Environment setup

Yocto è pensato per necesittare del minor numero possibile di dipendenze. Purtroppo alcune sono necessarie per avviare il sistema bitbake, su cui Yocto si basa.

Una guida dettagliata è disponibile sul sito ufficiale https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html#build-host-packages

Per un approccio più flessibile, però, è consigliabile realizzare un container adatto ad ospitare il build-system Yocto. Tra i sistemi a container più diffusi vi è Docker e per realizzare un container custom è sufficiente dichiarare in un Dockerfile la distribuzione linux su cui ci vogliamo basare e i pacchetti da installarvi.

Esistono inoltre container Yocto già pronti all uso, che includono anche tool aggiuntivi per semplificare ulteriormente lo sviluppo. Il nostro preferito è KAS, un container fornito da Siemens, che include l’omonimo tool KAS. Questo non è un tool generico, ma pensato appositamente per Yocto e ci permette di gestire con estrema facilità un intero progetto, permettendo di specificare quali layer (e con quali versioni) includere nel nostro progetto e applicare eventuali modifiche in maniera comoda.

https://github.com/siemens/kas

KAS richiede la scrittura di un file di descrizione del nostro progetto Yocto, in cui appunto elencare le repository dei layer. Tra questi deve essere presente il layer openembedded-core in cui è contenuto Bitbake.

KAS andrà infatti a cercare un layer contenente lo script iniziale di tutto il sistema Yocto oe-init-build-env

In seguito, potremo utilizzare i comandi di kas per avviare la build dell’intero progetto o per entrare in una shell di bitbake, in cui avremo a disposizione tutti i comandi e le variabili necessarie per lavorare con Yocto.

KAS container

available at ghcr.io/siemens/kas/kas:4.8.2 documentation …

services:
    kas:
        container_name: kas
        image: ghcr.io/siemens/kas/kas:4.8.2
        volumes:
         - ./kas:/builder/kas
         - ./workdir:/workdir
         #- /mpu-fw/cache/sstate-cache:/sstate
         #- /mpu-fw/cache/downloads:/downloads
        stdin_open: true
        tty: true
        networks:
         - yocto-server
        command: >
         /usr/local/bin/kas
          shell kas/fg_stm32mp2_qt5min.yml
        environment:
         - KAS_WORK_DIR=/workdir
         - SHELL=bash
         - KASYML=fg_stm32mp2_qt5min.yml
        # extra_hosts:
        #  - "yoctoserver.fg:172.16.31.221"
        #  - "cache.yoctoserver.fg:172.16.31.221"
        #  - "hashserver.yoctoserver.fg:172.16.31.221"
        #  - "git.yoctoserver.fg:172.16.31.221"
        #  - "registry.yoctoserver.fg:172.16.31.221"
gg diocan

My Bash Script
 1services:
 2    kas:
 3        container_name: kas
 4        image: ghcr.io/siemens/kas/kas:4.8.2
 5        volumes:
 6         - ./kas:/builder/kas
 7         - ./workdir:/workdir
 8         #- /mpu-fw/cache/sstate-cache:/sstate
 9         #- /mpu-fw/cache/downloads:/downloads
10        stdin_open: true
11        tty: true

using Docker

 1services:
 2    kas:
 3        container_name: kas
 4        image: ghcr.io/siemens/kas/kas:4.8.2
 5        volumes:
 6         - ./kas:/builder/kas
 7         - ./workdir:/workdir
 8         #- /mpu-fw/cache/sstate-cache:/sstate
 9         #- /mpu-fw/cache/downloads:/downloads
10        stdin_open: true
11        tty: true
12        networks:
13         - yocto-server
14        command: >
15         /usr/local/bin/kas
16          shell kas/fg_stm32mp2_qt5min.yml
17        environment:
18         - KAS_WORK_DIR=/workdir
19         - SHELL=bash

using Podman

crea una cartella e all interno un file con estensione .container

 1# check unit file
 2# /usr/lib/systemd/system-generators/podman-system-generator --user --dryrun
 3#
 4# install unit file
 5# podman quadlet install
 6
 7[Unit]
 8Description=fg yocto environment
 9#Wants
10#Requires=basic.container
11#Requisite
12#BindsTo
13#PartOf
14#Upholds
15#Conflicts
16#Before
17#After 
18
19# reference 
20# https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html#container-units-container
21[Container]
22ContainerName=yoctoserver-kas
23HostName=kas
24Image=ghcr.io/siemens/kas/kas:4.8.2
25
26# container arguments
27WorkingDir=/config
28#Exec=kas shell fg_stm32mp2_qt5min.yml
29Exec=sleep infinity
30
31UserNS=keep-id:uid=1000,gid=1000
32User=1000:1000
33
34# config
35
36# data
37Volume=/mnt/yocto/@containers/kas/config:/config
38Volume=/mnt/yocto/@cache/sstate:/sstate
39Volume=/mnt/yocto/@cache/downloads:/downloads
40Volume=/mnt/yocto/@builder:/workdir
41
42# Networking
43Network=yoctoserver.network
44# exposed ports
45# 
46# 
47#AddCapability=CAP_NET_BIND_SERVICE
48
49# env
50Timezone=local
51Environment=KAS_WORK_DIR=/workdir
52Environment=SHELL=bash
53
54
55# Container details
56# https://docs.gitea.com/installation/install-with-docker-rootless/
57#
58# fetch all recipes
59# bitbake core-image-base --runall=fetch
60# BB_GENERATE_MIRROR_TARBALLS = "1"
61
62# useful keys
63#ContainerName=
64#Pod=<name>.pod
65#NetworkAlias=web 
66#Environment=
67#Volume=/source:/dest
68#
69# if IP is set to 0.0.0.0 or not set at all, the port is bound on all IPv4 addresses
70#PublishPort=ip:hostPort:containerPort
71#
72#WorkingDir=$HOME
73#Timezone=local
74#Tmpfs=/work
75#UserNS=keep-id:uid=200,gid=210
76#AddCapability=CAP_DAC_OVERRIDE CAP_IPC_OWNER
77
78
79[Service]
80# give podman time to fetch image without systemd failing
81TimeoutStartSec=900
82
83# no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, always
84Restart=always
85
86# unit-less value in seconds, or a time span value such as "5min 20s"
87RestartSec=5
88
89
90
91# start a container on boot
92[Install]
93WantedBy=default.target
94#Alias
95#RequiredBy
96#UpheldBy 

kas config

a basic config file

 1header:
 2    version: 19
 3
 4build_system: oe
 5distro: fgos
 6machine: devboard
 7#machine: genericarm64
 8target: core-image-minimal
 9
10repos:
11  poky:
12    url: "https://git.yoctoproject.org/poky.git"
13    branch: "scarthgap"
14    path: "layers/oe"
15    layers:
16      meta:
17      meta-poky:
18  # oe-core:
19  #   url: "http://git.openembedded.org/openembedded-core"
20  #   commit: "236ac1b43308df722a78d3aa20aef065dfae5b2b"
21  #   path: "layers/openembedded-core"
22  #   layers:
23  #   meta:
24
25
26local_conf_header:
27    oe_conf: |
28        # 
29        MACHINE_FEATURES:append = " usbhost "

kas build

enter our dev container with

docker exec -it kasdev bash

then

kas build myproj.yml