Como crio uma cadeia de ferramentas do GCC 4.7 para compilação cruzada?

82

Eu já fiz essa pergunta no Stack Overflow, mas gostaria de saber se alguém conseguiu criar uma cadeia de ferramentas GCC 4.7 para compilação cruzada ARM (para um host Linux x86 / x86-64). Há muitas instruções para compilar o GCC a partir da fonte e muitos compiladores cruzados disponíveis para versões anteriores ao 4.7 do GCC, mas não a mais recente.

Compilar no próprio Rasp Pi funciona bem, mas é um pouco lento demais para fins práticos.

Estou ansioso para começar a compilar e gostaria de usar as ferramentas mais recentes e melhores.

tlhIngan
fonte
Isso parece mais ou menos o que eu preciso fazer também. Estamos desenvolvendo para um ARM5 executando o Arch Linux. O desenvolvimento está no Ubuntu Linux 10.04 LTS (hoje, talvez possamos atualizar isso amanhã, ainda não sei). Atualmente, estamos executando o GCC 4.4, mas as coisas que preciso fazer serão úteis, se não exigirem o GCC 4.7 (mínimo), se não o GCC 4.8 (se pudermos gerenciá-lo), para os recursos da linguagem C ++ 11. Parece que todas as cadeias de ferramentas disponíveis para o ARM (5 ou qualquer outra coisa) estão desatualizadas. É possível criar uma cadeia de ferramentas de compilador cruzado a partir da origem e oferecer suporte ao GCC que queremos?
Mwpowellhtx 01/03
Eu tenho um pequeno problema no segundo passo. na verdade, eu fiz o ./configure e criei comandos. Tudo funciona bem. mas quando eu avisei "install", recebi uma mensagem de erro dizendo: install: ausente arquivo operando
Veja também: raspberrypi.stackexchange.com/q/14587/5538 Fechei isso como um idiota, mas achei que valeria a pena ligar aqui porque a resposta aceita lá entra em detalhes consideráveis ​​não incluídos aqui.
goldilocks

Respostas:

60

Encontrei estas instruções Como criar um compilador cruzado para o seu Raspberry Pi . É uma ótima maneira de usar uma crosstool-ngferramenta que simplifica a configuração de um compilador cruzado A LOT (ele possui uma ótima interface baseada em maldições) e suporta o GCC 4.7.

Eu segui essas etapas e acabei com uma compilação bem-sucedida de um compilador cruzado 4.7.

Pré-requisitos: Os seguintes pacotes são necessários: bisonte , Flex , gperf , embasbacar , libtool , automake , g ++ , assegure que estes estão instalados antes de prosseguir.

  1. Primeiro download crosstool-nga partir daqui (eu usei a versão 1.15.2).
  2. Descompacte a distribuição e faça ./configure/ make/install
  3. Crie um novo diretório em algum lugar do sistema de arquivos para cdincorporá-lo.
  4. Corra ct-ng menuconfig. Você verá um bom conjunto de menus para configurar sua compilação.
  5. Vá para Caminhos e opções diversas. Ative os recursos de teste marcados como EXPERIMENTAL.
  6. Escolha um diretório Prefixo adequado . Este é o diretório no qual o seu compilador e bibliotecas serão instalados (tudo está bem basicamente, apenas verifique se o diretório está vazio).

    • NOTA: Também é importante que você tenha acesso de gravação à pasta escolhida
  7. Vá para o menu Opções de destino .

    • Arquitetura de destino: braço
    • Endianness: little endian
    • Testemunha: 32 bits
  8. Você também pode definir o parâmetro de ponto flutuante como softfp (consulte isso para obter mais informações), mas o hardfp é mais apropriado para o Raspbian.

  9. Vá para o menu Sistema operacional e altere o Target OS para linux .
  10. Vá para o menu do compilador C e escolha a versão 4.7.0 do gcc (o artigo recomenda o Linaro, mas consegui fazê-lo funcionar com o vanilla gcc). Também escolheu idiomas adicionais que você deseja poder compilar (C ++, Fortran, ...)
  11. Vá para o menu da biblioteca C e escolha um. O padrão é eglibc, mas esse não foi compilado para mim, então usei glibc (a versão mais recente).

    • NOTA: durante a etapa 13. da construção, o eglibc pode falhar na construção se o subversion não estiver instalado, pois a fonte não pode ser recuperada do repositório
    • NOTA: O eglibc não faz mais parte da versão 1.21.0 devido à sua falta de desenvolvimento. Consulte Há tanto tempo para eglibc . Use glibc como padrão. crosstool-ng
  12. Saia da ferramenta de configuração ao salvar suas alterações.
  13. Execute ct-ng buildno mesmo diretório. Espere um pouco (cerca de 45 minutos no meu caso) e seu compilador cruzado deve estar pronto.

Parece funcionar muito bem!

user13
fonte
Uau, 45 minutos é muito tempo. Quão rápido é o seu sistema? Eu estou esperando agora
Jivings
Bem, talvez tenha sido um pouco menos, mas ele tem que compilar todos os pré-requisitos primeiro e depois do bintools e do gcc também libc e libstdc ++, então 45 minutos me parece razoável.
Poderíamos adicionar detalhes sobre como instalá-los corretamente e atualizar o caminho, uma vez testados, é claro?
Alex Chamberlain
2
Além disso, acho que devemos usar o hardfp, como o RPi suporta.
Alex Chamberlain
Pode ser, mas IIRC, o GCC do Arch está configurado com softfp. Não tenho tempo para testar isso agora, mas criei a wiki da comunidade de respostas, fique à vontade para aprimorá-la.
19

Estou ansioso para começar a compilar e gostaria de usar as ferramentas mais recentes e melhores.

De fato, as melhores e mais recentes ferramentas não precisam ser construídas por você. No repositório do Raspberry Pi Tool GitHub, você encontrará as cadeias de ferramentas X86_64e x686para o software de compilação cruzada.

Eu recomendo usar a x86-linux64-cross-arm-linux-hardfpcadeia de ferramentas, pois ela será compilada para o Hard Floating Point, o que resultará em um sistema muito mais rápido.

$ arm-bcm2708hardfp-linux-gnueabi-gcc --version

arm-bcm2708-linux-gnueabi-gcc-4.5.1 (Broadcom-2708) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.

Nota: Se você estiver usando um kernel existente, precisará usar a cadeia de ferramentas que corresponde ao kernel. Os aplicativos HardFP não funcionarão em um kernel SoftFP.


Para usar a cadeia de ferramentas, basta verificar o repositório:

git clone https://github.com/raspberrypi/tools.git --depth 1

O --depthparâmetro significa que você não precisa esperar o download do histórico do repositório também (já que não o usaremos).

Em seguida, adicione os binários à sua variável PATH:

export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH

Ou para persistir no PATH:

echo "export PATH=~/tools/arm-bcm2708/x86-linux64-cross-arm-linux-hardfp/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

Para compilar com a cadeia de ferramentas, agora você pode adicionar o CROSS_COMPILEparâmetro Por exemplo, ao executar make:

make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- 

Ou, para facilitar isso, você pode salvar a variável bashrcnovamente:

echo "export TARGET=arm-bcm2708hardfp-linux-gnueabi" >> ~/.bashrc
source ~/.bashrc

e agora use a variável ao compilar:

make CROSS_COMPILE=${TARGET}
Jivings
fonte
1
Parece ser o gcc-4.5.1.
@ Tibor Isso é ruim?
Jivings
@Jivings Totalmente não responde à pergunta!
Alex Chamberlain
1
Eu desaprovo os votos negativos. @AlexChamberlain Ele sugere um método alternativo valioso para o ato demorado de construir sua própria cadeia de ferramentas.
Jivings
2
@Jivings: Isso é muito útil. Enquanto isso, é o gcc4.7.1 (o melhor que já tive) e o ponto flutuante funciona imediatamente. Eu não conseguia fazer o ponto flutuante funcionar usando a descrição original de Chris que Tibor postou. Muito obrigado.
4

Observe que ao construir a cadeia de ferramentas usando ct-ng no centos 6.3 em um sistema de 64 bits, fui forçado a desmarcar a opção de vincular estaticamente o libstdc ++ porque o vínculo estático não era suportado na plataforma (aparentemente).

Além disso, embora seja ótimo usar a cadeia de ferramentas pré-criada do repositório git, essa cadeia não parece funcionar no Centos 6.3 - provavelmente porque foi criada para um sistema mais moderno ou algo assim. Eu realmente não tentei explicar isso.

Shane McCarron
fonte
3

Este guia pode ser útil.

Isso me ajudou a fazer o meu ir. Também adicionei alguns comentários sobre o ajuste.

Dean Matsen
fonte
3

Se você deseja se beneficiar de um host rápido para compilar coisas para o seu RPI, sugiro que trabalhe em ambiente cruzado via chroot e QEMU. A propósito, isso substitui um compilador cruzado sem problemas.

Simplesmente configure um ambiente cruzado Debian usando deboostrap / multistrap

(consulte o capítulo abordagem QEMU / debootstrap) e está pronto.

sparkie
fonte
3

Caso você faça uma compilação cruzada a partir do OS X: aqui está o excelente artigo (e o único que trabalha na Web que encontrei).

O melhor de tudo é que o autor fornece uma cadeia de ferramentas pré-compilada completa , então você só precisa baixar, descompactar e montar a imagem dmg. E é isso, você está pronto para compilar.

Anton Matosov
fonte
2

Se você instalou o Ubuntu 64 bits edition e as ferramentas do Raspberry Pi SVN e está recebendo o erro:

-bash: /home/I/toolchain/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-c++: 
No such file or directory

apenas corra:

sudo apt-get install ia32-libs
Ave de rapina
fonte
1

A Carlson-Minot Inc. fornece uma cadeia de ferramentas pré-criada para destinos bare-metal e GNU / Linux ARM. Essa cadeia de ferramentas é baseada na cadeia de ferramentas Mentor Graphics Sourcery Lite com correções e adoções para compilação no OS X. Consulte

Anton Matosov
fonte