Sign in Join
Wiki copytemporary

Cross compiling/pt: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Introdução
22
33Esta é 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.
44
55## Passos Básicos
66
77Existem uns poucos passos em comum implicados em compilação cruzada que você precisa cumprir em cada caso:
88
991. Ter um compilador Free Pascal para a plataforma em que você quer compilar.
10102. Ter o código-fonte do Free Pascal.
11113. 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.
12124. Às vezes você vai precisar de alguns arquivos da plataforma para onde está compilando.
1313
1414# De Linux
1515
1616## Para Linux
1717
1818Fique claro que isso é para compilar de Linux(x86_64) para Linux(i386).
1919
2020Há 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:
2121
2222- Primeiro cheque se você já tem os arquivos i386-linux-ld e i386-linux-as:
2323
24-` bash $ which i386-linux-ld`\
25-` bash $ which i386-linux-as`
24+```text
25+ bash $ which i386-linux-ld
26+ bash $ which i386-linux-as
27+```
2628
2729Se você tem esses arquivos, pule para o título "Compilar o FPC". Se você não tem os arquivos, eu fiz alguns scripts:
2830
29-`#!/bin/bash`\
30-`# name this file /usr/bin/i386-linux-ld`\
31-`ld -A elf32-i386 $@`
31+```text
32+#!/bin/bash
33+# name this file /usr/bin/i386-linux-ld
34+ld -A elf32-i386 $@
35+```
3236
33-`#!/bin/bash`\
34-`# name this file /usr/bin/i386-linux-as`\
35-`as --32 $@`
37+```text
38+#!/bin/bash
39+# name this file /usr/bin/i386-linux-as
40+as --32 $@
41+```
3642
3743- Fazê-los um executável:
3844
39-`bash $ chmod +x /usr/bin/i386-linux-as`\
40-`bash $ chmod +x /usr/bin/i386-linux-ld`
45+```text
46+bash $ chmod +x /usr/bin/i386-linux-as
47+bash $ chmod +x /usr/bin/i386-linux-ld
48+```
4149
4250- Compilar o FPC:
4351
44-`bash $ make all CPU_TARGET=i386`
52+```text
53+bash $ make all CPU_TARGET=i386
54+```
4555
4656então:
4757
48-`bash $ su -c "make install CPU_TARGET=i386"`
58+```text
59+bash $ su -c "make install CPU_TARGET=i386"
60+```
4961
5062É isso. Edite seu arquivo /etc/fpc.cfg se necessário.
5163
5264## Para Windows
5365
5466Manual oficial [[Cross compiling for Windows under Linux]]\
5567Manual para Lazarus 0.9.22 e FPC 2.0.4 <http://fdavid.com.br/blog/?p=4>
5668
5769Se você está compilando a versão 2.1.1 ou superior do FPC, você pode apenas fazer:
5870
59-`bash $ make all OS_TARGET=win32 CPU_TARGET=i386`
71+```text
72+bash $ make all OS_TARGET=win32 CPU_TARGET=i386
73+```
6074
6175e então
6276
63-`bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"`
77+```text
78+bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"
79+```
6480
6581Nota: para construir para Win64, o comando make é: make all OS TARGET=win64 CPU_TARGET=x86_64
6682
6783A razão dessa simplicidade é o vinculador interno incluído nessa versão do FPC.
6884
6985## Para Darwin ou macOS
7086
7187- 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/>
7288- 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.
7389- 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.
7490- 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.
7591
7692Escreva:
7793
78-`$PATH=$PATH:$HOME/darwinroot/cross (ou onde você fez os symlinks)`
94+```text
95+$PATH=$PATH:$HOME/darwinroot/cross (ou onde você fez os symlinks)
96+```
7997
8098Escreva (iirc):
8199
82-`make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"`
100+```text
101+make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"
102+```
83103
84104Se isso der certo você pode instalá-lo em qualquer lugar que queira com:
85105
86-`make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc`
106+```text
107+make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc
108+```
87109
88110Agora copie o arquivo ./compiler/ppccross para onde você possa achá-lo, pois esse é o compilador que você vai precisar para construir programas para PowerPC.
89111
90112- Configure o seu arquivo /etc/fpc.cfg.
91113
92114Adicionne uma seção como essa:
93115
94-`#IFDEF powerpc`\
95-`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/`\
96-`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
97-`-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*`\
98-`-k-systemroot $HOME/darwin/cross`\
99-`#ENDIF`
116+```text
117+#IFDEF powerpc
118+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
119+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
120+-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
121+-k-systemroot $HOME/darwin/cross
122+#ENDIF
123+```
100124
101125Sempre 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.
102126
103127# De Windows
104128
105129## Para Linux
106130
107131(Marco vd Voort)
108132
109133Para compilar para Linux do Windows: (o procedimento de FreeBSD não será muito diferente, copiar o cprt0 não é necessário para FreeBSD)
110134
111135Requisitos:
112136
113137\- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado.
114138
115139-ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip
116140
117141\- O FPC do repositório CVS (qualquer um acima de 1.9.6).
118142
119143\- Um árvore do Lazarus (qualquer uma construível a partir do mesmo período).
120144
121145\- Muitas bibliotecs do Linux alvo. Um dos servidores FPC é um SUSE, de onde eu obtive a lista abaixo:
122146
1231471\) Baixar <ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip>
124148
1251492\) Extraia-o e mova os arquivos i386* para \<fpcbindir\>\bin\i386-win3 (por exemplo c:\pp\bin\i386\win32)
126150
1271513\) Vá parra o diretório dos fontes do FPC
128152
1291534\) make clean
130154
1311555\) Faça o OS_TARGET = linux all
132156
1331576\) Faça o OS_TARGET = linux e instale INSTALL_PREFIX = \<fpcbindir\>
134158
1351597\) Prepare o diretório lib como nas intruções abaixo, eu usei d:\fpc\linuxlib para estocá-las.
136160
1371618\) Vá para \<fpcbindir\>\units\i386-linux\rtl e copie o cprt21.o sobre o cprt0.o
138162
1391639\) Vá para o diretório do Lazarus
140164
14116510\) Edite o lazarus.pp e adicione {\$linklib dl} e {\$linklib gmodule} em algum lugar nos fontes.
142166
14316711\) Faça o OS_TARGET = linux all OPT = "-gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2"
144168
145169Se der algum erro do vinculador (mais especificamente linker can't find -l\<something\>) então
146170
14717112\) 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
148172
149-`   libs, to keep them apart from gtk2`
173+```text
174+ libs, to keep them apart from gtk2
175+```
150176
15117713\) Execute o ppas.bat para reiniciar o vinculador
152178
153179### Bibliotecas
154180
155181Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread).
156182
157183Eu as coletei do target system e renomeei todas de lib\<name\>.so.x.y to lib\<name\>.so.
158184
159185libgcc.a e umas outras são mais fáceis de encontrar fazendo gcc -v e procurando uma linha como
160186
161187"Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs"
162188
163189entã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
164190
165191libpthread.so.0
166192
167193libdl.so
168194
169195libc.so
170196
171197ld-linux.so.2
172198
173199crtbegin.o
174200
175201crtbeginS.o
176202
177203crtbeginT.o
178204
179205crtend.o
180206
181207crtendS.o
182208
183209crtn.o
184210
185211crti.o
186212
187213libgcc.a
188214
189215libX11.so
190216
191217libXi.so
192218
193219libglib-1.2.so
194220
195221libgmodule-1.2.so.0
196222
197223libgdk_pixbuf.so
198224
199225libgdk-1.2.so
200226
201227libgtk-1.2.so
202228
203229libXext.so
204230
205231libm.so
206232
207233libdl.so.2
208234
209235libgmodule-1.2.so
210236
211237Note que alguns diretórios estão duplicados, com ou sem sufixo. Elas são necessárias porque alguma outra lib tem dependência dela.
212238
213239Nome exato (assim o form lib\<name\>.so.x) Não podemos symlink no windows, então eu simplesmente o copiei.
214240
215241Errar 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.
216242
217243No 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.
218244
219245Para consertar isso manualmente eu adicionei -1.2 às linhas -l correspondentes no final do arquivo link.res que foi gerado no Passo 11.
220246
221247P.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.
222248
223249# De Darwin (macOS) i386
224250
225251## De i386 para PowerPC
226252
227253- Cross Binutils
228254
229255Primeiro verifique se você já tem os arquivos powerpc-darwin-ld e powerpc-darwin-as:
230256
231-` $ which powerpc-darwin-ld`\
232-` $ which powerpc-darwin-as`
257+```text
258+ $ which powerpc-darwin-ld
259+ $ which powerpc-darwin-as
260+```
233261
234262Se você tem esses arquivos, pule a criação dos symlinks e vá para o título "Compilar o FPC"
235263
236264Atualmente as binutils "normais" podem ser usadas, já que elas são universais. Portanto, symlinks simples são suficientes:
237265
238-` $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as`\
239-` $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld`
266+```text
267+ $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
268+ $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld
269+```
240270
241271Os symlinks podem ficar em qualquer outro diretório, desde que estejam no seu \$PATH (por exemplo /sw/bin when installing through fink).
242272
243273- Compilar o FPC:
244274
245-` $ cd fpc/compiler`\
246-` $ make cycle CPU_TARGET=powerpc`
275+```text
276+ $ cd fpc/compiler
277+ $ make cycle CPU_TARGET=powerpc
278+```
247279
248280Isto cria o compilarod PowerPC (fpc/compiler/ppcppc) e as unidades da RTL.
249281
250282Para criar os binários PowerPC nenhum cross-compilador ativo é necessário. O FPC para PowerPC e ppcppc executam bem em IntelMacs usando Rosetta.
251283
252284Mais teste e documentação são necessários para instalação paralela e uso dos dois.
253285
254286Se faltarem unidades, verifique seu arquivo de configuração, \$HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg.
255287
256288Você pode ter que adicionar alguma coisa like or where ever as suas unidades estiverem localizadas.
257289
258-`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/`\
259-`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
260-`-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*`
290+```text
291+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
292+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
293+-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
294+```
261295
262296Lembrete: Binários universais são criados dos binários individuais (i386 and powerpc) usando lipo.
263297
264298Currently (fpc 3.0.4) gives:
265299
266300``` bash
267301fpc-cross-arm-gba
268302fpc-cross-arm-linux
269303fpc-cross-arm-nds
270304fpc-cross-arm-wince
271305fpc-cross-arm-armv4t-embedded
272306fpc-cross-arm-armv7m-embedded
273307fpc-cross-i386-darwin
274308fpc-cross-i386-freebsd
275309fpc-cross-i386-go32v2
276310fpc-cross-i386-linux
277311fpc-cross-i386-nativent
278312fpc-cross-i386-netbsd
279313fpc-cross-i386-solaris
280314fpc-cross-i386-win32
281315fpc-cross-i386-wince
282316fpc-cross-jvm-android
283317fpc-cross-jvm-java
284318fpc-cross-m68k-linux
285319fpc-cross-mipsel-linux
286320fpc-cross-powerpc-linux
287321fpc-cross-sparc-linux
288322fpc-cross-x86-64-dragonfly
289323fpc-cross-x86-64-freebsd
290324fpc-cross-x86-64-linux
291325fpc-cross-x86-64-win64
292326```
293327
294328For 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.
295329
296330# FAQ de compilação cruzada
297331
298332## Por que compilação cruzada?
299333
300334Assim você pode desenvolver um programa para um OS/CPU e compilá-lo para outro OS/CPU sem reiniciar ou trocar de computador.
301335
302336## Por que Linux para Windows e não de outro modo?
303337
304338A 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.
305339
306340Você poderia precisar usar bibliotecas das plataformas-alvo (gtk, glib,libc etc) e muitas configurações adicionais para ld (bibliotecas, caminhos, dynlinker path, etc.).
307341
308342Isso 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?).
309343
310344## Eu gostaria de mais informações sobre a construção do Free Pascal. Onde posso encontrar?
311345
312346Essa é uma FAQ genérica em formato pdf sobre como construir e configurar o FPC: <http://www.stack.nl/~marcov/buildfaq.pdf>.
313347
314348---
315349*From the Free Pascal wiki, page "Cross compiling/pt", as it stood on 2021-07-19 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history