Introduction
Clang based toolchain can be used to compile large portions of packages in OpenEmbedded Framework, in this article we will cover the generating and using OpenEmbedded SDKs based on Clang, This SDK will also have the original cross gcc based compilers cohabiting with clang
Generating SDK
Building image base SDK in OpenEmbedded Framework is a simple process like its building any other image or component. One can generate a SDK corresponding to final image that will be shipped on target. This gets development headers and libraries from all the dependencies packaged into the SDK installer, this SDK then can be installed and used for stand alone application development.
Preparing OpenEmbedded Workspace
$ git clone https://github.com/openembedded/openembedded-core.git
$ cd openembedded-core
$ git clone https://github.com/openembedded/bitbake.git
$ git clone https://github.com/kraj/meta-clang.git
$ . ./oe-init-build-env
Add meta-clang to conf/bblayers.conf e.g.
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/kraj/openembedded-core/meta-clang \
/home/kraj/openembedded-core/meta \
"
BBLAYERS_NON_REMOVABLE ?= " \
/home/kraj/openembedded-core/meta \
"
Select qemuarm64 for MACHINE in conf/local.conf, you need to uncomment the line marked in red
#
# Machine Selection
#
# You need to select a specific machine to target the build with. There are a selection
# of emulated machines available which can boot and run in the QEMU emulator:
#
#MACHINE ?= "qemuarm"
MACHINE ?= "qemuarm64"
#MACHINE ?= "qemumips"
#MACHINE ?= "qemuppc"
#MACHINE ?= "qemux86"
#MACHINE ?= "qemux86-64"
#
Build SDK
$ bitbake -cpopulate_sdk core-image-minimal
Install SDK
SDK self-installer will be in deploy are under e.g. tmp-glibc/deploy/sdk/
$ ./tmp-glibc/deploy/sdk/oecore-x86_64-aarch64-toolchain-nodistro.0.sh
OpenEmbedded SDK installer version nodistro.0
===========================================================
Enter target directory for SDK (default: /usr/local/oecore-x86_64):
You are about to install the SDK to “/usr/local/oecore-x86_64”. Proceed[Y/n]?
Extracting SDK…………………………….done
Setting it up…done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
$ . /usr/local/oecore-x86_64/environment-setup-aarch64-oe-linux
Using SDK
The environment setup needs to be done in every shell where the SDK is to be used
$ . /usr/local/oecore-x86_64/environment-setup-aarch64-oe-linux
At this point the SDK is ready to be used for compiling applications as well as kernel. Since the SDK has both gcc and clang in it a new set of variables is introduced to make it easy to use clang
CLANGCC – C cross compiler
CLANGCXX – C++ cross compiler
Example 1 – Build musl C library
The example lists compiling musl C library using the cross SDK but this can be used for anything including kernel and application
$ git clone git://git.musl-libc.org/musl
$ cd musl
$ ./configure --host=aarch64-oe-linux CC=${CLANGCC}
$ make -j
Example 2 – Building llvmlinux kernel
$ git clone git://git.linuxfoundation.org/llvmlinux/kernel.git llvmlinux
$ cd llvmlinux
$ make ARCH=arm64 CC=${CLANGCC} LDFLAGS="" defconfig
$ make ARCH=arm64 CC=${CLANGCC} LDFLAGS="" -j vmlinux
If the kernel for aarch64 won’t build, then hey what have you been waiting for ? you have everything go fix it !!!
Notes
I have not provided prebuilt SDKs, if there is enough intrest for such SDKs, I would consider building the SDK self-installs and host them somewhere, contact me if you are interested.
Example is covering aarch64 but the SDKs are not limited to aarch64, one can build for x86,x86_64, ppc, mips, arm in same fashion. All one would need is to changes is MACHINE selection in conf/local.conf
Very interesting — glad to see the CLANG stuff coming along!
Can yocto be used to create a freestanding (clang) libc++ static library based on musl? Making cross compilers isn’t my specialty, so I’m look for help, thanks,
@araron, yes you will find libc++ as part of the SDK. however keep in mind Yocto generated SDK ( musl based ) can be used to build apps for linux platforms, so by default its targed at hosted environments. However, it can be used to compile baremetal apps e.g. u-boot etc as well by using -ffreestanding option and few other options to not use standard runtime, this however means that stand alone application provides the needed runtime and C libraries. Musl can be built for baremetal( nommu ) platforms for few architectures only. So if you are looking for using it for standalone/baremetal apps then you have to tweak the flags. If you want to use it for building linux apps then it should work out of box and if you want to use libc++ instead of libstdc++ then all you would need is add -stdlib=libc++ to ldflags/c++flags and that will do it