Newer kernels (including Android kernels) support Clang compilation and LTO. To configure a kernel (e.g., linux-rockchip) to use Clang, use a .bbappend with the following settings:
Basic Clang Toolchain Configuration
TOOLCHAIN:forcevariable = "clang"
DEPENDS:append:toolchain-clang = " clang-cross-${TARGET_ARCH}"
KERNEL_CC:toolchain-clang = "${CCACHE}clang ${HOST_CC_KERNEL_ARCH} -fuse-ld=lld ${DEBUG_PREFIX_MAP} -fdebug-prefix-map=${STAGING_KERNEL_DIR}=${KERNEL_SRC_PATH}"
KERNEL_LD:toolchain-clang = "${CCACHE}ld.lld"
KERNEL_AR:toolchain-clang = "${CCACHE}llvm-ar"
Enable LLVM Integrated Assembler (IAS)
For older kernels, you may need to explicitly enable the integrated assembler:
do_compile:prepend:toolchain-clang() {
export LLVM_IAS=1
}
do_compile_kernelmodules:prepend:toolchain-clang() {
export LLVM_IAS=1
}
Enable Link Time Optimization (LTO)
To enable LTO, append a configuration file to the SRC_URI:
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append:toolchain-clang = "\n\tfile://lto.cfg \n"
And create an lto.cfg file with:
CONFIG_LTO_CLANG=y
CONFIG_LTO=y
CONFIG_LTO_CLANG_THIN=y
Note: CONFIG_LTO_CLANG is required for some Android-based kernels; mainline kernels usually auto-detect.
TOOLCHAIN:forcevariable = "clang"
DEPENDS:append:toolchain-clang = " clang-cross-${TARGET_ARCH}"
KERNEL_CC:toolchain-clang = "${CCACHE}clang ${HOST_CC_KERNEL_ARCH} -fuse-ld=lld ${DEBUG_PREFIX_MAP} -fdebug-prefix-map=${STAGING_KERNEL_DIR}=${KERNEL_SRC_PATH}"
KERNEL_LD:toolchain-clang = "${CCACHE}ld.lld"
KERNEL_AR:toolchain-clang = "${CCACHE}llvm-ar"