Usando um toolchain externo no Yocto Project

- por Sergio Prado

Categorias: Yocto Project Tags: ,

A configuração de qual toolchain o Poky irá utilizar para construir a distribuição Linux é realizada através da variável TCMODE, que definirá qual arquivo tcmode-*.inc será incluído durante o processamento das receitas.

O valor padrão desta variável é “default“, fazendo com que seja incluído o arquivo tcmode-default.inc, que via PREFERRED_PROVIDER’s irá definir as receitas necessárias para compilar e gerar os componentes de software do toolchain.

Portanto, alterando o conteúdo desta variável podemos modificar o comportamento do Poky, fazendo-o utilizar um toolchain externo.

Para exemplificar, vamos compilar uma imagem para o QEMU usando o toolchain Sourcery G++ da Mentor Graphics.

PREPARANDO O AMBIENTE

Os testes foram feitos em um host Ubuntu 12.04 64 bits.

O primeiro passo é preparar a máquina para trabalhar com as ferramentas do Yocto Project:

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm

Se você estiver usando outra distribuição, consulte a documentação do Yocto Project para preparar a sua máquina de desenvolvimento.

Criei um diretório para realizar os testes e entre nele:

$ cd ~ && mkdir -p yocto

BAIXANDO AS FERRAMENTAS

Clone o repositório do Poky:

$ git clone -b dizzy http://git.yoctoproject.org/cgit/cgit.cgi/poky

Clone também a camada meta-sourcery, que contém as receitas para utilizar o toolchain da Mentor Graphics:

$ git clone git://github.com/MentorEmbedded/meta-sourcery.git

Os binários do toolchain precisam ser instalados separadamente. Faça isso com os comandos abaixo:

$ wget https://sourcery.mentor.com/GNUToolchain/package12813/public/arm-none-linux-gnueabi/arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar xjfv arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

CONFIGURANDO O SISTEMA DE BUILD

Inicialize o diretório de compilação:

$ source poky/oe-init-build-env

Abra o arquivo conf/bblayers.conf e inclua a camada meta-sourcery na variável BBLAYERS (não esqueça de alterar para o diretório HOME do seu usuário):

BBLAYERS ?= " \
    /home/sprado/yocto/meta-sourcery \
    /home/sprado/yocto/poky/meta \
    /home/sprado/yocto/poky/meta-yocto \
    /home/sprado/yocto/poky/meta-yocto-bsp \
    "

Abra o arquivo conf/local.conf e altere a variável MACHINE:

MACHINE ??= "qemuarm"

Neste mesmo arquivo, configure o toolchain na variável TCMODE e defina o local da instalação do toolchain em EXTERNAL_TOOLCHAIN (não esqueça de alterar para o diretório HOME do seu usuário):

TCMODE ?= "external-sourcery"
EXTERNAL_TOOLCHAIN = "/home/sprado/yocto/arm-2014.05"

COMPILANDO E TESTANDO

Agora é só gerar a imagem:

$ bitbake core-image-minimal

E depois emular com o QEMU:

$ runqemu qemuarm

POR QUE USAR UM TOOLCHAIN EXTERNO?

Na maioria dos casos, não tem um porquê. Você irá provavelmente utilizar o toolchain gerado pelo Poky.

Mas em alguns casos bem específicos, pode ser que você queira utilizar um toolchain pré-compilado. Provavelmente porque este toolchain possui suporte à algumas funcionalidades específicas da sua plataforma de hardware. Ou então porque você quer uma compilação inicial mais rápida, já que o Poky não precisará compilar e gerar o toolchain. Ou porque você quer um toolchain com uma versão do GCC diferente da versão utilizada pelo Poky, ou uma biblioteca C diferente não suportada pelo Poky, etc.

Independentemente do motivo, é legal saber que temos esta flexibilidade com o Yocto Project.

Happy compiling!

Sergio Prado

  • Felipe Tonello

    Boa sorte se você tentar usar outro toolchain sem ser da Code Sourcery.
    Já passei por muita dor de cabeça por causa disso. Não sei hoje, mas pelo menos o OE não era muito flexível qualquer tipo de toolchain há um tempo atrás.

  • Andre Pinto

    Boas.
    Estou a ter problemas em executar este tutorial (seguindo todos os passos). Por exemplo tenho um erro.

    ROR: ParseError at /home//yocto/lixo/meta-sourcery/recipes-external/gcc/gcc-sanitizers-external.bb:5: Could not include required file recipes-devtools/gcc/gcc-sanitizers.inc

    • Olá André,

      Muito estranho este erro. Me parece ser um erro de sintaxe de algum arquivo de configuração. Verifique novamente se os arquivos bblayers.conf e local.conf estão corretos. Vou fazer alguns testes aqui e te retorno.

      • Andre Pinto

        Obrigado pela a resposta. Eu utilizei a yocto 1.8 (fido) com a toolchain ARM-none-linux-2013. Tentei resolver mas continuo a ter muitos problemas a utilizar a ferramenta meta-sourcery com o yocto 1.8 (fido)

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.