Difference between revisions of "Cross compiling/pt"
Line 126: | Line 126: | ||
13) Execute o ppas.bat para reiniciar o vinculador | 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). | Existem as bibliotecas que eu coletei para Lazarus e a IDE modo texto(o Lazarus não precisa da pthread). |
Revision as of 18:12, 21 April 2007
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:
- Ter um compilador Free Pascal para a plataforma em que você quer compilar.
- 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.
- À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_Win32_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 Mac OS X
- 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 (Mac OS X) 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.
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.