Cross-compiling Gwyddion for MS Windows under Linux is quite similar to normal Unix compilation with certain additional setup and extra steps. Although the process is quite smooth the initial setup may seem a bit complicated. If, in addition, you are not familiar with the normal Unix compilation you might wish to start with that and attempt cross-compilation once you familiarise yourself with the basic procedure.
These instructions describe compilation under Fedora using its MinGW cross-compilation support as this is what Gwyddion developers use. In general, the instructions work on the current version of Fedora. Compilation on other versions and other RedHat-based distributions (CentOS, Scientific Linux, …) should be similar and relatively straightforward, possibly with some tweaks. Building on, for instance, openSUSE will require modifications. Reports of success (or failure) of cross-compilation of Gwyddion in other distributions and environments and namely improvements to these instructions are welcome.
Full cross-compilation has the following steps:
A script is available that automatically performs all the steps, as described below.
Before the first compilation you must set up the cross-compilation environment. This has to be done only once.
Run as root:
dnf install mingw{32,64}-{gcc-c++,gtk2,libxml2,minizip,fftw,gtkglext,libwebp,OpenEXR}
to install the necessary mingw32 and mingw64 packages. Several more packages will be installed as dependencies of those explicitly given here. Note that, technically, some of the packages are optional dependencies and you can build a MS Windows installer without them (after some adjustments). Neverhteless the standard installers include these packages and the cross-compilation scripts expect them to be present by default.
MinGW versions of a few packages used by Gwyddion are not available in Fedora yet (or any more), or there may be some patches we would like to include but they are not in Fedora packages. This includes HDF5 and gtksourceview2 (only used by pygwy).
You can build these additional packages using the patches and spec
files at
https://sourceforge.net/projects/gwyddion/files/mingw32-cross-compile/,
however, it should be much easier to just install them using
dnf. For this, download and install the
gwyddion.net repository configuration package.
The installation brings two repository configurations, for the program and for
the extra MinGW packages. By default only the gwyddion
repository is enabled. Enable gwyddion-manually
by editing
/etc/yum.repos.d/gwyddion-mingw.repo
for the MinGW
packages. Run the following command to install them:
dnf install mingw32-{hdf5,gtksourceview2}
Be warned the repo overrides a few Fedora MinGW packages to keep them at specific versions.
Wine is the MS Windows compatibility layer/emulator for Unix. It is used to run NSIS that creates the executable Gwyddion Windows installer. Wine can also be used to run and test the cross-compiled Gwyddion, as described below.
Run
dnf install wine
to install Wine.
Nullsoft scriptable install system (NSIS) is used to create the Gwyddion installer. This is a MS Windows program, therefore, it is installed under Wine. A cross-compiled version of NSIS might be available in the distribution but we have found the original more reliable.
Download NSIS from its web page and run
wine nsis-3.06-setup.exe
replacing 3.06 with the actual version. Version 3.06 is the oldest NSIS 3 that has been tested, but any version probably works.
To compile pygwy you need to install Python into Wine. The steps are the same as if you just want to use pygwy, except that all packages listed in Enabling pygwy need to be installed using msiexec:
wine msiexec /i python-2.7.16.msi
wine msiexec /i pygobject-2.28.3.win32-py2.7.msi
wine msiexec /i pycairo-1.8.10.win32-py2.7.msi
wine msiexec /i pygtk-2.24.0.win32-py2.7.msi
or similarly.
Support scripts and data are available in
mingw32-cross-compile
module in the Gwyddion
subversion repository. Run
svn checkout http://svn.code.sf.net/p/gwyddion/code/trunk/mingw32-cross-compile
to check it out from the repository.
The most important tool you obtain is the cross-build-32 (or cross-build-64)
script that automates all the cross-compilation steps. Before you use
it for the first time, review file setup32
that
defines where various things are located (or
setup64
for the 64-bit target). The default
contents looks as follows:
source_dir=$HOME/Projects/Gwyddion/gwyddion-mingw mingw_prefix=/usr/i686-pc-mingw32/sys-root/mingw target_prefix=$HOME/opt/gwyddion-mingw32 python_dir=$HOME/.wine/drive_c/Python27 nsis_compiler=C:\\Program\ Files\ \(x86\)\\NSIS\\makensis.exe
Variable source_dir
specifies the location of the
unpacked or checked-out Gwyddion source code and it will likely need to
be adjusted. Variable target_prefix
specifies the
installation directory (staging area) for the cross-compiled Gwyddion.
The default value should be reasonable and you do not need to change it
unless you want to. The remaining variables,
mingw32_prefix
, nsis_compiler
and python_dir
,
specify the location of MinGW files, NSIS compiler and Win32 Python,
respectively. They do not need to be changed from the default values
under normal circumstances although NSIS can be installed in either
Program Files (x86)
or
Program Files
by default depending on Wine
configuration. Note setup
is read by shell so
there must not be any spaces around =
.
The setup was tedious but it was worth it because the compilation is then extremely simple. Run
./cross-build-32
in mingw32-cross-compile
directory to build Win32
insstaller. That's all. If it succeeds an executable Gwyddion Windows
installer with bundled GTK+ and everything will be created in
$target_prefix
. Similarly, the Win64 installer is
built just with
./cross-build-64
You can make a coffee meanwhile – or study the
cross-build
script (it is actually quite short and
clear).
Note the cross-build scripts run autogen.sh
but do
not clean the source code directory. You may wish to do that manually if
you compile Gwyddion repeatedly. Especially if you build for both
architectures in the same directory, make sure to run
make distclean
between the builds to get the source directory back to a well-defined state.
Compiled Gwyddion can be run under Wine. Assuming the default value of
target_prefix
:
wine ~/opt/gwyddion-mingw32/bin/gwyddion.exe
To run gwyddion.exe
the dynamic linker must be able
to find all the necessary DLLs. This is ensured in a somewhat crude way by
script copysysfiles that copies all necessary MinGW files
from system to $target_prefix
. Since
copysysfiles is executed by cross-build
you normally do not need to execute it manually.
The second step that might be necessary is setting registry key
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\gwyddion.exe
to point to gwyddion.exe
and the value
Path
to point to the bin
subdirectory.
Cross-compilation of standalone modules requires only Gwyddion headers
and Win32 development libraries. While they can be surely obtained by
cross-compiling entire Gwyddion is it not necessary to do so. By
compiling only the libraries you can avoid the installation of various
rarer Gwyddion dependencies. This can be achieved using the patch
gwyddion-2.22-build-only-libs.patch
available among the build scripts.
But it gets even easier, the MinGW Gwyddion libraries are available as a
RPM package mingw32-gwyddion-libs
in the
gwyddion.net repository.
Once you have this package installed you can try cross-compilation of the
sample standalone module threshold-example
that is
available in the subversion repository (or as a tarball). See
README
therein for some more details.