Difference between revisions of "Hacking:Building/Windows"
(→Set your cross-compiling environment: Addin CPATH env variable.)
(Cross-Compiling GIMP under UNIX using crossroad)
|Line 273:||Line 273:|
3. Restart GIMP.
3. Restart GIMP.
== Building GIMP using Microsoft tools ==
== Building GIMP using Microsoft tools ==
Revision as of 12:02, 9 August 2014
A developer can build and develop GIMP using Windows. One reason to do so is to fix any GIMP bugs specific to the Windows platform. However, there is already a package of GIMP for Windows (at: GIMP Windows installers by Jernej Simončič.). A GIMP debugger or developer would still need to submit patches to the GIMP development team.
- 1 Building GIMP natively under Windows using MinGW
- 2 Cross-Compiling GIMP under UNIX using MinGW-w64
- 2.1 Create a separate environment prefix
- 2.2 Install mingw-w64
- 2.3 Install GIMP Dependencies
- 2.4 Set your cross-compiling environment
- 2.5 Build BABL
- 2.6 Build GEGL
- 2.7 Build any optional dependency
- 2.8 Build GIMP
- 2.9 Install On Windows
- 2.10 Troubleshooting
- 3 Cross-Compiling GIMP under UNIX using crossroad
- 4 Building GIMP using Microsoft tools
- 5 Building GIMP plug-ins using Microsoft tools
- 6 Packaging third-party GIMP plug-ins for Windows
Building GIMP natively under Windows using MinGW
MinGW is an open source Linux environment available on the Windows platform.
The following articles discuss building GIMP on and for the Windows platform using MinGW:
Groundwork by Partha Bagchi
Building GIMP for Windows by Partha Bagchi
Building GIMP and plug-ins for Windows by Jernej Simončič
Building GIMP for Linux and Windows by Barak Itkin
You find MinGW (the programming tool) and MSYS (a Bourne shell command line) at the MinGW website.
Cross-Compiling GIMP under UNIX using MinGW-w64
Experience shows that working with the MinGW environment on a UNIX machine provides a much faster compilation, and you are still able to compile for any Windows target (32 and 64 bits).
NOTE: the following procedure should be distribution-independent and does not rely on your package management system, even though it uses some OpenSuse packages. It would probably work on OSX or any other UNIX as well (add a note on the list below if you know this procedure works on another OS).
Has been known to work on at least: Linux Mint 15, Ubuntu 12.04LST and Mageia 2 distributions.
Source of the original procedure from an email by Victor Oliveira.
Create a separate environment prefix
You obviously don't want to mix your Windows binaries with your normal distribution (and also you want to avoid ever having to use root). For instance you can choose:
$ mkdir $HOME/w64/
$ cd $HOME/w64
If your distribution provides the mingw-w64 tools, you may install them with your package manager. Otherwise you can download directly on SourceForge the last daily snapshot from the project.
For instance if you are on Linux 64 bits and want to compile for Windows 64 bits, you should download mingw-w64-bin_x86_64-linux_20121031.tar.bz2. Note that you can install alongside mingw-w32-bin_x86_64-linux_20121031.tar.bz2 if you want to be able to cross-compile for Windows 32 bits as well.
$ tar xjf mingw-w64-bin_x86_64-linux_20121031.tar.bz2
This will extract all the cross-compiling tools and generate a prefix tree inside your $HOME/w64 directory.
Install GIMP Dependencies
The default environment provided by MinGW does not have the huge list of dependencies that GIMP requires. Fortunately the email linked above has bash script named grab-stuff.sh (which calls itself a python3 script named "download-mingw-rpm.py", so you have to download both and have python3), which downloads pre-compiled version of all needed dependencies for cross-compiling (it uses OpenSuse repositories as source, but it does not mean at all you need rpm support).
From the root of your cross-compiling prefix ($HOME/w64) run:
$ bash grab-stuff.sh
You will notice in particular a new usr/ folder, and inside i686-w64-mingw32/ and x86_64-w64-mingw32/ sub-folders.
Set your cross-compiling environment
1. Choose your target:
For building Windows 32 bits executables:
$ export HOST=i686-w64-mingw32
For building Windows 64 bits executables:
$ export HOST=x86_64-w64-mingw32
2. Create a dependencies prefix:
$ export DEP_PREFIX=$HOME/w64/usr/$HOST/sys-root/mingw
3. Create an installation prefix, that you chose earlier:
$ export PREFIX=$HOME/w64
4. You don't want any library linked from your normal Linux environment, so let's reset pkg-config:
$ export PKG_CONFIG_LIBDIR=
$ export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig:$DEP_PREFIX/lib/pkgconfig
$ export LD_LIBRARY_PATH=$PREFIX/lib:$DEP_PREFIX/lib
5. Used tools though may still use the old path as well, but preferably the downloaded MinGW.
NOTE: This step is useless if you installed MinGW-w64 from your distribution.
$ export PATH=$PREFIX/bin:$DEP_PREFIX/bin:$PATH
6. Let GEGLs and GIMPs configure scripts find JPEG, MNG and EXIF2 support. If you set this, you won't need the --without-libjpeg option in GIMPs configure step:
$ export C_INCLUDE_PATH=$DEP_PREFIX/include
7. Finally let's add some compilation flags:
$ export ACLOCAL_FLAGS="-I $DEP_PREFIX/share/aclocal"
$ export CFLAGS="-I$DEP_PREFIX/include -I$PREFIX/include"
$ export CPATH="$DEP_PREFIX/include:$PREFIX/include"
$ export LDFLAGS="-L$DEP_PREFIX/lib -L$PREFIX/lib"
NOTE: If you installed MinGW-w64 from your distribution, the "-L$DEP_PREFIX/lib" or "-I$DEP_PREFIX/include" will have to be replaced by your distribution default profile, likely respectively "-L/usr/x86_64-w64-mingw32/lib" and "-I/usr/x86_64-w64-mingw32/include".
8. You will probably want to save these values if you have to cross-compile again for Windows. The best is to save them in a file "env-64.sh" (and env-32.sh), that you can source at anytime.
You can use released versions if they have a version big enough. As the time of writing this, GIMP from git requires BABL and GEGL from git as well.
$ cd src/
$ git clone git://git.gnome.org/babl
$ cd babl
$ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no
$ make install
1. $ cd ..
2. $ git clone git://git.gnome.org/gegl
3. $ cd gegl
4. Checkout the right branch from your GEGL git repository.
- For GIMP 2.8:
$ git checkout gegl-0-2
- For the latest development version of GIMP:
$ git checkout master
5. $ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-docs --disable-glibtest
6. $ make
7. $ make install
Build any optional dependency
This step is not necessary if you compile GIMP with the minimum set of dependency as indicated at the next section.
Nevertheless if for instance, you needed compression support (hence be able to load and save your images in various compressed format), you would need zlib,libbzip2 and liblzma installed. In particular the cross-compilation environment described on this page has no pre-compiled liblzma. You would need to cross-compile it first yourself.
In my case xz-5.0.4 worked well.
$ cd ..
$ tar xf xz-5.0.4.tar.xz
$ rm xz-5.0.4.tar.xz
$ cd xz-5.0.4
$ ./configure --prefix=$PREFIX --host=$HOST
$ make install
Finally obviously in the GIMP configure step, remove the --without-liblzma option on the autogen.sh command line before compiling GIMP.
You should be able to do similar things for other optional features that you would want on your cross-compiled GIMP.
Alternatively there exists a patch to get compression support working in 32 bit builds.
Multi-Language support is installed with the grab-stuff.sh script. Due to a bug in the package mingw32-iso-codes-devel the pkgconfig program can't find the iso-codes package. In this case you will notice, that GIMPs autogen.sh reports
Language selection: no
and the finished GIMP build has no language selector listbox in Edit/Preferences/Interface. To solve this, copy $HOME/w64/usr/$HOST/sys-root/mingw/share/pkgconfig/iso-codes.pc to $HOME/w64/usr/$HOST/sys-root/mingw/lib/pkgconfig before executing autogen.sh or configure for GIMP. Note you have to do this for every value of $HOST you want to build (e.g. i686 and x86_64 architecture). Also merge the MinGW and GIMP build folders when installing it on Windows (see the Troubleshooting section).
$ cd ..
$ git clone git://git.gnome.org/gimp
$ cd gimp
$ ./autogen.sh --prefix=$PREFIX --host=$HOST --enable-introspection=no --disable-glibtest --disable-gtktest --disable-docs --without-libjpeg --disable-python --without-xmc --without-dbus --without-libzma
$ make install
Install On Windows
To test your compiled installation, I found nothing better than moving the whole tree (in my case $HOME/w64) into Windows, because libraries are dynamically linked, then run $HOME/w64/bin/gimp-2.9.exe under Windows.
If you really want to build a self contained GIMP, you should compile everything as static libraries. GIMP will probably still rely on some external files though, for instance what you find under $HOME/w64/share/gimp/2.0/. Maybe other things. But this will have to be tested if needed.
Running gimp-2.x.exe on Windows fails. Error messages about a missing entry point in libglib-2.0-0.dll or a missing bzip2.dll are shown.
The missing dll files are in the MinGW binary folder, which is separate from the GIMP folders.
To export the GIMP build to Windows properly, use the following steps:
1. On Windows create a folder for the GIMP build, like GIMP-Master.
2. Copy all files from $HOME/w64/$HOST/sys-root/mingw to the newly created folder.
3. Copy all files from your $PREFIX folder to the newly created folder. There are duplicate subfolders, for instance bin, share etc., in both directories. If your filemanager asks you to overwrite them, then confirm.
It's important to keep this order to ensure you overwrite older BABL and GEGL from the grab-stuff.sh script by the newer ones from your build.
At the end you have merged your MinGW installation and the GIMP build to a running GIMP on Windows build. (It also contains the unnecessary MinGW binaries, which are not needed anymore to run GIMP. But for testing purposes you have a running GIMP installation.)
Some fonts, like Sans, are shown improperly
See also the Bugzilla report.
The fontconfig package installation writes absolute paths of the building system to fonts.conf and conf.d/*.conf. When GIMP is installed on the Windows target system, these absolute paths become invalid.
The bug should be reported to the Fontconfig developers. Meanwhile do on the Windows target system:
1. Close GIMP.
2. Edit the file <GIMP installation folder>\etc\fonts\fonts.conf:
Replace the line
<include ignore_missing="yes">$a_directory/conf.d</include> by
3. Restart GIMP.
Cross-Compiling GIMP under UNIX using crossroad
This is basically the same procedure as "#Cross Compiling GIMP under UNIX using MinGW-w64", but wrapped in a tool called `crossroad`, which makes it easier because there is no "magic" to remember (like the host and target syntaxes, etc.) and also because the dependency handling is done through an installer tool, similar to usual package managers. Check this [email](https://mail.gnome.org/archives/gimp-developer-list/2013-October/msg00108.html) where the procedure is explained for a full GIMP build with crossroad, and install [crossroad](https://pypi.python.org/pypi/crossroad) from pypi.
Building GIMP using Microsoft tools
Microsoft Visual Studio comes with its own C compiler. Most of GIMP development is done with the GCC and its MinGW Windows port.
Unfortunately both are not fully compatible, so integrating GCC into the Visual Studio build chain has its flaws, even while it might work in some points.
Because of this you are recommended to use MinGW for building GIMP on Windows.
Building GIMP plug-ins using Microsoft tools
Packaging third-party GIMP plug-ins for Windows
Users on the Windows and Mac OSX platforms expect software to be packaged in a self-installing file (an installer). Even though GIMP plugins (whether scripts in Python or Scheme, or executables in the C language) are relatively easy to install, you might want to package them using an installer such as Inno Setup.