Difference between revisions of "Cross compiling/pt"

From Lazarus wiki
Jump to navigationJump to search
(Allow for a name change on another page)
 
(47 intermediate revisions by 7 users not shown)
Line 2: Line 2:
  
 
=Introdução=
 
=Introdução=
Esta é uma curta introdução para novatos. As seções seguintes descrevem como configurar um sistema para cross-compilação, isto é, trabalhar no Linux and criar executáveis para Win32 (ou FreeBSD, Darwin, etc.). O FreePascal é um compilador e basicamente converte código em binário (linguagem de máquina). Os binários também contêm informação sobre como o sistema operacional inicia o executável. Portanto os  binários são específicos para cada plataforma. O FreePascal em si mesmo não precisa  de muita configuração. Ele pode criar binários para muitas plataformas. Somente lhe diga para fazer isso. Mas o compilador é somente uma parte. Existe também o assembler e o vinculador, e essas ferramentas não são capazes de criar código cross-plataforma. É por isso que nós precisamos criar vinculadores especiais 'ld' e  assembler 'as' para cada plataforma-alvo. Essas são as binutils. Depois de criar as ferramentas cross-plataforma, todas as unidades Pascal do FPC serão cross-compiladas. Por exemplo, existe um system.ppu para cada plataforma-alvo. Assim o seu arquivo de configuração do FPC será configurado de forma que a cross-compilação se torne tão fácil que você esquecer todos os detalhes aborrecidos. O mesmo será feito para a LCL - a biblioteca de componentes do Lazarus. E depois disso você pode fazer cross-compilação de seus programas Pascal para Win32. Ou iniciá-los no Wine ou copiá-los para uma máquina Windows e testá-los.
+
Esta é uma curta introdução para novatos. As seções seguintes descrevem como configurar um sistema para compilação cruzada, isto é, trabalhar no Linux and criar executáveis para Win32 (ou FreeBSD, Darwin, etc.). O Free Pascal é um compilador e basicamente converte código em binário (linguagem de máquina). Os binários também contêm informação sobre como o sistema operacional inicia o executável. Portanto os  binários são específicos para cada plataforma. O Free Pascal em si mesmo não precisa  de muita configuração. Ele pode criar binários para muitas plataformas. Somente lhe diga para fazer isso. Mas o compilador é somente uma parte. Existe também o montador e o vinculador, e essas ferramentas não são capazes de criar código cross-plataforma. É por isso que nós precisamos criar vinculadores especiais 'ld' e  assembler 'as' para cada plataforma-alvo. Essas são as binutils. Depois de criar as ferramentas cross-plataforma, todas as unidades Pascal do FPC serão cross-compiladas. Por exemplo, existe um system.ppu para cada plataforma-alvo. Assim o seu arquivo de configuração do FPC será configurado de forma que a compilação cruzada se torne tão fácil que você pode esquecer todos os detalhes aborrecidos. O mesmo será feito para a LCL - a biblioteca de componentes do Lazarus. E depois disso você pode fazer compilação cruzada de seus programas Pascal para Win32. Ou iniciá-los no Wine ou copiá-los para uma máquina Windows e testá-los.
  
 
==Passos Básicos==
 
==Passos Básicos==
Existem uns poucos passos em comum implicados em cross-compilação que você precisa cumprir em cada caso:
+
Existem uns poucos passos em comum implicados em compilação cruzada que você precisa cumprir em cada caso:
# Ter um compilador FreePascal para a plataforma em que você quer compilar.
+
# Ter um compilador Free Pascal para a plataforma em que você quer compilar.
# Ter o código-fonte do FreePascal.
+
# Ter o código-fonte do Free Pascal.
 
# Ou construí-lo dos fontes ou obter os binários das cross-binutils que executem na plataforma em que você está e são desenhadas para construir programas para a plataforma-alvo desejada.
 
# Ou construí-lo dos fontes ou obter os binários das cross-binutils que executem na plataforma em que você está e são desenhadas para construir programas para a plataforma-alvo desejada.
 
# Às vezes você vai precisar de alguns arquivos da plataforma para onde está compilando.
 
# Às vezes você vai precisar de alguns arquivos da plataforma para onde está compilando.
Line 13: Line 13:
 
=De Linux=
 
=De Linux=
 
==Para Linux==
 
==Para Linux==
Fique claro que isso é para compilar de Linux(x86_64) para Linux((i386).
+
Fique claro que isso é para compilar de Linux(x86_64) para Linux(i386).
  
 
Há chances de a sua distribuição Linux 64 bits já possibilitar a compilação de programas 32 bits mas devido à maneira como o processo de construção do FPC é desenhado existem algumas coisas que você vai precisar fazer:
 
Há chances de a sua distribuição Linux 64 bits já possibilitar a compilação de programas 32 bits mas devido à maneira como o processo de construção do FPC é desenhado existem algumas coisas que você vai precisar fazer:
Line 41: Line 41:
  
 
==Para Windows==
 
==Para Windows==
[[Cross_compiling_for_Win32_under_Linux]]
+
Manual oficial [[Cross_compiling_for_Windows_under_Linux]] <br>
 +
Manual para Lazarus 0.9.22 e FPC 2.0.4 http://fdavid.com.br/blog/?p=4
  
 
Se você está compilando a versão 2.1.1 ou superior do FPC, você pode apenas fazer:
 
Se você está compilando a versão 2.1.1 ou superior do FPC, você pode apenas fazer:
Line 51: Line 52:
 
Nota: para construir para Win64, o comando make é: make all OS TARGET=win64 CPU_TARGET=x86_64
 
Nota: para construir para Win64, o comando make é: make all OS TARGET=win64 CPU_TARGET=x86_64
  
A razão dessa siplicidade é o vinculador interno incluído nessa versão do FPC.
+
A razão dessa simplicidade é o vinculador interno incluído nessa versão do FPC.
  
==Para Darwin ou Mac OS X==
+
==Para Darwin ou macOS==
 
* Primeiro você precisa das binutils para a plataforma para a qual você quer compiilar. Baixe o odcctools deste site (use a versão CVS) e siga as instruções de instalação. http://www.opendarwin.org/projects/odcctools/
 
* Primeiro você precisa das binutils para a plataforma para a qual você quer compiilar. Baixe o odcctools deste site (use a versão CVS) e siga as instruções de instalação. http://www.opendarwin.org/projects/odcctools/
 
* Você precisa criar um falso diretório root, como: $HOME/darwinroot. Copie pelo menos os diretórios /System e/Frameworks e /usr (você deve ter que copiar mais do que isso) do seu computador Aple ou Darwin para $HOME/darwinroot.
 
* Você precisa criar um falso diretório root, como: $HOME/darwinroot. Copie pelo menos os diretórios /System e/Frameworks e /usr (você deve ter que copiar mais do que isso) do seu computador Aple ou Darwin para $HOME/darwinroot.
 
* Agora que você tem esses arquivos, crie uma pasta em $HOME/darwinroot chamada cross. Em qualquer lugar que você tenha instalado o odcctools você precisa fazer links for the cross tools to be more fpc friendly. Existe um grupo de arquivos de ferramentas odcc chamado powerpc-apple-darwin-*. Você precisa fazer links (ou renomeá-los) de modo que o powerpc-apple-darwin-ld se torne powerpc-darwin-ld. Faça o mesmo com *-ar *-as.
 
* Agora que você tem esses arquivos, crie uma pasta em $HOME/darwinroot chamada cross. Em qualquer lugar que você tenha instalado o odcctools você precisa fazer links for the cross tools to be more fpc friendly. Existe um grupo de arquivos de ferramentas odcc chamado powerpc-apple-darwin-*. Você precisa fazer links (ou renomeá-los) de modo que o powerpc-apple-darwin-ld se torne powerpc-darwin-ld. Faça o mesmo com *-ar *-as.
 
+
* Agora você está pronto para cross-compilar o FPC. Basicamente você precisa ter o código-fonte do FPC e uma janela de terminal aberta.
* now you are ready to crosscompile fpc. basically you need to have the fpc source and have a terminal open there.
+
Escreva:  
type:  
+
  $PATH=$PATH:$HOME/darwinroot/cross (ou onde você fez os symlinks)
  $PATH=$PATH:$HOME/darwinroot/cross (or whereever you made the symlinks)
+
Escreva (iirc):
type (iirc):
 
 
  make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"
 
  make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"
if that succeded you can install it to whereever you want with:  
+
Se isso der certo você pode instalá-lo em qualquer lugar que queira com:
 
  make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc
 
  make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc
 +
Agora copie o arquivo ./compiler/ppccross para onde você possa achá-lo, pois esse é  o compilador que você vai precisar para construir programas para PowerPC.
  
now copy the file ./compiler/ppccross somewhere you will be able to find it as it's the compiler you'll need to build powerpc programs
+
* Configure o seu arquivo /etc/fpc.cfg.
 
+
Adicionne uma seção como essa:
* configure your /etc/fpc.cfg file.
 
add a section like this:
 
 
  #IFDEF powerpc
 
  #IFDEF powerpc
 
  -Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
 
  -Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
Line 77: Line 76:
 
  #ENDIF
 
  #ENDIF
  
whenever you want to crosscompile you have to have ppccross and the symlinks to powerpc-darwin-* in the PATH
+
Sempre que você queira cross-compilar você precisa ter o ppccross e os symlinks para powerpc-darwin-* no seu Path. E você deve poder fazer o pcccross someprogie.pas e ele vai criar o executável Darwin.
and you should be able to just do ppccross someprogie.pas and it will create a darwin executable.
 
 
 
I may have mistated some things (or most everything) as it's been a while since I did this.
 
  
 
=De Windows=
 
=De Windows=
 
==Para Linux==
 
==Para Linux==
Marco vd Voort wrote some [http://www.stack.nl/~marcov/crossnotes.txt crossnotes]. If somebody has time, he can add them to this wiki.
 
  
=From Darwin (Mac OS X) i386=
+
(Marco vd Voort)
==from i386 to powerpc==
 
  
* Cross binutils
+
Para compilar para Linux do Windows: (o procedimento de FreeBSD não será muito diferente, copiar o cprt0 não é necessário para FreeBSD)
  
First check if you already have the files powerpc-darwin-ld and powerpc-darwin-as:
+
Requisitos:
 +
 
 +
- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado.
 +
 
 +
-ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip
 +
 
 +
- O FPC do repositório CVS (qualquer um acima de 1.9.6).
 +
 
 +
- Um árvore do Lazarus (qualquer uma construível a partir do mesmo período).
 +
 
 +
- Muitas bibliotecs do Linux alvo. Um dos servidores FPC é um SUSE, de onde eu obtive a lista abaixo:
 +
 
 +
1) Baixar ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip
 +
 
 +
2) Extraia-o e mova os arquivos i386* para <fpcbindir>\bin\i386-win3 (por exemplo c:\pp\bin\i386\win32)
 +
 
 +
3) Vá parra o diretório dos fontes do FPC
 +
 
 +
4) make clean
 +
 
 +
5) Faça o OS_TARGET = linux all
 +
 
 +
6) Faça o OS_TARGET = linux e instale INSTALL_PREFIX = <fpcbindir>
 +
 
 +
7) Prepare o diretório lib como nas intruções abaixo, eu usei d:\fpc\linuxlib para estocá-las.
 +
 
 +
8) Vá para <fpcbindir>\units\i386-linux\rtl  e copie o cprt21.o sobre o cprt0.o
 +
 
 +
9) Vá para o diretório do Lazarus
 +
 
 +
10) Edite o lazarus.pp e adicione {$linklib dl} e {$linklib gmodule} em algum lugar nos fontes.
 +
 
 +
11) Faça o OS_TARGET = linux all OPT = "-gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2"
 +
 
 +
Se der algum erro do vinculador (mais especificamente linker can't find -l<something>) então
 +
 
 +
12) Edite manualmente o link.res se necessário (veja abaixo para observações sobre gtk ) e adapte os nomes -l<x> no final dos arquivos. I had to add -1.2 to all gtk
 +
    libs, to keep them apart from gtk2
 +
 
 +
13) Execute o ppas.bat para reiniciar o vinculador
 +
 
 +
===Bibliotecas===
 +
 
 +
Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread).
 +
 
 +
Eu as coletei do target system e renomeei todas de lib<name>.so.x.y to lib<name>.so.
 +
 
 +
libgcc.a e umas outras são mais fáceis de encontrar fazendo gcc -v e procurando uma linha como
 +
 
 +
"Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs"
 +
 
 +
então algumas das libs estão em  /usr/lib/gcc-lib/i486-linux/3.3.5/
 +
Uma boa outra localização é /lib /usr/lib /usr/local/lib /usr/x11R6/lib e /opt/gnome/lib
 +
 
 +
libpthread.so.0
 +
 
 +
libdl.so
 +
 
 +
libc.so
 +
 
 +
ld-linux.so.2
 +
 
 +
crtbegin.o
 +
 
 +
crtbeginS.o
 +
 
 +
crtbeginT.o
 +
 
 +
crtend.o
 +
 
 +
crtendS.o
 +
 
 +
crtn.o
 +
 
 +
crti.o
 +
 
 +
libgcc.a
 +
 
 +
libX11.so
 +
 
 +
libXi.so
 +
 
 +
libglib-1.2.so
 +
 
 +
libgmodule-1.2.so.0
 +
 
 +
libgdk_pixbuf.so
 +
 
 +
libgdk-1.2.so
 +
 
 +
libgtk-1.2.so
 +
 
 +
libXext.so
 +
 
 +
libm.so
 +
 
 +
libdl.so.2
 +
 
 +
libgmodule-1.2.so
 +
 
 +
Note que alguns diretórios estão duplicados, com ou sem sufixo. Elas são necessárias porque alguma outra lib tem dependência dela.
 +
 
 +
Nome exato (assim o form lib<name>.so.x) Não podemos symlink no windows, então  eu simplesmente o copiei.
 +
 
 +
Errar ao renomear não é tão ruim, haverá chances de consertar . Tenha certeza de que todos os  crt* e o arquivo "libc.so" estão disponíveis, senão
 +
gerar o link.res vai dar errado.
 +
 
 +
No meu caso compilação para o passo 11 vai dar certo mas o vinculador vai dizer que não pode encontrar o libgtk.so e as outras bibliootecas marcadas com -1.2. Isso é por causa do target system, libgtk é GTK 2.0 enquanto nós queremos o gtk1.2 para o Lazarus.
 +
 
 +
Para consertar isso manualmente eu adicionei -1.2 às linhas -l correspondentes no final do arquivo link.res que foi gerado no Passo 11.
 +
 
 +
P.S.: Um bocado de edições do vinculador podem ser resolvidas com os beta linker control switches (-XLA and friends) em 2.0.4 e 2.1.1. Mas eles são beta, sem documentação e não necessariamente disponíveis em versões futuras. Sâo na maioria adicionados a um pacote de construtores (para Linux distros) e cross-compiladores uma chance de avaliar uma possível opção.
 +
 
 +
=De Darwin (macOS) i386=
 +
==De i386 para PowerPC==
 +
 
 +
* Cross Binutils
 +
 
 +
Primeiro verifique se você já tem os arquivos powerpc-darwin-ld e powerpc-darwin-as:
  
 
   $ which powerpc-darwin-ld
 
   $ which powerpc-darwin-ld
 
   $ which powerpc-darwin-as
 
   $ which powerpc-darwin-as
  
If you have these files skip the creation of the symlinks and go to the "Compile FPC" heading.
+
Se você tem esses arquivos, pule a criação dos symlinks e vá para o título "Compilar o FPC"
  
Actually, the "normal" binutils can be used, since they are universal. Therefore, simple symlinks are enough:
+
Atualmente as binutils "normais" podem ser usadas, já que elas são universais. Portanto, symlinks simples são suficientes:
  
 
   $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
 
   $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
 
   $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld
 
   $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld
  
The symlinks can be in any other directory, as long as it is in your $PATH (for example /sw/bin when installing through fink).
+
Os symlinks podem ficar em qualquer outro diretório, desde que estejam no seu $PATH (por exemplo /sw/bin when installing through fink).
  
* Compile FPC:
+
* Compilar o FPC:
  
 
   $ cd fpc/compiler
 
   $ cd fpc/compiler
 
   $ make cycle CPU_TARGET=powerpc
 
   $ make cycle CPU_TARGET=powerpc
  
This creates the powerpc compiler (fpc/compiler/ppcppc) and the units of the rtl.
+
Isto cria o compilarod PowerPC (fpc/compiler/ppcppc) e as unidades da RTL.
 +
 
 +
Para criar os binários PowerPC nenhum cross-compilador ativo é necessário. O FPC para PowerPC e ppcppc executam bem em IntelMacs usando Rosetta.
  
In order to create powerpc binaries no actual crosscompiler is needed. The powerpc fpc and ppcppc run fine on IntelMacs using Rosetta.
+
Mais teste e documentação são necessários para instalação paralela e uso dos dois.
  
More test and docs are needed for parallel installation of both and usage.
+
Se faltarem unidades, verifique seu arquivo de configuração, $HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg.
  
If there are missing units, check your config file, $HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg
+
Você pode ter que adicionar alguma coisa like or where ever as suas unidades estiverem localizadas.
You may have to add something like or where ever your units are located.
 
  
 
  -Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
 
  -Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
Line 123: Line 236:
 
  -Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
  
Reminder: Universal binaries are created from the individual (i386 and powerpc) binaries using lipo.
+
Lembrete: Binários universais são criados dos binários individuais (i386 and powerpc) usando lipo.
 +
 
 +
Currently (fpc 3.0.4) gives:
 +
 
 +
<syntaxhighlight lang="bash">
 +
fpc-cross-arm-gba
 +
fpc-cross-arm-linux
 +
fpc-cross-arm-nds
 +
fpc-cross-arm-wince
 +
fpc-cross-arm-armv4t-embedded
 +
fpc-cross-arm-armv7m-embedded
 +
fpc-cross-i386-darwin
 +
fpc-cross-i386-freebsd
 +
fpc-cross-i386-go32v2
 +
fpc-cross-i386-linux
 +
fpc-cross-i386-nativent
 +
fpc-cross-i386-netbsd
 +
fpc-cross-i386-solaris
 +
fpc-cross-i386-win32
 +
fpc-cross-i386-wince
 +
fpc-cross-jvm-android
 +
fpc-cross-jvm-java
 +
fpc-cross-m68k-linux
 +
fpc-cross-mipsel-linux
 +
fpc-cross-powerpc-linux
 +
fpc-cross-sparc-linux
 +
fpc-cross-x86-64-dragonfly
 +
fpc-cross-x86-64-freebsd
 +
fpc-cross-x86-64-linux
 +
fpc-cross-x86-64-win64
 +
</syntaxhighlight>
 +
 
 +
For other platforms (processors and systems) you have to do the setup by yourself. It is basically the same scheme: First, you need the corresponding binutils (See [[Binutils]]) and second, the crosscompiler and the run time library. Some more details of the building procedure can be learned from the fink package description files of the crosscompilers from above.
  
=Cross compile FAQ=
+
=FAQ de compilação cruzada=
==Por que cross compilação?==
+
==Por que compilação cruzada?==
 
Assim você pode desenvolver um programa para um OS/CPU e compilá-lo para outro OS/CPU sem reiniciar ou trocar de computador.
 
Assim você pode desenvolver um programa para um OS/CPU e compilá-lo para outro OS/CPU sem reiniciar ou trocar de computador.
  
==Why Linux to Windows and not the other way around?==
+
==Por que Linux para Windows e não de outro modo?==
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.
+
A principal razão para isso é que gerar binários Unix em plataformas estranhas (outro Unix ou mesmo distribuições Linux) é mais complicado. Vinculação estática já é complicada, ainda mais compartilhada.
  
You would need the used libraries from the target platforms (gtk, glib,libc etc), and a lot of additional configuring for ld. (library paths, dynlinker path, etc.)
+
Você poderia precisar usar bibliotecas das plataformas-alvo (gtk, glib,libc etc) e muitas configurações adicionais para ld (bibliotecas, caminhos, dynlinker path, etc.).
  
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.
+
Isso foi parcialmente feito (para a vinculação estática) mas é difícil pois precisa de uma pós-edição manual dos arquivos do vinculador de linha de comando e um entendimento profundo sobre o que faz os binários Unix tick (funcionar?).
  
==I want more information on building Freepascal. Where is it?==
+
==Eu gostaria de mais informações sobre a construção do Free Pascal. Onde posso encontrar?==
This is a general FAQ in pdf format about how to build and configure FPC: http://www.stack.nl/~marcov/buildfaq.pdf.
+
Essa é uma FAQ genérica em formato pdf sobre como construir e configurar o FPC: http://www.stack.nl/~marcov/buildfaq.pdf.

Latest revision as of 05:39, 19 July 2021

Deutsch (de) English (en) español (es) français (fr) magyar (hu) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Introdução

Esta é uma curta introdução para novatos. As seções seguintes descrevem como configurar um sistema para compilação cruzada, isto é, trabalhar no Linux and criar executáveis para Win32 (ou FreeBSD, Darwin, etc.). O Free Pascal é um compilador e basicamente converte código em binário (linguagem de máquina). Os binários também contêm informação sobre como o sistema operacional inicia o executável. Portanto os binários são específicos para cada plataforma. O Free Pascal em si mesmo não precisa de muita configuração. Ele pode criar binários para muitas plataformas. Somente lhe diga para fazer isso. Mas o compilador é somente uma parte. Existe também o montador e o vinculador, e essas ferramentas não são capazes de criar código cross-plataforma. É por isso que nós precisamos criar vinculadores especiais 'ld' e assembler 'as' para cada plataforma-alvo. Essas são as binutils. Depois de criar as ferramentas cross-plataforma, todas as unidades Pascal do FPC serão cross-compiladas. Por exemplo, existe um system.ppu para cada plataforma-alvo. Assim o seu arquivo de configuração do FPC será configurado de forma que a compilação cruzada se torne tão fácil que você pode esquecer todos os detalhes aborrecidos. O mesmo será feito para a LCL - a biblioteca de componentes do Lazarus. E depois disso você pode fazer compilação cruzada de seus programas Pascal para Win32. Ou iniciá-los no Wine ou copiá-los para uma máquina Windows e testá-los.

Passos Básicos

Existem uns poucos passos em comum implicados em compilação cruzada que você precisa cumprir em cada caso:

  1. Ter um compilador Free Pascal para a plataforma em que você quer compilar.
  2. Ter o código-fonte do Free Pascal.
  3. Ou construí-lo dos fontes ou obter os binários das cross-binutils que executem na plataforma em que você está e são desenhadas para construir programas para a plataforma-alvo desejada.
  4. Às vezes você vai precisar de alguns arquivos da plataforma para onde está compilando.

De Linux

Para Linux

Fique claro que isso é para compilar de Linux(x86_64) para Linux(i386).

Há chances de a sua distribuição Linux 64 bits já possibilitar a compilação de programas 32 bits mas devido à maneira como o processo de construção do FPC é desenhado existem algumas coisas que você vai precisar fazer:

  • Primeiro cheque se você já tem os arquivos i386-linux-ld e i386-linux-as:
 bash $ which i386-linux-ld
 bash $ which i386-linux-as

Se você tem esses arquivos, pule para o título "Compilar o FPC". Se você não tem os arquivos, eu fiz alguns scripts:

#!/bin/bash
# name this file /usr/bin/i386-linux-ld
ld -A elf32-i386 $@
#!/bin/bash
# name this file /usr/bin/i386-linux-as
as --32 $@
  • Fazê-los um executável:
bash $ chmod +x /usr/bin/i386-linux-as
bash $ chmod +x /usr/bin/i386-linux-ld
  • Compilar o FPC:
bash $ make all CPU_TARGET=i386

então:

bash $ su -c "make install CPU_TARGET=i386"

É isso. Edite seu arquivo /etc/fpc.cfg se necessário.

Para Windows

Manual oficial Cross_compiling_for_Windows_under_Linux
Manual para Lazarus 0.9.22 e FPC 2.0.4 http://fdavid.com.br/blog/?p=4

Se você está compilando a versão 2.1.1 ou superior do FPC, você pode apenas fazer:

bash $ make all OS_TARGET=win32 CPU_TARGET=i386

e então

bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"

Nota: para construir para Win64, o comando make é: make all OS TARGET=win64 CPU_TARGET=x86_64

A razão dessa simplicidade é o vinculador interno incluído nessa versão do FPC.

Para Darwin ou macOS

  • Primeiro você precisa das binutils para a plataforma para a qual você quer compiilar. Baixe o odcctools deste site (use a versão CVS) e siga as instruções de instalação. http://www.opendarwin.org/projects/odcctools/
  • Você precisa criar um falso diretório root, como: $HOME/darwinroot. Copie pelo menos os diretórios /System e/Frameworks e /usr (você deve ter que copiar mais do que isso) do seu computador Aple ou Darwin para $HOME/darwinroot.
  • Agora que você tem esses arquivos, crie uma pasta em $HOME/darwinroot chamada cross. Em qualquer lugar que você tenha instalado o odcctools você precisa fazer links for the cross tools to be more fpc friendly. Existe um grupo de arquivos de ferramentas odcc chamado powerpc-apple-darwin-*. Você precisa fazer links (ou renomeá-los) de modo que o powerpc-apple-darwin-ld se torne powerpc-darwin-ld. Faça o mesmo com *-ar *-as.
  • Agora você está pronto para cross-compilar o FPC. Basicamente você precisa ter o código-fonte do FPC e uma janela de terminal aberta.

Escreva:

$PATH=$PATH:$HOME/darwinroot/cross (ou onde você fez os symlinks)

Escreva (iirc):

make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"

Se isso der certo você pode instalá-lo em qualquer lugar que queira com:

make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc

Agora copie o arquivo ./compiler/ppccross para onde você possa achá-lo, pois esse é o compilador que você vai precisar para construir programas para PowerPC.

  • Configure o seu arquivo /etc/fpc.cfg.

Adicionne uma seção como essa:

#IFDEF powerpc
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
-k-systemroot $HOME/darwin/cross
#ENDIF

Sempre que você queira cross-compilar você precisa ter o ppccross e os symlinks para powerpc-darwin-* no seu Path. E você deve poder fazer o pcccross someprogie.pas e ele vai criar o executável Darwin.

De Windows

Para Linux

(Marco vd Voort)

Para compilar para Linux do Windows: (o procedimento de FreeBSD não será muito diferente, copiar o cprt0 não é necessário para FreeBSD)

Requisitos:

- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado.

-ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip

- O FPC do repositório CVS (qualquer um acima de 1.9.6).

- Um árvore do Lazarus (qualquer uma construível a partir do mesmo período).

- Muitas bibliotecs do Linux alvo. Um dos servidores FPC é um SUSE, de onde eu obtive a lista abaixo:

1) Baixar ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip

2) Extraia-o e mova os arquivos i386* para <fpcbindir>\bin\i386-win3 (por exemplo c:\pp\bin\i386\win32)

3) Vá parra o diretório dos fontes do FPC

4) make clean

5) Faça o OS_TARGET = linux all

6) Faça o OS_TARGET = linux e instale INSTALL_PREFIX = <fpcbindir>

7) Prepare o diretório lib como nas intruções abaixo, eu usei d:\fpc\linuxlib para estocá-las.

8) Vá para <fpcbindir>\units\i386-linux\rtl e copie o cprt21.o sobre o cprt0.o

9) Vá para o diretório do Lazarus

10) Edite o lazarus.pp e adicione {$linklib dl} e {$linklib gmodule} em algum lugar nos fontes.

11) Faça o OS_TARGET = linux all OPT = "-gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2"

Se der algum erro do vinculador (mais especificamente linker can't find -l<something>) então

12) Edite manualmente o link.res se necessário (veja abaixo para observações sobre gtk ) e adapte os nomes -l<x> no final dos arquivos. I had to add -1.2 to all gtk

   libs, to keep them apart from gtk2

13) Execute o ppas.bat para reiniciar o vinculador

Bibliotecas

Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread).

Eu as coletei do target system e renomeei todas de lib<name>.so.x.y to lib<name>.so.

libgcc.a e umas outras são mais fáceis de encontrar fazendo gcc -v e procurando uma linha como

"Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs"

então algumas das libs estão em /usr/lib/gcc-lib/i486-linux/3.3.5/ Uma boa outra localização é /lib /usr/lib /usr/local/lib /usr/x11R6/lib e /opt/gnome/lib

libpthread.so.0

libdl.so

libc.so

ld-linux.so.2

crtbegin.o

crtbeginS.o

crtbeginT.o

crtend.o

crtendS.o

crtn.o

crti.o

libgcc.a

libX11.so

libXi.so

libglib-1.2.so

libgmodule-1.2.so.0

libgdk_pixbuf.so

libgdk-1.2.so

libgtk-1.2.so

libXext.so

libm.so

libdl.so.2

libgmodule-1.2.so

Note que alguns diretórios estão duplicados, com ou sem sufixo. Elas são necessárias porque alguma outra lib tem dependência dela.

Nome exato (assim o form lib<name>.so.x) Não podemos symlink no windows, então eu simplesmente o copiei.

Errar ao renomear não é tão ruim, haverá chances de consertar . Tenha certeza de que todos os crt* e o arquivo "libc.so" estão disponíveis, senão gerar o link.res vai dar errado.

No meu caso compilação para o passo 11 vai dar certo mas o vinculador vai dizer que não pode encontrar o libgtk.so e as outras bibliootecas marcadas com -1.2. Isso é por causa do target system, libgtk é GTK 2.0 enquanto nós queremos o gtk1.2 para o Lazarus.

Para consertar isso manualmente eu adicionei -1.2 às linhas -l correspondentes no final do arquivo link.res que foi gerado no Passo 11.

P.S.: Um bocado de edições do vinculador podem ser resolvidas com os beta linker control switches (-XLA and friends) em 2.0.4 e 2.1.1. Mas eles são beta, sem documentação e não necessariamente disponíveis em versões futuras. Sâo na maioria adicionados a um pacote de construtores (para Linux distros) e cross-compiladores uma chance de avaliar uma possível opção.

De Darwin (macOS) i386

De i386 para PowerPC

  • Cross Binutils

Primeiro verifique se você já tem os arquivos powerpc-darwin-ld e powerpc-darwin-as:

 $ which powerpc-darwin-ld
 $ which powerpc-darwin-as

Se você tem esses arquivos, pule a criação dos symlinks e vá para o título "Compilar o FPC"

Atualmente as binutils "normais" podem ser usadas, já que elas são universais. Portanto, symlinks simples são suficientes:

 $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
 $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld

Os symlinks podem ficar em qualquer outro diretório, desde que estejam no seu $PATH (por exemplo /sw/bin when installing through fink).

  • Compilar o FPC:
 $ cd fpc/compiler
 $ make cycle CPU_TARGET=powerpc

Isto cria o compilarod PowerPC (fpc/compiler/ppcppc) e as unidades da RTL.

Para criar os binários PowerPC nenhum cross-compilador ativo é necessário. O FPC para PowerPC e ppcppc executam bem em IntelMacs usando Rosetta.

Mais teste e documentação são necessários para instalação paralela e uso dos dois.

Se faltarem unidades, verifique seu arquivo de configuração, $HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg.

Você pode ter que adicionar alguma coisa like or where ever as suas unidades estiverem localizadas.

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

Lembrete: Binários universais são criados dos binários individuais (i386 and powerpc) usando lipo.

Currently (fpc 3.0.4) gives:

fpc-cross-arm-gba
fpc-cross-arm-linux
fpc-cross-arm-nds
fpc-cross-arm-wince
fpc-cross-arm-armv4t-embedded
fpc-cross-arm-armv7m-embedded
fpc-cross-i386-darwin
fpc-cross-i386-freebsd
fpc-cross-i386-go32v2
fpc-cross-i386-linux
fpc-cross-i386-nativent
fpc-cross-i386-netbsd
fpc-cross-i386-solaris
fpc-cross-i386-win32
fpc-cross-i386-wince
fpc-cross-jvm-android
fpc-cross-jvm-java
fpc-cross-m68k-linux
fpc-cross-mipsel-linux
fpc-cross-powerpc-linux
fpc-cross-sparc-linux
fpc-cross-x86-64-dragonfly
fpc-cross-x86-64-freebsd
fpc-cross-x86-64-linux
fpc-cross-x86-64-win64

For other platforms (processors and systems) you have to do the setup by yourself. It is basically the same scheme: First, you need the corresponding binutils (See Binutils) and second, the crosscompiler and the run time library. Some more details of the building procedure can be learned from the fink package description files of the crosscompilers from above.

FAQ de compilação cruzada

Por que compilação cruzada?

Assim você pode desenvolver um programa para um OS/CPU e compilá-lo para outro OS/CPU sem reiniciar ou trocar de computador.

Por que Linux para Windows e não de outro modo?

A principal razão para isso é que gerar binários Unix em plataformas estranhas (outro Unix ou mesmo distribuições Linux) é mais complicado. Vinculação estática já é complicada, ainda mais compartilhada.

Você poderia precisar usar bibliotecas das plataformas-alvo (gtk, glib,libc etc) e muitas configurações adicionais para ld (bibliotecas, caminhos, dynlinker path, etc.).

Isso foi parcialmente feito (para a vinculação estática) mas é difícil pois precisa de uma pós-edição manual dos arquivos do vinculador de linha de comando e um entendimento profundo sobre o que faz os binários Unix tick (funcionar?).

Eu gostaria de mais informações sobre a construção do Free Pascal. Onde posso encontrar?

Essa é uma FAQ genérica em formato pdf sobre como construir e configurar o FPC: http://www.stack.nl/~marcov/buildfaq.pdf.