Долго не было возможности все проверить — пишу только сейчас.
Нижеследующее проверено мной при компиляции простого тестового примера для Linux
из-под Win32 компилятором версии 2.0. Согласно документации для других сочетаний
целевой и хост-платформы последовательность действий должна быть той же.
1. Что касается непосредственно компиляции — тут проблем нет никаких, по крайней
мере с FPC 2.0. Кросскомпиляция поддерживается вполне, для чего служит ключ
-T<xxx>, где <xxx> — целевая система. Хуже дело обстоит с компоновкой.
2. Во-первых, нужны соответствующие целевой системе версии модулей: бинарные или
в исходниках. В случае бинарных модулей, они должны соответствовать версии
компилятора. В случае исходников, важно следующее: помимо модуля System
компилятор использует маленький объектный файл, ассемблерные исходники
которого находятся вместе с исходниками RTL для соответствующей системы,
однако as, идущий в составе дистрибутива, кросскомпиляцией не владеет.
Соответствующий as следует брать там же, где и ld (см. ниже).
В конфигурационном файле fpc.cfg должны быть строки примерно такого вида:
-FuC:\pp\units\$FPCTARGET\rtl
-FuC:\pp\units\$FPCTARGET\fcl и т.д.
и
-FDC:\PP\bin\$FPCTARGET
Первая указывает путь поиска модулей, а вторая — утилит, таких как as или ld.
Переменная $FPCTARGET зависит от целевой платформы и имеет вид
<процессор>-<OS>. Соответственно, модули и кросс-версию BinUtils следует так
и расположить. Лично я просто выдернул каталог модулей i386-linux из
соответствующего rpm-дистрибутива.
3. Теперь о компоновке. Нужна соответствующая версия линкера ld. Искать
компилятор ее будет согласно ключу -FD<xxx>. Взять кроссплатформеные версии
пакета BinUtils, то есть ld, as и иже с ними можно с FTP-сервера
freepascal.org по адресу: <a href='ftp://ftp.freepascal.org/fpc/contrib/cross/' target='_blank'>ftp://ftp.freepascal.org/fpc/contrib/cross/</a>
Конкретно Win32 -> прочие системы находится в файле:
<a href='ftp://ftp.freepascal.org/fpc/contrib/cross/mingw/win32crossbinutils2005.zip' target='_blank'>ftp://ftp.freepascal.org/fpc/contrib/cros...inutils2005.zip</a>
В наличии имеются:
- arm-linux
- i386-freebsd
- i386-linux
- mingw32
- powerpc-linux
- sparc-linux
- sparc64-freebsd
- sparc64-linux
- x86_64-freebsd
- x86_64-linux
Правда, в архиве некоторые файлы имеют не те имена, например — ld называется
i386-linux-ld.exe. Можно их после распаковки переименовать, можно
скопировать, а можно даже создать жесткие ссылки — NTFS 5-й версии такое
позволяет.
4. После того как все файлы рассованы по своим местам и пути прописаны в fpc.cfg
при помощи переменной $FPCTARGET остается только набрать в командной строке
что-то вроде:
fpc -Tlinux test.pp
И возрадоваться получившемуся.
5. При компоновке с внешними библиотеками через директиву {$LinkLib ...}
возможны некоторые проблемы. Полагаю, нужно лишь выдернуть соответствующую
библиотеку (*.a) из целевой платформы, однако проверить у меня пока не
получилось.
Такая ситуация возникает, например, при попытке скомпилировать из-под Win32
примеры с GTK, однако в моем дистрибутиве linux (Mandrake 9.2) некоторые *.a
файлы отсутствуют, хотя *.h и *.so на месте… Т.е. под Linux'ом у меня эти
примеры также не компилируются.