Como criar um pacote para o buildroot


Além da introdução básica a embarcados nos últimos posts anteriores a esse, darei sequência ao assunto, mas de forma mais específica agora. Nesse post mostrarei como criar e compilar um pacote para o buildroot, especificamente o FSArchiver, que foi meu objetivo para incluí-lo como nova engine do Phantom, uma vez que o projeto partimage foi descontinuado.

O projeto BuildRoot (http://buildroot.uclibc.org/) além de excelente em arquitetura e simplicidade de construção, conta ainda com uma lista de mail e um pessoal muito bom no IRC. Muito mais por causa da ajuda conseguida com os desenvolvedores é que me dediquei a esse excelente toolchain. Porém tenha em mente que a libC padrão dele é a uClibC (micro-C-lib-C) e dependendo de sua necessidade, da complexidade do seu sistema ou da forma que os seus programas foram construidos, pode ser inviável sua utilização (por falta de recursos ou incompatibilidade). Sugiro que avalie o projeto como um todo antes de iniciar a construção do seu sistema, porém se você está lendo esse post sobre construção de pacotes para ele, provavelmente você já está ambientado e conciente dos fatos.

Iniciando a construção de um pacote
O ideal é que você leia a documentação do projeto, porque apesar da relativa simplicidade para criar um pacote, é necessário estudar as falhas que contecem durante a construção de um pacote que não é padrão.

Basicamente os pacotes suportados se encontram no diretório package dentro da pasta raiz do toolchain. Quando você decide criar um pacote de um software que não é nativamente suportado pelo toolchain, é nesse diretório que as pré-definições são geradas.

O primeiro passo é criar o diretório da sua aplicação. No nosso exemplo, a minha aventura na criação do FSArchiver. Dentro desse diretório deverão ser criados 2 outros arquivos – Config.in e o correspondente ao programa, fsarchiver.mk:

O Arquivo Config.in basicamente com essa informação (os comentários inclui apenas para dizer o que significa cada campo):

E o conteúdo do arquivo fsarchiver.mk:

Para a aplicação aparecer no menu para ser selecionado, edite o arquivo Config.in do diretório packagee inclua-o em algum lugar que achar adequado.

Quando selecionado no menu, então a construção do pacote será efetuada junto aos demais pacotes, rodando o comando ‘make’. Se quiser fazer a construção do pacote à parte, basta digitar ‘make fsarchiver’.

Descobrindo dependências
Ao iniciar a construção de um pacote não se sabe ao certo quais serão suas dependências, mas conforme sua compilação estiver em andamento, elas serão reclamadas, bastando procurar por nome semelhante no diretório package e incluí-lo nas dependências do seu arquivo ‘pacote.mk’. Depois, rode o make do pacote novamente.

Dependências na construção da uClibc
As vezes poderá ser necessário adicionar recursos à uClibc. Essa necessidade será reclamada durante a compilação, mas não é tão claro saber o que fazer. No meu caso, tive que habilitar duas flags na construção da uClibc e recompilar todos os pacotes mais uma vez. As flags que habilitei na uClibc para adicionar o devido suporte foram:
UCLIBC_HAS_BACKTRACE=y
UCLIBC_WORDEXP=yes
Essas flags foram habilitadas no arquivo de configuração da versão da uClibc escolhida por mim. Esse arquivo se encontra em toolchain/uClibc.

Sempre que alguma mudança for feita na uClibc, será necessário fazer uma recompilação completa do sistema devido à ‘linkagem’ com essa lib.

Por fim, o pacote deveria compilar nesse ponto, mas eu ainda obtenho erros muito específicos que estou tentando resolver com o pessoal do BuildRoot. Recomendo o canal #buildroot no servidor irc.freenode.net. EU utilizo o Xchat para IRC no Linux, mas acho que tem versão para Windows também.

Fiz a compilação de pacotes mais simples como o Bar, sem nenhum problema. Quando todas as etapas dessa construção do FSArchiver forem vencidas, coloco os resultados aqui, mas esse tutorial já serve para você também iniciar a compilação dos seus próprios pacotes!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta