GIMP Plugins unter Windows kompilieren

Mit der im GIMP-Tutorial eingerichteten Entwicklungsumgebung lassen sich prinzipiell auch GIMP-Plugins für Windows kompilieren. Es empfiehlt sich jedoch dann, das bereits zur Verfügung stehende gimp-dev-Paket (Danke an elsamuko für den Hinweis) zur Erfüllung der notwendigen Abhängigkeiten zu verwenden: Download (32-bit) bzw. Download (64-bit)

Ansonsten können die Abhängigkeiten auch aus dem im GIMP-Tutorial zum Kompilieren verwendeten GIMP-Ordner C:\gimp\gimp-2.6.9\ nach einem ähnlichen Muster wie bei gegl und babl zusammengetragen werden.

Falls dann noch Fehlermeldungen auftauchen (die nicht auf fehlende Abhängigkeiten hinweisen), ist der Plugincode wahrscheinlich leider (noch) nicht plattformunabhängig und im Einzelfall (z.B. durch Anpassung des Makefiles, was aber weitere Anpassungen nötig machen kann) zu behandeln.

Lesenswert ist auch folgende ausführliche (englische) Anleitung zum Kompilieren von C-GIMP-Plugins unter Windows.

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.

GPG und Entropie

Zur sicheren Schlüsselgenerierung braucht GPG Zufallsdaten, die bei einem Desktop-System durch Tastatureingaben und Mausbewegungen abgefragt werden. Auf einem Server, zu dem man meist nur über SSH verbunden ist, kann dies zu einem kleinen Problem werden, wenn folgende Meldung während der Schlüsselgenerierung auftaucht:

Es sind nicht genügend Zufallswerte vorhanden. Bitte führen Sie andere Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann!

oder auf Englisch

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy!

Im Extremfall kann es mehrere Stunden dauern, bis GPG dann endlich fertig wird. Beschleunigen lässt sich dies effektiv über folgende Befehle (Ubuntu oder Debian vorausgesetzt):

aptitude install rng-tools
rngd -r /dev/urandom

Datei öffnen – Sicherheitswarnung deaktivieren

Wer kennt sie nicht, die für erfahrene User durchaus lästigen Popups von Windows nach dem Download der Installationsdatei eines Programms:

Datei öffnen – Sicherheitswarnung

Ja, ich will die Datei wirklich öffnen, deswegen habe ich sie doppelt angeklickt! Das Entfernen des Häkchens bei „Vor dem Öffnen dieser Datei immer bestätigen“ löst dieses Problem auch nicht, da Programme häufig nur einmal installiert werden und bei neuen Downloads die Meldung natürlich erneut aufpoppt.

Das Deaktivieren der Meldung hat Microsoft sehr gut versteckt, wahrscheinlich um unerfahrene Nutzer davon abzuhalten, dieses in meinen Augen Pseudo-Sicherheitsfeature zu deaktivieren.

So geht`s (in Windows 7):

  1. Editor für lokale Gruppenrichtlinien aufrufen über Start -> gpedit.msc -> Enter
  2. Im linken Bereich Benutzerkonfiguration -> Administrative Vorlagen auswählen
  3. Bereich Windows-Komponenten -> Anlagen-Manager auswählen
  4. In der rechten Liste nun „Aufnahmeliste für Dateitypen mit niedrigem Risiko“ auswählen
  5. Den dann erscheinenden Link „Richtlinieneinstellung bearbeiten“ anklicken
  6. Im nun erscheinenden Dialog kann über den Radiobutton „Aktiviert“ die Richtlinie aktiviert und bei Optionen die Endung „.exe“ (ohne Anführungszeichen) eingegeben werden
  7. Nach dem Klick auf OK haben die nervigen Popups (zumindest bei .exe-Dateien) ein Ende – andere Dateitypen lassen sich analog hinzufügen

Ubuntu 10.04 Lucid Lynx: „unexpected exit with status 0x0009“

Bei der Installation der aktuellen Ubuntu Version 10.04 Lucid Lynx auf einem aktuellen Desktop PC kam es (unter anderem) zu folgender Fehlermeldung:

unexpected exit with status 0x0009

Auch das Ausprobieren der Live-CD klappte nicht.

Schuld daran ist mal wieder ein „Feature“ der intern verbauten Intel Grafikkarte. PAVP (Protected Audio Video Path) nennt sich das Ganze:

to ensure a robust and secure content protection path for high-definition video playback including Blu-ray discs on the Microsoft Windows Vista* operating system (Quelle: Intel).

Ziemlich nutzlos also, vor allem wenn man Ubuntu installiert. Einfach im BIOS deaktivieren (PAVP Mode = Disabled setzen) und neustarten. Dann sollte es mit Testen bzw. Installieren von Ubuntu klappen.