Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT sourceware DOT cygnus DOT com Delivered-To: mailing list cygwin AT sourceware DOT cygnus DOT com From: Tor Lillqvist MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <14374.52677.20000.857145@gargle.gargle.HOWL> Date: Mon, 8 Nov 1999 15:19:01 +0200 (FLE Standard Time) To: Mumit Khan Cc: cygwin AT sourceware DOT cygnus DOT com Subject: Re: [ANN] GCC-2.95.2 binaries for Cygwin b20.1 In-Reply-To: <199911080413.WAA28353@mercury.xraylith.wisc.edu> References: <199911080413 DOT WAA28353 AT mercury DOT xraylith DOT wisc DOT edu> X-Mailer: VM 6.73 under Emacs 20.4.1 Hi, (Nice hostname, "THOR.xraylith..." ;-) In my work on GLib, GTk+ and the GIMP for Win32, I want to run gcc etc under cygwin, but still produce EXEs and DLLs that run without cygwin, and with the MSVCRT runtime, even. I don't want to use gcc packaged for mingw32. (There are some irritating differences in the way command line arguments are passed to gcc from Makefiles, for instance.) In order to do this I have to to the following with gcc 2.95.2. (This is in a "recipe" form as I intend to use the same text as advice to others wanting to build GLib, GTk+ and the GIMP on Win32 with gcc) I would appreciate comments on the correctness of this, and whether it would be possible to have support for building MSVCRT-using binaries with gcc-on-cygwin "built in" in the future... BTW, there seems to be a slight incompatibility between gcc-2.95.2 and dlltool 2.9.4: If you export a variable with __declspec(dllexport), gcc produces a " -export:foo,data" directive. Dlltool mistakes this to mean that also a symbol "data" is exported. This can be worked around by not exporting data with __declspec, only with a .def file. Gcc-2.95 didn't add the ",data" part. 0) Get and install Cygwin B20.1. Move the include files and libraries included in Cygwin out of the way not to mix things up... (For example, rename /cygnus/cygwin-b20/H-i586-cygwin32/i586-cygwin32/lib to lib-no-thanks and rename /cygnus/cygwin-b20/H-i586-cygwin32/i586-cygwin32/include to include-no-thanks. 1) Get gcc 2.95.2 built for Cygwin B20.1 from ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/gcc-2.95.2-cygb20.tar.gz Install it somewhere, let's say G:\gcc-2.95.2 (//g/gcc-2.95.2 when in Cygwin). Add //g/gcc-2.95.2/H-i586-cygwin32/bin to your PATH. I assume you use bash under cygwin below. Replace the specs file with the following. (The changes are: Define __MSVCRT__, replace the "1" versions of the crt files with the "2" ones, replace crtdll with msvcrt. Also, extra whitespace squished. ) ================ cut here ================ *asm: *asm_final: *cpp: -remap %(cpp_cpu) %{posix:-D_POSIX_SOURCE} %{!mno-cygwin:-D__CYGWIN32__ -D__CYGWIN__} %{mno-cygwin:-iwithprefixbefore ../../../../%(mingw_include_path)/include/mingw32 -D__MSVCRT__ -D__MINGW32__=0.2} *cc1: %(cc1_spec) *cc1plus: *endfile: *link: %{mwindows:--subsystem windows} %{mconsole:--subsystem console} %{mdll:--dll -e _DllMainCRTStartup AT 12} *lib: %{pg:-lgmon} %{!mno-cygwin:-lcygwin} %{mno-cygwin:-lmingw32 -lmoldname -lmsvcrt} %{mwindows:-lgdi32 -lcomdlg32} -luser32 -lkernel32 -ladvapi32 -lshell32 *libgcc: -lgcc *startfile: %{mdll: %{mno-cygwin:dllcrt2%O%s}} %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:crt2%O%s} %{pg: %{!mno-cygwin:gcrt0%O%s} %{mno-cygwin:gcrt2%O%s}}} *switches_need_spaces: *signed_char: %{funsigned-char:-D__CHAR_UNSIGNED__} *predefines: -Di386 -D_WIN32 -DWINNT -D_X86_=1 -D__STDC__=1 -D__stdcall=__attribute__((__stdcall__)) -D__cdecl=__attribute__((__cdecl__)) -D__declspec(x)=__attribute__((x)) -Asystem(winnt) -Acpu(i386) -Amachine(i386) *cross_compile: 0 *version: 2.95.2 *multilib: . !mno-cygwin;mingw32 mno-cygwin;; *multilib_defaults: *multilib_extra: *multilib_matches: mno-cygwin mno-cygwin; *linker: collect2 *cpp_486: %{!ansi:-Di486} -D__i486 -D__i486__ *cpp_586: %{!ansi:-Di586 -Dpentium} -D__i586 -D__i586__ -D__pentium -D__pentium__ *cpp_k6: %{!ansi:-Di586 -Dk6} -D__i586 -D__i586__ -D__k6 -D__k6__ *cpp_686: %{!ansi:-Di686 -Dpentiumpro} -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ *cpp_cpu_default: %(cpp_586) *cpp_cpu: -Acpu(i386) -Amachine(i386) %{!ansi:-Di386} -D__i386 -D__i386__ %{mcpu=i486:%(cpp_486)} %{m486:%(cpp_486)} %{mpentium:%(cpp_586)} %{mcpu=pentium:%(cpp_586)} %{mpentiumpro:%(cpp_686)} %{mcpu=pentiumpro:%(cpp_686)} %{mcpu=k6:%(cpp_k6)} %{!mcpu*:%{!m486:%{!mpentium*:%(cpp_cpu_default)}}} *cc1_cpu: %{!mcpu*: %{m386:-mcpu=i386 -march=i386} %{m486:-mcpu=i486 -march=i486} %{mpentium:-mcpu=pentium} %{mpentiumpro:-mcpu=pentiumpro}} *mingw_include_path: i586-cygwin32 *link_command: %{!fsyntax-only: %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %D %o %{!nostdlib:%{!nodefaultlibs:%G %L %G}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} ================ cut here ================ 2) Get the Mingw32 runtime sources from ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/gcc-2.95.2/runtime-source-19991107.zip Unpack it somewhere, say //g/src/mingw-runtime-19991107 . Apply the following patches: This makes the mingwm10.dll depend on the stuff that is needed to build it.: ================ cut here ================ diff -ru2 ./mingw/Makefile.in ../../src/mingw-runtime-19991107/mingw/Makefile.in --- ./mingw/Makefile.in Sun Nov 07 12:19:22 1999 +++ ../../src/mingw-runtime-19991107/mingw/Makefile.in Mon Nov 08 14:55:38 1999 @@ -138,5 +138,5 @@ --base-file mingwthrd.base --output-exp mingwthrd.exp -$(THREAD_DLL_NAME) mingwthrd.def: $(DLL_OFILES) Makefile +$(THREAD_DLL_NAME) mingwthrd.def: $(DLL_OFILES) Makefile libmingw32.a libmoldname.a lib$(RUNTIME).a dllcrt$(CRT_ID).o $(DLLTOOL) --as $(AS) --output-def mingwthrd.def $(DLL_OFILES) $(CC) -Wl,--base-file=mingwthrd.base $(DLL_CC_STUFF) ================ cut here ================ This enables building the profiling gcrt2.o. I don't know how useful it is, though, there doesn't seem to be any gprof command in cygwin. ================ cut here ================ diff -ru2 ./mingw/profile/Makefile.in ../../src/mingw-runtime-19991107/mingw/profile/Makefile.in --- ./mingw/profile/Makefile.in Sun Nov 07 12:18:56 1999 +++ ../../src/mingw-runtime-19991107/mingw/profile/Makefile.in Mon Nov 08 12:12:12 1999 @@ -76,8 +76,8 @@ gcrt1.o: gcrt0.c - $(CC) -U__MSVCRT__ -c -o $@ $(CPPFLAGS) $(CFLAGS) $? + $(CC) -U__MSVCRT__ -c -o $@ $(CPPFLAGS) $(ALL_CFLAGS) $? gcrt2.o: gcrt0.c - $(CC) -D__MSVCRT__ -c -o $@ $(CPPFLAGS) $(CFLAGS) $? + $(CC) -D__MSVCRT__ -c -o $@ $(CPPFLAGS) $(ALL_CFLAGS) $? Makefile: Makefile.in config.status configure ================ cut here ================ This fixes a typo in wingdi.h: ================ cut here ================ diff -ru2 ./w32api/include/wingdi.h ../../src/mingw-runtime-19991107/w32api/include/wingdi.h --- ./w32api/include/wingdi.h Thu Nov 04 03:42:40 1999 +++ ../../src/mingw-runtime-19991107/w32api/include/wingdi.h Mon Nov 08 12:48:02 1999 @@ -304,5 +304,5 @@ #define FW_BOLD 700 #define FW_EXTRABOLD 800 -#define FW_ULTRABOLD FW_EXTRABOOLD +#define FW_ULTRABOLD FW_EXTRABOLD #define FW_HEAVY 900 #define FW_BLACK FW_HEAVY ================ cut here ================ (I haven't checked yet if other small errors I have noticed in previous w32api header versions have been corrected.) 3) Now you should build the mingw32 and w32api runtime and import libraries. Go to //g/src/mingw-runtime-19991107/w32api. Enter: CC='gcc -mno-cygwin' ./configure i586-pc-mingw32msvc make That should complete in a while. It should produce a lot of .a libraries (both import libraries, and a couple of archive libraries), and some .o files. I don't trust make install to do what I want (especially as I didn't give any --prefix argument to the configure...), so I install the stuff manually: cd lib mkdir //g/gcc-2.95.2/H-i586-cygwin32/lib/mingw32 cp *.a //g/gcc-2.95.2/H-i586-cygwin32/lib/mingw32 cd ../include mkdir //g/gcc-2.95.2/H-i586-cygwin32/i586-cygwin32/include/mingw32 cp *.h //g/gcc-2.95.2/H-i586-cygwin32/i586-cygwin32/include/mingw32 Now go to ../../mingw, and run the same configure command, and do a make: CC='gcc -mno-cygwin' ./configure i586-pc-mingw32msvc make Then install the mingw32 libraries and headers: cp *.a //g/gcc-2.95.2/H-i586-cygwin32/lib/mingw32 mkdir //g/gcc-2.95.2/H-i586-cygwin32/i586-cygwin32/include/mingw32/sys cp include/sys/*.h //g/gcc-2.95.2/H-i586-cygwin32/i586-cygwin32/include/mingw32/sys cp include/*.h //g/gcc-2.95.2/H-i586-cygwin32/i586-cygwin32/include/mingw32 4) Whew. That hopefully should be it. Cheers, --tml -- Want to unsubscribe from this list? Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com