Tor Lillqvist <tml@iki.fi>
Hans Breuer <hans@breuer.org>

The general parts, and the section about gcc and autoconfiscated build
are by Tor Lillqvist. The sections about MSVC build is by Hans Breuer.

General
=======

For prebuilt binaries (DLLs and EXEs) and developer packages (headers,
import libraries) of GLib, GTK+, GIMP etc for Windows, surf to
http://www.gimp.org/win32/downloads.html . They are for "native"
Windows meaning they use the Win32 API and Microsoft C runtime library
only, no POSIX (Unix) emulation layer (like Cygwin).

To build GLib on Win32, you can use either gcc or the Microsoft
compiler and tools. Both the compiler from MSVC 5.0 and from MSVC 6.0
have been used successfully.

But note that to just *use* GLib on Windows, there is no need to build
it yourself. Prepackaged runtime and developer packages are available
from the webiste above. On Unix, it is quite normal that system admins
build and install libraries like GLib themselves without bothering to
look for prebuilt packages, especially if prebuilt packages tend to
use installation paths that don't conform to local customs.

On Windows setting up a correct build environment can be quite a task,
especially if you are used to just type "./configure; make" on Unix,
and expect things to work as smoothly on Windows.

The following preprocessor macros are to be used for conditional
compilation related to Win32 in GLib-using code:

- G_OS_WIN32 is defined when compiling for native Win32, without
  any POSIX emulation, other than to the extent provided by the
  bundled Microsoft C library (msvcrt.dll).

- G_WITH_CYGWIN is defined if compiling for the Cygwin
  environment. Note that G_OS_WIN32 is *not* defined in that case, as
  Cygwin is supposed to behave like Unix. G_OS_UNIX *is* defined when
  compiling for Cygwin.

- G_PLATFORM_WIN32 is defined when either G_OS_WIN32 or G_WITH_CYGWIN
  is defined.

These macros are defined in glibconfig.h, and are thus (indirectly)
available in all source files that include <glib.h> or GTK+ headers.

Additionally, there are the compiler-specific macros:
- __GNUC__ is defined when using gcc
- _MSC_VER is defined when using the Microsoft compiler

G_OS_WIN32 implies using the Microsoft C runtime MSVCRT.DLL. GLib is
not known to work with the older CRTDLL.DLL runtime, or the static
Microsoft C runtime libraries LIBC.LIB and LIBCMT.LIB. It apparently
does work with the debugging version of MSVCRT.DLL,
MSVCRTD.DLL. Presumably, if compiled with MSVC.NET, it also works with
MSVCR70.DLL. Please note that it's dubious if you would be allowed by
the license to distrubute a GLib linked to MSVCR70.DLL, as it is not
part of the operating system, but of the MSVC product. MSVCRT.DLL is
part of Windows.

Building software that use GLib or GTK+
=======================================

Even building software that just *uses* 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.

Tor uses gcc with the -mms-bitfields flag (used to be called
-fnative-struct in gcc 2.x), which means that in order to use the
prebuilt DLLs (especially of GTK+), if you compile your code with gcc,
you *must* also use that flag. This flag means that the struct layout
rules are identical to those used by MSVC. This is essential if the
same DLLs are to be usable both from gcc- and MSVC-compiled code. This
definitely is something one wants.

Building GLib
=============

Again, first decide whether you really want to do this.

Before building GLib you must also have the libiconv library and GNU
gettext. Get prebuilt binaries of libiconv (1.9.1 or newer), and
gettext-runtime (0.13.1 or newer) from www.gimp.org/win32/downloads.html.

Autoconfiscated build (with gcc)
================================

Tor uses gcc 3.3.1. Somewhat earlier or later versions presumably also
work.

You can either use gcc running on Cygwin, or the "pure" mingw
gcc. Using the latter might work better, or at least did at some
point. You should be running Cygwin, or maybe cross-compiling from
real Unix, for the configure script to work, obviously. It is also
possible to use MSYS.

If you want to use mingw's gcc, install gcc, Win32 headers and
binutils from www.mingw.org. Set up your PATH so that the mingw gcc is
the one that gets used, and not Cygwin's gcc. Even if you run the
mingw gcc, you still want to have Cygwin to run make in.

Tor invokes configure using:

CC='gcc -mcpu=pentium3' CPPFLAGS='-I/target/include' 
  CFLAGS=-O3 LDFLAGS='-L/target/lib' ./configure --with-libiconv 
  --disable-gtk-doc --prefix=/target --host=i386-pc-mingw32 

(on a single line). The /target/include mentioned contains the header
files for libintl and libiconv, and the (import) libraries are in
/target/lib. This happens to be in the same tree where he configures
GLib to be installed, but doesn't have to be.

Please note that the ./configure mechanism should not blindly be used
to build a GLib to be distributed to other developers because it
produces a compiler-dependent glibconfig.h (and config.h, but that
shouldn't matter, as it isn't seen by GLib-using applications). For
instance, the typedef for gint64 is long long with gcc, but __int64
with MSVC.

Except for this and a few other minor issues, there really shouldn't
be any reason to distribute separate GLib headers and DLLs for gcc and
MSVC users, as the compilers generate code that uses the same C
runtime library. The DLL generated by either compiler is binary
compatible with the other one. Thus one either has to manually edit
glibconfig.h afterwards, or use the supplied glibconfig.h.win32 which
has been produced by running configure twice, once using gcc and once
using MSVC, and merging the resulting files with diff -D.

For GLib, the DLL is called
libglib-2.0-0.dll, and the import libraries libglib-2.0.dll.a and
glib-2.0.lib. Note that the "2.0" is part of the "basename" of the
library, it is not something that libtool has tucked on. The -0 suffix
is the value of "LT_CURRENT - LT_AGE". The 0 is *not* simply the micro
version number of GLib, although, for GLib 2.2.0, it happens to be the
same. The LT_CURRENT - LT_AGE value will on purpose be kept as zero as
long as binary compatibility is maintained. For the gory details, see
configure.in and libtool documentation.

If you want to run the Cygwin-hosted gcc, and still want to produce
code that does not use Cygwin, but the msvcrt runtime, in theory it
should work to use the -no-cygwin flag, but Tor hasn't tested that
lately.

If you would want to use the Cygwin tools to generate a GLib that
*does* use the Cygwin runtime, the normal Unix configuration method
should work as if on Unix. Note that successfully producing shared
libraries (DLLs) for Cygwin most probably requires you to have a very
new libtool. (And a new libtool probably requires rather new autoconf
and automake.) Tor hasn't tested this in a while, either.

Cross-compiling
===============

It is possible to build GLib using a cross compiler. See
docs/reference/glib/html/glib-cross-compiling.html (part of the
GLib reference manual) for more information.

Building with MSVC
==================

If you are building from a CVS snapshot, you will not have any
makefile.msc files. You should copy the corresponding makefile.msc.in
file to that name, and replace any @...@ strings with the correct
value.

This is done automatically when an official GLib source distribution
package is built, so if you get GLib from a source distribution
package, there should be makefile.msc files ready to use (after some
editing).

The hand-written makefile.msc files, and the stuff in the "build"
subdirectory, produce DLLs and import libraries that match what the
so-called autoconfiscated build produces.

All the MSVC makefiles are for the command line build with nmake.  If
you want to use the VC-UI you can simply create wrapper .dsp makefiles
(read the VC docs how to do so).

Some modules may require Perl to auto-generate files. The goal (at
least Hans's) is to not require any more tools.

Build with:

nmake -f makefile.msc
  or
nmake -f makefile.msc DEBUG=1

[
 The former will create 'release' versions of the DLLs. If you
 plan to distribute you DLLs please use this command. The latter 
 will create DLLs with debug information _and_ link them with
 msvcrtd.dll instead of msvcrt.dll. 
 Beware: There are known problems with mixing DLLs in one 
 application, which are build against different runtimes. 
 Especially the index-to-file mapping used by 'unix-style' file
 operation - _open() _pipe() etc. - breaks sometimes in strange 
 ways (for example the Gimp plug-in communication).
]

Required libraries (not build from cvs)
------------------
  libintl (gnu-intl), libiconv
  libtiff, libpng, zlib, libjpeg

are available pre-built from the website mentioned above.

Versioning
----------
Instead of the Unix and auto* way of tracking versions and resolving
dependencies (configure; make; make install) involving autoconf,
automake, libtool and friends the MSVC build uses a different
approach.

The core of it's versioning is the file build/win32/module.defs.
It contains entries of the form MODULE_VER, e.g.:

	GLIB_VER = 2.0
	LIBICONV_VER = 1.3

and the placement of these modules defined as MODULE, e.g.:

	GLIB = $(TOP)/glib
	LIBICONV = $(TOP)/libiconv-$(LIBICONV_VER)

whereas TOP is defined as the relative path from the respective
module directory to your top build directory. Every makefile.msc
needs to define TOP before including the common make file part
make.msc, which than includes module.defs, like:

TOP = ../..
!INCLUDE $(TOP)/glib/build/win32/make.msc

(Taken from gtk+/gdk/makefile.msc)

With this provision it is possible to create almost placement
independent makefiles without requiring to 'install' the libraries and
headers into a common place (as it is done on Unix, and as Tor does
when producing his zipfiles with prebuilt GLib, GTK+ etc).

Special Files
-------------
	config.h.win32.in : @XXX_MAJOR_VERSION@ needs to be replaced by
the current version/build number. The resulting file is to be saved
as 'config.h.win32'. This should be automatically done if a package
gets build on the Unix platform.

	makefile.msc.in : @XXX_MAJOR_VERSION@ to be replaced. Save as
makefile.msc.

	<module>.def : every function which should be used from the outside of
a dll needs to be marked for 'export'. It is common that one needs to change 
these files after some api changes occured. If there are variables to be
exported another mechanism is needed, like :

	#ifdef G_OS_WIN32
	#  ifdef GDK_COMPILATION
	#    define GDKVAR __declspec(dllexport)
	#  else
	#    define GDKVAR extern __declspec(dllimport)
	#  endif
	#else
	#  define GDKVAR extern
	#endif



Directory Structure
-------------------
all modules should be build in a common directory tree otherwise you 
need to adapt the file 'module.defs'. They are listed here in increasing
dependencies order.

<common rootdir without spaces>
  |
  +- glib
  |   |
  |   +- build          : [this module lives in the cvs root dir]
  |   |   +- win32
  |   |       .\module.defs : defines (relative) locations of the headers
  |   |                       and libs and version numbers to be include 
  |   |                       in dll names
  |   |       .\make.msc    : include by almost every 'makefile.msc'
  |   |
  |   | .\README.WIN32  : more information how to build
  |   | .\glibconfig.h.win32.in : similar to config.h.win32.in
  |   | .\makefile.msc  : master makefile, sub dir makefiles should work 
  |   |
  |   +- glib
  |   +- gmodule
  |   +- gthread        : does _not_ depend on pthread anymore
  |   +- gobject
  |
  +- pango
  |   +- pango          : 'native' build does not require extra libs and
  |   |                 includes the minimal required text renderer
  |   |                 (there is also a currently slightly broken FreeType2 
  |   |                 based implementation for win32)
  |   +- modules (not yet build)
  |
  +- atk
  |   +- atk
  |       .\makefile.msc : build here
  |
  +- gtk+
  |   | .\config.h.win32 : for all the below
  |   |
  |   +- gdk-pixbuf
  |   |   .\gdk_pixbuf.rc.in : version resource for the DLLs. Needs
  |   |                 to be converted (filled with version info)
  |   |                 as described above.
  |   |
  |   +- gdk
  |   |   | .\makefile.msc : some auto-generation is needed to build in the
  |   |   |             in the subdirectory 
  |   |   +- win32
  |   |
  |   +- gtk

  |
  +- gimp
  |   .\makefile.msc    : master makefile to build The Gimp. The makefiles
  |                     from the sub dirs should work stand alone, but than
  |                     the user needs to know the build order

  |
  +- dia                : additionally depends on libart_lgpl (in cvs)
      |                 and libxml2 ( see http://www.xmlsoft.org/ )
      +- lib
      +- app
      +- objects
      +- plug-ins
          +- python

