Guia de cross-compiling de DistCC
1.
Fazendo cross-compiling com distcc
Introdução
distcc é uma ferramenta que permite compartilhar o peso da compilação de
software através de vários computadores em rede. Contanto que todas máquinas da
rede estejam usando a mesma toolchain construída para a mesma arquitetura de
processador, nenhuma configuração especial de distcc é necessária. Mas o
que fazer se você precisa compilar para uma arquitetura diferente usando
computadores diferentes? Este guia irá mostrar como configurar o distcc
para compilar para arquiteturas diferentes.
Instale os utilitários necessários
Primeiro, você deve instalar crossdev em todas as máquinas que estarão
envolvidas no processo de compilação. O crossdev é uma ferramenta que
torna a construção de toolchains de arquiteturas diferentes fácil. Foi
originalmente escrita por Joshua Kinard e reescrita do zero por Mike Frysinger. Seu uso é simples: crossdev
-t sparc irá construir uma cross-toolchain com alvo da arquitetura Sparc.
Isto inclui binutils, gcc, glibc, e linux-headers. Se você precisar de mais
ajuda, tente rodar crossdev --help. Obviamente, você precisará instalar
a cross-toolchain adequada em todas máquinas ajudantes.
A seguir, você precisará instalar o distcc em todas máquinas que estarão
envolvidas no processo. Isto inclui a máquina que rodará o emerge e todas as
máquinas com os cross-compilers. Por favor veja aDocumentação de Distcc do Gentoo para mais
informações sobre como configurar e usar distcc.
Notas específicas de arquitetura
Se você estiver fazendo cross-compiling entre diferentes sub-arquiteturas para
Intel x86 (como i586 e i686), você deve construir uma cross-toolchain inteira
para o CHOST desejado, caso contrário a compilação irá falhar. Isto acontece
porque i586 e i686 são na verdade CHOSTs diferentes, apesar de ambos serem
considerados "x86." Por favor tenha isto em mente quando você construir suas
cross-toolchains. Por exemplo, se a máquina alvo for i586, isto significa que
você precisa construir cross-toolchains em suas máquinas i686 ajudantes.
Configurando o distcc para fazer cross-compile diretamente
Na configuração padrão do distcc, cross-compiling não irá funcionar
devidamente. O problema é que muitas construções simplesmente chamam gcc
ao invés do nome inteiro do compilador (como
sparc-unknown-linux-gnu-gcc). Quanto esta compilação é distribuída para
a máquina distcc ajudante, o compilador nativo é chamado ao invés de seu
cross-compiler novo em folha.
Felizmente, há uma solução para este pequeno problema. Tudo que é necessário é
um script wrapper e alguns links simbólicos na máquina que rodará emerge
emerge. Usarei minha máquina Sparc como exemplo. Onde você vir
sparc-unknown-linux-gnu abaixo, você deve inserir seu próprio CHOST
(x86_64-pc-linux-gnu para uma máquina AMD64, por exemplo). Quando você
instalar o distcc pela primeira vez, o diretório
/usr/lib/distcc/bin irá se parecer com o seguinte:
Nota:
As instruções seguintes são feitas somente na máquina rodando o processo de
emerge. Não faça os passos nas máquinas ajudantes.
|
Listagem de código 1.1: Compiladores disponíveis |
# cd /usr/lib/distcc/bin
# ls -l
total 0
lrwxrwxrwx 1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
|
Aqui está o que você deve fazer:
Listagem de código 1.2: Modificando distcc |
# rm c++ g++ gcc cc
|
A seguir, iremos criar o novo script nesta máquina. Abra seu editor favorito e
crie um arquivo com o texto seguinte nele, então salve-o como
sparc-unknown-linux-gnu-wrapper. Lembre-se de mudar o CHOST (neste
caso, sparc-unknown-linux-gnu) para o CHOST real da máquina que irá rodar
o emerge.
Listagem de código 1.3: O novo script wrapper |
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
|
A seguir, nós iremos tornar o script executável e criar os links simbólicos
apropriados:
Listagem de código 1.4: Criando os links simbólicos |
# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper g++
# ln -s sparc-unknown-linux-gnu-wrapper c++
|
Quando você terminar, /usr/lib/distcc/bin irá se parecer com o
seguinte:
Listagem de código 1.5: Um conjunto devido de compiladores |
# ls -l
total 4
lrwxrwxrwx 1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper
|
Parabéns; agora você tem uma configuração de cross-distcc funcional (espera-se).
Como funciona
Quando o distcc é chamado, ele verifica como foi chamado (como
i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++, etc.) Quando
o distcc distribui a compilação para uma máquina ajudante, passa o nome com que
foi chamado. O daemon do distcc nas outras máquinas ajudantes procurar um
binário com o mesmo nome. Se só vir gcc, irá procurar gcc, que é
provavelmente o compilador nativo na máquina ajudante, se não for da mesma
arquitetura que a da máquina rodando emerge. Quando o nome
completo do compilador for enviado (como
sparc-unknown-linux-gnu-gcc), não há confusão.
O conteúdo deste documento está licenciado pela licença Creative Commons -
Attribution / Share Alike.
|