Pular para conteúdo

Prática 06 - Receitas


Note

Diretório de trabalho: ~/treinamento/yp/poky/meta-treinamento


Receita com programa em C

Dentro de meta-treinamento criar o diretório recipes-b2open:

Executar no HOST
cd ~/treinamento/yp/poky/meta-treinamento

mkdir recipes-b2open

Depois crie o diretório apps:

Executar no HOST
cd recipes-b2open

mkdir apps


Criar o diretório b2open-demo1 e dentro dele um arquivo chamado main.c:

Executar no HOST
cd apps

mkdir b2open-demo1

cd b2open-demo1

touch main.c


Editar main.c e adicionar o código abaixo:

1
2
3
4
5
6
#include <stdio.h>

int main(void) {
    printf("-> Treinamento B2Open Systems\n");
    return 0;
}


Próximo passo voltar para o diretorio ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps e criar um arquivo de receita chamado b2open-demo1_1.0.bb com o conteúdo:

DESCRIPTION = "B2Open Application Demo1"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = " \ 
                   file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302 \
                   "

SRC_URI = "file://main.c"

S = "${WORKDIR}"

do_compile() {
    ${CC} ${LDFLAGS} main.c -o b2open_demo1
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 b2open_demo1 ${D}${bindir}
}


Neste exemplo, criamos uma receita estamos compilando um código em C direto na receita utilizando a variável ambiente CC exportada e configurada pelo bitbake.


Estrutura do diretório:

Executar no HOST
cd ~/treinamento/yp/poky/meta-treinamento

tree recipes-b2open

Saída esperada:

recipes-b2open
└── apps
    ├── b2open-demo1_1.0.bb
    └── b2open-demo1
        └── main.c

2 directories, 2 files


Volte para o diretório de build-qemu e utilizando bitbake-layers verificar se encontra a receita:

Executar no HOST
cd ~/treinamento/yp/poky/build-qemu

bitbake-layers show-recipes b2open-demo1


Próximo passo compilar a receita criada:

Executar no HOST
bitbake b2open-demo1


Visualizando o resultado da receita, mas primeiro obter o diretorio de trabalho (WORKDIR) para inspecionar:

Executar no HOST
bitbake -e b2open-demo1 | grep ^WORKDIR

Saída esperada:

WORKDIR="/home/b2open/treinamento/yp/poky/build-qemu/tmp/work/core2-64-poky-linux/b2open-demo1/1.0"
WORKDIR_PKGDATA="/home/b2open/treinamento/yp/poky/build-qemu/tmp/work/core2-64-poky-linux/b2open-demo1/1.0/pkgdata-sysroot"

Warning

ATENÇÃO: O caminho acima pode variar de acordo com o MACHINE configurado!


Com o caminho do diretório de trabalho da receita b2open-demo1, realizando verificações:

Executar no HOST
tree tmp/work/core2-64-poky-linux/b2open-demo1/1.0/image/

Saída esperada:

tmp/work/core2-64-poky-linux/b2open-demo1/1.0/image/
└── usr
    └── bin
        └── b2open_demo1

2 directories, 1 file


Receita utilizando Makefile

O próximo exemplo será criar uma receita para compilar um código em C localmente mas utilizando Makefile.


Criar um novo diretório em meta-treinamento/recipes-b2open/apps/b2open-demo2 e dentro dele os arquivos main.c e Makefile:

Executar no HOST
cd ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps

mkdir b2open-demo2

cd b2open-demo2

touch main.c

touch Makefile


Editar main.c e adicionar o código abaixo:

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER_SIZE 1024

int main() {
    FILE *fp;
    char output[MAX_BUFFER_SIZE];

   // Comando para obter a versão do kernel
   const char *command = "uname -r";

   // Executar o comando e capturar a saída
   fp = popen(command,"r");
   if (fp == NULL) {
        printf("Erro ao executar o comando.\n");
        return 1;
   }

   // Ler a saída do comando linha por linha
   while (fgets(output, sizeof(output), fp) != NULL) {
        printf("Versão do Kernel: %s", output);
   }

   // Fechar o arquivo de fluxo
   pclose(fp);

   return 0;
}


Editar Makefile e adicionar o bloco abaixo:

Note

Ao editar o Makefile adicione 'TAB' no CC, CFLAGS e não utilizar espaços!

ifdef CC
    CC := ${CC}
else
    CC := gcc
endif

ifdef CFLAGS
    CFLAGS := ${CFLAGS}
else
    CFLAGS := -Wall
endif

ifdef LDFLAGS
    LDFLAGS := ${LDFLAGS}
endif

TARGET = show_kernel
SOURCES = main.c
OBJECTS = $(SOURCES:.c=.o)

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET)
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    rm -f $(OBJECTS) $(TARGET)


Próximo passo criar o arquivo da receita em ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps chamado b2open-demo2_1.3.bb:

Executar no HOST
cd ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps

touch b2open-demo2_1.3.bb


Editar o arquivo b2open-demo2_1.3.bb e adicionar o conteúdo:

DESCRIPTION = "B2Open Application Demo2"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = " \
                   file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302 \
                   "

SRC_URI = " \
            file://main.c \
            file://Makefile \
            "

S = "${WORKDIR}"

TARGET_CC_ARCH += "${LDFLAGS}"

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 show_kernel ${D}${bindir}/b2open_demo2
}


Estrutura do diretório:

Executar no HOST
cd ~/treinamento/yp/poky/meta-treinamento

tree recipes-b2open

Saída esperada:

recipes-b2open/
└── apps
    ├── b2open-demo1
       └── main.c
    ├── b2open-demo1_1.0.bb
    ├── b2open-demo2
       ├── main.c
       └── Makefile
    └── b2open-demo2_1.3.bb

3 directories, 5 files


Volte para o diretório de build-qemu e utilizando bitbake-layers para verificar se encontra a receita:

Executar no HOST
cd ~/treinamento/yp/poky/build-qemu

bitbake-layers show-recipes b2open-demo2


Próximo passo compilar a receita criada e analisando o conteúdo:

Executar no HOST
bitbake b2open-demo2

Warning

Caso receba um erro como abaixo na construção da receita:

1
2
3
4
5
6
Log data follows:
| DEBUG: Executing shell function do_compile
| NOTE: make -j 8
| Makefile:24: *** missing separator.  Stop.
| ERROR: oe_runmake failed
| WARNING: exit code 1 from a shell command.

Edite o Makefile e confirme se esta com TAB ou espaços em cada opção.


Visualizando o resultado da receita, mas primeiro obter o diretório de trabalho (WORKDIR) para inspecionar:

Executar no HOST
bitbake -e b2open-demo2 | grep ^WORKDIR

Saída esperada:

WORKDIR="/home/b2open/treinamento/yp/poky/build-qemu/tmp/work/core2-64-poky-linux/b2open-demo2/1.3"
WORKDIR_PKGDATA="/home/b2open/treinamento/yp/poky/build-qemu/tmp/work/core2-64-poky-linux/b2open-demo2/1.3/pkgdata-sysroot"

Warning

ATENÇÃO: O caminho acima pode variar de acordo com o MACHINE configurado!


Com o caminho do diretório de trabalho da receita b2open-demo2, realizando verificações:

Executar no HOST
tree tmp/work/core2-64-poky-linux/b2open-demo2/1.3/image/

Saída esperada:

tmp/work/core2-64-poky-linux/b2open-demo2/1.3/image/
└── usr
    └── bin
        └── b2open_demo2

2 directories, 1 file