Environment setup
On this page
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" 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: trueusing 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=bashusing 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 bashthen
kas build myproj.yml