A ferramenta devtool do Yocto Project

- por Sergio Prado

Categorias: Yocto Project Tags: ,

A ferramenta devtool foi criada para que o desenvolvedor de aplicações pudesse integrar mais facilmente a sua aplicação na distribuição criada pelo Yocto Project, sem que precise conhecer em detalhes a sintaxe do BitBake e do sistema de build. Ela automatiza o processo de criação de receitas, compilação da aplicação e instalação no target, facilitando bastante a vida do desenvolvedor.

devtool

Por exemplo, dado o código-fonte de uma aplicação chamada app, os três comandos abaixo irão criar uma receita para a aplicação, compilar e instalar a aplicação no target:

$ devtool add app /path/to/app/source
$ devtool build app
$ devtool deploy-target app root@device_ip

Simples assim!

Vamos estudar mais detalhadamente como esta ferramenta funciona.

EXEMPLO 1: PROGRAMA SIMPLES EM C

Dado um simples programa em C:

$ vim /home/sprado/apps/apptest/apptest.c
#include <stdio.h>
 
int main(int argc, const char *argv[])
{
    printf("Aplicação de Teste V1.0\n");
 
    return 0;
}

O comando “devtool add” é capaz de criar um esqueleto de receita para este programa:

$ devtool add apptest /home/sprado/apps/apptest

Primeiro, o comando irá criar uma camada chamada “workspace” no diretório de build do Yocto Project:

$ tree workspace/
workspace/
├── appends
│   └── apptest.bbappend
├── conf
│   └── layer.conf
├── README
└── recipes
    └── apptest
        └── apptest.bb

Esta camada será adicionada automaticamente no bblayers.conf, e dentro dela serão criados todos os arquivos de trabalho da ferramenta, incluindo código-fonte, patches, receitas e arquivos de append.

Esta é a receita criada pela ferramenta devtool para a aplicação de teste:

$ cat workspace/recipes/apptest/apptest.bb
# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)
 
# Unable to find any files that looked like license statements. Check the accompanying
# documentation and source headers and set LICENSE and LIC_FILES_CHKSUM accordingly.
#
# NOTE: LICENSE is being set to "CLOSED" to allow you to at least start building - if
# this is not accurate with respect to the licensing of the software being built (it
# will not be in most cases) you must specify the correct value before using this
# recipe for anything other than initial testing/development!
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
 
# No information for SRC_URI yet (only an external source tree was specified)
SRC_URI = ""
 
# NOTE: no Makefile found, unable to determine what needs to be done
 
do_configure () {
	# Specify any needed configure commands here
	:
}
 
do_compile () {
	# Specify compilation commands here
	:
}
 
do_install () {
	# Specify install commands here
	:
}

Perceba que, como a aplicação de teste não tem um Makefile e não é baseada em nenhum sistema de build de aplicações como o autotools, a ferramenta devtool criou apenas um esqueleto da receita, que precisa de adaptações.

Podemos utilizar o comando “devtool edit-recipe” para adaptar a receita, que irá abrir o código-fonte da receita com o editor de textos padrão do terminal, que pode ser alterado através da variável de ambiente EDITOR.

$ devtool edit-recipe apptest

Para testar, apaguei todos os comentários e implementei as tarefas do_compile() e do_install():

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
 
# No information for SRC_URI yet (only an external source tree was specified)
SRC_URI = ""
 
do_compile () {
        ${CC} apptest.c -o apptest
}
 
do_install () {
        install -d ${D}${bindir}
        install -m 0755 apptest ${D}${bindir}
}

Com o comando “build apptest” podemos processar a receita e compilar a aplicação:

$ devtool build apptest

E o comando “devtool deploy-target” possibilita instalar a aplicação no target (via SSH) para testá-la:

$ devtool deploy-target apptest root@192.168.7.2

EXEMPLO 2: AUTOTOOLS

Como outro exemplo, podemos facilmente criar uma receita para a aplicação bc (baseada em autotools), processá-la e instalar no target com os comandos abaixo:

$ devtool add bc https://ftp.gnu.org/gnu/bc/bc-1.06.tar.gz
$ devtool build bc
$ devtool deploy-target bc root@192.168.7.2

Fácil, não?

A ferramenta devtool é bem interessante e pode nos ajudar bastante no processo de criação de receitas, desenvolvimento e testes de aplicações. Mais informações sobre ela estão disponíveis no manual de desenvolvimento do Yocto Project.

Um abraço,

Sergio Prado

  • Caio Pereira

    Bem legal Sérgio! Realmente tem algumas receitas que são bem repetitivas. Isso ajuda muito.

    Obrigado por compartilhar.

  • Bernardo Rodrigues

    Fala Sérgio, tudo bem? Obrigado pelos artigos, eles têm me ajudado muito.

    Segui os passos descritos acima, mas estou encontrando o seguinte erro ao executar o código na minha BeagleBone Black:

    root@beaglebone:~# apptest
    /usr/bin/apptest: line 1: syntax error: unexpected “(“

  • Bernardo Rodrigues

    Ótimo tutorial Sérgio!

    Estou tentando reproduzir os passos, só que utilizando o código do seguinte projeto: https://github.com/vsergeev/c-periphery

    O comando build não gera nenhum erro. Porém, quando tento fazer o deploy, recebo o seguinte erro:

    bernardo@bernardo-ThinkCentre-Edge72:~/yocto/bbb-periphery$ devtool deploy-target c-periphery root@10.0.16.35
    Parsing recipes..done.
    ERROR: No files to deploy – have you built the c-periphery recipe? If so, the install step has not installed any files.

    • Olá Bernardo!

      Dei uma olhada no projeto e me parece que o Makefile dele não tem o target de instalação. Deve ser por isso que o deploy não funcionou. Neste caso, é necessário implementar manualmente na receita o target de instalação, parecido com a tarefa do_install que implementei no post.

      Um abraço!

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