Cross compiling/pt

From Free Pascal wiki
Jump to: navigation, search

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_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.

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.