Win32: With the latest gcc (2.95, pre-release), we can have binary

compatibility with MSVC by using the switch -fnative-struct. No
 	longer build DLLs with .gcc in the name when using gcc.

	* README.win32: Renew gcc build instructions.

	* build-dll: Comments change, handle also .a files.

	* makefile.cygwin.in
	* tests/makefile.cygwin.in: Remove .gcc from DLL name.
This commit is contained in:
Tor Lillqvist 1999-07-21 19:18:03 +00:00
parent da87b1ac85
commit 4d7172def0
4 changed files with 72 additions and 78 deletions

View File

@ -10,11 +10,12 @@ library is used.
To build GLib on Win32, you can use either the Microsoft compiler and To build GLib on Win32, you can use either the Microsoft compiler and
tools, or gcc. Both the compiler from MSVC 5.0 and from MSVC 6.0 have tools, or gcc. Both the compiler from MSVC 5.0 and from MSVC 6.0 have
been used successfully. With gcc I mean egcs-1.1.2 (as distributed by been used successfully. With gcc I mean the gcc-2.95 pre-release as
Mumit Khan), running under cygwin-b20.1. To successfully use gcc, distributed by Mumit Khan, running under cygwin-b20.1. To successfully
follow the instructions below. We want to use gcc -mno-cygwin, use gcc, follow the instructions below. We want to use gcc
i.e. produce executables (.exe and .dll files) that do *not* require -mno-cygwin, i.e. produce executables (.exe and .dll files) that do
the cygwin runtime library. This is sometimes called "mingw32". *not* require the cygwin runtime library. This is sometimes called
"mingw32".
To test the GLib functions, go to the tests subdirectory and enter To test the GLib functions, go to the tests subdirectory and enter
`nmake -f makefile.msc check` or `make -f makefile.cygwin check`. `nmake -f makefile.msc check` or `make -f makefile.cygwin check`.
@ -46,7 +47,7 @@ GLib (or GTk+, which uses GLib).
Additionally, there are the compiler-specific macros: Additionally, there are the compiler-specific macros:
- _MSC_VER is defined when using the Microsoft compiler - _MSC_VER is defined when using the Microsoft compiler
- __GNUC__ is defined when using GCC (i.e. egcs) - __GNUC__ is defined when using GCC
Some of the usage of these macros used to be a bit mixed up, and had Some of the usage of these macros used to be a bit mixed up, and had
to be straightened out when adding the gcc support. In particular, I to be straightened out when adding the gcc support. In particular, I
@ -90,44 +91,20 @@ Building with gcc
================= =================
The gcc support was added quite recently, but seems to work. Debugging The gcc support was added quite recently, but seems to work. Debugging
with gdb works. I prefer to use the msvcrt runtime and not the default with gdb works. I use the latest and greatest gcc and mingw32.
crtdll. Especially, as the pthread library also uses msvcrt, using Somewhat earlier versions will also work, but you are on your own.
crtdll would probably not be a good idea at all. Using msvcrt can be
achieved by applying the following diff to the specs file, which
typically is installed as
C:\cygnus\cygwin-b20\H-i586-cygwin32\lib\gcc-lib\i586-cygwin32\egcs-2.91.66\specs.
Sorry for the illegibility of this diff, but the specs file is like Fetch the gcc-2.95 developer snapshot from
that... This patch replaces -lcrtdll with -lmsvcrt, replaces crt1 with ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/snapshots/gcc-2.95-19990715/.
crt2, removes -lmoldname (because using functions from it would pull Install it somewhere, for instance \gcc-2.95.
in crtdll.dll), and defines __MSVCRT__.
--- specs.ORIG Sun Apr 25 00:40:40 1999 Fetch the mingw runtime snapshot from 1999-07-15 from
+++ specs Sun Apr 25 00:48:04 1999 ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime/. You
@@ -23 +23 @@ must fix two bugs in it:
-%{pg:-lgmon} %{!mno-cygwin:-lcygwin} %{mno-cygwin:-lmingw32 -lmoldname -lcrtdll} %{mwindows:-luser32 -lgdi32 -lcomdlg32} -lkernel32 -ladvapi32 -lshell32
+%{pg:-lgmon} %{!mno-cygwin:-lcygwin} %{mno-cygwin:-lmingw32 -lmsvcrt} %{mwindows:-luser32 -lgdi32 -lcomdlg32} -lkernel32 -ladvapi32 -lshell32
@@ -29 +29 @@
-%{mdll: %{!mno-cygwin:dllcrt0%O%s} %{mno-cygwin:dllcrt1%O%s}} %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:crt1%O%s} %{pg:gcrt0%O%s}}
+%{mdll: %{!mno-cygwin:dllcrt0%O%s} %{mno-cygwin:dllcrt2%O%s}} %{!mdll: %{!mno-cygwin:crt0%O%s} %{mno-cygwin:crt2%O%s} %{pg:gcrt0%O%s}}
@@ -38 +38 @@
--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)
+-Di386 -D_WIN32 %{mno-cygwin:-D__MSVCRT__ } -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)
You should also fix two bugs in the mingw32 headers: The type of 1) Fix the prototype and call to __getmainargs() in init.c to include
_dev_t in the header mingw32/sys/types.h should be unsigned int, not one more parameter, an int *, which should be passed the address of a
short. The type for st_uid in sys/stat.h to be short, not int. This is zero int. Code snippets below:
what the Microsoft's headers and runtime library use. Otherwise
accessing the fields in a stat struct as filled in by the stat and
fstat functions in the MS library will cause various interesting
failures.
You also will have to get the mingw32 runtime source from
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime/source-1999-04-05.tar.gz
(this is the source to the "mingw32" part of Mumit Khan's egcs-1.1.2
distribution.) Unpack it and fix the prototype and call to
__getmainargs() in init.c to include one more parameter, an int *,
which should be passed the address of a zero int. Code snippets below:
... ...
#ifdef __MSVCRT__ #ifdef __MSVCRT__
@ -140,12 +117,29 @@ extern void __getmainargs(int *, char***, char***, int, int *);
#else #else
... ...
Remake dllcrt2.o (which is the file which gets linked into dlls when 2) Fix the type of the function __p___argv() in stdlib.h to be char***,
using msvcrt, as per the specs file above), and move it into place not char**.
(typically C:\cygnus\cygwin-b20\H-i586-cygwin32\i586-cygwin32\lib\dllcrt2.o).
Next, go back to the GLib directory and build using `make -f makefile.cygwin`. Build the mingw32 runtime and install the libraries in the
Building the dlls uses the script build-dll which is an awful hack. But gcc-2.95\H-i586-cygwin32\lib directory, and the headers in the
I couldn't get things working in a cleaner way. gcc-2.95\H-i586-cygwin32\i586-cygwin32\include\mingw32 directory.
Remember to build and install also the w32api import libraries and
headers.
I prefer to use the msvcrt runtime and not the default
crtdll. Especially, as the pthread library also uses msvcrt, using
crtdll would probably not be a good idea at all. Using msvcrt can be
achieved by applying a few changes to the specs file.
The specs file is in gcc-2.95\H-i586-cygwin32\lib\gcc-lib\i586-cygwin32\2.95
The necessary changes are: replace -lcrtdll with -lmsvcrt, replace
crt1 with crt2, change -lmoldname to -lmoldname-msvc, and define
__MSVCRT__.
Next, go back to the GLib directory and build using `make -f
makefile.cygwin`. Building the dlls uses the script build-dll which
is somewhat of a hack. But I couldn't get things working in a cleaner
way.
--Tor Lillqvist <tml@iki.fi> --Tor Lillqvist <tml@iki.fi>

View File

@ -1,11 +1,11 @@
#!/bin/sh #!/bin/sh
# Temporary hack until building dlls or executables with exported # Temporary hack until building dlls or executables with exported
# entry points is easier with gcc -mno-cygwin. # entry points is easier with gcc -mno-cygwin ("mingw32").
# This is usable with cygwin b20.1 and egcs-2.91.66 19990314 # This is usable with cygwin b20.1 and egcs-2.91.66 19990314
# (egcs-1.1.2 release) as distributed by Mumit Khan. For other combinations, # (egcs-1.1.2 release) or gcc-2.95 as distributed by Mumit Khan. For
# no idea. # other combinations, no idea.
GCC=gcc GCC=gcc
DLLTOOL=dlltool DLLTOOL=dlltool
@ -25,7 +25,7 @@ dllfile=$libname.dll
for F in $ldargs; do for F in $ldargs; do
case $F in case $F in
*.o) objs="$objs $F";; *.[ao]) objs="$objs $F";;
esac esac
done done

View File

@ -19,7 +19,7 @@ OPTIMIZE = -g -O
# Nothing much configurable below # Nothing much configurable below
CC = gcc -mno-cygwin -mpentium CC = gcc -mno-cygwin -mpentium -fnative-struct
CP = cp CP = cp
LD = ld LD = ld
@ -33,19 +33,19 @@ CFLAGS = $(OPTIMIZE) -I. -DHAVE_CONFIG_H
all : \ all : \
config.h \ config.h \
glibconfig.h \ glibconfig.h \
glib-$(GLIB_VER).gcc.dll \ glib-$(GLIB_VER).dll \
gmodule/gmoduleconf.h \ gmodule/gmoduleconf.h \
gmodule-$(GLIB_VER).gcc.dll \ gmodule-$(GLIB_VER).dll \
gthread-$(GLIB_VER).gcc.dll \ gthread-$(GLIB_VER).dll \
testglib.exe \ testglib.exe \
testgmodule.exe \ testgmodule.exe \
testgdate.exe \ testgdate.exe \
testgdateparser.exe testgdateparser.exe
install : all install : all
$(INSTALL) glib-$(GLIB_VER).gcc.dll $(BIN) $(INSTALL) glib-$(GLIB_VER).dll $(BIN)
$(INSTALL) gmodule-$(GLIB_VER).gcc.dll $(BIN) $(INSTALL) gmodule-$(GLIB_VER).dll $(BIN)
$(INSTALL) gthread-$(GLIB_VER).gcc.dll $(BIN) $(INSTALL) gthread-$(GLIB_VER).dll $(BIN)
glib_OBJECTS = \ glib_OBJECTS = \
garray.o \ garray.o \
@ -77,8 +77,8 @@ glib_OBJECTS = \
gscanner.o \ gscanner.o \
gutils.o gutils.o
glib-$(GLIB_VER).gcc.dll : $(glib_OBJECTS) glib.def glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def
./build-dll glib $(GLIB_VER).gcc glib.def $(glib_OBJECTS) -luser32 -lwsock32 ./build-dll glib $(GLIB_VER) glib.def $(glib_OBJECTS) -luser32 -lwsock32
glibconfig.h: glibconfig.h.win32 glibconfig.h: glibconfig.h.win32
$(CP) glibconfig.h.win32 glibconfig.h $(CP) glibconfig.h.win32 glibconfig.h
@ -92,8 +92,8 @@ config.h: config.h.win32
gmodule_OBJECTS = \ gmodule_OBJECTS = \
gmodule.o gmodule.o
gmodule-$(GLIB_VER).gcc.dll : $(gmodule_OBJECTS) gmodule/gmodule.def gmodule-$(GLIB_VER).dll : $(gmodule_OBJECTS) gmodule/gmodule.def
./build-dll gmodule $(GLIB_VER).gcc gmodule/gmodule.def $(gmodule_OBJECTS) -L. -lglib-$(GLIB_VER).gcc -lwsock32 ./build-dll gmodule $(GLIB_VER) gmodule/gmodule.def $(gmodule_OBJECTS) -L. -lglib-$(GLIB_VER) -lwsock32
gmodule.o : gmodule/gmodule.c gmodule/gmodule-win32.c gmodule.o : gmodule/gmodule.c gmodule/gmodule-win32.c
$(CC) $(CFLAGS) -Igmodule -c -DG_LOG_DOMAIN=g_log_domain_gmodule gmodule/gmodule.c $(CC) $(CFLAGS) -Igmodule -c -DG_LOG_DOMAIN=g_log_domain_gmodule gmodule/gmodule.c
@ -104,51 +104,51 @@ gmodule/gmoduleconf.h: gmodule/gmoduleconf.h.win32
gthread_OBJECTS = \ gthread_OBJECTS = \
gthread-impl.o gthread-impl.o
gthread-$(GLIB_VER).gcc.dll : $(gthread_OBJECTS) glib-$(GLIB_VER).gcc.dll gthread/gthread.def gthread-$(GLIB_VER).dll : $(gthread_OBJECTS) glib-$(GLIB_VER).dll gthread/gthread.def
./build-dll gthread $(GLIB_VER).gcc gthread/gthread.def $(gthread_OBJECTS) -L. -lglib-$(GLIB_VER).gcc $(PTHREAD_LIB) ./build-dll gthread $(GLIB_VER) gthread/gthread.def $(gthread_OBJECTS) -L. -lglib-$(GLIB_VER) $(PTHREAD_LIB)
gthread-impl.o : gthread/gthread-impl.c gthread/gthread-posix.c gthread-impl.o : gthread/gthread-impl.c gthread/gthread-posix.c
$(CC) $(CFLAGS) $(PTHREAD_INC) -DG_LOG_DOMAIN=\"GThread\" -c gthread/gthread-impl.c $(CC) $(CFLAGS) $(PTHREAD_INC) -DG_LOG_DOMAIN=\"GThread\" -c gthread/gthread-impl.c
testglib.exe : glib-$(GLIB_VER).gcc.dll testglib.o testglib.exe : glib-$(GLIB_VER).dll testglib.o
$(CC) $(CFLAGS) -o testglib testglib.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -o testglib testglib.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testglib.o : testglib.c testglib.o : testglib.c
$(CC) -c $(CFLAGS) testglib.c $(CC) -c $(CFLAGS) testglib.c
testgdate.exe : glib-$(GLIB_VER).gcc.dll testgdate.o testgdate.exe : glib-$(GLIB_VER).dll testgdate.o
$(CC) $(CFLAGS) -o testgdate.exe testgdate.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -o testgdate.exe testgdate.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testgdate.o : testgdate.c testgdate.o : testgdate.c
$(CC) -c $(CFLAGS) testgdate.c $(CC) -c $(CFLAGS) testgdate.c
testgdateparser.exe : glib-$(GLIB_VER).gcc.dll testgdateparser.o testgdateparser.exe : glib-$(GLIB_VER).dll testgdateparser.o
$(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testgdateparser.o : testgdateparser.c testgdateparser.o : testgdateparser.c
$(CC) -c $(CFLAGS) testgdateparser.c $(CC) -c $(CFLAGS) testgdateparser.c
testgmodule.exe : glib-$(GLIB_VER).gcc.dll gmodule-$(GLIB_VER).gcc.dll testgmodule.o libgplugin_a.dll libgplugin_b.dll testgmodule.exe : glib-$(GLIB_VER).dll gmodule-$(GLIB_VER).dll testgmodule.o libgplugin_a.dll libgplugin_b.dll
# Wow, do we really have to do it like this to get some symbols # Wow, do we really have to do it like this to get some symbols
# exported from a .exe? Apparently yes. Does the __declspec(dllexport) # exported from a .exe? Apparently yes. Does the __declspec(dllexport)
# actually do anything in egcs-1.1.2? # actually do anything in egcs-1.1.2?
$(CC) $(CFLAGS) -Wl,--base-file,testgmodule.base -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER).gcc -lgmodule-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -Wl,--base-file,testgmodule.base -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) $(LDFLAGS)
$(DLLTOOL) --base-file testgmodule.base --output-exp testgmodule.exp testgmodule.o $(DLLTOOL) --base-file testgmodule.base --output-exp testgmodule.exp testgmodule.o
$(CC) $(CFLAGS) -Wl,--base-file,testgmodule.base,testgmodule.exp -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER).gcc -lgmodule-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -Wl,--base-file,testgmodule.base,testgmodule.exp -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) $(LDFLAGS)
$(DLLTOOL) --base-file testgmodule.base --output-exp testgmodule.exp testgmodule.o $(DLLTOOL) --base-file testgmodule.base --output-exp testgmodule.exp testgmodule.o
$(CC) $(CFLAGS) -Wl,testgmodule.exp -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER).gcc -lgmodule-$(GLIB_VER).gcc $(LDFLAGS) $(CC) $(CFLAGS) -Wl,testgmodule.exp -o testgmodule.exe testgmodule.o -L. -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) $(LDFLAGS)
testgmodule.o : gmodule/testgmodule.c testgmodule.o : gmodule/testgmodule.c
$(CC) $(CFLAGS) -Igmodule -c gmodule/testgmodule.c $(CC) $(CFLAGS) -Igmodule -c gmodule/testgmodule.c
libgplugin_a.dll : libgplugin_a.o libgplugin_a.dll : libgplugin_a.o
./build-dll libgplugin_a - - libgplugin_a.o -L. -lglib-$(GLIB_VER).gcc -lgmodule-$(GLIB_VER).gcc ./build-dll libgplugin_a - - libgplugin_a.o -L. -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER)
libgplugin_a.o : gmodule/libgplugin_a.c libgplugin_a.o : gmodule/libgplugin_a.c
$(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_a.c $(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_a.c
libgplugin_b.dll : libgplugin_b.o libgplugin_b.dll : libgplugin_b.o
./build-dll libgplugin_b - - libgplugin_b.o -L. -lglib-$(GLIB_VER).gcc -lgmodule-$(GLIB_VER).gcc ./build-dll libgplugin_b - - libgplugin_b.o -L. -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER)
libgplugin_b.o : gmodule/libgplugin_b.c libgplugin_b.o : gmodule/libgplugin_b.c
$(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_b.c $(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_b.c

View File

@ -7,7 +7,7 @@ OPTIMIZE = -g -O
# Nothing much configurable below # Nothing much configurable below
CC = gcc -mno-cygwin -mpentium CC = gcc -mno-cygwin -mpentium -fnative-struct
GLIB_VER = @GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@ GLIB_VER = @GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@
@ -37,7 +37,7 @@ all : $(TESTS)
.c.exe : .c.exe :
$(CC) $(CFLAGS) -c $< $(CC) $(CFLAGS) -c $<
$(CC) $(CFLAGS) -o $@ $< -L.. -lglib-$(GLIB_VER).gcc -lgthread-$(GLIB_VER).gcc $(CC) $(CFLAGS) -o $@ $< -L.. -lglib-$(GLIB_VER) -lgthread-$(GLIB_VER)
check: all check: all
@for P in $(TESTS) ; do echo $$P; ./$$P; done @for P in $(TESTS) ; do echo $$P; ./$$P; done