Difference between revisions of "Cross compiling/pt"

From Free Pascal wiki
Jump to navigationJump to search
(Allow for a name change on another page)
 
(23 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{Compilação cruzada}}
+
{{Cross compiling}}
  
 
=Introdução=
 
=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 monttador 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.
+
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==
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==
Manual oficial [[Cross_compiling_for_Win32_under_Linux]] <br>
+
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  
 
Manual para Lazarus 0.9.22 e FPC 2.0.4 http://fdavid.com.br/blog/?p=4  
  
Line 54: Line 54:
 
A razão dessa simplicidade é 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.
Line 77: Line 77:
  
 
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.
 
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.
 
Eu posso ter errado alguma coisa (ou quase tudo) as it's been a while pois eu fiz assim.
 
  
 
=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.)
+
(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)
 
Para compilar para Linux do Windows: (o procedimento de FreeBSD não será muito diferente, copiar o cprt0 não é necessário para FreeBSD)
  
Requirements:
+
Requisitos:
  
 
- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado.
 
- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado.
Line 119: Line 117:
 
10) Edite o lazarus.pp e adicione {$linklib dl} e {$linklib gmodule} em algum lugar nos fontes.
 
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 "  
+
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
 
Se der algum erro do vinculador (mais especificamente linker can't find -l<something>) então
Line 126: Line 124:
 
     libs, to keep them apart from gtk2
 
     libs, to keep them apart from gtk2
  
13) run ppas.bat to restart the linker
+
13) Execute o ppas.bat para reiniciar o vinculador
  
----------- Libraries
+
===Bibliotecas===
  
These are the libraries I collected for both lazarus and the textmode IDE (lazarus doesn't need pthread).
+
Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread).
  
I gathered these from the target system, and renamed all from lib<name>.so.x.y to lib<name>.so.
+
Eu as coletei do target system e renomeei todas de lib<name>.so.x.y to lib<name>.so.
  
libgcc.a and a few others are easiest found by doing gcc -v and look for a line like
+
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"
 
"Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs"
  
then some of the libs are in /usr/lib/gcc-lib/i486-linux/3.3.5/
+
então algumas das libs estão em /usr/lib/gcc-lib/i486-linux/3.3.5/
Some other good locations are /lib /usr/lib /usr/local/lib /usr/x11R6/lib and /opt/gnome/lib
+
Uma boa outra localização é /lib /usr/lib /usr/local/lib /usr/x11R6/lib e /opt/gnome/lib
  
 
libpthread.so.0
 
libpthread.so.0
Line 187: Line 185:
 
libgmodule-1.2.so
 
libgmodule-1.2.so
  
Note that some directories are duplicate, with a suffix and not. These are required because some other lib has a dependancy on that
+
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.
exact name (so the form lib<name>.so.x) we can't symlink on windows, so I simply copy it.
+
 
 +
Nome exato (assim o form lib<name>.so.x) Não podemos symlink no windows, então  eu simplesmente o copiei.
  
Making mistakes with renaming is not that bad, there will be chances to fix it. Make sure all crt* and a file "libc.so" are available, otherwise
+
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
generating link.res will go wrong. (Yes, Peter, that was my mistake :-)
+
gerar o link.res vai dar errado.
  
In my case compilation for step 11 will go ok, but the linker will complain it can't find libgtk.so and the other libraries marked with -1.2
+
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.
This is because on the target system, libgtk is gtk 2.0, while we want gtk1.2 for lazarus.
 
  
To fix this I manually added -1.2 to the corresponding -l lines in the bottom of the link.res file that was generated by step 11
+
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.
+
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.
a lot of linker editing _can_ be resolved with the beta linker control
 
switches (-XLA and friends) in 2.0.4 and 2.1.1 . However these are beta,
 
undocumented and not necessary available in future versions. They were
 
mostly added to give package builders ( for linux distro's) and
 
crosscompilers a chance to evaluate possible option.
 
  
=From Darwin (Mac OS X) i386=
+
=De Darwin (macOS) i386=
==from i386 to powerpc==
+
==De i386 para PowerPC==
  
* Cross binutils
+
* Cross Binutils
  
First check if you already have the files powerpc-darwin-ld and powerpc-darwin-as:
+
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.
  
In order to create powerpc binaries no actual crosscompiler is needed. The powerpc fpc and ppcppc run fine on IntelMacs using Rosetta.
+
Para criar os binários PowerPC nenhum cross-compilador ativo é necessário. O FPC para PowerPC e ppcppc executam bem em IntelMacs usando Rosetta.
  
More test and docs are needed for parallel installation of both and usage.
+
Mais teste e documentação são necessários para instalação paralela e uso dos dois.
  
If there are missing units, check your config file, $HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg
+
Se faltarem unidades, verifique seu arquivo de configuração, $HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg.
You may have to add something like or where ever your units are located.
+
 
 +
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/
Line 242: 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.
  
 
=FAQ de compilação cruzada=
 
=FAQ de compilação cruzada=
Line 248: Line 274:
 
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?).
  
==Eu gostaria de mais informações sobre a contrução do Free Pascal. Onde posso encontrar?==
+
==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.
 
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.