GIMP unter Windows kompilieren

Um eine aktuelle Version (derzeit 2.6.9) des Grafikbearbeitungsprogramms GIMP (GNU Image Manipulation Program) unter Windows selbst zu kompilieren, benötigt man eine ganze Reihe an Software sowie diverse Software-Bibliotheken. Im Gegensatz zu Linux bringt Windows hier von Haus aus leider recht wenig selbst mit.

1. MinGW

MinGW (Minimalist GNU for Windows) ist die Umgebung, in der wir GIMP kompilieren werden. Die aktuelle Version (derzeit 5.1.6) kann von Sourceforge heruntergeladen werden: Download

Bei der Installation von MinGW benötigen wir die MinGW base tools, MinGW Make und den g++ compiler.Man kann natürlich auch einfach alle Komponenten installieren, um für andere Projekte mit z.B. Java schon jetzt gerüstet zu sein. Am besten auch das Standardverzeichnis C:\MinGW beibehalten, da die nachfolgenden Beschreibungen und Skripte dies voraussetzen und ansonsten angepasst werden müssten.

2. MSYS

MSYS (Minimal System) ist eine Reihe von GNU Programmen, die zum Kompilieren benötigt werden, wie z.B. bash, make, grep, etc. – und wird jetzt als nächstes in der Version 1.0.11 heruntergeladen und in sein Standardverzeichnis C:\msys\1.0 installiert: Download

Nach der Installation erscheint ein Konsolenfenster, dessen Fragen wie folgt beantwortet werden:

  1. Do you wish to continue with the post install? -> y
  2. Do you have MinGW installed? -> y
  3. Where is your MinGW installation? -> c:/mingw (Achtung, hier nicht den Backslash „\“ verwenden!)

Alle neueren Versionen von MSYS sind noch nicht als Paket verfügbar und daher deutlich umständlicher zu installieren. Version 1.0.11 reicht für unsere Zwecke aber vollkommen aus.

3. Perl

Weiterhin benötigen wir noch Perl, z.B. von ActivePerl von ActiveState: Download

Hier bitte das zur Systemarchitektur passende Paket auswählen (32bit, x86 oder 64bit, x64), ansonsten kann jede Version gewählt werden (z.B. aktuelle stable Version 5.10.1.1007) und in C:\Perl installieren.

Um sicherzustellen, dass Perl in der Kommandozeile verwendet werden kann, müssen noch Umgebungsvariablen gesetzt werden. Diese sind bei Windows 7 unter Systemsteuerung -> System und Sicherheit -> System -> Erweiterte Systemeinstellungen -> Umgebungsvariablen zu erreichen.

Bei den Benutzervariablen wird hier entweder eine neue Variable PATH angelegt und gefüllt bzw. falls diese existiert mit folgendem Inhalt ergänzt:

c:\mingw;C:\Mingw\bin;C:\mingw\mingw32\bin; c:\msys\1.0\bin;c:\perl\bin

Weiterhin wird hier noch die Variable PKG_CONFIG_PATH angelegt und auf

C:\MinGW\lib\pkgconfig

gesetzt. Dies wird später noch benötigt.

Falls man sich bei der Installation von MinGW oder MSYS für andere Pfade entschieden hat, muss man diese Werte natürlich sinngemäß anpassen. In der Eingabeaufforderung von Windows (zu erreichen über Start -> cmd.exe -> Enter) kann durch Eingabe von

perl

die Funktion von Perl getestet werden. Wenn keine Fehlermeldung erscheint, hat es funktioniert (mit Strg+C abbrechen).

4. wget und unzip für Windows

Die Windowsversion von wget kann hier heruntergeladen werden: Download

Die wget.exe aus dem Archiv in das Verzeichnis C:\MinGW entpacken.

Die Windowsversion von unzip kann hier heruntergeladen werden: Download

Den ganzen Inhalt des Archivs in das Verzeichnis C:\MinGW entpacken.

5. GIMP Quelltext

Der Quelltext der aktuellen GIMP-Version (stable, 2.6.9) kann von folgendem FTP-Server heruntergeladen werden: Download

Den heruntergeladenen Quelltext entpacken wir nach C:\gimp (Order ggf. vorher anlegen) – durch die im Archiv enthaltene Ordnerstruktur liegen diese nun in folgendem Ordner: C:\gimp\gimp-2.6.9

6. Grundlegende Bibliotheken

Nun verwenden wir eine Kombination der soeben installierten Tools wget und unzip, um grundlegende Bibliotheken für das Kompilieren von GIMP zu installieren. Über ein Skript wird der Download und die Installation dieser Bibliotheken stark vereinfacht, da man diese ansonsten manuell herunterladen und entpacken müsste. Die untenstehende Version des Skripts basiert auf einem veralteten Tutorial zum Kompilieren von GIMP.


#!/bin/sh

MINGW="/mingw/"
TMP_DIR="c:/temp"

GLIB_BASE="http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.22/"
GLIB_PACKAGES="glib_2.22.5-1_win32 glib-dev_2.22.5-1_win32"

GTK_BASE="http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.20/"
GTK_PACKAGES="gtk+-bundle_2.20.0-20100406_win32"

GTK_DEP_BASE="http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/"
GTK_DEP_PACKAGES="gettext-tools-0.17 gettext-runtime-0.17-1 gettext-runtime-dev-0.17-1 pkg-config_0.23-3_win32 libiconv-1.9.1.bin.woe32"

LIBART_BASE="ftp://ftp.gnome.org/pub/gnome/binaries/win32/libart_lgpl/2.3"
LIBART_PACKAGES="libart_lgpl-2.3.17 libart_lgpl-dev-2.3.17"

MINGW_BASE="http://heanet.dl.sourceforge.net/sourceforge/gnuwin32/"
MINGW_PACKAGES="libpng-1.2.37-bin libpng-1.2.37-dep libpng-1.2.37-lib jpeg-6b-4-bin jpeg-6b-4-dep jpeg-6b-4-lib tiff-3.8.2-1-bin tiff-3.8.2-1-lib freetype-2.3.5-1-bin freetype-2.3.5-1-lib zlib-1.2.3-bin zlib-1.2.3-lib libgw32c-0.4-lib libiconv-1.9.2-1-bin libiconv-1.9.2-1-dep libiconv-1.9.2-1-lib"

EXPAT_BASE="ftp://ftp.jclark.com/pub/xml/"
EXPAT_PACKAGE="expat"
EXPAT_DLL="expat/bin/xmltok.dll"

cd $TMP_DIR

echo "Downloading glib packages..."
for PACKAGE in $GLIB_PACKAGES;
do
if [ -e "$PACKAGE.zip" ]; then
echo "  Already there - extracting $PACKAGE.";
else
echo "  Getting $PACKAGE.";
wget "$GLIB_BASE/$PACKAGE.zip";
fi
echo "  Extracting $PACKAGE.";
unzip -o -q "$PACKAGE.zip" -d $MINGW;
done
echo "OK"

echo "Downloading GTK dependency packages..."
for PACKAGE in $GTK_DEP_PACKAGES;
do
if [ -e "$PACKAGE.zip" ]; then
echo "  Already there - extracting $PACKAGE.";
else
echo "  Getting $PACKAGE.";
wget "$GTK_DEP_BASE/$PACKAGE.zip";
fi
echo "  Extracting $PACKAGE.";
unzip -o -q "$PACKAGE.zip" -d $MINGW;
done
echo "OK"

echo "Downloading GTK packages..."
for PACKAGE in $GTK_PACKAGES;
do
if [ -e "$PACKAGE.zip" ]; then
echo "  Already there - extracting $PACKAGE.";
else
echo "  Getting $PACKAGE.";
wget "$GTK_BASE/$PACKAGE.zip";
fi
echo "  Extracting $PACKAGE.";
unzip -o -q "$PACKAGE.zip" -d $MINGW;
done
echo "OK"

echo "Downloading libart_lgpl packages..."
for PACKAGE in $LIBART_PACKAGES;
do
if [ -e "$PACKAGE.zip" ]; then
echo "  Already there - extracting $PACKAGE.";
else
echo "  Getting $PACKAGE.";
wget "$LIBART_BASE/$PACKAGE.zip";
fi
echo "  Extracting $PACKAGE.";
unzip -o -q "$PACKAGE.zip" -d $MINGW;
done
echo "OK"

echo "Downloadung GnuWin32 packages..."
for PACKAGE in $MINGW_PACKAGES;
do
if [ -e "$PACKAGE.zip" ]; then
echo "  Already there - extracting $PACKAGE.";
else
echo "  Getting $PACKAGE.";
wget "$MINGW_BASE/$PACKAGE.zip";
fi
echo "  Extracting $PACKAGE.";
unzip -o -q "$PACKAGE.zip" -d $MINGW;
done
echo "OK"

echo "Downloading and installing expat"
if ! [ -e "$EXPAT_PACKAGE.zip" ]; then wget -q "$EXPAT_BASE/$EXPAT_PACKAGE.zip"; fi
unzip -o -q "$EXPAT_PACKAGE.zip" -d .
cp $EXPAT_DLL $MINGW/bin
echo "OK"

echo "Freetype"
cp -Rp $MINGW/include/freetype2/freetype $MINGW/include/freetype

Dieses Skript in C:\gimp\gimp-dep.sh platzieren (kann auch hier heruntergeladen werden) und ein leeres Verzeichnis C:\temp anlegen. Nach dem Starten von MSYS können wir über folgende Befehle in der MSYS-Konsole das Skript starten:

cd /c/gimp
sh gimp-dep.sh

Wenn alles glattgeht, lädt das Skript die benötigten Pakete nach C:\temp herunter und entpackt sie automatisch nach C:\MinGW.

7. pthreads

Zusätzlich zu den soeben installierten Bibliotheken benötigen wir außerdem noch pthreads.

Wir laden also pthreads in der aktuellen Version 2.8.0 herunter: Download

Aus diesem Archiv benötigen wir die pthread.h und die sched.h welche wir nach C:\mingw\include\ kopieren.

8. BABL und GEGL

Nun zu den beiden letzten Komponenten, die wir selbst kompilieren werden: babl und gegl. Da gegl auf babl basiert, holen wir uns zuerst babl in der Version 0.1.2: Download

Das Archiv wird wieder wie gewohnt nach C:\gimp\entpackt, so dass wir diese Ordnerumgebung erhalten: C:\gimp\babl-0.1.2

Um einen Compiler-Fehler zu verhindern, kommentieren wir in den for-Schleifen in der Datei concurrency-stress-test.c im Ordner C:\gimp\babl-0.1.2\tests alle pthread-Funktionen aus, so dass es ungefähr so aussieht:

[...]
for (i = 0; i < N_THREADS; i++)
{
//     pthread_create (&threads[i],
//                     NULL, /* attr */
//                     babl_fish_path_stress_test_thread_func,
//                     NULL /* arg */);
}

/* Wait for them all to finish */
for (i = 0; i < N_THREADS; i++)
{
//      pthread_join (threads[i],
//                    NULL /* thread_return */);
}
[...]

Kompiliert wird das Ganze in der MSYS Konsole so (die auftretenden Warnungen wegen nicht verwendeter Variablen kann man ignorieren):

cd /c/gimp/babl-0.1.2/
./configure
make
make install

Da „make install“ nicht so richtig funktioniert, müssen die so erhaltenen Dateien aus C:\gimp\babl-0.1.2 manuell kopiert werden:

  • Das Verzeichnis babl komplett nach C:\mingw\include\, so dass dort C:\mingw\include\babl entsteht
  • Alle Headerdateien *.h aus dem Verzeichnis babl nochmal direkt nach C:\mingw\include
  • Das Verzeichnis .libs aus babl nach C:\mingw\lib\ kopieren, so dass dort C:\mingw\lib\.libs entsteht
  • Die Datei libbabl-0.1.la aus babl nach C:\mingw\lib\
  • Die Datei babl.pc aus dem Stammverzeichnis von babl nach C:\mingw\lib\pkgconfig\

Damit sind alle Voraussetzungen erfüllt, um das gleiche Spiel mit gegl durchzuziehen: Download

Wie vorher nach C:\gimp\ entpacken, und dann wieder in der MSYS Konsole kompilieren (dauert eine Weile):

cd /c/gimp/gegl-0.12/
./configure
make
make install

Auch die hier erhaltenen Dateien müssen wieder aus C:\gimp\gegl-0.1.2 manuell kopiert werden:

  • Das Verzeichnis gegl komplett nach C:\mingw\include\, so dass dort C:\mingw\include\gegl entsteht
  • Alle Headerdateien *.h aus dem Verzeichnis gegl nochmal direkt nach C:\mingw\include
  • Alle Headerdateien *.h aus den Unterverzeichnissen gegl/buffer, gegl/graph, gegl/module, gegl/operation, gegl/process und gegl/property-types nochmal direkt nach C:\mingw\include
  • Das Verzeichnis gegl/operation nach C:\mingw\include, so dass dort C:\mingw\include\operation entsteht
  • Das Verzeichnis .libs aus gegl nach C:\mingw\lib\ kopieren, so dass es dort in das von babl vorhandene C:\mingw\lib\.libs integriert wird
  • Die Datei libgegl-0.1.la aus gegl nach C:\mingw\lib\
  • Die Datei gegl.pc aus dem Stammverzeichnis von gegl nach C:\mingw\lib\pkgconfig\

9. intltool

Update: intltool muss noch auf den neuesten Stand gebracht werden, damit das Kompilieren von GIMP funktioniert.

http://ftp.gnome.org/pub/gnome/sources/intltool/0.40/
Tarball downloaden und in c:\MingW in eigenen Pfad entpacken.

Msys starten und
cd /mingw/intltool-0.40.6
./configure
make
make install

Danke an herrgismo für diese Anmerkung!

10. Endlich GIMP kompilieren

Wenn bis hierher alles glatt gegangen ist, können wir nun endlich GIMP (ohne Python) kompilieren. Wer gern Python mag, kann Python installieren (analog wie Perl) und die Konfigurationsanweisung weglassen. Wie immer in der MSYS Konsole folgende Befehle ausführen (nach „make“ + Enter am besten Kaffeetrinken gehen):

cd /c/gimp/gimp-2.6.9/
./configure --disable-python
make
make install

Gestartet werden kann GIMP dann über die erzeugte Executable: C:\msys\1.0\local\bin\gimp-2.6.exe
GIMP 2.6 unter Windows kompiliert und gestartet

Viel Spaß! 🙂

P.S.: Habe gerade darüber nachgedacht, dass man sich vielleicht einen Großteil der Hin- und Her-Kopiererei sparen kann, wenn man die PATH-Variable geschickt erweitert. Werde ich bei Gelegenheit mal überprüfen.