Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

quinta-feira, 19 de março de 2015

OpenWRT: Criando novos pacotes - introdução

Mais um artigo da série sobre o OpenWRT.

Para os que acompanha este blog, fica claro o grande espectro de possibilidades que se abrem ao trocar a firmware do seu roteador. Você transforma um sistema tipo "caixa preta", fechado, limitado, e normalmente muito mal feito, em uma distribuição Linux aberta com toda uma gama de programas para aumentar o potencial do seu equipamento.

Tudo muito bonito, tudo muito bem e então você pensa que seria muito legal rodar aquele programa xyz (nome hipotético) no seu roteador. Ele é leve, feito em C e já funciona em Linux. Opa deve funcionar no OpenWRT (que é Linux). Provavelmente sim. Então, instalar novos programas já sabemos fazer...

root@router:~# opkg update
root@router:~# opkg install xyz...
Unknown package 'xyz'.
Collected errors:
 * opkg_install_cmd: Cannot install package xyz.

Pacote xyz desconhecido? Sim, ninguém empacotou este programa. Apesar do repositório do OpenWRT constar com milhares de pacotes, muitos programas nunca foram empacotados para o OpenWRT. O que fazer se você realmente queria o xyz?

Que tal um "faça você mesmo"? Esta é a temática deste artigo.

É recomendável que você tenha compilado algum programa UNIX a partir dos fontes. Caso contrário, alguns passos intermediários importantes do que será visto aqui pode passar batido.

Compilar programas a partir do fonte no UNIX, normalmente passa por estes passos:
  1. Você baixa os fontes e descompacta;
    1. Deve existir um arquivo texto documentando o que você deve fazer (ou não);
  2. Na maioria dos casos, você vai encontrar um arquivo configure nos fontes;
    1. Se não existir, normalmente ele é criado com o autoconf (ou não);
  3. Você roda o ./configure. Ele verifica seu ambiente buscando pelos programas necessários (como o compilador) e bibliotecas de desenvolvimento necessárias. Se tudo for encontrado, ele gera uma configuração e cria o Makefile;
  4. Você roda o "make" (que lê o Makefile). O programa é compilado;
  5. Se tudo der certo, você pode rodar o "make install" para instalar seu programa. Programa instalado!
Só isto? Sim, se tudo der certo. Isto significa que o ./configure vai achar todas as bibliotecas, que as opções padrão do configure são o que você quer (e precisar de alguma alteração é normal), que não existir algum problema no código manifestado somente no seu ambiente, etc... A chance de falha é grande. Além disto, existe uma miríade de variações destes passos, cortando etapas, adicionando extra ou mesmo trocando ferramentas, como usar o cmake ou escrever o Makefile manualmente (bem comum). Só a documentação pode esclarecer. Se quiser realmente aprender como compilar programas a partir do fonte, não é a intenção deste artigo (e o google é seu amigo).

OK, então eu baixo o fonte no roteador e rodo os comandos lá e... não! O seu roteador, salvo raras exceções, possui recursos limitados. Por este motivo, nem existem pacotes de desenvolvimento para instalar em um OpenWRT. Você precisa fazer uma compilação cruzada.

A compilação cruzada (cross compiling) utiliza um sistema distinto do sistema alvo (target) para compilar os programas. Como exemplo, você pode usar seu Mac OSX com processador Intel como sistema hospedeiro (host) para gerar programas para um Linux OpenWRT (target) que utiliza processador MIPS. No caso do OpenWRT, recomendo como sistema host o Linux.

E claro, ao introduzir mais esta complexidade ao processo de compilação, uma nova família de problemas pode aparecer. Nem todos os programadores pensam que um dia o seu programa será compilado para um sistema não Intel, onde o bit mais significativo é diferente. Nem todo configure está pronto para fazer a configuração da compilação cruzada e, fora isto, todas as bibliotecas e ferramentas para o processo devem ser compiladas para o sistema host compilar para o sistema alvo. Você não vai conseguir usar as bibliotecas e ferramentas já existentes no seu ambiente. Para um programa que nunca sofreu uma compilação cruzada, é normal falhar na primeira tentativa.

Mas temos boas notícias! O OpenWRT é todo preparado para a compilação cruzada, mesmo quando a arquitetura hospedeira e alvo são a mesma. Usar esta infraestrutura simplifica em muito a tarefa de ajustar o ambiente. Para usufruir deste ambiente, o mais fácil é montar um pacote mesmo que você deseje somente compilar e não empacotar um programa.

No próximo artigo, mostro como realizar o empacotamento de um comando exemplo qualquer. Será só um exemplo pois cada empacotamento é único. Pode não dar qualquer problema ou chegar ao ponto de exigir alteração profunda no código fonte do programa. Espero que seja o primeiro caso ;-)

Se precisar de uma ajuda, crie um tópico no fórum do blog ou no tópico deste artigo.
Até a próxima.