Difference between revisions of "Cross compiling for Win32 under Linux/ru"

From Lazarus wiki
Jump to navigationJump to search
(New page: {{Translate}}<!--{{Cross compiling for Win32 under Linux}}--> == Hints to Cross Compile Win32 binaries under Linux == Since 0.9.10 there is an rpm 'fpc-crosswin32', that installs the nee...)
 
(Allow for a name change on another page)
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Translate}}<!--{{Cross compiling for Win32 under Linux}}-->
+
{{Cross compiling for Windows under Linux}}
  
== Hints to Cross Compile Win32 binaries under Linux ==
+
== Заметки по кросс-компиляции исполняемых файлов Win32 из Linux ==
  
Since 0.9.10 there is an rpm 'fpc-crosswin32', that installs the needed binutils (e.g. cross assembler, cross linker), the fpc .ppu files cross compiled for win32 and modifies /etc/fpc.cfg.
+
Начиная с 0.9.10 существует rpm 'fpc-crosswin32', который устанавливает необходимые утилиты binutils (например кросс ассемблер, кросс линкер), fpc .ppu файлы скомпилированные для win32 и вносит изменения в /etc/fpc.cfg.
  
It does not contain the cross compiled LCL .ppu files. You need to compile them yourself, after installing fpc-crosswin32.
+
Он не включает кросс-скомпилированные LCL .ppu файлы. Вам нужно скомпилировать их самостоятельно после установки, fpc-crosswin32.
  
== Lazarus and the Free Pascal Compiler ==
 
  
=== About Cross compiling - Knowing, what you are doing ===
+
Также существует быстрый способ описанный тут: http://wiki.lazarus.freepascal.org/Cross_compiling/ru
  
This is a short introduction for newbies.
+
== Lazarus и Free Pascal Compiler ==
The following sections describe how to setup a system to cross compile, that means working under linux and creating win32 executables (or freebsd or dawin, or ...).
 
Why cross compiling: FreePascal is a compiler and basically converts source into binaries (machine language). These binaries also contains information, how the operating system starts the executable. Therefore these binaries are platform specific.
 
FreePascal itself does not need much setup. It can create binaries for many platforms. Just tell it to do so. But the compiler is only one part. There is also the assembler and the linker. And these tools are not able to create cross code. That's why we have to create special linker 'ld' and assembler 'as' for every target platform. These are the binutils.
 
After creating the cross tools, all the fpc pascal units will be cross compiled. For example, then there is one system.ppu file for every target platform.
 
Then your fpc config file will be setup, so that cross compilation becomes so easy, that you can forget all the boring details.
 
The same will be done for the LCL - the lazarus component library.
 
And after this you can cross compile pascal programs for win32. Either start them with wine or copy them to a windows machine and test them there.
 
  
=== Why *nix to windows and not the other way around. ===
+
=== О кросс-компиляции - понимайте то что вы делаете ===
  
The main reason for this is that generating unix binaries on a foreign platform (another unix or even Linux distro included) is more complicated. Static linking is already complicated, let alone shared.
+
Это короткое введение для новичков.
 +
В последующих разделах описывается как настроить систему для кросс-компиляции, имеется ввиду работая под linux создавать исполняемые файлы win32 (или freebsd, или dawin, или...)
 +
Почему кросс-компиляция: FreePascal это компилятор, преобразующий исходный код в исполняемые файлы (на машинном языке). Эти исполняемые файлы, кроме всего прочего, содержат информацию о том как операционная система запускает их на выполнение. Поэтому исполняемые файлы являются платформенно-зависимыми. Сам FreePascal не требует различных дистрибутивов. Он может создавать исполняемые файлы для многих платформ. Просто укажите ему это. Но компилятор - это только одна часть. Существует ещё ассемблер и линкер. И эти утилиты не способны создавать кроссплатформенный код. Поэтому были созданы специальные утилиты линкер 'ld' и ассемблер 'as' для каждой целевой платформы. Это binutils. 
 +
После создания кроссплатформенных утилит все модули fpc pascal будут кросс-компилированы. Например, для каждой из целевых платформ существует отдельный файл system.ppu.
 +
Затем ваш конфигурационный файл fpc.cfg будет перенастроен, таким образом кросс-компиляция станет настолько лёгкой, что вы сможете забыть обо всех мелочах.
 +
То же самое нужно проделать и с LCL - lazarus component library.
 +
И после этого вы сможете кросс-компилировать программы на паскале для win32. Затем проверить их при помощи wine или скопировать на машину с Windows и протестировать на ней.
  
You would need the used libraries from the target platform's (gtk, glib,libc etc), and a lot of additional configuring for ld. (library paths, dynlinker path etc)
+
=== Почему из *nix в windows а не по-другому. ===
  
This has been partially done (for the static case), but it is hard since it needs manual postediting of linker files and linker commandline, and a deep understanding about what makes Unix binaries tick.  
+
Основная причина - генерирование unix-бинарников на другой платформе (другой unix или Linux) более сложно. Более сложное статическое связывание, не говоря уж об остальном.
  
=== Download the FPC Sources ===
+
Придется использовать библиотеки из целевой платформы (gtk, glib, libc и т.д.), и множество дополнительных настроек для ld. (пути к библиотекам, путь к линкеру и т.д.)
  
The binaries are not enough, you need the complete fpc sources.
+
Это было частично сделано (в статическом случае), но это сложно т.к. требует внесения изменений в файлы линкера и командную строку линкера, а также глубокого понимания о сборке бинарников Unix.
See www.freepascal.org. You can use SVN or a daily snapshot.
 
For the following examples the fpc sources were downloaded to ~/sources/fpc.
 
  
=== Download the gnu binutils. ===
+
=== Скачивание исходных кодов FPC ===
  
For example binutils-2.18.tar.gz downloaded to
+
Исполняемых файлов недостаточно, вам потребуются все исходники fpc.
~/download/binutils-2.18.tar.gz.
+
Обратитесь к www.freepascal.org. Вы можете использовать SVN или ежедневные сборки.
 +
Для следующих примеров исходники fpc были скачены в папку ~/sources/fpc.
  
=== Cross build binutils ===
+
=== Скачивание gnu binutils. ===
  
In the fpcbuild repository there is a script to build the binutils for all
+
Например, binutils-2.18.tar.gz скачайте в ~/download/binutils-2.18.tar.gz.
cross platforms: install/cross/buildcrossbinutils
 
  
Download install of fpcbuild:
+
=== Кроссплатформенная сборка binutils ===
 +
 
 +
В репозитории fpcbuild существует скрипт для сборки binutils для всех
 +
поддерживаемых целевых платформ: install/cross/buildcrossbinutils
 +
 
 +
Скачиваем инсталлятор fpcbuild:
 
   []$ cd ~
 
   []$ cd ~
 
   []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install install
 
   []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install install
  
Create a copy of the script:
+
Создаём копию скрипта:
  
 
   []$ cd ~/install/cross/
 
   []$ cd ~/install/cross/
 
   []$ cp buildcrossbinutils buildcrossbinutils.sh
 
   []$ cp buildcrossbinutils buildcrossbinutils.sh
  
Edit the variables at the start of the new script.
+
Правим переменные в начале нового скрипта.
  
The BASE variable points to a building and installation directory. So, it
+
Переменная BASE указывает на директорию сборки и установки. Директория должна
should be an empty directory. For example:
+
быть пустой. Например:
 
   BASE=~/cross_fpc
 
   BASE=~/cross_fpc
  
Now the downloaded binutils file. If for instance you downloaded ~/download/binutils-2.18.tar.gz then set
+
Теперь разберёмся со скачанным файлом binutils. Если путь к скачанному файлу
 +
~/download/binutils-2.18.tar.gz то укажем
 
   BINUTILSPATH=~/download/
 
   BINUTILSPATH=~/download/
 
   BINUTILSBASE=binutils
 
   BINUTILSBASE=binutils
Line 65: Line 67:
 
   BINUTILS_GZIP=yes
 
   BINUTILS_GZIP=yes
  
The script will automatically combine this to ~/download/binutils-2.18.tar.gz.
+
Скрипт будет автоматически соберёт это в ~/download/binutils-2.18.tar.gz.
The rest variables define what target platforms you have. The default is to
+
Остальные переменные определяют какие целевые платформы мы имеем. По умолчанию
build quite a lot, so compilation will take some time (hours on slow machines).
+
их довольно много, поэтому компиляция может занять много времени (часы на
For cross compile to windows, you need only
+
слабых машинах). Для кросс-компиляции для Windows вам потребуется только
  
 
   TARGETS_WIN="mingw32"
 
   TARGETS_WIN="mingw32"
 
    
 
    
and to comment all other:
+
и закомментировать все остальные:
 
    
 
    
 
   #BSD="freebsd netbsd openbsd"
 
   #BSD="freebsd netbsd openbsd"
Line 82: Line 84:
  
  
Then run the script:
+
Затем запустите скрипт:
  
 
   []$ sh buildcrossbinutils.sh
 
   []$ sh buildcrossbinutils.sh
 
 
The script creates a subdirectory 'logs' full of log files. If something goes
 
wrong, start looking there.
 
  
Note that for several platforms (Linux,FreeBSD, win32) these are available in compiled
+
Скрипт создаст поддиректорию 'logs' с соответствующим содержимым. В случае чего,
form already. See ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
+
начните поиски оттуда.
 +
 
 +
Заметьте что для некоторых платформ (Linux,FreeBSD, win32) утилиты доступны в
 +
скомпилированном виде. Смотрите ftp://freepascal.stack.nl/pub/fpc/contrib/cross/
  
=== Cross build FPC ===
+
=== Кроссплатформенная сборка FPC ===
  
In the fpcbuild repository there is a script to build the fpc snapshot for
+
В рекозитории fpcbuild существует скрипт для сборки fpc под все поддерживаемые
all cross platforms: install/cross/buildcrosssnapshot
+
целевые платформы: install/cross/buildcrosssnapshot
Create a copy of the script:
+
Создайте копию скрипта
  
 
   []$ cd ~/install/cross/
 
   []$ cd ~/install/cross/
 
   []$ cp buildcrosssnapshot buildcrosssnapshot.sh
 
   []$ cp buildcrosssnapshot buildcrosssnapshot.sh
  
Edit the variables at the start of the new script.
+
Исправьте переменные в начале нового скрипта.
  
Normally you will change at least CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS
+
Вам потребуется изменить всего лишь CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS
and TARGETS_CPU. For example:
+
и TARGETS_CPU. Например:
 
    
 
    
 
   CROSSTOOLSROOT=~/cross_fpc/cross
 
   CROSSTOOLSROOT=~/cross_fpc/cross
Line 112: Line 114:
 
   DESTDIR=~/cross_fpc/
 
   DESTDIR=~/cross_fpc/
 
    
 
    
Then run the script:
+
Затем запустите скрипт:
  
 
   []$ sh buildcrosssnapshot.sh
 
   []$ sh buildcrosssnapshot.sh
  
After this you got cross compiled units in ~/cross_fpc/
+
После этого вы получите кросс-компилированные модули в ~/cross_fpc/
  
=== Configure your fpc.cfg ===
+
=== Конфигурирование вашего fpc.cfg ===
  
Open as root your /etc/fpc.cfg or create copy /etc/fpc.cfg to ~/fpc.cfg and edit this file. Search in the config for the unit search paths
+
Откройте с правами рута /etc/fpc.cfg или создайте копию /etc/fpc.cfg to ~/fpc.cfg и отредактируйте этот файл. Найдите в файле пути поиска модулей.
  
Note: On older versions of FPC $version and $target are used instead of $fpcversion and $fpctarget
+
Примечание: В более старых версиях FPC вместо $fpcversion и $fpctarget использовались $version и $target.
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
 
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
  
Replace them with special paths for other platforms. For example for normal linux and cross compiled win32:
+
Замените их специальными путями для других платформ. Например, для linux и кросс-компилированной win32:
 
  #IFDEF win32
 
  #IFDEF win32
 
  -Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/
 
  -Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/
Line 141: Line 143:
 
  #ENDIF
 
  #ENDIF
  
ToDo: Test and troubleshooting
+
Выполните: тестирование и устранение неполадок.
  
=== Cross compiling the LCL and lazarus components ===
+
=== Кросс-компиляция LCL и компонентов lazarus ===
  
At Command line:  
+
В коммандной строке:  
 
  cd lazarus; make clean all OS_TARGET=win32
 
  cd lazarus; make clean all OS_TARGET=win32
 
  cd lazarus/lcl; make clean all  
 
  cd lazarus/lcl; make clean all  
  
This will first cross compile everything for win32 (including the IDE, which is unecessary, but so I have to write less doc).
+
Таким образом всё скомпилируется для win32 (включая IDE, что необязательно, но это сокращает объём манипуляций).
 
 
Or in the IDE: Set LCL, Synedit, Codetools, Package Registration and IDE Interface to Clean+Build, set LCL interface to win32/win64 and set 'Target OS' to win32. Then 'build lazarus'.
 
These four parts have splitted output directories, so your linux .ppu/.o files are *not* overwritten and you don't need to recompile them.
 
  
=== Cross compiling a project ===
+
Или в IDE Сервис->Параметры сборки: отметим LCL, Synedit, Codetools, Регистрация пакетов и Интерфейс IDE как Очистить+Собрать, установми в поле Библиотека виджетов LCL значение win32/win64, а Целевая ОС - win32. Затем нажмём 'Собрать'.
 +
Ваши файлы .ppu/.o скомпилированные для linux не будут перезаписаны и вам не нужно будет перекомпилировать их каждый раз, т.к. в рабочей папке будут созданы специальные директории для других целевых систем.
  
Set in Project->Compiler Options->Code the Target OS to 'win32' and in Paths the
+
=== Коросс-компиляция проекта ===
'LCL Widget Type' to win32. That's all. The next time you build, you will
 
create a win32 executable.
 
The IDE will rescan for win32 units, so that 'Find declaration' and code
 
completion features will now work with the win32 rtl instead of the linux rtl.
 
When you open another project or reopen this project the IDE will automatically
 
switch.
 
  
=== Hints for Cross compiling and Lazarus ===
+
Выберите Проект->Параметры проекта->Параметры компилятора->Генерация кода Целевая ОС='win32' и Проект->Параметры проекта->Параметры компилятора->Пути Библиотека виджетов LCL='win32'. Вот и всё. При следующей компиляции будет создан исполняемый файл win32.
 +
IDE произведёт поиск утилит win32, поэтому компилятор будет работать с rtl для win32 вместо rtl для linux.
 +
Когда вы откроете другой проект или закроете текущий и откроете его вновь IDE автоматически установит настройки.
  
If you create an application/package for multiple targets, you will often do the following: Fix a bug, compile and test it under linux, then compile and test it under win32, .. . Because normally you overwrite your .ppu files, you have to recompile everything, everytime you switch. This is not necessary.
+
=== Подсказки по кросс-компиляции и Lazarus ===
The Lazarus IDE supports macros.
 
  
Example 1: Cross compiling a project for linux and win32.  
+
Если вы создаете приложение/пакет для различных целевых ОС, вам необходимо действовать следующим образом: устранить баги, скомпилировать и протестировать приложение под linux, затем скомпилировать и протестировать его под win32, .. . Потому что обычно вы перезаписываете ваши .ppu файлы, и вам придётся перекомпилировать всё, каждый раз когда вы переключаете захотите изменить целевую ОС. Но это не обязательно. Lazarus поддреживает макросы.
  
Set Project -> Compiler Options -> Paths -> Unit Output directory to $(TargetOS). This macro will be replaced by the value in Code -> TargetOS in lowercase (i.e. "linux" for Linux and "win32" for Win32).
+
Пример 1: Кросс-компиляция проекта для linux и win32.
The output directory is relative to your project directory (the directory where your .lpi is). Create a linux and win32 directory in your project directory.
 
When you click on the "Show Options" button at the bottom of the compiler options, you will see a -FElinux/ or -FEwin32/. This option tells the compiler where to write the output (e.g. .ppu/.o files).
 
  
 +
Установите значение Проект-> Параметры компилятора->Пути->Каталог вывода модулей = $(TargetOS). Этот макрос будет заменён названием целевой ОС в нижнем регистре (например 'linux' для Linux, 'win32' для Win32).
 +
Каталог вывода модулей находится в директории вашего проекта (директории где расположен файл .lpi). Создайте директории с именами 'linux' и 'win32' в директории вашего проекта.
 +
Когда вы кликните на кнопке 'Показать параметры' в самом низу окна Параметры проекта, вы увидите -FElinux/ или -FEwin32/. Эта опция сообщает компилятору куда записать создаваемые файлы (файлы .ppu/.o).
  
Example 2: Cross compiling a project for various platforms and widget sets.
+
Пример 2: Кросс-компиляция проекта для различных платформ и наборов виджетов.
  
Set the Unit output directory to
+
Укажите Каталог вывода модулей следующим образом
 
$(TargetCPU)/$(TargetOS)/$(LCLWidgetType)
 
$(TargetCPU)/$(TargetOS)/$(LCLWidgetType)
and create the sub directories for all targets. This path construction is also used by the LCL.
+
и создайте поддиректории для всех целей. Этот путь также используется LCL.
 
 
  
 +
То же самое можно проделать и для пакетов.
  
The same can be done for packages.
+
=== Кросс-компиляция и пакеты Lazarus ===
  
=== Cross compiling and Lazarus Packages ===
+
Пакеты Lazarus не ограничены библиотеками. Они могут быть использованы для компиляции практически чего угодно. И IDE автоматически перекомпилирует их при необходимости.
 +
Пакеты могут наследовать опции компилятора. Например: проект, использующий пакет, наследует каталог вывода пакета. Другими словами: каталог вывода пакета добавляется в пути поиска модулей проекта. Посмотрите в IDE: Проект->Параметры проекта->Параметры компилятора->Унаследованные.
  
Lazarus packages are not limited to libraries. They can be used to compile nearly everything. And the IDE automatically recompiles them if needed.
+
Наследование срабатывает единажды.
Packages can inherit compiler options. For example: A project that uses a package inherits the output directory of the package. In other words: the output directory of the package is added to unit search path of the project. See in the IDE: Project -> Compiler options -> Inherited.
+
Но существуют исключения:
Inheritance normally works only one way.  
+
Целевая платформа (ОС и CPU) проекта переопределяет цель для всех используемых пакетов. Это значит, если вы укажете Целевую ОС в проекте = 'win32' и скомпилируете проект, IDE выполнит проверку на предмет необходимости перекомпиляции пакетов для Целевой ОС.
But there are exceptions:
 
The target platform (OS and CPU) of the project overrides the target for all used packages. That means, if you set the Target OS of the project to "win32" and compile the project, the IDE will check if the used packages need to be recompiled for this Target OS.
 
  
For example:
+
Пример:
  
Package A has as output directory: lib/$(TargetOS)
+
Пакет А имеет директорию вывода: lib/$(TargetOS)
Project uses A.
+
Проект использует А.
# The project is built for linux. The IDE compiles A for linux in <PackageDirOfA>/lib/linux/, then it compiles the project for linux.
+
# Проект собирается для linux. IDE компилирует А для linux в <PackageDirOfA>/lib/linux/, затем компилирует проект для linux.
# The project is built for win32. The IDE compiles A for win32 in <PackageDirOfA>/lib/win32/, then it compiles the project for win32.
+
# Проект собирается для win32. IDE компилирует А для win32 в <PackageDirOfA>/lib/win32/, затем компилирует проект для win32.
# The project is built again for linux. The IDE checks A for linux and does not recompile it. Then it compiles the project for linux.
+
# Проект снова собирается для linux. IDE проверяет, существует ли А для linux. Затем компилирует проект для linux.
  
So, using the macros saves a lot of time.
+
Таким образом, использование макросов экономит много времени.
  
== For Unix (general) ==
+
== Для Unix (в общих чертах) ==
  
Option -XLA is used to rename library dependencies specified in pascal units. Format is -XLAold=new, to modify ld link option -l<old> to -l<new>.
+
Опция -XLA используется для изменения зависимостей библиотек определённых в модулях. Формат -XLAold=new изменяет link-опцию ld -l<old> на -l<new>.
  
Option -XR<sysroot> (recent trunk) that can be used to specify the target system root. It's used for:
+
Опция -XR<sysroot> (recent trunk) может быть использована для указания корня Целевой ОС. Она используется для:
* adding a prefix to the default added library paths; in the past you used to specify -Xd and these paths manually. E.g. for i386-linux instead of passing /lib, /usr/lib, and /usr/X11R6/lib to ld, it will pass <sysroot>/lib, <sysroot>/usr/lib, and <sysroot>/usr/X11R6/lib to ld.
+
* добавления префикса к указанным по-умолчанию путям библиотек, в прошлом вы использовали -Xd и эти пути вручную. Например для i386-linux
* detecting the C library (linux specific): glibc or uclibc. E.g. for uclibc detection '<sysroot>/lib/ld-uClibc.so.0' is tried.
+
вместо следования в /lib, /usr/lib, и /usr/X11R6/lib к ld, будет следовать в <sysroot>/lib, <sysroot>/usr/lib, и <sysroot>/usr/X11R6/lib к ld.  
 +
* определение местоположения библиотек С (linux-версий): glibc или uclibc. Например для uclibc будет принята попытка поиска по пути '<sysroot>/lib/ld-uClibc.so.0'
  
== For Linux under Win32 ==
+
== Для Linux под Win32 ==
 
<!--Marco vd Voort wrote some [http://www.stack.nl/~marcov/crossnotes.txt crossnotes]. If somebody has time, he can add them to this wiki.-->
 
<!--Marco vd Voort wrote some [http://www.stack.nl/~marcov/crossnotes.txt crossnotes]. If somebody has time, he can add them to this wiki.-->
This is less trivial, there is some info in the [[buildfaq]]
+
Это просто, есть некоторая информация в [[buildfaq]]
  
== FreeBSD to sparc ==
+
== FreeBSD для sparc ==
  
I managed to crosscompile from x86 to Sparc Solaris 9. However the result doesn't work very well, but here is my cmdline:
+
Я пытался кросс-компилировать из х86 для Sparc Solaris 9. Несмотря на то что результат не работал должным образом привожу мою командную строку:
  
in compiler/ execute:
+
в компилятор / выполнить:
  
 
   gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
 
   gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'
  
~/src/sollib is a directory that contains:
+
~/src/sollib директория которая содержит:
* a set of .o's from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
+
* набор файлов .o из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
* libgcc.a from /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
+
* libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
* a set of lib*.so from /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so        
+
* набор файлов lib*.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
  
Problem is illustrated by the following binary.
+
Иллюстрация проблемы при компиляции:
  
 
   Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
 
   Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
Line 237: Line 233:
 
   system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
 
   system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found
  
I suspect wrong .o's are taken.
+
Я подозреваю что ошибся с выбранными .o файлами.
 +
 
 +
== Для Mac OS X ==
 +
Посмотрите этот [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 пост].
 +
 
  
== For Mac OS X ==
 
See this [http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222 forum post].
 
  
 +
==Авторы==
 +
Эта страница была конвертирована из epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWin32UnderLinux version].
  
  
==Original Contributors==
+
{{AutoCategory}}
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWin32UnderLinux version].
+
[[Category:FPC/ru]]
 +
[[Category:Lazarus/ru]]
 +
[[Category:Cross compilation/ru]]

Latest revision as of 12:51, 20 July 2021

English (en) français (fr) magyar (hu) italiano (it) русский (ru) 中文(中国大陆)‎ (zh_CN)

Заметки по кросс-компиляции исполняемых файлов Win32 из Linux

Начиная с 0.9.10 существует rpm 'fpc-crosswin32', который устанавливает необходимые утилиты binutils (например кросс ассемблер, кросс линкер), fpc .ppu файлы скомпилированные для win32 и вносит изменения в /etc/fpc.cfg.

Он не включает кросс-скомпилированные LCL .ppu файлы. Вам нужно скомпилировать их самостоятельно после установки, fpc-crosswin32.


Также существует быстрый способ описанный тут: http://wiki.lazarus.freepascal.org/Cross_compiling/ru

Lazarus и Free Pascal Compiler

О кросс-компиляции - понимайте то что вы делаете

Это короткое введение для новичков. В последующих разделах описывается как настроить систему для кросс-компиляции, имеется ввиду работая под linux создавать исполняемые файлы win32 (или freebsd, или dawin, или...) Почему кросс-компиляция: FreePascal это компилятор, преобразующий исходный код в исполняемые файлы (на машинном языке). Эти исполняемые файлы, кроме всего прочего, содержат информацию о том как операционная система запускает их на выполнение. Поэтому исполняемые файлы являются платформенно-зависимыми. Сам FreePascal не требует различных дистрибутивов. Он может создавать исполняемые файлы для многих платформ. Просто укажите ему это. Но компилятор - это только одна часть. Существует ещё ассемблер и линкер. И эти утилиты не способны создавать кроссплатформенный код. Поэтому были созданы специальные утилиты линкер 'ld' и ассемблер 'as' для каждой целевой платформы. Это binutils. После создания кроссплатформенных утилит все модули fpc pascal будут кросс-компилированы. Например, для каждой из целевых платформ существует отдельный файл system.ppu. Затем ваш конфигурационный файл fpc.cfg будет перенастроен, таким образом кросс-компиляция станет настолько лёгкой, что вы сможете забыть обо всех мелочах. То же самое нужно проделать и с LCL - lazarus component library. И после этого вы сможете кросс-компилировать программы на паскале для win32. Затем проверить их при помощи wine или скопировать на машину с Windows и протестировать на ней.

Почему из *nix в windows а не по-другому.

Основная причина - генерирование unix-бинарников на другой платформе (другой unix или Linux) более сложно. Более сложное статическое связывание, не говоря уж об остальном.

Придется использовать библиотеки из целевой платформы (gtk, glib, libc и т.д.), и множество дополнительных настроек для ld. (пути к библиотекам, путь к линкеру и т.д.)

Это было частично сделано (в статическом случае), но это сложно т.к. требует внесения изменений в файлы линкера и командную строку линкера, а также глубокого понимания о сборке бинарников Unix.

Скачивание исходных кодов FPC

Исполняемых файлов недостаточно, вам потребуются все исходники fpc. Обратитесь к www.freepascal.org. Вы можете использовать SVN или ежедневные сборки. Для следующих примеров исходники fpc были скачены в папку ~/sources/fpc.

Скачивание gnu binutils.

Например, binutils-2.18.tar.gz скачайте в ~/download/binutils-2.18.tar.gz.

Кроссплатформенная сборка binutils

В репозитории fpcbuild существует скрипт для сборки binutils для всех поддерживаемых целевых платформ: install/cross/buildcrossbinutils

Скачиваем инсталлятор fpcbuild:

 []$ cd ~
 []$ svn co http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_4/install install

Создаём копию скрипта:

 []$ cd ~/install/cross/
 []$ cp buildcrossbinutils buildcrossbinutils.sh

Правим переменные в начале нового скрипта.

Переменная BASE указывает на директорию сборки и установки. Директория должна быть пустой. Например:

 BASE=~/cross_fpc

Теперь разберёмся со скачанным файлом binutils. Если путь к скачанному файлу ~/download/binutils-2.18.tar.gz то укажем

 BINUTILSPATH=~/download/
 BINUTILSBASE=binutils
 BINUTILSVERSION=2.18
 BINUTILS_GZIP=yes

Скрипт будет автоматически соберёт это в ~/download/binutils-2.18.tar.gz. Остальные переменные определяют какие целевые платформы мы имеем. По умолчанию их довольно много, поэтому компиляция может занять много времени (часы на слабых машинах). Для кросс-компиляции для Windows вам потребуется только

 TARGETS_WIN="mingw32"
 

и закомментировать все остальные:

 #BSD="freebsd netbsd openbsd"
 #TARGETS_WIN="cygwin mingw32 msdosdjgpp"
 #TARGETS_I386="${BSD} linux solaris darwin"
 #TARGETS_POWERPC="${BSD} linux darwin"
 #TARGETS_SPARC="${BSD} linux solaris"
 #TARGETS_M68k=


Затем запустите скрипт:

 []$ sh buildcrossbinutils.sh

Скрипт создаст поддиректорию 'logs' с соответствующим содержимым. В случае чего, начните поиски оттуда.

Заметьте что для некоторых платформ (Linux,FreeBSD, win32) утилиты доступны в скомпилированном виде. Смотрите ftp://freepascal.stack.nl/pub/fpc/contrib/cross/

Кроссплатформенная сборка FPC

В рекозитории fpcbuild существует скрипт для сборки fpc под все поддерживаемые целевые платформы: install/cross/buildcrosssnapshot Создайте копию скрипта

 []$ cd ~/install/cross/
 []$ cp buildcrosssnapshot buildcrosssnapshot.sh

Исправьте переменные в начале нового скрипта.

Вам потребуется изменить всего лишь CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS и TARGETS_CPU. Например:

 CROSSTOOLSROOT=~/cross_fpc/cross
 FPCCVS=~/sources/fpc
 TARGETS_OS="win32"
 TARGETS_CPU="i386"
 DESTDIR=~/cross_fpc/
 

Затем запустите скрипт:

 []$ sh buildcrosssnapshot.sh

После этого вы получите кросс-компилированные модули в ~/cross_fpc/

Конфигурирование вашего fpc.cfg

Откройте с правами рута /etc/fpc.cfg или создайте копию /etc/fpc.cfg to ~/fpc.cfg и отредактируйте этот файл. Найдите в файле пути поиска модулей.

Примечание: В более старых версиях FPC вместо $fpcversion и $fpctarget использовались $version и $target.

-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl

Замените их специальными путями для других платформ. Например, для linux и кросс-компилированной win32:

#IFDEF win32
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/*
-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/units/i386-win32/rtl
-XPi686-mingw32-
-FD~/cross_fpc/cross/bin
#ELSE linux
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
#-Fu~/fpc/packages/*;~/fpc/rtl/linux
#ENDIF

Выполните: тестирование и устранение неполадок.

Кросс-компиляция LCL и компонентов lazarus

В коммандной строке:

cd lazarus; make clean all OS_TARGET=win32
cd lazarus/lcl; make clean all 

Таким образом всё скомпилируется для win32 (включая IDE, что необязательно, но это сокращает объём манипуляций).

Или в IDE Сервис->Параметры сборки: отметим LCL, Synedit, Codetools, Регистрация пакетов и Интерфейс IDE как Очистить+Собрать, установми в поле Библиотека виджетов LCL значение win32/win64, а Целевая ОС - win32. Затем нажмём 'Собрать'. Ваши файлы .ppu/.o скомпилированные для linux не будут перезаписаны и вам не нужно будет перекомпилировать их каждый раз, т.к. в рабочей папке будут созданы специальные директории для других целевых систем.

Коросс-компиляция проекта

Выберите Проект->Параметры проекта->Параметры компилятора->Генерация кода Целевая ОС='win32' и Проект->Параметры проекта->Параметры компилятора->Пути Библиотека виджетов LCL='win32'. Вот и всё. При следующей компиляции будет создан исполняемый файл win32. IDE произведёт поиск утилит win32, поэтому компилятор будет работать с rtl для win32 вместо rtl для linux. Когда вы откроете другой проект или закроете текущий и откроете его вновь IDE автоматически установит настройки.

Подсказки по кросс-компиляции и Lazarus

Если вы создаете приложение/пакет для различных целевых ОС, вам необходимо действовать следующим образом: устранить баги, скомпилировать и протестировать приложение под linux, затем скомпилировать и протестировать его под win32, .. . Потому что обычно вы перезаписываете ваши .ppu файлы, и вам придётся перекомпилировать всё, каждый раз когда вы переключаете захотите изменить целевую ОС. Но это не обязательно. Lazarus поддреживает макросы.

Пример 1: Кросс-компиляция проекта для linux и win32.

Установите значение Проект-> Параметры компилятора->Пути->Каталог вывода модулей = $(TargetOS). Этот макрос будет заменён названием целевой ОС в нижнем регистре (например 'linux' для Linux, 'win32' для Win32). Каталог вывода модулей находится в директории вашего проекта (директории где расположен файл .lpi). Создайте директории с именами 'linux' и 'win32' в директории вашего проекта. Когда вы кликните на кнопке 'Показать параметры' в самом низу окна Параметры проекта, вы увидите -FElinux/ или -FEwin32/. Эта опция сообщает компилятору куда записать создаваемые файлы (файлы .ppu/.o).

Пример 2: Кросс-компиляция проекта для различных платформ и наборов виджетов.

Укажите Каталог вывода модулей следующим образом $(TargetCPU)/$(TargetOS)/$(LCLWidgetType) и создайте поддиректории для всех целей. Этот путь также используется LCL.

То же самое можно проделать и для пакетов.

Кросс-компиляция и пакеты Lazarus

Пакеты Lazarus не ограничены библиотеками. Они могут быть использованы для компиляции практически чего угодно. И IDE автоматически перекомпилирует их при необходимости. Пакеты могут наследовать опции компилятора. Например: проект, использующий пакет, наследует каталог вывода пакета. Другими словами: каталог вывода пакета добавляется в пути поиска модулей проекта. Посмотрите в IDE: Проект->Параметры проекта->Параметры компилятора->Унаследованные.

Наследование срабатывает единажды. Но существуют исключения: Целевая платформа (ОС и CPU) проекта переопределяет цель для всех используемых пакетов. Это значит, если вы укажете Целевую ОС в проекте = 'win32' и скомпилируете проект, IDE выполнит проверку на предмет необходимости перекомпиляции пакетов для Целевой ОС.

Пример:

Пакет А имеет директорию вывода: lib/$(TargetOS) Проект использует А.

  1. Проект собирается для linux. IDE компилирует А для linux в <PackageDirOfA>/lib/linux/, затем компилирует проект для linux.
  2. Проект собирается для win32. IDE компилирует А для win32 в <PackageDirOfA>/lib/win32/, затем компилирует проект для win32.
  3. Проект снова собирается для linux. IDE проверяет, существует ли А для linux. Затем компилирует проект для linux.

Таким образом, использование макросов экономит много времени.

Для Unix (в общих чертах)

Опция -XLA используется для изменения зависимостей библиотек определённых в модулях. Формат -XLAold=new изменяет link-опцию ld -l<old> на -l<new>.

Опция -XR<sysroot> (recent trunk) может быть использована для указания корня Целевой ОС. Она используется для:

  • добавления префикса к указанным по-умолчанию путям библиотек, в прошлом вы использовали -Xd и эти пути вручную. Например для i386-linux

вместо следования в /lib, /usr/lib, и /usr/X11R6/lib к ld, будет следовать в <sysroot>/lib, <sysroot>/usr/lib, и <sysroot>/usr/X11R6/lib к ld.

  • определение местоположения библиотек С (linux-версий): glibc или uclibc. Например для uclibc будет принята попытка поиска по пути '<sysroot>/lib/ld-uClibc.so.0'

Для Linux под Win32

Это просто, есть некоторая информация в buildfaq

FreeBSD для sparc

Я пытался кросс-компилировать из х86 для Sparc Solaris 9. Несмотря на то что результат не работал должным образом привожу мою командную строку:

в компилятор / выполнить:

 gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'

~/src/sollib директория которая содержит:

  • набор файлов .o из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
  • libgcc.a из /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3
  • набор файлов lib*.so из /usr/lib: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so

Иллюстрация проблемы при компиляции:

 Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc
 Copyright (c) 1993-2005 by Florian Klaempfl
 Target OS: Solaris for SPARC
 Compiling system.pp
 system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found

Я подозреваю что ошибся с выбранными .o файлами.

Для Mac OS X

Посмотрите этот пост.


Авторы

Эта страница была конвертирована из epikwiki version.