Кросс-компиляция для MS Windows

Кросс-компиляция Gwyddion для MS Windows под Linux весьма похожа на обычную сборку для Unix с некоторыми дополнительными настройками и дополнительными шагами. Хотя процесс достаточно тривиален, начальные настройки могут показаться в какой-то степени непростыми. Если вы к тому же не знакомы с обычной сборкой под Unix, имеет смысл начать с неё и попробовать кросс-компиляцию после того, как основная процедура станет понятной.

Эти инструкции описывают компиляцию в дистрибутиве Fedora используя дистрибутивную поддержку кросс-компиляции MinGW, поскольку разработчики Gwyddion используют именно этот вариант. В общем, эти инструкции работают в текущей версии Fedora. Компиляция в других версиях и других основанных на RedHat дистрибутивах (CentOS, Scientific Linux, …) будет происходить подобным образом и достаточно проста, но возможно потребуются некоторые небольшие изменения. Сборка, например, в openSUSE потребует модификации. Мы будем рады получить отчёты об успешной (или неудачной) сборке на других системах и дополнить эти инструкции.

Полная кросс-компиляция включает в себя следующие шаги:

Доступен скрипт, который автоматически проведёт все шаги, как описано ниже.

Настройка

Перед первой компиляцией может потребоваться настройка среды кросс-компиляции. Это надо делать только один раз.

Основные пакеты MinGW

Запустите с правами суперпользователя root:

dnf install mingw{32,64}-{gcc-c++,gtk2,libxml2,minizip,fftw,gtkglext,libwebp,OpenEXR}

чтобы установить необходимые пакеты mingw32 и mingw64. Некоторые другие пакеты будут установлены как зависимости пакетов, указанных здесь явно. Следует отметить, что технически некоторые из пакетов являются опциональными зависимостями и можно собрать пакет установки для MS Windows без них (после небольшой настройки). Тем не менее, стандартные пакеты установки включают эти зависимости, и скрипты кросс-компиляции подразумевают их наличие по умолчанию.

Репозиторий Gwyddion.net

Версии для MinGW некоторых пакетов, используемых Gwyddion, ещё (или уже) недоступны в Fedora, либо могут быть некоторые исправления, отсутствующие в пакетах Fedora, которые мы хотели бы включить. В настоящее время это HDF5 и gtksourceview2, который используется только в pygwy.

Можно собрать эти опциональные пакеты используя патчи и spec-файлы с https://sourceforge.net/projects/gwyddion/files/mingw32-cross-compile/, однако, гораздо проще установить их командой dnf. Для этого нужно загрузить и установить пакет конфигурации репозитория gwyddion.net. Установка этого пакета добавит в систему две конфигурации репозитория, для программы и для дополнительных пакетов MinGW. По умолчанию будет включен только репозиторий gwyddion. Для добавления пакетов MinGW нужно включить второй репозиторий вручную редактированием файла /etc/yum.repos.d/gwyddion-mingw.repo. Чтобы установить их необходимо запустить следующую команду:

dnf install mingw32-{hdf5,gtksourceview2}

Следует отметить, что данный репозиторий переопределяет ряд пакетов MinGW из Fedora чтобы они были нужных версий.

Wine

Wine является слоем совместимости/(не) эмулятором MS Windows для Unix. Он используется для запуска NSIS который создает программу установки Gwyddion для Windows. Wine также можно использовать для запуска и тестирования собранного кросс-компиляцией Gwyddion, как описано ниже.

Запустите

dnf install wine

чтобы установить Wine.

NSIS

Nullsoft scriptable install system (NSIS) используется для создания программы установки Gwyddion. Поскольку это программа для MS Windows, она устанавливается под Wine. Собранная кросс-компиляцией версия NSIS может присутствовать в некоторых дистрибутивах, но, как показала практика, оригинальная версия работает более надёжно.

Загрузите NSIS с его веб-страницы и запустите informalexample>

wine nsis-3.06-setup.exe

Python

Чтобы собрать pygwy нужно установить Python в Wine. Это делается так же, как при обычной установке pygwy, за исключением того, что все пакеты, описанные в разделе включение pygwy необходимо устанавливать с помощью команды 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

или подобным образом.

Скрипты поддержки

Скрипты поддержки и данные доступны в модуле mingw32-cross-compile репозитория subversion программы Gwyddion. нужно запустить

svn checkout http://svn.code.sf.net/p/gwyddion/code/trunk/mingw32-cross-compile

чтобы получить снимок репозитория.

Наиболее важным из полученных вами является скрипт cross-build-32 (или cross-build-64), который автоматизирует все шаги кросс-компиляции. Перед тем, как запускать его в первый раз, просмотрите файл setup32 (или setup64 для 64-битных сборок), который определяет где находятся различные нужные вещи. По умолчанию его содержимое выглядит следующим образом:

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

Переменная source_dir задаёт место, куда был распакован архив или сохранён снимок системы контроля версий исходного кода Gwyddion и эту переменную скорей всего нужно будет изменить. Переменная target_prefix указывает каталог установки (временный каталог) для собранного кросс-компиляцией Gwyddion. Значение по умолчанию должно работать, и вам не нужно его менять, если вы этого не хотите. Оставшиеся переменные, mingw32_prefix, nsis_compiler и python_dir, задают местоположение файлов MinGW, компилятора NSIS и Win32 Python, соответственно, и их обычно не надо менять со значений по умолчанию, хотя NSIS может быть установлен либо в Program Files (x86), либо в Program Files по умолчанию в зависимости от настроек Wine. Следует отметить, что setup читается оболочкой, и, следовательно, вокруг знака = не должно быть пробелов.

Компиляция

Настройка была утомительной, но это того стоило, поскольку затем компиляция станет крайне простой. Нужно запустить

./cross-build-32

в каталоге mingw32-cross-compile чтобы собрать пакет установки под Win32. На этом всё. Если процесс создания прошел успешно, выполняемый пакет установки Gwyddion под Windows вместе с предустановленным GTK+ и всем остальным будет создан в каталоге, заданном $target_prefix. Аналогично, пакет установки под Win64 собирается с помощью

./cross-build-64

Во время сборки можно сделать кофе, или изучить скрипт cross-build (он в действительности достаточно короткий и понятный).

Следует отметить, что скрипт кросс-компиляции запускает autogen.sh, но не чистит каталог с исходным кодом. Вам может понадобиться сделать это вручную если вы постоянно собираете Gwyddion. Особенно это важно, если вы собираете версии под обе архитектуры в одном и том же каталоге, убедитесь, что

make distclean

был запущен между сборками чтобы привести каталог с исходным кодов в правильное состояние.

Запуск под Wine

Собранный Gwyddion может быть запущен под Wine. Предполагая значение по умолчанию target_prefix:

wine ~/opt/gwyddion-mingw32/bin/gwyddion.exe

Чтобы запустить gwyddion.exe динамический линкер должен иметь возможность найти все нужные DLL. Это обеспечивается несколько грубым путём в скрипте copysysfiles, который копирует все необходимые файлы MinGW из системы в $target_prefix. Поскольку команда copysysfiles запускается из cross-build обычно не нужно запускать её вручную.

Второй шаг, который может понадобиться, это установка ключа реестра

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\gwyddion.exe

таким образом, чтобы он указывал на gwyddion.exe и значения Path, чтобы оно указывало на подкаталог bin.

Кросс-компиляция отдельных модулей

Кросс-компиляция отдельных модулей требует только заголовочные файлы Gwyddion и библиотеки для разработки под Win32. Хотя их гарантированно получить кросс-компиляцией всей программы, делать это необязательно. Компилируя только библиотеки можно обойтись без установки разнообразных редких библиотек, от которых зависит Gwyddion. Это можно сделать используя патч gwyddion-2.22-build-only-libs.patch, который находится вместе со скриптами сборки.

Но ещё проще, библиотеки MinGW Gwyddion доступны как RPM-пакет mingw32-gwyddion-libs в репозитории gwyddion.net.

После того, как всё установлено можно попробовать собрать пример отдельного модуля threshold-example который доступен в репозитории subversion (или в виде пакета исходного кода). См. README там для получения дополнительной информации.