mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-12 20:36:15 +01:00
77866eaf9b
2000-05-13 Tor Lillqvist <tml@iki.fi> * makefile.mingw.in * tests/makefile.mingw.in * build-dll: Rename makefile.cygwin(.in) to makefile.mingw(.in), which better describes what it is. Move the build of gmodule, gthread and gobject DLLs to makefiles in those directories. Move resource file handling and build number bump to build-dll, where it sits much cleaner. * README.win32 * Makefile.am (EXTRA_DIST): Update accordingly. * glib.h: Add G_PI, G_PI_2, G_PI_4, G_E, G_LN2, G_LN10 and G_SQRT2. M_PI etc aren't necessarily in <math.h> in strict ISO C implementations. * glib.def: Add g_strcanon. * gtree.c (g_tree_node_rotate_left): Remove unused variables. * gwin32.c (g_win32_opendir): Remove unneeded statement. gmodule: * makefile.mingw.in: New file, with gmodule stuff moved from ../makefile.mingw.in. * Makefile.am: Add to EXTRA_DIST, and add rule to make makefile.mingw. gobject: * makefile.mingw.in * gobject.def * gobject.rc.in: New files, for Win32 (mingw) build. * Makefile.am: Add to EXTRA_DIST. Add rules to produce the corresponding non-*.in files. * gtype.h: (Win32:) Mark _g_type_fundamental_last for export/import from DLL. gthread: * makefile.mingw.in: New file, with gthread stuff moved from ../makefile.mingw.in. * Makefile.am: Add to EXTRA_DIST, add rule to build makefile.mingw.
363 lines
13 KiB
Plaintext
363 lines
13 KiB
Plaintext
General
|
|
=======
|
|
|
|
For more information about the port or GLib, GTk+ and the GIMP to
|
|
native Windows, and pre-built binary packages, see
|
|
http://www.iki.fi/tml/gimp/win32/ . "Native" means that we use the
|
|
Win32 API only, and not any POSIX operating system emulation layer
|
|
except that provided by the Microsoft runtime C library. Additionally,
|
|
a pthreads emulation library is used.
|
|
|
|
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 gcc-2.95 or gcc-2.95.2 as
|
|
distributed by Mumit Khan, either as a mingw version (preferred), or
|
|
running under cygwin. 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 called "mingw".
|
|
|
|
To test the GLib functions, go to the tests subdirectory and enter
|
|
`nmake -f makefile.msc check` or `make -f makefile.mingw check`.
|
|
|
|
If you would want to use the cygwin tools to generate executables that
|
|
*do* use the cygwin runtime, the normal Unix configuration method
|
|
should work as if on Unix. But it won't produce DLLs. At least I
|
|
haven't succeeded in that.
|
|
|
|
With a little work, it might be possible to use the ./configure
|
|
mechanism also with a "mingw32" configuration.
|
|
|
|
The following preprocessor macro are used for conditional compilation
|
|
related to Win32:
|
|
|
|
- G_OS_WIN32 is defined when compiling for Win32, *and* without
|
|
any POSIX emulation, other that to the extent provided by the
|
|
bundled Microsoft C library (msvcrt.dll) and the pthreads-win32
|
|
library. For instance, pathnames are in the native Windows syntax.
|
|
|
|
- _WIN32 is defined by the compiler
|
|
|
|
The Win32 port uses the combination with both of those on. As
|
|
G_OS_WIN32 is defined in glibconfig.h, it is available to all source
|
|
files that use GLib (or GTk+, which uses GLib).
|
|
|
|
Additionally, there are the compiler-specific macros:
|
|
- _MSC_VER is defined when using the Microsoft compiler
|
|
- __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
|
|
used to check for _MSC_VER in some places where I really wanted to
|
|
check for the Microsoft C library, and those checks has now been
|
|
changed to G_OS_WIN32.
|
|
|
|
G_OS_WIN32 implies using the Microsoft C runtime MSVCRT.DLL.
|
|
|
|
Building software that use GLib or GTk+
|
|
=======================================
|
|
|
|
Unfortunately, even building software that just *use* GLib or GTk+
|
|
also require to have the right compiler set up the right way, so if
|
|
you intend to use gcc, follow the relevant instructions below in that
|
|
case, too.
|
|
|
|
Pthreads library
|
|
================
|
|
|
|
Before building you must get the pthreads library for Win32 from
|
|
http://sourceware.cygnus.com/pthreads-win32/. The pthreads-win32
|
|
snapshot from 1999-05-30 is the one that should be used. Edit the
|
|
location of the pthreads library and include files in makefile.msc or
|
|
makefile.mingw. The pthreads distribution includes the precompiled dll
|
|
and import libraries both for MSVC and gcc.
|
|
|
|
The pthreads for Win32 package that the thread support uses supposedly
|
|
isn't quite ready yet, and thus threads stuff should not be relied
|
|
upon for anything serious.
|
|
|
|
Where are the makefiles?
|
|
========================
|
|
|
|
If you are building from a CVS snapshot, you will not have any
|
|
makefile.msc or makefile.mingw file. You should copy the
|
|
corresponding makefile.msc.in or makefile.mingw.in file to that name,
|
|
and edit the line that sets GLIB_VER to the correct version number.
|
|
|
|
This is done automatically when an official distribution package is
|
|
built.
|
|
|
|
Building with MSVC
|
|
==================
|
|
|
|
If using the Microsoft toolchain, build with `nmake -f
|
|
makefile.msc`. Install with `nmake -f makefile.msc install`.
|
|
|
|
Building with gcc
|
|
=================
|
|
|
|
I use the latest and greatest gcc, gcc-2.95.2. 2.95 will also work.
|
|
Earlier version might, but you are on your own.
|
|
|
|
You can either use gcc running on cygwin, or the "pure" mingw
|
|
gcc. Using the latter is much easier. Just fetch the latest version of
|
|
gcc for mingw and the msvcrt runtime, currently from
|
|
ftp://ftp.nanotech.wisc.edu/pub/khan/gnu-win32/mingw32/snapshots/gcc-2.95.2-1/
|
|
. Download the three zip archives: the gcc-<version>-msvcrt,
|
|
mingw-msvcrt-<timestamp> and binutils-<timestamp>-msvcrt, and unpack
|
|
them in a suitable directory. Set up your PATH so that the gcc from
|
|
the bin directory that got created above is the one that gets
|
|
used. You can skip steps 1--5 below. Even if you run the mingw gcc,
|
|
you still want to have cygwin to run make in.
|
|
|
|
If you want to run a cygwin-based gcc, it gets much more
|
|
complicated. We still want gcc to produce code that does not use
|
|
cygwin, but the msvcrt runtime. Read the below instruction carefully
|
|
and understand them. If you don't understand or can't follow the
|
|
instructions, you probably shouldn't want to build GLib (or GTk+ or
|
|
GIMP) yourself anyway.
|
|
|
|
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 below.
|
|
|
|
Replace the specs file in
|
|
//g/gcc-2.95.2/H-i586-cygwin32/lib/gcc-lib/i586-cygwin32/2.95.2/specs
|
|
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 ================
|
|
|
|
fpos_t should be long long with MSVCRT.DLL:
|
|
|
|
================ cut here ================
|
|
--- stdio.h~ Thu Aug 19 02:47:42 1999
|
|
+++ stdio.h Mon Jan 17 21:58:20 2000
|
|
@@ -296,6 +296,11 @@
|
|
* it is fairly evident that the fpos_t type is a long (in CRTDLL.DLL).
|
|
* Perhaps an unsigned long? TODO?
|
|
+ * In MSVCRT.DLL it's a long long, however.
|
|
*/
|
|
+#ifdef __MSVCRT__
|
|
+typedef long long fpos_t;
|
|
+#else
|
|
typedef long fpos_t;
|
|
+#endif
|
|
|
|
int fgetpos (FILE* fileGetPosition, fpos_t* pfpos);
|
|
================ 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
|
|
cp crt2.o crtdll2.o //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) Get an updated set of binutils for cygwin B20.1 from
|
|
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/binutils-2.9.4-cygb20.tar.gz
|
|
Unpack that in your /cygnus/cygwin-b20 directory. The relevant
|
|
difference is: dlltool now parses GCC generated export directives
|
|
correctly for DATA items.
|
|
|
|
5) Whew. That hopefully should be it.
|
|
|
|
Next, go back to the GLib directory and build using `make -f
|
|
makefile.mingw`. 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>
|