How to install and use the Reliable Embedded Systems – Robert Berger e.U. Yocto Project®/OpenEmbedded build framework
Objectives
This post shows you how to install and use the Reliable Embedded Systems – Robert Berger e.U. Yocto Project®/OpenEmbedded build framework.
Prerequisites
A somewhat recent Linux distro should be fine. I’ll show you how to install the framework on something like Ubuntu 18, 20 or 22.
Install the Build framework
Install docker
sudo apt install docker.io sudo usermod -aG docker ${USER} sudo reboot
Install git
sudo apt install git
Default gitconfig
In case you don’t already have a proper gitconfig
you can use the one provided with here:
pushd ~ wget https://raw.githubusercontent.com/RobertBerger/manifests/master/gitconfig mv gitconfig .gitconfig popd
Create a directory where you have plenty of space
mkdir -p ~/projects/resy-playground cd ~/projects/resy-playground
Convenient symlink on the host
sudo ln -sf ~/projects/resy-playground /workdir
You might need to fix some permissions.
Download the latest version
mkdir -p /workdir/sources pushd /workdir/sources git clone https://github.com/RobertBerger/manifests.git popd cd /workdir ln -sf sources/manifests/resy.sh resy.sh chmod +x resy.sh ./resy.sh
Pick e.g. experimental. The script pulls lot’s of meta-layers as well as a couple of “helper scripts”.
Let’s build something
Start the poky build container
./resy-poky-container.sh
This will pull the “container” when you do it the first time:
+ docker pull reliableembeddedsystems/poky-container:2021-05-07-master-local-gcc-9-gui-icecc-ub18 ... Digest: sha256:3f83f549071bfb1bdf1609b0bb977d4ba494ac5cdaa262e641a09a7d1827cb4a Status: Downloaded newer image for reliableembeddedsystems/poky-container:2021-05-07-master-local-gcc-9-gui-icecc-ub18 docker.io/reliableembeddedsystems/poky-container:2021-05-07-master-local-gcc-9-gui-icecc-ub18 + set +x -- interactive mode -- source /workdir/resy-cooker.sh in container + press <ENTER> to go on
You should end up at a command line shell inside the container.
+ docker run --name poky_container --rm -it --add-host mirror:192.168.42.1 --net=host -p ::10245/tcp -p ::8765/tcp -p ::8766/tcp -p ::8765/udp -v /home/student/projects:/projects -v /opt:/nfs -v /workdir:/workdir -v /workdir:/workdir reliableembeddedsystems/poky-container:2021-05-07-master-local-gcc-9-gui-icecc-ub18 --workdir=/workdir WARNING: Published ports are discarded when using host network mode pokyuser@e450-6:/workdir$
You may want to inspect the script and adjust some settings on top of it. What I would suggest as a good starting point is this:
#!/bin/bash # this enables building all the images # for a specific MACHINE as defined in resy-cooker.sh # set to "yes" if you want this to happen in non-interactive mode BUILD_ALL_VAR="no" USE_GUI="no" USE_MIRROR="no" DOCKER_PULL="yes" USE_ICECC="no" USE_QEMU="no"
This needs to be done from inside of the container
Get preconfigured build environments
pokyuser@e450-6:/workdir$ source /workdir/resy-cooker.sh
This is what is currently available:
/workdir /workdir --> USAGE 1 <-- usage: source /workdir/resy-cooker.sh MACHINE or MACHINE-sw-variant source /workdir/resy-cooker.sh container-x86-64 available targets: am335x-phytec-wega-mender am335x-phytec-wega-wic am335x-phytec-wega-wic-master am335x-pocketbeagle-wic-master am335x-regor-rdk-wic-master beagle-bone-black-mender beagle-bone-black-virt-wic beagle-bone-black-wic beagle-bone-black-wic-master beagle-bone-green-wic beagle-bone-green-wic-master container-arm-v7 container-arm-v7-master container-arm-v7-phoronix container-arm-v7-tig container-raspberrypi-4-64-ml-phoronix container-x86-64 container-x86-64-golang container-x86-64-golang-master container-x86-64-java container-x86-64-java-master container-x86-64-master container-x86-64-tensorflow container-x86-64-tensorflow-master container-x86-64-tig container-x86-64-tig-master de0-nano-soc-kit-wic-master imx6q-phytec-mira-rdk-nand-mender imx6q-phytec-mira-rdk-nand-virt-mender imx6q-phytec-mira-rdk-nand-virt-wic imx6q-phytec-mira-rdk-nand-virt-wic-mc imx6q-phytec-mira-rdk-nand-virt-wic-mc-master imx6q-phytec-mira-rdk-nand-wic imx6q-phytec-mira-rdk-nand-wic-master imx6sx-udoo-neo-full-wic-master imx6ul-phytec-segin-systemd-wic-master imx6ul-phytec-segin-virt-telegraf-wic-master imx6ul-phytec-segin-wic-master imx8mmevk-master karo-imx6ul-txul multi-v7-mender multi-v7-ml multi-v7-ml-bpf-master multi-v7-ml-debug multi-v7-ml-debug-training multi-v7-ml-debug-training-libs multi-v7-ml-debug-training-lic multi-v7-ml-debug-training-pkgs multi-v7-ml-master multi-v7-ml-pkgs multi-v7-ml-prt multi-v7-ml-qt5 multi-v7-ml-virt multi-v7-ml-virt-docker-master multi-v7-ml-virt-podman-master multi-v7-ml-xenomai omap3-beagle-xm-wic-master phyboard-polis-imx8mm-wic phyboard-polis-imx8mm-wic-virt qemux86-64-virt-master raspberrypi-4-64-ml-kernel-wic raspberrypi-4-64-ml-kernel-wic-virt-all-sdcard raspberrypi-4-64-ml-kernel-wic-virt-tftp-nfs raspberrypi-4-64-raspi-kernel-wic stm32mp157c-dk2-systemd-wic-master stm32mp157c-dk2-wic-master --> $#: 0 pokyuser@e450-6:/workdir/build$
Pick one
e.g. imx6q-phytec-mira-rdk-nand-wic-master
: This is an SD card image for an imx6q-phytec-mira-rdk-nand board from master git branches.
pokyuser@e450-6:/workdir/build$ source /workdir/resy-cooker.sh imx6q-phytec-mira-rdk-nand-wic-master
/workdir /workdir/build /workdir MACHINE or MACHINE-sw-variant: imx6q-phytec-mira-rdk-nand-wic-master initial SITE_CONF=../../sources/meta-resy/template-common/site.conf.sample TEMPLATECONF: ../meta-u-boot-wic-bsp-master/template-imx6q-phytec-mira-rdk-nand-master source ../sources/poky-master/oe-init-build-env imx6q-phytec-mira-rdk-nand-wic-master You had no conf/local.conf file. This configuration file has therefore been created for you with some default values. You may wish to edit it to, for example, select a different MACHINE (target hardware). See conf/local.conf for more information as common configuration options are commented. You had no conf/bblayers.conf file. This configuration file has therefore been created for you with some default values. To add additional metadata layers into your configuration please add entries to conf/bblayers.conf. The Yocto Project® has extensive documentation about OE including a reference manual which can be found at: http://yoctoproject.org/documentation For more information about OpenEmbedded see their website: http://www.openembedded.org/ ### Shell environment set up for builds. ### You can now run 'bitbake <target>' Common targets are: core-image-minimal You can also run generated qemu images with a command like 'runqemu qemux86' conf ├── bblayers.conf ├── local.conf ├── site.conf └── templateconf.cfg 0 directories, 4 files /workdir/build /workdir --> $#: 1 pokyuser 74 21 0 11:29 pts/0 00:00:00 /bin/bash /workdir/killall_bitbake.sh pokyuser 76 74 0 11:29 pts/0 00:00:00 grep bitbake pokyuser 74 21 0 11:29 pts/0 00:00:00 /bin/bash /workdir/killall_bitbake.sh pokyuser 81 74 0 11:29 pts/0 00:00:00 grep bitbake rm -f /workdir/build/imx6q-phytec-mira-rdk-nand-wic-master/hashserve.sock to ./resy-poky-container.sh: -- non-interactive mode -- add the image you want to build to the command line ./resy-poky-container.sh <MACHINE> <image> -- interactive mode -- enter it with - ./resy-poky-container.sh <no param> bitbake <image> source /workdir/resy-cooker.sh <MACHINE> pokyuser@e450-6:/workdir/build$
Let’s build a “core-image-minimal” with BitBake:
pokyuser@e450-6:/workdir/build$ bitbake core-image-minimal
Please note, that since those are “master branches” it’s not guaranteed to build out of the box. You might want to use a “non-master” configuration for something which will build out-of-the-box with a much higher probability. Anyways, if you get lucky, you’ll see something like this:
NOTE: Started PRServer with DBfile: /workdir/build/imx6q-phytec-mira-rdk-nand-wic-master/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 41854, PID: 21366 Loading cache: 100% |##########################################################################################################################################################| Time: 0:00:00 Loaded 3676 entries from dependency cache. Parsing recipes: 100% |########################################################################################################################################################| Time: 0:00:00 Parsing of 2394 .bb files complete (2393 cached, 1 parsed). 3677 targets, 137 skipped, 0 masked, 0 errors. NOTE: Resolving any missing task queue dependencies Build Configuration: BB_VERSION = "1.49.2" BUILD_SYS = "x86_64-linux" NATIVELSBSTRING = "universal" TARGET_SYS = "arm-resy-linux-gnueabi" MACHINE = "imx6q-phytec-mira-rdk-nand" DISTRO = "resy" DISTRO_VERSION = "3.3" TUNE_FEATURES = "arm armv7a vfp thumb callconvention-hard" TARGET_FPU = "hard" meta meta-poky meta-yocto-bsp = "master:e1839b58ebe05242a52fe050aa9a08140136aa0a" meta-multi-v7-ml-bsp-master = "master:00f716ef03a6d37489cf8f1704a566938d3c7c64" meta-u-boot-wic-bsp-master = "master:4d38425039ff45f8e314f8d1127875b6694d5a1e" meta-resy-master = "master:48562f43bed481ad342d92b9cdcb45fa75487f58" meta-oe meta-networking meta-filesystems meta-python = "master:a23fa069d0a60cf348dcc6399f7990de59105c21" Initialising tasks: 100% |#####################################################################################################################################################| Time: 0:00:01 Sstate summary: Wanted 0 Local 0 Network 0 Missed 0 Current 1036 (0% match, 100% complete) NOTE: Executing Tasks NOTE: Tasks Summary: Attempted 2843 tasks of which 2843 didn't need to be rerun and all succeeded. NOTE: Writing buildhistory NOTE: Writing buildhistory took: 1 seconds pokyuser@e450-6:/workdir/build/imx6q-phytec-mira-rdk-nand-wic-master/conf$
Conclusion
That’s just a small demo of how a “Build Container” can be used.
Appendix
For a blog post that describes how to build the upstream kernel without the Yocto Project® have a look here. If you want to learn how Embedded Linux works have a look here. To learn more about the Yocto Project® have a look here.