Cross compiling/pt: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Cross compiling/pt
| Old | New | Line | |
|---|---|---|---|
| 1 | + | # Introdução | |
| 2 | + | ||
| 3 | + | 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. | |
| 4 | + | ||
| 5 | + | ## Passos Básicos | |
| 6 | + | ||
| 7 | + | Existem uns poucos passos em comum implicados em compilação cruzada que você precisa cumprir em cada caso: | |
| 8 | + | ||
| 9 | + | 1. Ter um compilador Free Pascal para a plataforma em que você quer compilar. | |
| 10 | + | 2. Ter o código-fonte do Free Pascal. | |
| 11 | + | 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. | |
| 12 | + | 4. Às vezes você vai precisar de alguns arquivos da plataforma para onde está compilando. | |
| 13 | + | ||
| 14 | + | # De Linux | |
| 15 | + | ||
| 16 | + | ## Para Linux | |
| 17 | + | ||
| 18 | + | Fique claro que isso é para compilar de Linux(x86_64) para Linux(i386). | |
| 19 | + | ||
| 20 | + | 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: | |
| 21 | + | ||
| 22 | + | - Primeiro cheque se você já tem os arquivos i386-linux-ld e i386-linux-as: | |
| 23 | + | ||
| 24 | + | ` bash $ which i386-linux-ld`\ | |
| 25 | + | ` bash $ which i386-linux-as` | |
| 26 | + | ||
| 27 | + | Se você tem esses arquivos, pule para o título "Compilar o FPC". Se você não tem os arquivos, eu fiz alguns scripts: | |
| 28 | + | ||
| 29 | + | `#!/bin/bash`\ | |
| 30 | + | `# name this file /usr/bin/i386-linux-ld`\ | |
| 31 | + | `ld -A elf32-i386 $@` | |
| 32 | + | ||
| 33 | + | `#!/bin/bash`\ | |
| 34 | + | `# name this file /usr/bin/i386-linux-as`\ | |
| 35 | + | `as --32 $@` | |
| 36 | + | ||
| 37 | + | - Fazê-los um executável: | |
| 38 | + | ||
| 39 | + | `bash $ chmod +x /usr/bin/i386-linux-as`\ | |
| 40 | + | `bash $ chmod +x /usr/bin/i386-linux-ld` | |
| 41 | + | ||
| 42 | + | - Compilar o FPC: | |
| 43 | + | ||
| 44 | + | `bash $ make all CPU_TARGET=i386` | |
| 45 | + | ||
| 46 | + | então: | |
| 47 | + | ||
| 48 | + | `bash $ su -c "make install CPU_TARGET=i386"` | |
| 49 | + | ||
| 50 | + | É isso. Edite seu arquivo /etc/fpc.cfg se necessário. | |
| 51 | + | ||
| 52 | + | ## Para Windows | |
| 53 | + | ||
| 54 | + | Manual oficial [[Cross compiling for Windows under Linux]]\ | |
| 55 | + | Manual para Lazarus 0.9.22 e FPC 2.0.4 <http://fdavid.com.br/blog/?p=4> | |
| 56 | + | ||
| 57 | + | Se você está compilando a versão 2.1.1 ou superior do FPC, você pode apenas fazer: | |
| 58 | + | ||
| 59 | + | `bash $ make all OS_TARGET=win32 CPU_TARGET=i386` | |
| 60 | + | ||
| 61 | + | e então | |
| 62 | + | ||
| 63 | + | `bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"` | |
| 64 | + | ||
| 65 | + | Nota: para construir para Win64, o comando make é: make all OS TARGET=win64 CPU_TARGET=x86_64 | |
| 66 | + | ||
| 67 | + | A razão dessa simplicidade é o vinculador interno incluído nessa versão do FPC. | |
| 68 | + | ||
| 69 | + | ## Para Darwin ou macOS | |
| 70 | + | ||
| 71 | + | - 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/> | |
| 72 | + | - 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. | |
| 73 | + | - 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. | |
| 74 | + | - 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. | |
| 75 | + | ||
| 76 | + | Escreva: | |
| 77 | + | ||
| 78 | + | `$PATH=$PATH:$HOME/darwinroot/cross (ou onde você fez os symlinks)` | |
| 79 | + | ||
| 80 | + | Escreva (iirc): | |
| 81 | + | ||
| 82 | + | `make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"` | |
| 83 | + | ||
| 84 | + | Se isso der certo você pode instalá-lo em qualquer lugar que queira com: | |
| 85 | + | ||
| 86 | + | `make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc` | |
| 87 | + | ||
| 88 | + | 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. | |
| 89 | + | ||
| 90 | + | - Configure o seu arquivo /etc/fpc.cfg. | |
| 91 | + | ||
| 92 | + | Adicionne uma seção como essa: | |
| 93 | + | ||
| 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` | |
| 100 | + | ||
| 101 | + | 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. | |
| 102 | + | ||
| 103 | + | # De Windows | |
| 104 | + | ||
| 105 | + | ## Para Linux | |
| 106 | + | ||
| 107 | + | (Marco vd Voort) | |
| 108 | + | ||
| 109 | + | Para compilar para Linux do Windows: (o procedimento de FreeBSD não será muito diferente, copiar o cprt0 não é necessário para FreeBSD) | |
| 110 | + | ||
| 111 | + | Requisitos: | |
| 112 | + | ||
| 113 | + | \- FPC 1.9.6 ou superior. 1.9.4 deve funcionar, mas não foi testado. | |
| 114 | + | ||
| 115 | + | -ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip | |
| 116 | + | ||
| 117 | + | \- O FPC do repositório CVS (qualquer um acima de 1.9.6). | |
| 118 | + | ||
| 119 | + | \- Um árvore do Lazarus (qualquer uma construível a partir do mesmo período). | |
| 120 | + | ||
| 121 | + | \- Muitas bibliotecs do Linux alvo. Um dos servidores FPC é um SUSE, de onde eu obtive a lista abaixo: | |
| 122 | + | ||
| 123 | + | 1\) Baixar <ftp://freepascal.stack.nl/pub/fpc/contrib/cross/mingw/binutils-2.15-win32-i386-linux.zip> | |
| 124 | + | ||
| 125 | + | 2\) Extraia-o e mova os arquivos i386* para \<fpcbindir\>\bin\i386-win3 (por exemplo c:\pp\bin\i386\win32) | |
| 126 | + | ||
| 127 | + | 3\) Vá parra o diretório dos fontes do FPC | |
| 128 | + | ||
| 129 | + | 4\) make clean | |
| 130 | + | ||
| 131 | + | 5\) Faça o OS_TARGET = linux all | |
| 132 | + | ||
| 133 | + | 6\) Faça o OS_TARGET = linux e instale INSTALL_PREFIX = \<fpcbindir\> | |
| 134 | + | ||
| 135 | + | 7\) Prepare o diretório lib como nas intruções abaixo, eu usei d:\fpc\linuxlib para estocá-las. | |
| 136 | + | ||
| 137 | + | 8\) Vá para \<fpcbindir\>\units\i386-linux\rtl e copie o cprt21.o sobre o cprt0.o | |
| 138 | + | ||
| 139 | + | 9\) Vá para o diretório do Lazarus | |
| 140 | + | ||
| 141 | + | 10\) Edite o lazarus.pp e adicione {\$linklib dl} e {\$linklib gmodule} em algum lugar nos fontes. | |
| 142 | + | ||
| 143 | + | 11\) Faça o OS_TARGET = linux all OPT = "-gl -Fld:\fpc\linuxlib -Xr/usr/lib -FL/usr/lib/ld-linux.so.2" | |
| 144 | + | ||
| 145 | + | Se der algum erro do vinculador (mais especificamente linker can't find -l\<something\>) então | |
| 146 | + | ||
| 147 | + | 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 | |
| 148 | + | ||
| 149 | + | ` libs, to keep them apart from gtk2` | |
| 150 | + | ||
| 151 | + | 13\) Execute o ppas.bat para reiniciar o vinculador | |
| 152 | + | ||
| 153 | + | ### Bibliotecas | |
| 154 | + | ||
| 155 | + | Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread). | |
| 156 | + | ||
| 157 | + | Eu as coletei do target system e renomeei todas de lib\<name\>.so.x.y to lib\<name\>.so. | |
| 158 | + | ||
| 159 | + | libgcc.a e umas outras são mais fáceis de encontrar fazendo gcc -v e procurando uma linha como | |
| 160 | + | ||
| 161 | + | "Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs" | |
| 162 | + | ||
| 163 | + | 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 | |
| 164 | + | ||
| 165 | + | libpthread.so.0 | |
| 166 | + | ||
| 167 | + | libdl.so | |
| 168 | + | ||
| 169 | + | libc.so | |
| 170 | + | ||
| 171 | + | ld-linux.so.2 | |
| 172 | + | ||
| 173 | + | crtbegin.o | |
| 174 | + | ||
| 175 | + | crtbeginS.o | |
| 176 | + | ||
| 177 | + | crtbeginT.o | |
| 178 | + | ||
| 179 | + | crtend.o | |
| 180 | + | ||
| 181 | + | crtendS.o | |
| 182 | + | ||
| 183 | + | crtn.o | |
| 184 | + | ||
| 185 | + | crti.o | |
| 186 | + | ||
| 187 | + | libgcc.a | |
| 188 | + | ||
| 189 | + | libX11.so | |
| 190 | + | ||
| 191 | + | libXi.so | |
| 192 | + | ||
| 193 | + | libglib-1.2.so | |
| 194 | + | ||
| 195 | + | libgmodule-1.2.so.0 | |
| 196 | + | ||
| 197 | + | libgdk_pixbuf.so | |
| 198 | + | ||
| 199 | + | libgdk-1.2.so | |
| 200 | + | ||
| 201 | + | libgtk-1.2.so | |
| 202 | + | ||
| 203 | + | libXext.so | |
| 204 | + | ||
| 205 | + | libm.so | |
| 206 | + | ||
| 207 | + | libdl.so.2 | |
| 208 | + | ||
| 209 | + | libgmodule-1.2.so | |
| 210 | + | ||
| 211 | + | 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. | |
| 212 | + | ||
| 213 | + | Nome exato (assim o form lib\<name\>.so.x) Não podemos symlink no windows, então eu simplesmente o copiei. | |
| 214 | + | ||
| 215 | + | 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. | |
| 216 | + | ||
| 217 | + | 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. | |
| 218 | + | ||
| 219 | + | Para consertar isso manualmente eu adicionei -1.2 às linhas -l correspondentes no final do arquivo link.res que foi gerado no Passo 11. | |
| 220 | + | ||
| 221 | + | 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. | |
| 222 | + | ||
| 223 | + | # De Darwin (macOS) i386 | |
| 224 | + | ||
| 225 | + | ## De i386 para PowerPC | |
| 226 | + | ||
| 227 | + | - Cross Binutils | |
| 228 | + | ||
| 229 | + | Primeiro verifique se você já tem os arquivos powerpc-darwin-ld e powerpc-darwin-as: | |
| 230 | + | ||
| 231 | + | ` $ which powerpc-darwin-ld`\ | |
| 232 | + | ` $ which powerpc-darwin-as` | |
| 233 | + | ||
| 234 | + | Se você tem esses arquivos, pule a criação dos symlinks e vá para o título "Compilar o FPC" | |
| 235 | + | ||
| 236 | + | Atualmente as binutils "normais" podem ser usadas, já que elas são universais. Portanto, symlinks simples são suficientes: | |
| 237 | + | ||
| 238 | + | ` $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as`\ | |
| 239 | + | ` $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld` | |
| 240 | + | ||
| 241 | + | Os symlinks podem ficar em qualquer outro diretório, desde que estejam no seu \$PATH (por exemplo /sw/bin when installing through fink). | |
| 242 | + | ||
| 243 | + | - Compilar o FPC: | |
| 244 | + | ||
| 245 | + | ` $ cd fpc/compiler`\ | |
| 246 | + | ` $ make cycle CPU_TARGET=powerpc` | |
| 247 | + | ||
| 248 | + | Isto cria o compilarod PowerPC (fpc/compiler/ppcppc) e as unidades da RTL. | |
| 249 | + | ||
| 250 | + | Para criar os binários PowerPC nenhum cross-compilador ativo é necessário. O FPC para PowerPC e ppcppc executam bem em IntelMacs usando Rosetta. | |
| 251 | + | ||
| 252 | + | Mais teste e documentação são necessários para instalação paralela e uso dos dois. | |
| 253 | + | ||
| 254 | + | Se faltarem unidades, verifique seu arquivo de configuração, \$HOME/.fpc.cfg or /etc/fpc.cfg or /sw/etc/fpc.cfg. | |
| 255 | + | ||
| 256 | + | Você pode ter que adicionar alguma coisa like or where ever as suas unidades estiverem localizadas. | |
| 257 | + | ||
| 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/*` | |
| 261 | + | ||
| 262 | + | Lembrete: Binários universais são criados dos binários individuais (i386 and powerpc) usando lipo. | |
| 263 | + | ||
| 264 | + | Currently (fpc 3.0.4) gives: | |
| 265 | + | ||
| 266 | + | ``` bash | |
| 267 | + | fpc-cross-arm-gba | |
| 268 | + | fpc-cross-arm-linux | |
| 269 | + | fpc-cross-arm-nds | |
| 270 | + | fpc-cross-arm-wince | |
| 271 | + | fpc-cross-arm-armv4t-embedded | |
| 272 | + | fpc-cross-arm-armv7m-embedded | |
| 273 | + | fpc-cross-i386-darwin | |
| 274 | + | fpc-cross-i386-freebsd | |
| 275 | + | fpc-cross-i386-go32v2 | |
| 276 | + | fpc-cross-i386-linux | |
| 277 | + | fpc-cross-i386-nativent | |
| 278 | + | fpc-cross-i386-netbsd | |
| 279 | + | fpc-cross-i386-solaris | |
| 280 | + | fpc-cross-i386-win32 | |
| 281 | + | fpc-cross-i386-wince | |
| 282 | + | fpc-cross-jvm-android | |
| 283 | + | fpc-cross-jvm-java | |
| 284 | + | fpc-cross-m68k-linux | |
| 285 | + | fpc-cross-mipsel-linux | |
| 286 | + | fpc-cross-powerpc-linux | |
| 287 | + | fpc-cross-sparc-linux | |
| 288 | + | fpc-cross-x86-64-dragonfly | |
| 289 | + | fpc-cross-x86-64-freebsd | |
| 290 | + | fpc-cross-x86-64-linux | |
| 291 | + | fpc-cross-x86-64-win64 | |
| 292 | + | ``` | |
| 293 | + | ||
| 294 | + | 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. | |
| 295 | + | ||
| 296 | + | # FAQ de compilação cruzada | |
| 297 | + | ||
| 298 | + | ## Por que compilação cruzada? | |
| 299 | + | ||
| 300 | + | Assim você pode desenvolver um programa para um OS/CPU e compilá-lo para outro OS/CPU sem reiniciar ou trocar de computador. | |
| 301 | + | ||
| 302 | + | ## Por que Linux para Windows e não de outro modo? | |
| 303 | + | ||
| 304 | + | 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. | |
| 305 | + | ||
| 306 | + | Você poderia precisar usar bibliotecas das plataformas-alvo (gtk, glib,libc etc) e muitas configurações adicionais para ld (bibliotecas, caminhos, dynlinker path, etc.). | |
| 307 | + | ||
| 308 | + | 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?). | |
| 309 | + | ||
| 310 | + | ## Eu gostaria de mais informações sobre a construção do Free Pascal. Onde posso encontrar? | |
| 311 | + | ||
| 312 | + | Essa é uma FAQ genérica em formato pdf sobre como construir e configurar o FPC: <http://www.stack.nl/~marcov/buildfaq.pdf>. | |
| 313 | + | ||
| 314 | + | --- | |
| 315 | + | *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).* |
