Prática 07 - Pesquisando Receitas e mais práticas com receitas
Note
Diretório de trabalho: ~/treinamento/yp/poky/meta-treinamento
Acesse o site https://layers.openembedded.org/layerindex/branch/master/layers/ em seguida selecione o branch scarthgap:
- Selecione Layer e pesquise por
xilinx. - Selecione Recipes e pesquise pelos pacotes
python3-certifi,firefox,hsqldbegreengrass-lite.OBS: Caso não encontre alguma das receitas, troque de branch!
- Selecione Machine e pesquise por:
bananapi,dragonboard-845c,raspberrypi5estm32mp1 - Selecione Layer e novamente utilizando o branch scarthgap localize o repositório das camadas:
meta-openembedded,meta-qt5,meta-javaemeta-clang- 4.1. Faça um git clone destas camadas junto as camadas do poky (meta, meta-poky e meta-yocto-bsp)
- 4.2. Adicione as camadas a seguir ao projeto atual com bitbake-layers:
- meta-openembedded/meta-multimedia
- meta-openembedded/meta-networking
- meta-openembedded/meta-oe
- meta-openembedded/meta-filesystems
Note
Atenção ao clonar cada repositório não se esqueça de especificar o branch scarthgap
E ao executar bitbake-layers certifique-se de estar dentro do diretorio build-qemu/.
Verifique o resultado final no bitbake-layers show-layers o resultado deve ser igual abaixo:
NOTE: Starting bitbake server...
layer path priority
========================================================================================================
core /home/b2open/treinamento/yp/poky/meta 5
yocto /home/b2open/treinamento/yp/poky/meta-poky 5
yoctobsp /home/b2open/treinamento/yp/poky/meta-yocto-bsp 5
meta-treinamento /home/b2open/treinamento/yp/poky/meta-treinamento 6
openembedded-layer /home/b2open/treinamento/yp/poky/meta-openembedded/meta-oe 5
meta-python /home/b2open/treinamento/yp/poky/meta-openembedded/meta-python 5
multimedia-layer /home/b2open/treinamento/yp/poky/meta-openembedded/meta-multimedia 5
networking-layer /home/b2open/treinamento/yp/poky/meta-openembedded/meta-networking 5
filesystems-layer /home/b2open/treinamento/yp/poky/meta-openembedded/meta-filesystems 5
Note
Na sessão Dicas Extras e Avançadas tem a dica Baixando Camadas via bitbake-layers, mas é válido somente para camadas que fazem parte do OpenEmbedded Metadata Index.
Criando Receita para projeto que utiliza CMake
Criar o diretório meta-treinamento/recipes-b2open/apps/b2open-demo3, em seguida criar os arquivo usb_mon.c e os arquivos para utilizar CMake:
cd ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps
mkdir b2open-demo3
cd b2open-demo3
touch usb_mon.c
touch CMakeLists.txt
No arquivo usb_mon.c adicione o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | |
Próximo passo editar o arquivo CMakeLists.txt e adicionar o conteúdo abaixo:
cmake_minimum_required(VERSION 3.12)
project(usb_mon C)
set(CMAKE_C_STANDARD 11)
# Encontre a biblioteca libudev
find_package(PkgConfig REQUIRED)
pkg_check_modules(UDEV REQUIRED libudev)
# Adicione o diretório de inclusao e as bibliotecas da libudev
include_directories(${UDEV_INCLUDE_DIRS})
link_directories(${UDEV_LIBRARY_DIRS})
# Adicione os arquivos-fonte do seu programa
add_executable(usb_mon usb_mon.c)
# Vincule seu programa com a libudev
target_link_libraries(usb_mon ${UDEV_LIBRARIES})
Retorno para o diretório apps e criar o arquivo para a receita b2open-demo3.bb:
Edite o arquivo da receita e adicione:
DESCRIPTION = "B2Open Application Demo3"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = " \
file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302 \
"
SRC_URI = " \
file://CMakeLists.txt \
file://usb_mon.c \
"
S = "${WORKDIR}"
inherit cmake pkgconfig
do_install() {
install -d ${D}${bindir}
install -m 0755 usb_mon ${D}${bindir}/b2open-demo3_usb_mon
}
Analisando a estrutura da camada do Treinamento meta-treinamento:
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
├── b2open-demo3
│ ├── CMakeLists.txt
│ └── usb_mon.c
└── b2open-demo3.bb
4 directories, 8 files
Retorne para o diretório build-qemu/ e tente construir o pacote da receita criada:
O erro abaixo será gerado:
Analisando o log reportado, encontramos a informação "No package 'libudev' found", o código utiliza recursos da biblioteca udev e não está encontrando a biblioteca para compilação, então, deve-se adicionar udev em DEPENDS para satisfazer esta dependência para compilação.
Adicione na receita b2open-demo3.bb a variável DEPENDS acima de SRC_URI:
Salve e tente construir novamente executando bitbake b2open-demo3.
Verificando se o binario foi construido com sucesso:
Resultado esperada:
Criando Receita para baixar projeto de repositório Git
Acessar novamente meta-treinamento/recipes-b2open/apps e criar a receita b2-sniffer_git.bb:
cd ~/treinamento/yp/poky/meta-treinamento/recipes-b2open/apps/
touch b2-sniffer_git.bb
Editar o arquivo da receita criada b2-sniffer_git.bb e adicionar:
Retorno para o diretorio de build-qemu/ e execute o bitbake b2-sniffer para baixar o repositório do projeto b2-sniffer e construir utilizando cmake herdando a classe cmake.
DESAFIO: Resolver o erro de compilação que está ocorrendo no b2-sniffer.
Note
Existe um erro no código-fonte do b2-sniffer, o desafio é corrigir/fixar e avançar o processo de compilação utilizando recursos e configurações na receita.
error: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Werror=unused-result]
Adicionando camadas para suportar BSP dos hardware da Toradex
Note
Antes de continuar verificar com o instrutor se será utilizada o mesmo container e ambiente com o qemu ou um novo build/projeto será ou ja foi criado a fim de agilizar ambiente e downloads.
Afim de preparar o mesmo ambiente atual para construir imagens para Módulos da Toradex, clone os repositorios abaixo junto com as demais meta camadas.
Criando uma nova instância do Container para Toradex BSP
docker run -it --rm --privileged --cap-add=NET_ADMIN --name treinamento-build-tdx --hostname build-tdx -e DISPLAY=$DISPLAY -v ${HOME}/treinamento-b2open:/home/b2open/treinamento -v /tmp:/tmp -v /dev:/dev -v /var/run/dbus:/var/run/dbus -v /run/udev:/run/udev:ro -v /etc/localtime:/etc/localtime:ro b2open/treinamento-linux-embarcado /bin/bash
Próximo passo acessar o poky atualmente baixado e configurado, mas iremos criar um novo projeto de build chamado build-toradex, mas antes baixar as camadas do BSP e dependências da Toradex:
Branch scarthgap
# revision: 70c83e96c7f75e73245cb77f1b0cada9ed4bbc6d
git clone -b scarthgap https://github.com/Freescale/meta-freescale-3rdparty.git
# revision: b9d6a5d9931922558046d230c1f5f4ef6ee72345
git clone -b scarthgap https://github.com/Freescale/meta-freescale-distro.git
# revision: a82f138b140f613a06bf9ac60101e4bb511c309f
git clone -b scarthgap https://github.com/Freescale/meta-freescale.git
# revision: aec6ca26d6eb9b7c2d74e15e10deb76d63230016
git clone -b scarthgap-7.x.y http://git.toradex.com/meta-toradex-bsp-common.git
# revision: a217e4b3186b4d1b1beaf44ff8bdb7eda252e6c1
git clone -b scarthgap-7.x.y http://git.toradex.com/meta-toradex-nxp.git
# revision: 7d9d42e024b8bd9048028986c8dfb36a7300ac6a
git clone -b scarthgap-7.x.y http://git.toradex.com/meta-toradex-demos.git
# revision: e808259783ae03856eb908fae18bb5279dac78c7
git clone -b scarthgap-7.x.y http://git.toradex.com/meta-toradex-distro.git
# revision: bc865c5276c2ab4031229916e8d7c20148dfbac3
git clone -b scarthgap https://git.yoctoproject.org/meta-security
# revision: eb828418264a49b8d00035cb3d7b12fcea3be801
git clone -b scarthgap https://github.com/meta-qt5/meta-qt5
# revision: be5c50bed93b3dfafb3354e418ed48aca51d3153
git clone -b scarthgap https://github.com/b2open/meta-b2open-treinamento
Criar o novo projeto de build
Adicionado as camadas da Toradex ao projeto atual
bitbake-layers add-layer ../meta-freescale-3rdparty
bitbake-layers add-layer ../meta-freescale
bitbake-layers add-layer ../meta-freescale-distro
bitbake-layers add-layer ../meta-toradex-bsp-common
bitbake-layers add-layer ../meta-toradex-nxp
bitbake-layers add-layer ../meta-toradex-demos
bitbake-layers add-layer ../meta-toradex-distro
bitbake-layers add-layer ../meta-security/meta-tpm
bitbake-layers add-layer ../meta-qt5
bitbake-layers add-layer ../meta-b2open-treinamento
Ajustando o conf/local.conf
Edite o conf/local.conf e adicione as MACHINE abaixo junto com as já existentes:
Ainda no conf/local.conf adicione abaixo do DISTRO ?= "poky":
E no final do arquivo adicione:
# Delete the the source/object/binary files once a package is built to preserve disk space
INHERIT += "rm_work"
# Add Toradex bbclasses
INHERIT += "toradex-mirrors toradex-sanity"
# This file does not need to exist, if it does it can be used to influence machine specific
# configurations without copying the machine file.
include conf/machine/include/${MACHINE}.inc
ACCEPT_FSL_EULA = "1"
Gerando primeira imagem para Toradex
Abaixo passando os parametros de um MACHINE sendo "colibri-imx8x" e a DISTRO a fornecida pela Toradex "tdx-xwayland":
MACHINE="colibri-imx8x" DISTRO="tdx-xwayland" bitbake tdx-reference-minimal-image -k
Diretório com o resultado final
O resultado final com a geração de todos os arquivos como Bootloader, Kernel, RootFS, Modulos e o arquivo de instalação da Toradex Tezi todos em tmp/deploy/images/colibri-imx8x/.
Exemplo o deploy do colibri-imx8x:
Resultado:
total 590808
-rw-r--r-- 1 b2open b2open 32909 Jun 02 16:47 bl31-imx8qx.bin
-rw-r--r-- 1 b2open b2open 5389 Jun 02 21:04 boot.scr-colibri-imx8x
-rw-r--r-- 2 b2open b2open 8424528 Jun 02 20:14 Colibri-iMX8X_Reference-Minimal-Image.bootfs.tar.xz
-rw-r--r-- 2 b2open b2open 66906 Jun 02 20:12 Colibri-iMX8X_Reference-Minimal-Image.manifest
-rw-r--r-- 2 b2open b2open 3126752 Jun 02 20:14 Colibri-iMX8X_Reference-Minimal-Image.spdx.tar.zst
-rw-r--r-- 2 b2open b2open 154882544 Jun 02 20:15 Colibri-iMX8X_Reference-Minimal-Image.tar.xz
-rw-r--r-- 2 b2open b2open 924997 Jun 02 20:11 Colibri-iMX8X_Reference-Minimal-Image.testdata.json
-rw-r--r-- 2 b2open b2open 164966400 Jun 02 20:16 Colibri-iMX8X_Reference-Minimal-Image-Tezi_7.5.0-devel-20250602225301+build.0.tar
lrwxrwxrwx 2 b2open b2open 81 Jun 02 20:16 Colibri-iMX8X_Reference-Minimal-Image-Tezi.tar -> Colibri-iMX8X_Reference-Minimal-Image-Tezi_7.5.0-devel-20250602225301+build.0.tar
-rw-r--r-- 2 b2open b2open 3619 Jun 02 20:18 Colibri-iMX8X_Reference-Minimal-Image.wic.bmap
-rw-r--r-- 2 b2open b2open 251689142 Jun 02 20:18 Colibri-iMX8X_Reference-Minimal-Image.wic.gz
drwxr-xr-x 2 b2open b2open 4096 Jun 02 10:33 devicetree
lrwxrwxrwx 2 b2open b2open 74 Jun 02 20:05 Image.gz -> Image.gz--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.bin
-rw-r--r-- 2 b2open b2open 8402094 Jun 02 20:05 Image.gz--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.bin
lrwxrwxrwx 2 b2open b2open 74 Jun 02 20:05 Image.gz-colibri-imx8x.bin -> Image.gz--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.bin
-rw-r--r-- 2 b2open b2open 2031 Jun 02 20:15 image-Reference-Minimal-Image.json
lrwxrwxrwx 2 b2open b2open 24 Jun 02 20:05 imx8dx-colibri-aster--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8dx-colibri-aster.dtb
lrwxrwxrwx 2 b2open b2open 24 Jun 02 20:05 imx8dx-colibri-aster-colibri-imx8x.dtb -> imx8dx-colibri-aster.dtb
-rw-r--r-- 2 b2open b2open 120592 Jun 02 20:05 imx8dx-colibri-aster.dtb
lrwxrwxrwx 2 b2open b2open 26 Jun 02 20:05 imx8dx-colibri-eval-v3--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8dx-colibri-eval-v3.dtb
lrwxrwxrwx 2 b2open b2open 26 Jun 02 20:05 imx8dx-colibri-eval-v3-colibri-imx8x.dtb -> imx8dx-colibri-eval-v3.dtb
-rw-r--r-- 2 b2open b2open 121528 Jun 02 20:05 imx8dx-colibri-eval-v3.dtb
lrwxrwxrwx 2 b2open b2open 23 Jun 02 20:05 imx8dx-colibri-iris--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8dx-colibri-iris.dtb
lrwxrwxrwx 2 b2open b2open 23 Jun 02 20:05 imx8dx-colibri-iris-colibri-imx8x.dtb -> imx8dx-colibri-iris.dtb
-rw-r--r-- 2 b2open b2open 121532 Jun 02 20:05 imx8dx-colibri-iris.dtb
lrwxrwxrwx 2 b2open b2open 26 Jun 02 20:05 imx8dx-colibri-iris-v2--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8dx-colibri-iris-v2.dtb
lrwxrwxrwx 2 b2open b2open 26 Jun 02 20:05 imx8dx-colibri-iris-v2-colibri-imx8x.dtb -> imx8dx-colibri-iris-v2.dtb
-rw-r--r-- 2 b2open b2open 122122 Jun 02 20:05 imx8dx-colibri-iris-v2.dtb
lrwxrwxrwx 2 b2open b2open 25 Jun 02 20:05 imx8qxp-colibri-aster--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8qxp-colibri-aster.dtb
lrwxrwxrwx 2 b2open b2open 25 Jun 02 20:05 imx8qxp-colibri-aster-colibri-imx8x.dtb -> imx8qxp-colibri-aster.dtb
-rw-r--r-- 2 b2open b2open 121268 Jun 02 20:05 imx8qxp-colibri-aster.dtb
lrwxrwxrwx 2 b2open b2open 27 Jun 02 20:05 imx8qxp-colibri-eval-v3--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8qxp-colibri-eval-v3.dtb
lrwxrwxrwx 2 b2open b2open 27 Jun 02 20:05 imx8qxp-colibri-eval-v3-colibri-imx8x.dtb -> imx8qxp-colibri-eval-v3.dtb
-rw-r--r-- 2 b2open b2open 122208 Jun 02 20:05 imx8qxp-colibri-eval-v3.dtb
lrwxrwxrwx 2 b2open b2open 24 Jun 02 20:05 imx8qxp-colibri-iris--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8qxp-colibri-iris.dtb
lrwxrwxrwx 2 b2open b2open 24 Jun 02 20:05 imx8qxp-colibri-iris-colibri-imx8x.dtb -> imx8qxp-colibri-iris.dtb
-rw-r--r-- 2 b2open b2open 122212 Jun 02 20:05 imx8qxp-colibri-iris.dtb
lrwxrwxrwx 2 b2open b2open 27 Jun 02 20:05 imx8qxp-colibri-iris-v2--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.dtb -> imx8qxp-colibri-iris-v2.dtb
lrwxrwxrwx 2 b2open b2open 27 Jun 02 20:05 imx8qxp-colibri-iris-v2-colibri-imx8x.dtb -> imx8qxp-colibri-iris-v2.dtb
-rw-r--r-- 2 b2open b2open 122802 Jun 02 20:05 imx8qxp-colibri-iris-v2.dtb
lrwxrwxrwx 1 b2open b2open 35 Jun 02 21:18 imx-boot -> imx-boot-colibri-imx8x-sd.bin-flash
-rw-r--r-- 1 b2open b2open 1192960 Jun 02 21:18 imx-boot-colibri-imx8x-sd.bin-flash
-rw-r--r-- 1 b2open b2open 1193000 Jun 02 21:18 imx-boot.tagged
drwxr-xr-x 2 b2open b2open 4096 Jun 02 21:18 imx-boot-tools
lrwxrwxrwx 2 b2open b2open 75 Jun 02 20:05 kernel-config -> kernel-config--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301
-rw-r--r-- 2 b2open b2open 214357 Jun 02 13:14 kernel-config--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301
-rw-r--r-- 1 b2open b2open 69050 Jun 02 23:42 LA_OPT_NXP_SW.html
-rw-r--r-- 1 b2open b2open 378880 Jun 02 23:42 marketing.tar
-rw-r--r-- 2 b2open b2open 7388230 Jun 02 20:05 modules--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.tgz
lrwxrwxrwx 2 b2open b2open 73 Jun 02 20:05 modules-colibri-imx8x.tgz -> modules--6.6.119+git0+meta_e5c5595adb-r0-colibri-imx8x-20250602225301.tgz
-rw-r--r-- 1 b2open b2open 78408 Jun 02 19:28 mx8qxc0-ahab-container.img
drwxr-xr-x 2 b2open b2open 4096 Jun 02 10:33 overlays
-rw-r--r-- 1 b2open b2open 52 Jun 02 10:33 overlays.txt
-rw-r--r-- 1 b2open b2open 183 Jun 02 23:42 prepare.sh
lrwxrwxrwx 2 b2open b2open 51 Jun 02 20:14 Reference-Minimal-Image-colibri-imx8x.rootfs.bootfs.tar.xz -> Colibri-iMX8X_Reference-Minimal-Image.bootfs.tar.xz
lrwxrwxrwx 2 b2open b2open 46 Jun 02 20:12 Reference-Minimal-Image-colibri-imx8x.rootfs.manifest -> Colibri-iMX8X_Reference-Minimal-Image.manifest
lrwxrwxrwx 2 b2open b2open 50 Jun 02 20:14 Reference-Minimal-Image-colibri-imx8x.rootfs.spdx.tar.zst -> Colibri-iMX8X_Reference-Minimal-Image.spdx.tar.zst
lrwxrwxrwx 2 b2open b2open 44 Jun 02 20:15 Reference-Minimal-Image-colibri-imx8x.rootfs.tar.xz -> Colibri-iMX8X_Reference-Minimal-Image.tar.xz
lrwxrwxrwx 2 b2open b2open 51 Jun 02 20:11 Reference-Minimal-Image-colibri-imx8x.rootfs.testdata.json -> Colibri-iMX8X_Reference-Minimal-Image.testdata.json
lrwxrwxrwx 2 b2open b2open 46 Jun 02 20:18 Reference-Minimal-Image-colibri-imx8x.rootfs.wic.bmap -> Colibri-iMX8X_Reference-Minimal-Image.wic.bmap
lrwxrwxrwx 2 b2open b2open 44 Jun 02 20:18 Reference-Minimal-Image-colibri-imx8x.rootfs.wic.gz -> Colibri-iMX8X_Reference-Minimal-Image.wic.gz
-rw-r--r-- 2 b2open b2open 7301 Jun 02 20:14 Reference-Minimal-Image.env
-rw-r--r-- 2 b2open b2open 976 Jun 02 20:14 Reference-Minimal-Image-imx-imx-boot-bootpart.wks
-rw-r--r-- 1 b2open b2open 2434 Jun 02 23:42 toradexlinux.png
lrwxrwxrwx 1 b2open b2open 24 Jun 02 18:57 u-boot.bin -> u-boot-sd-2024.04-r0.bin
lrwxrwxrwx 1 b2open b2open 24 Jun 02 18:57 u-boot.bin-sd -> u-boot-sd-2024.04-r0.bin
lrwxrwxrwx 1 b2open b2open 24 Jun 02 18:57 u-boot-colibri-imx8x.bin -> u-boot-sd-2024.04-r0.bin
lrwxrwxrwx 1 b2open b2open 24 Jun 02 18:57 u-boot-colibri-imx8x.bin-sd -> u-boot-sd-2024.04-r0.bin
lrwxrwxrwx 1 b2open b2open 46 Jun 02 18:57 u-boot-initial-env-colibri-imx8x-sd -> u-boot-initial-env-colibri-imx8x-sd-2024.04-r0
-rw-r--r-- 1 b2open b2open 2917 Jun 02 18:57 u-boot-initial-env-colibri-imx8x-sd-2024.04-r0
lrwxrwxrwx 1 b2open b2open 46 Jun 02 18:57 u-boot-initial-env-sd -> u-boot-initial-env-colibri-imx8x-sd-2024.04-r0
-rw-r--r-- 1 b2open b2open 832112 Jun 02 18:57 u-boot-sd-2024.04-r0.bin
-rw-r--r-- 1 b2open b2open 18 Jun 02 23:42 wrapup.sh
No exemplo acima, deverá copiar e extrair o conteúdo do arquivo Colibri-iMX8X_Reference-Minimal-Image-Tezi_7.5.0-devel-20250602225301+build.0.tar para o MicroSD de instalação!
Download TEZI
Para baixar a ferramenta utilize o link abaixo e selecione o hardware/modulo correto para download: