ÍNDICE DE CONTEÚDO
Não é raro na carreira de desenvolvedor de software embarcado, deparar-se com situações em que é necessário ter mais de um ambiente de desenvolvimento. Ou ainda, necessitar de um ambiente que de compilação que o fabricante do processador instruiu usar uma distribuição Linux mais antiga ou diferente da instalada na máquina de desenvolvimento. Foi por enfrentar esses problemas, dentre outros, que a ferramenta rebuild foi criada.
O rebuild, ou simplesmente rbld, é uma aplicação de terminal que permite o desenvolvedor (não exclusivamente de sistemas embarcados) criar ambientes de desenvolvimento, com toolchain, bibliotecas e aplicações isoladas do ambiente de trabalho. Esse isolamento provê a possibilidade de criação de diversos ambientes em uma única máquina, e ainda, compartilhá-los, de forma que dentro de um time, todos os membros tenham a mesma configuração de ambiente.
Mas como o rbld consegue realizar isso? O rbld funciona sobre o Docker, que é uma ferramenta que permite criar e gerenciar “conteiners” Linux, que são como distribuições completas dentro ambientes isolados (algo semelhante ao “chroot”, mas com recursos mais avançados). No caso o rbld abstrai o uso do Docker, permitindo que seja possível criar containers para desenvolvimento, mesmo sem saber como utilizar o Docker.
Hands-on
Para exemplificar o uso do rbld, vamos compilar uma imagem da versão 15.05 (Chaos Calmer) do OpenWRT. Essa versão não pode ser compilada por versões mais atuais do GCC, o que pode ser um problema para quem usa distribuições do tipo Rolling Release ou as últimas versões do Ubuntu ou Fedora.
Este exemplo utiliza o Linux Mint 18 – adapte os comandos abaixo aos gerenciadores de pacote (se enfrentar alguma dificuldade, peça ajuda pelos comentários)
Primeiramente, é necessário instalar algumas aplicações como o interpretador Ruby (uma vez que rbld é escrito nessa linguagem), o gerenciador de pacotes Gem, e por fim, o Docker.
1 |
$ sudo aptitude install -y docker gem ruby |
Para que seja possível rodar o rbld sem permissões de super usuário (sudo), basta adicionar o usuário que pretende utilizá-lo ao gropo ‘docker’.
1 |
$ usermod -Ga <usuário> docker |
Agora, basta instalar o rebuild usando o Gem:
1 |
$ sudo gem install rbld |
Criando um environment
A primeira coisa a se fazer é criar um ambiente. Como dito anteriormente, o ambiente nada mais é que um container do Docker. A vantagem de usar o rbdl é que tudo que envolve o docker fica transparente para o desenvolvedor, evitando ter que aprender mais uma ferramenta.
Para criar um ambiente utiliza-se o comando ‘create’, cuja sintaxe é:
1 |
$ rbld create [--base <distro>:[versão]] <nome do ambiente> |
A opção ‘base’ é usada para especificar a distribuição (é possível especificar inclusive a versão) que se deseja utilizar. Por exemplo, a versão 15.03 (Chaos Calmer) do OpenWRT exige uma versão X do gcc, disponível no Ubuntu 14.04. Versões mais novas do gcc simplesmente não compilam essa versão do OpenWRT.
Para inciar um ambiente para o OpenrWRT 15.03, rode
1 |
$ rbld create --base ubuntu:14.04 openwrt |
Se tudo der certo, no final do que é mostrado na tela, deve-se ler: “Successfully created openwrt:initial“
O sistema base não inclui as ferramentas de desenvolvimento (toolchain, bibliotecas, headers dakernel, etc.). Precisamos, então, modificar o ambiente base para incluir as ferramentas necessárias. O processo de instalar as ferramentas necessárias no ambiente é chamado provisionamento, que é realizado pelo comando modify:
1 |
$ rbld modify <nome do ambiente> -- "<comandos>" |
No caso do ambiente para o OpenrWRT, precisamos instalar uma série de pacotes, que o faremos pelo apt-get no ambiente:
1 |
$ rbld modify openwrt -- "sudo apt-get update && sudo apt-get install -y make gcc binutils bzip2 flex python perl grep git unzip gawk subversion libz-dev libc-dev libncurses-dev time wget g++ xz-utils libssl-dev" |
Para encerrar o provisionamento, devemos “comitar” as mudanças realizadas.
1 |
$ rbld commit --tag <apelido> <nome do ambiente> |
O parâmetro “tag” permite colocar “apelidos” nas versões de um mesmo ambiente. Por exemplo, “v001” para primeira versão, ou “com-libssl” para uma versão hipotética que inclua a libssl.
Dando continuidade ao exemplo do OpenWRT, comite as mudanças realizadas anteriormente:
1 |
$ rbld commit --tag v001 openwrt |
Com o ambiente criado e provisionado, realize um teste com o comando run:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ rbld run openwrt:v001 -- gcc --version >>> rebuild env openwrt-v001 >>> gcc --version gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. <<< rebuild env openwrt-v001 |
O comando “run” executa comandos no container (ambiente) capazes de interagir com o ambiente de máquina de desenvolvimento. Essa iteração ficará mais clara no passo seguinte, onde será realizado o “clone” do repositório do OpenWRT:
1 2 3 |
$ git clone https://github.com/openwrt/chaos_calmer.git openwrt_cc $ cd openwrt_cc |
Deste ponto em diante, basta rodar os comandos para compilar o OpenWRT usando o rbld run openwrt — como prefixo,
1 2 3 4 5 6 7 8 9 |
$ rbld run openwrt:v001 -- scripts/feeds update $ rbld run openwrt:v001 -- scripts/feeds install -a $ rbld run openwrt:v001 -- make menuconfig $ rbld run openwrt:v001 -- make download $ rbld run openwrt:v001 -- make -j4 |
Ao final, você deve ter uma imagem compilada em no diretório bin.
Um pouco mais sobre o gerenciamento de ambientes
Para ver os ambientes criados até o momento, utiliza-se o comando ‘list’:
1 |
$ rbld list |
O comando “rm” apaga versões (criadas com a opção “tag”) ou ambientes inteiros.
1 |
$ rbld rm <nome do ambiente>:[versão] |
Por exemplo, para apagar a versão inicial do ambiente do tutorial,
1 |
$ rbld rm openwrt:initial |
É possível salvar um ambiente (comando “save”) e carregá-lo com outra máquina (comando “load”), ou mesmo publicar esses ambientes em um serviço chamado Registry (comando “publish”) – deixamos para o leitor mais interessado pesquisar na documentação como utilizar esses comandos e de que forma isso pode ser útil para seus projetos.
Mais informações
Quem quiser conhecer mais sobre o projeto Rebuild, pode acessar a sua documentação em https://github.com/rbld/rebuild/wiki ou seguir o tutorial em inglês em https://medium.com/jumperiot/simplifying-iot-development-using-rebuild-71b8de2dea5f
Nota:
Este artigo contou com a colaboração de Tiago Medicci Serrano, a quem eu agradeço imensamente pela ajuda.
To c/ uma duvida aki pra fazer meu openwrt dir825 c1 virar wifi cliente