Compilare Yocto per la Beaglebone Black su Debian GNU/Linux Stretch

Ottavio Campana bio photo Di Ottavio Campana

Essendo stata rilasciata la nuova Debian Stable è possibile scrivere una guida aggiornata su Yocto e la BeagleBone Black.

Tutti inizia scaricando il CD Netinst di Debian Stretch. Di solito scarico questo CD perché è il CD più piccolo possibile con l’installer Debian, tutti gli altri pacchetti sono disponibili dagli archivi Debian. Se avete dubbi su come installare Debian, esiste un ricco manuale di installazione. Nei computer dedicati allo sviluppo embedded io installo mediante tasksel solo i pacchetti

  • server SSH
  • utilità di sistema standard

mentre per tutto il resto uso quando serve apt-get.

Il mi editor preferito è Vim, e mi assicuro sempre che sia l’unico editor da riga di comando installato, affinché sia sempre richiamato automaticamente da tutti gli altri programmi, quali per esempio git:

root@debian:~# apt-get install vim
root@debian:~# echo "syntax on" > /etc/vim/vimrc.local
root@debian:~# dpkg --purge nano vim-tiny

Un altro punto fondamentale è cambiare la shell di default. In Debian infatti /bin/sh di default è un link a /bin/dash, ma per far funzionare correttamente Yocto è necessario fare in modo che /bin/sh punti a /bin/bash con il seguente comando

root@debian:~# dpkg-reconfigure dash

e rispondere no.

È inoltre bene aggiungere il supporto al locale en_US.UTF-8, altrimenti si otterrà un errore al lancio della compilazione di Yocto:

root@debian:~# dpkg-reconfigure locales

va aggiunto il locale en_US.UTF-8, ma non è necessario che sia selezionato come predefinito.

Dash viene usata da Debian ed Ubuntu perché implementa un sottoinsieme delle funzionalità di Bash ed è più rapida da eseguire. Questo risulta essere molto vantaggioso negli script di avvio del sistema, perché riduce i tempi necessari all’ovvio dei processi e degli script. Purtroppo Yocto e bitbake richiedono alcune funzioni non presenti di Dash, quindi la compilazione è destinata a fallire se non si cambia la shell predefinita di sistema.

A questo punto è necessario installare alcuni pacchetti

root@debian:~# apt-get install gawk wget git-core diffstat unzip \
               texinfo gcc-multilib build-essential chrpath socat cpio \
	       python python3 python3-pip python3-pexpect xz-utils \
	       debianutils iputils-ping libsdl1.2-dev

Fatto questo non serve più essere root ed è possibile lavorare su Yocto come utente non privilegiato. Per prima cosa è necessario fare il checkout di Poky. Poky è la distribuzione del progetto Yocto, che include al suo interno bitbake ed una parte di OpenEmbedded, oltre a tutto un insieme di metadati specifici del progetto Yocto. Nel repository di Poky sono disponibili tutti i rami che corrispondono a tutte le versioni rilasciate. Per scaricare l’ultima versione stabile, la 2.3 al momento in cui questa pagina viene scritta, è necessario selezionare il ramo pyro.

user@debian:~$ git clone git://git.yoctoproject.org/poky
user@debian:~$ cd poky
user@debian:~/poky$ git checkout pyro

A questo punto dentro la directory poky sono disponibili alcuni file ed altre sottocartelle:

user@debian:~/poky$ ls
bitbake        meta-poky      meta-yocto-bsp            README.hardware
documentation  meta-selftest  oe-init-build-env         scripts
LICENSE        meta-skeleton  oe-init-build-env-memres
meta           meta-yocto     README

Le cartelle meta-* contengono i metadati, ovvero tutte le informazioni per compilare tutti i componenti software. Sono organizzati in layer, ovvero in gruppi di informazioni raccolte per temi. Per la beaglebone black per esempio è necessario aggiungere i layer chiamati meta-bbb, meta-openembedded e meta-qt5. Va notato che attualmente non esiste un branch pyro per meta-qt5, quindi viene fatto il checkout di master. (per completezza a fine pagina riporto i commit id dei vari repository, affinché possiate replicare la build anche nel caso in cui i branch vengano modificati)

user@debian:~/poky$ git clone -b pyro git://git.openembedded.org/meta-openembedded
user@debian:~/poky$ git clone -b pyro https://github.com/jumpnow/meta-bbb
user@debian:~/poky$ git clone https://github.com/meta-qt5/meta-qt5.git

Creiamo un ambiente di compilazione in /home/user/poky/bbb

user@debian:~/poky$ source oe-init-build-env bbb

A questo punto editiamo ~/poky/bbb/conf/local.conf :

# Local configuration for meta-bbb images
# Yocto Project 2.3 Poky distribution [pyro] branch
# This is a sysvinit system
LICENSE_FLAGS_WHITELIST = "commercial"
DISTRO_FEATURES = "ext2 usbhost ${DISTRO_FEATURES_LIBC}"

# remove opengl so opencv builds cleanly, remove pulseaudio since
# it brings in x11
DISTRO_FEATURES_BACKFILL_CONSIDERED += "pulseaudio opengl"
PREFERRED_PROVIDER_jpeg = "libjpeg-turbo"
PREFERRED_PROVIDER_udev = "eudev"
VIRTUAL_RUNTIME_init_manager = "sysvinit"

# To change kernel version
PREFERRED_VERSION_linux-stable = "4.9.%"
MACHINE = "beaglebone"
#DL_DIR = "${HOME}/oe-sources"

DISTRO = "poky"
PACKAGE_CLASSES = "package_ipk"

# i686 or x86_64
SDKMACHINE = "x86_64"
EXTRA_IMAGE_FEATURES = "debug-tweaks"
USER_CLASSES = "image-mklibs image-prelink"
PATCHRESOLVE = "noop"
RM_OLD_IMAGE = "1"
INHERIT += "rm_work"
CONF_VERSION = "1"

ed il file ~/poky/bbb/conf/bblayers.conf :

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  ${HOME}/poky/meta \
  ${HOME}/poky/meta-poky \
  ${HOME}/poky/meta-openembedded/meta-oe \
  ${HOME}/poky/meta-openembedded/meta-networking \
  ${HOME}/poky/meta-openembedded/meta-python \
  ${HOME}/poky/meta-qt5 \
  ${HOME}/poky/meta-bbb \
"

A questo punto si è pronti per lanciare la compilazione del primo sistema GNU/Linux embedded, usando bitbake:

user@debian:~/poky/bbb$ bitbake core-image-minimal

Lanciando il comando bitbake vengono pianificati ed eseguiti tutti i passaggi necessari alla realizzazione di un sistema minimale. Spesso le azioni da compiere sono ripetitive, infatti si tratta di scaricare i sorgenti, patcharli, configurarli con CMake o gli autotools, cross compilare i programmi, installarli nello staging environment ed infine creare l’immagine del rootfs. Per evitare di doverlo fare a mano (se non sapete cosa fare nel tempo libero, potete seguire il progetto Linux From Scratch, ma questo progetto esula dallo scopo di questi post) è stato sviluppato il programma BitBake che automatizza tutti questi passaggi.

La durata della prima compilazione è in genere molto lunga e dipende dalle risorse del computer e dalla qualità delle connessione ad internet. Ciò nonostante, al termine del processo, dentro alla cartella ~/poky/bbb/tmp/deploy/images/beaglebone/ saranno disponibili svariati file:

user@debian:~/poky/bbb$ ls tmp/deploy/images/beaglebone/
core-image-minimal-beaglebone-20170622131019.rootfs.manifest
core-image-minimal-beaglebone-20170622131019.rootfs.tar.xz
core-image-minimal-beaglebone-20170622131019.testdata.json
core-image-minimal-beaglebone.manifest
core-image-minimal-beaglebone.tar.xz
core-image-minimal-beaglebone.testdata.json
MLO
MLO-beaglebone
MLO-beaglebone-2017.05-r1
modules--4.9.33-r30-beaglebone-20170622131019.tgz
modules-beaglebone.tgz
u-boot-beaglebone-2017.05-r1.img
u-boot-beaglebone.img
u-boot.img
zImage
zImage--4.9.33-r30-am335x-boneblack-20170622131019.dtb
zImage--4.9.33-r30-am335x-bonegreen-20170622131019.dtb
zImage--4.9.33-r30-am335x-bonegreen-wireless-20170622131019.dtb
zImage--4.9.33-r30-bbb-4dcape43t-20170622131019.dtb
zImage--4.9.33-r30-bbb-4dcape70t-20170622131019.dtb
zImage--4.9.33-r30-bbb-hdmi-20170622131019.dtb
zImage--4.9.33-r30-bbb-nh5cape-20170622131019.dtb
zImage--4.9.33-r30-bbb-nhd7cape-20170622131019.dtb
zImage--4.9.33-r30-bbb-nohdmi-20170622131019.dtb
zImage--4.9.33-r30-beaglebone-20170622131019.bin
zImage-am335x-boneblack.dtb
zImage-am335x-bonegreen.dtb
zImage-am335x-bonegreen-wireless.dtb
zImage-bbb-4dcape43t.dtb
zImage-bbb-4dcape70t.dtb
zImage-bbb-hdmi.dtb
zImage-bbb-nh5cape.dtb
zImage-bbb-nhd7cape.dtb
zImage-bbb-nohdmi.dtb
zImage-beaglebone.bin
user@debian:~/poky/bbb$ 

Molti di qeusti file sono link simbolici, per avviare il sistema nella beaglebone black saranno necessari i seguenti file:

  • MLO
  • u-boot.img
  • zImage
  • zImage-bbb-nohdmi.dtb
  • core-image-minimal-beaglebone.tar.xz

A cosa servono e come usare questi file per popolare una microSD sarà l’aromento del prossimo post.

Indici di revisione dei repository usati in questo esempio

Repository Nome branch Commit ID
poky pyro 9074fb46bc2a6da92334df068dbcc8cf8efbb6dc
meta-bbb pyro b84b65a7adb76f9871731286db26a525ac8ae378
meta-qt5 master 3ae86cb32edd1449f702e0a094929ae9b21ce191
meta-openembedded pyro 5e82995148a2844c6f483ae5ddd1438d87ea9fb7