Manual

do

Maker

.

com

Como criar um pacote para o buildroot

Como criar um pacote para o buildroot

"Como criar um pacote para o buildroot" foi o titulo selecionado partindo da dúvida que eu mesmo tinha e que certamente muitos têm. Mas é algo meio fácil de se fazer, só seguir alguns passos, descritos nesse artigo.

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:


mkdir package/fsarchiver

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


#Nome do pacote. BR2_PACKAGE seguido do nome de programa
config BR2_PACKAGE_FSARCHIVER
#Nome do identificador
bool "FSArchiver"
  #Pacotes que deverão ser pré-selecionados quando alguém escolher o FSArchiver no menu
  select BR2_PACKAGE_LIBINTL
  select BR2_PACKAGE_NEWT
  select BR2_PACKAGE_ZLIB
  select BR2_PACKAGE_BZIP2

  #Ajuda
  help
    Partition cloning tool. 
    http://sourceforge.net/projects/fsarchiver/files/fsarchiver-src/0.6.15/

E o conteúdo do arquivo fsarchiver.mk:

#############################################################
#
# FSArchiver
#
#############################################################
FSARCHIVER_VERSION = 0.6.15
FSARCHIVER_SOURCE = fsarchiver-0.6.15.tar.gz
FSARCHIVER_SITE =  http://sourceforge.net/projects/fsarchiver/files/fsarchiver-src/0.6.15/

#Dependências. Quando você rodar 'make fsarchiver', automaticamente ele
#configura as dependências que estiverem faltando.
#
FSARCHIVER_DEPENDENCIES = host-pkg-config e2fsprogs libgcrypt attr gzip zlib bzip2 lzo intltool libgpg-error

#Flags linkagem. 
FSARCHIVER_LDFLAGS += -lcom_err -lext2fs -lcom_err -le2p

#Instalar no staging. Não é necessário para uso comum.
FSARCHIVER_INSTALL_STAGING = YES
#Instalar no sistema construido. É como o 'make install' mas para o rootfs pretendido.
FSARCHIVER_INSTALL_TARGET = YES

#Parâmetros que se passa ao configure vão aqui
FSARCHIVER_CONF_OPT = --program-prefix=''

#Isso é um padrão. Basta trocar o último campo que é o nome do pacote.
$(eval $(call AUTOTARGETS,package,fsarchiver))


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!

Se gostou do artigo, sugiro esse outro sobre extração de firmwares.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.