Build Yocto on up-to-date Arch Linux
When I recently tried building an embedded Linux system using Yocto Zeus on Arch, I ran into a couple of issues. Here’s a summary of the problem and and a workaround.
Problem 1: GCC 10
From version 10, GCC
defaults to -fno-common
instead of the previous default
-fcommon
. This can lead to linker errors due to multiple symbol
definitions. The natural solution would be to override this new default with
the old one using something like BUILD_CFLAGS
. Unfortunately,
this doesn’t work for all -native
recipes as not all allow to
override the CFLAGS
, e.g. dtc-native
. The only
solution I have found for this problem is downgrading GCC.
Problem 2: file with libseccomp
Some recipe steps fail with errors like
Command '['file', '-b', '/…/base-files/3.0.14-r89/package/etc/skel/.profile']' died with <Signals.SIGSYS: 31>.
This is caused by the fact that the file
utility in Arch is
compiled with libseccomp
support. This wouldn’t be a problem in itself, but the Yocto build system uses
libpseudo
which seems to cause the issue. The functionality provided by libseccomp can
be disabled with file
’s --no-sandbox
switch.
Workaround
I have added a .bin
directory to my Yocto project’s root
directory which gets added to PATH
with the highest priority
(left-most). It symlinks gcc
and g++
to
gcc-8
and g++-8
(gcc8
package from the
community repo), respectively. I furthermore included a wrapper script for
file
.
mkdir .bin
ln -s /usr/bin/gcc-8 .bin/gcc
ln -s /usr/bin/g++-8 .bin/g++
cat <<EOF > .bin/file
#!/bin/sh
/usr/bin/file --no-sandbox "\$@"
EOF
chmod +x .bin/file
In order to make working with this a little more convenient, I added a small script that can be sourced when starting to work on the project:
cat <<EOF > source-me
export PATH="\$PWD/.bin:\$PATH"
. ./poky/oe-init-build-env
EOF