* README.win32: More editing.
* build-dll: Use gcc, not ld to link.
* glib.h: On native Win32 use _unlink().
* gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
not _MSC_VER.
* gstring.c: Include <io.h> on Win32 for _read prototype.
* gutils.c: Remove old IO channel code (was in #if 0).
* makefile.cygwin: Don't need to link with kernel32 and msvcrt
explicitly, they are included anyway.
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
+1999-04-25 Tor Lillqvist <tml@iki.fi>
+
+ * README.win32: More editing.
+ * build-dll: Use gcc, not ld to link.
+ * glib.h: On native Win32 use _unlink().
+ * gscanner.c: Use corrent NATIVE_WIN32 feature test macro,
+ not _MSC_VER.
+ * gstring.c: Include <io.h> on Win32 for _read prototype.
+ * gutils.c: Remove old IO channel code (was in #if 0).
+ * makefile.cygwin: Don't need to link with kernel32 and msvcrt
+ explicitly, they are included anyway.
+
1999-04-24 Tor Lillqvist <tml@iki.fi>
Support added for building using a GNU toolchain on Win32,
library is used.
To build GLib on Win32, you can use either the Microsoft compiler and
-tools, or egcs-1.1.2 running under cygwin-b20.1. Both the compiler
-from MSVC 5.0 and from MSVC 6.0 have been used successfully. If you
-build with egcs, note that the produced executables and DLLs do *not*
-require the cygwin dll ("mingw32"). That's the whole point of this
-porting effort, more or less.
+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.
-The egcs support was added quite recently, but seems to work in all
-respects. Debugging with gdk works.
+If you build with gcc, note that the produced executables and DLLs do
+*not* require the cygwin dll (gcc -mno-cygwin). That's the whole point
+of this porting effort, more or less.
-Before building you must get the pthreads library for Windows from
+The egcs 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. This 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 diff replaces -lcrtdll with -lmsvcrt, replaces crt1 with
+crt2, 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 -lmoldname -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)
+
+Note: If you build with gcc, you should also fix the definition of
+_dev_t in the header mingw32/sys/types.h to correspond to what it
+actually is used by msvcrt.dll. It should be unsigned int, not
+short. Otherwise stat() calls will fail.
+
+Before building you must get the pthreads library for Win32 from
http://sourceware.cygnus.com/pthreads-win32/. The pthreads-win32
snapshot from 1999-04-07 is the one that should be used. Edit the
-location of the pthreads library and include files in
-makefile.msc.
+location of the pthreads library and include files in makefile.msc.
If using the Microsoft toolchain, build with `nmake -f
-makefile.msc`. Install with `nmake -f makefile.msc install`.
-If using egcs, build using `make -f makefile.cygwin`.
+makefile.msc`. Install with `nmake -f makefile.msc install`. If using
+egcs, build using `make -f makefile.cygwin`.
To test the GLib functions, go to the tests subdirectory and enter
`nmake -f makefile.msc check`.
If you would want to use the cygwin tools to generate executables that
-*do* usethe cygwin runtime the normal Unix configuration method should
-work as if on Unix (knock on wood).
+*do* use the cygwin runtime, the normal Unix configuration method
+should work as if on Unix (knock on wood).
With a little work, it might be possible to use the ./configure
mechanism also with a "mingw32" configuration.
#!/bin/sh
-# Temporary hack until building dlls with gcc -mno-cygwin is easier
+# Temporary hack until building dlls or executables with exported
+# entry points is easier with gcc -mno-cygwin.
-LD=ld
+#LD=ld
+GCC=gcc
DLLTOOL=dlltool
AS=as
esac
done
-$LD -s --base-file $library.base --dll -o $dllfile $ldargs -e _DllMain@12 -lmingw32
-$DLLTOOL --as=$AS --dllname $dllfile $defswitch --base-file $library.base --output-exp $library.exp $objs
-$LD -s --base-file $library.base $library.exp --dll -o $dllfile $ldargs -e _DllMain@12 -lmingw32
-$DLLTOOL --as=$AS --dllname $dllfile $defswitch --base-file $library.base --output-exp $library.exp $objs
-$LD $library.exp --dll -o $dllfile $ldargs -e _DllMain@12 -lmingw32
+$GCC -s -mdll -mno-cygwin -Wl,--base-file,$library.base -o $dllfile $ldargs
+$DLLTOOL --as=$AS --dllname $dllfile $defswitch --base-file $library.base --output-exp $library.exp $objs &&
+$GCC -s -mdll -mno-cygwin -Wl,--base-file,$library.base,$library.exp -o $dllfile $ldargs
+$DLLTOOL --as=$AS --dllname $dllfile $defswitch --base-file $library.base --output-exp $library.exp $objs &&
+$GCC -mdll -mno-cygwin -Wl,$library.exp -o $dllfile $ldargs
$DLLTOOL --as=$AS --dllname $dllfile $defswitch --output-lib lib$libname.a $objs
-rm $library.base $library.exp
+
+rm $library.base $library.exp 2>/dev/null
#ifdef __GNUC__
# define stat _stat
#endif
+# define unlink _unlink
# define open _open
# define read _read
# define write _write
#ifdef __GNUC__
# define stat _stat
#endif
+# define unlink _unlink
# define open _open
# define read _read
# define write _write
#include <errno.h>
#include <sys/types.h> /* needed for sys/stat.h */
#include <sys/stat.h>
-#ifdef _MSC_VER
+#ifdef NATIVE_WIN32
#include <io.h> /* For _read() */
#endif
#include <ctype.h>
#include "glib.h"
+#ifdef NATIVE_WIN32
+#include <io.h> /* For _read */
+#endif
+
#define G_STRING_BLOCK_SIZE 512
typedef struct _GRealStringChunk GRealStringChunk;
return *(const gint*) v;
}
-#if 0 /* Old IO Channels */
-
-GIOChannel*
-g_iochannel_new (gint fd)
-{
- GIOChannel *channel = g_new (GIOChannel, 1);
-
- channel->fd = fd;
-
-#ifdef NATIVE_WIN32
- channel->peer = 0;
- channel->peer_fd = 0;
- channel->offset = 0;
- channel->need_wakeups = 0;
-#endif /* NATIVE_WIN32 */
-
- return channel;
-}
-
-void
-g_iochannel_free (GIOChannel *channel)
-{
- g_return_if_fail (channel != NULL);
-
- g_free (channel);
-}
-
-void
-g_iochannel_close_and_free (GIOChannel *channel)
-{
- g_return_if_fail (channel != NULL);
-
- close (channel->fd);
-
- g_iochannel_free (channel);
-}
-
-#undef g_iochannel_wakeup_peer
-
-void
-g_iochannel_wakeup_peer (GIOChannel *channel)
-{
-#ifdef NATIVE_WIN32
- static guint message = 0;
-#endif
-
- g_return_if_fail (channel != NULL);
-
-#ifdef NATIVE_WIN32
- if (message == 0)
- message = RegisterWindowMessage ("gdk-pipe-readable");
-
-# if 0
- g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
- channel->peer, message, channel->peer_fd, channel->offset);
-# endif
- PostThreadMessage (channel->peer, message,
- channel->peer_fd, channel->offset);
-#endif /* NATIVE_WIN32 */
-}
-
-#endif /* Old IO Channels */
-
#ifdef NATIVE_WIN32
int
#include <errno.h>
#include <sys/types.h> /* needed for sys/stat.h */
#include <sys/stat.h>
-#ifdef _MSC_VER
+#ifdef NATIVE_WIN32
#include <io.h> /* For _read() */
#endif
#include <ctype.h>
#include "glib.h"
+#ifdef NATIVE_WIN32
+#include <io.h> /* For _read */
+#endif
+
#define G_STRING_BLOCK_SIZE 512
typedef struct _GRealStringChunk GRealStringChunk;
return *(const gint*) v;
}
-#if 0 /* Old IO Channels */
-
-GIOChannel*
-g_iochannel_new (gint fd)
-{
- GIOChannel *channel = g_new (GIOChannel, 1);
-
- channel->fd = fd;
-
-#ifdef NATIVE_WIN32
- channel->peer = 0;
- channel->peer_fd = 0;
- channel->offset = 0;
- channel->need_wakeups = 0;
-#endif /* NATIVE_WIN32 */
-
- return channel;
-}
-
-void
-g_iochannel_free (GIOChannel *channel)
-{
- g_return_if_fail (channel != NULL);
-
- g_free (channel);
-}
-
-void
-g_iochannel_close_and_free (GIOChannel *channel)
-{
- g_return_if_fail (channel != NULL);
-
- close (channel->fd);
-
- g_iochannel_free (channel);
-}
-
-#undef g_iochannel_wakeup_peer
-
-void
-g_iochannel_wakeup_peer (GIOChannel *channel)
-{
-#ifdef NATIVE_WIN32
- static guint message = 0;
-#endif
-
- g_return_if_fail (channel != NULL);
-
-#ifdef NATIVE_WIN32
- if (message == 0)
- message = RegisterWindowMessage ("gdk-pipe-readable");
-
-# if 0
- g_print ("g_iochannel_wakeup_peer: calling PostThreadMessage (%#x, %d, %d, %d)\n",
- channel->peer, message, channel->peer_fd, channel->offset);
-# endif
- PostThreadMessage (channel->peer, message,
- channel->peer_fd, channel->offset);
-#endif /* NATIVE_WIN32 */
-}
-
-#endif /* Old IO Channels */
-
#ifdef NATIVE_WIN32
int
PTHREAD_LIB = -L$(PTHREADS) -lpthread
PTHREAD_INC = -I $(PTHREADS)
+OPTIMIZE = -g -O
+
################################################################
# Nothing much configurable below
GLIB_VER = 1.3
-CFLAGS = -g -O2 -I. -DHAVE_CONFIG_H
+CFLAGS = $(OPTIMIZE) -I. -DHAVE_CONFIG_H
all : \
glibconfig.h \
gutils.o
glib-$(GLIB_VER).dll : $(glib_OBJECTS) glib.def
- ./build-dll glib $(GLIB_VER) glib.def $(glib_OBJECTS) -lmsvcrt -lkernel32 -luser32 -ladvapi32 -lwsock32
+ ./build-dll glib $(GLIB_VER) glib.def $(glib_OBJECTS) -luser32 -lwsock32
glibconfig.h: glibconfig.h.win32
$(CP) glibconfig.h.win32 glibconfig.h
gmodule.o
gmodule-$(GLIB_VER).dll : $(gmodule_OBJECTS) gmodule/gmodule.def
- ./build-dll gmodule $(GLIB_VER) gmodule/gmodule.def $(gmodule_OBJECTS) -L. -lglib-$(GLIB_VER) -lmsvcrt -lkernel32 -luser32 -ladvapi32 -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
$(CC) $(CFLAGS) -Igmodule -c -DG_LOG_DOMAIN=g_log_domain_gmodule gmodule/gmodule.c
gthread.o
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) -lmsvcrt -lkernel32 -luser32 -ladvapi32 -lwsock32
+ ./build-dll gthread $(GLIB_VER) gthread/gthread.def $(gthread_OBJECTS) -L. -lglib-$(GLIB_VER) $(PTHREAD_LIB) -lwsock32
gthread.o : gthread/gthread.c gthread/gthread-posix.c
$(CC) $(CFLAGS) $(PTHREAD_INC) -DG_LOG_DOMAIN=\"GThread\" -c gthread/gthread.c
testglib.exe : glib-$(GLIB_VER).dll testglib.o
- $(CC) $(CFLAGS) -o testglib testglib.o -L. -lglib-$(GLIB_VER) -lmsvcrt $(LDFLAGS)
+ $(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).dll testgdate.o
- $(CC) $(CFLAGS) -o testgdate.exe testgdate.o -L. -lglib-$(GLIB_VER) -lmsvcrt $(LDFLAGS)
+ $(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).dll testgdateparser.o
- $(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER) -lmsvcrt $(LDFLAGS)
+ $(CC) $(CFLAGS) -o testgdateparser.exe testgdateparser.o -L. -lglib-$(GLIB_VER) $(LDFLAGS)
testgdateparser.o : testgdateparser.c
$(CC) -c $(CFLAGS) testgdateparser.c
# 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) -lgmodule-$(GLIB_VER) -lmsvcrt $(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) -lgmodule-$(GLIB_VER) -lmsvcrt $(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) -lgmodule-$(GLIB_VER) -lmsvcrt $(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) -lgmodule-$(GLIB_VER) -lmsvcrt
+ ./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) -lgmodule-$(GLIB_VER) -lmsvcrt
+ ./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
$(CC) $(CFLAGS) $(PTHREAD_INC) -c gthread/testgthread.c
clean:
- -rm config.h
- -rm glibconfig.h
- -rm gmodule/gmoduleconf.h
- -rm *.exe
- -rm *.o
- -rm *.dll
- -rm *.a
- -rm *.base
- -rm *.exp
+ -rm config.h glibconfig.h gmodule/gmoduleconf.h
+ -rm *.exe *.o *.dll *.a *.base *.exp