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
-been used successfully. With gcc I mean egcs-1.1.2 (as distributed by
-Mumit Khan), running under cygwin-b20.1. To successfully use gcc,
-follow the instructions below. We want to use gcc -mno-cygwin,
-i.e. produce executables (.exe and .dll files) that do *not* require
-the cygwin runtime library. This is sometimes called "mingw32".
+been used successfully. With gcc I mean the gcc-2.95 pre-release as
+distributed by Mumit Khan, running under cygwin-b20.1. To successfully
+use gcc, follow the instructions below. We want to use gcc
+-mno-cygwin, i.e. produce executables (.exe and .dll files) that do
+*not* require the cygwin runtime library. This is sometimes called
+"mingw32".
To test the GLib functions, go to the tests subdirectory and enter
`nmake -f makefile.msc check` or `make -f makefile.cygwin check`.
Additionally, there are the compiler-specific macros:
- _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
to be straightened out when adding the gcc support. In particular, I
=================
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
-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 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
-that... This patch replaces -lcrtdll with -lmsvcrt, replaces crt1 with
-crt2, removes -lmoldname (because using functions from it would pull
-in crtdll.dll), and defines __MSVCRT__.
-
---- specs.ORIG Sun Apr 25 00:40:40 1999
-+++ specs Sun Apr 25 00:48:04 1999
-@@ -23 +23 @@
--%{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
-_dev_t in the header mingw32/sys/types.h should be unsigned int, not
-short. The type for st_uid in sys/stat.h to be short, not int. This is
-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:
+with gdb works. I use the latest and greatest gcc and mingw32.
+Somewhat earlier versions will also work, but you are on your own.
+
+Fetch the gcc-2.95 developer snapshot from
+ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/snapshots/gcc-2.95-19990715/.
+Install it somewhere, for instance \gcc-2.95.
+
+Fetch the mingw runtime snapshot from 1999-07-15 from
+ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/runtime/. You
+must fix two bugs in it:
+
+1) 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__
#else
...
-Remake dllcrt2.o (which is the file which gets linked into dlls when
-using msvcrt, as per the specs file above), and move it into place
-(typically C:\cygnus\cygwin-b20\H-i586-cygwin32\i586-cygwin32\lib\dllcrt2.o).
+2) Fix the type of the function __p___argv() in stdlib.h to be char***,
+not char**.
+
+Build the mingw32 runtime and install the libraries in the
+gcc-2.95\H-i586-cygwin32\lib directory, and the headers in the
+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 an awful hack. But
-I couldn't get things working in a cleaner way.
+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>
# Nothing much configurable below
-CC = gcc -mno-cygwin -mpentium
+CC = gcc -mno-cygwin -mpentium -fnative-struct
CP = cp
LD = ld
all : \
config.h \
glibconfig.h \
- glib-$(GLIB_VER).gcc.dll \
+ glib-$(GLIB_VER).dll \
gmodule/gmoduleconf.h \
- gmodule-$(GLIB_VER).gcc.dll \
- gthread-$(GLIB_VER).gcc.dll \
+ gmodule-$(GLIB_VER).dll \
+ gthread-$(GLIB_VER).dll \
testglib.exe \
testgmodule.exe \
testgdate.exe \
testgdateparser.exe
install : all
- $(INSTALL) glib-$(GLIB_VER).gcc.dll $(BIN)
- $(INSTALL) gmodule-$(GLIB_VER).gcc.dll $(BIN)
- $(INSTALL) gthread-$(GLIB_VER).gcc.dll $(BIN)
+ $(INSTALL) glib-$(GLIB_VER).dll $(BIN)
+ $(INSTALL) gmodule-$(GLIB_VER).dll $(BIN)
+ $(INSTALL) gthread-$(GLIB_VER).dll $(BIN)
glib_OBJECTS = \
garray.o \
gscanner.o \
gutils.o
-glib-$(GLIB_VER).gcc.dll : $(glib_OBJECTS) glib.def
- ./build-dll glib $(GLIB_VER).gcc glib.def $(glib_OBJECTS) -luser32 -lwsock32
+glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def
+ ./build-dll glib $(GLIB_VER) glib.def $(glib_OBJECTS) -luser32 -lwsock32
glibconfig.h: glibconfig.h.win32
$(CP) glibconfig.h.win32 glibconfig.h
gmodule_OBJECTS = \
gmodule.o
-gmodule-$(GLIB_VER).gcc.dll : $(gmodule_OBJECTS) gmodule/gmodule.def
- ./build-dll gmodule $(GLIB_VER).gcc gmodule/gmodule.def $(gmodule_OBJECTS) -L. -lglib-$(GLIB_VER).gcc -lwsock32
+gmodule-$(GLIB_VER).dll : $(gmodule_OBJECTS) gmodule/gmodule.def
+ ./build-dll gmodule $(GLIB_VER) gmodule/gmodule.def $(gmodule_OBJECTS) -L. -lglib-$(GLIB_VER) -lwsock32
gmodule.o : gmodule/gmodule.c gmodule/gmodule-win32.c
$(CC) $(CFLAGS) -Igmodule -c -DG_LOG_DOMAIN=g_log_domain_gmodule gmodule/gmodule.c
gthread_OBJECTS = \
gthread-impl.o
-gthread-$(GLIB_VER).gcc.dll : $(gthread_OBJECTS) glib-$(GLIB_VER).gcc.dll gthread/gthread.def
- ./build-dll gthread $(GLIB_VER).gcc gthread/gthread.def $(gthread_OBJECTS) -L. -lglib-$(GLIB_VER).gcc $(PTHREAD_LIB)
+gthread-$(GLIB_VER).dll : $(gthread_OBJECTS) glib-$(GLIB_VER).dll gthread/gthread.def
+ ./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
$(CC) $(CFLAGS) $(PTHREAD_INC) -DG_LOG_DOMAIN=\"GThread\" -c gthread/gthread-impl.c
-testglib.exe : glib-$(GLIB_VER).gcc.dll testglib.o
- $(CC) $(CFLAGS) -o testglib testglib.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS)
+testglib.exe : glib-$(GLIB_VER).dll testglib.o
+ $(CC) $(CFLAGS) -o testglib testglib.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testglib.o : testglib.c
$(CC) -c $(CFLAGS) testglib.c
-testgdate.exe : glib-$(GLIB_VER).gcc.dll testgdate.o
- $(CC) $(CFLAGS) -o testgdate.exe testgdate.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS)
+testgdate.exe : glib-$(GLIB_VER).dll testgdate.o
+ $(CC) $(CFLAGS) -o testgdate.exe testgdate.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testgdate.o : testgdate.c
$(CC) -c $(CFLAGS) testgdate.c
-testgdateparser.exe : glib-$(GLIB_VER).gcc.dll testgdateparser.o
- $(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER).gcc $(LDFLAGS)
+testgdateparser.exe : glib-$(GLIB_VER).dll testgdateparser.o
+ $(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testgdateparser.o : 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
# exported from a .exe? Apparently yes. Does the __declspec(dllexport)
# 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
- $(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
- $(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
$(CC) $(CFLAGS) -Igmodule -c gmodule/testgmodule.c
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
$(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_a.c
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
$(CC) $(CFLAGS) -Igmodule -c gmodule/libgplugin_b.c