Кросскомпиляция из FreeBSD в Windows


Сейчас мы рассмотрим способ получения исполняемого файл для Windows в операционной системе FreeBSD. Все ниже описанное проделано мной на FreeBSD 5.4. с FPC 2.0.0. В качестве примера будем использовать winhello.pp из демонстрационных программ Free Pascal.

Free Pascal являясь кроссплатформенным и поддерживает кроссплатформенную компиляцию, для этого существует стандартная опция компилятора -TXXXX, где XXXX целевая платформа. Но просто указать ее в параметрах не достаточно – понадобится соответветвующий компоновщик и стандартные библиотеки компилятора для целевой системы (RTL).

Следует учесть, что на момент написания данного текста FPC 2.0.0 все еще не появился в портах, поэтому лично у меня сначала установлены бинарники, а затем все пересобрано из исходников. Все это с префиксом по умолчанию - /usr/local. Соответственно бинарники попали в /usr/local/bin, а юниты и тп в /usr/local/lib.

Собранные для win32 юниты (каталог какой-то_путьi386-win32) берем из дистрибутива для win32 и помещаем в /usr/local/lib/fpc/2.0.0/units/ рядом с i386-freebsd.

Теперь выполняем следующие магические действия:

cd
mkdir fpc
cd fpc
ln -s /usr/local i386-freebsd
mkdir i386-win32/bin
Теперь идем на ftp://ftp.freepascal.org/fpc/contrib/cross/. Там заходим в каталог freebsd и тянем от туда binutils-2.11.2-cross-freebsd44.2.win32.tar.bz2 Содержимое данного архива кладем в каталог ~/fpc/i386-win32/bin. Важно! Данные бинарники для FreeBSD 4! Поэтому надо либо установить соответвующий дистрибутив (в sysinstall что-то вроде compat_4x) или указать в файле /etc/make.conf опцию COMPAT4X=yes и прересобрать систему.

Но это еще не все. FPC будет пытаться запустить "-as" и "-ld" (сначала мне подумалось, что ему просто какие-то опции надо установить, а оказалось что это именно имена файлов). Поэтому:

cd ~/fpc/i386-win32/bin
ln -s as "-as"
ln -s ld "-ld"

Все. Настройка завершена. Теперь делаем, что-то вроде

fpc -Twin32 winhello.pp
и получаем готовый экзешничек для Windows. Запустить можно например так

wine winhello.exe
Надеюсь ничего не упустил.

PS. Программы написанные для Windows можно портировать в FreeBSD (и тп) прилинковав их к winelib (содержит WinAPI). Известно как это делать для программ на Си. А вот для программ на Паскале нужны юниты Windows.pas и тп. К сожалению стандартные Windows-юниты похоже для этого не подходят. (подробности о Wine на сайте www.winehq.com)

Обновлено: 12.03.2015