Subject: Re: [ANN] GCC-2.95.2 binaries for Cygwin b20.1
From: Tor Lillqvist <[email-masked]>
To: Mumit Khan <[email-masked]>
Cc: [email-masked]
Date: Mon, 8 Nov 1999 15:19:01 +0200 (FLE Standard Time)

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@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 [email-masked]