Cross compiling/pt

From Free Pascal wiki
Revision as of 14:49, 14 July 2015 by FTurtle (talk | contribs)
Jump to navigationJump to 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.

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.