1*4882a593Smuzhiyun# Add the necessary override 2*4882a593SmuzhiyunCCACHE_COMPILERCHECK:toolchain-clang ?= "%compiler% -v" 3*4882a593SmuzhiyunHOST_CC_ARCH:prepend:toolchain-clang = "-target ${HOST_SYS} " 4*4882a593SmuzhiyunCC:toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}" 5*4882a593SmuzhiyunCXX:toolchain-clang = "${CCACHE}${HOST_PREFIX}clang++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}" 6*4882a593SmuzhiyunCPP:toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS} -E" 7*4882a593SmuzhiyunCCLD:toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}" 8*4882a593SmuzhiyunRANLIB:toolchain-clang = "${HOST_PREFIX}llvm-ranlib" 9*4882a593SmuzhiyunAR:toolchain-clang = "${HOST_PREFIX}llvm-ar" 10*4882a593SmuzhiyunNM:toolchain-clang = "${HOST_PREFIX}llvm-nm" 11*4882a593SmuzhiyunOBJDUMP:toolchain-clang = "${HOST_PREFIX}llvm-objdump" 12*4882a593SmuzhiyunOBJCOPY:toolchain-clang = "${HOST_PREFIX}llvm-objcopy" 13*4882a593SmuzhiyunSTRIP:toolchain-clang = "${HOST_PREFIX}llvm-strip" 14*4882a593SmuzhiyunSTRINGS:toolchain-clang = "${HOST_PREFIX}llvm-strings" 15*4882a593SmuzhiyunREADELF:toolchain-clang = "${HOST_PREFIX}llvm-readelf" 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunLTO:toolchain-clang = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', '-flto=thin', '-flto -fuse-ld=lld', d)}" 18*4882a593SmuzhiyunPACKAGE_DEBUG_SPLIT_STYLE:toolchain-clang = "debug-without-src" 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunCOMPILER_RT ??= "" 21*4882a593SmuzhiyunCOMPILER_RT:class-native = "-rtlib=libgcc ${UNWINDLIB}" 22*4882a593SmuzhiyunCOMPILER_RT:armeb = "-rtlib=libgcc ${UNWINDLIB}" 23*4882a593SmuzhiyunCOMPILER_RT:libc-klibc = "-rtlib=libgcc ${UNWINDLIB}" 24*4882a593Smuzhiyun 25*4882a593SmuzhiyunUNWINDLIB ??= "" 26*4882a593SmuzhiyunUNWINDLIB:class-native = "--unwindlib=libgcc" 27*4882a593SmuzhiyunUNWINDLIB:armeb = "--unwindlib=libgcc" 28*4882a593SmuzhiyunUNWINDLIB_libc-klibc = "--unwindlib=libgcc" 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunLIBCPLUSPLUS ??= "" 31*4882a593SmuzhiyunLIBCPLUSPLUS:armv5 = "-stdlib=libstdc++" 32*4882a593Smuzhiyun 33*4882a593SmuzhiyunCXXFLAGS:append:toolchain-clang = " ${LIBCPLUSPLUS}" 34*4882a593SmuzhiyunLDFLAGS:append:toolchain-clang = " ${COMPILER_RT} ${LIBCPLUSPLUS}" 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunTUNE_CCARGS:remove:toolchain-clang = "-meb" 37*4882a593SmuzhiyunTUNE_CCARGS:remove:toolchain-clang = "-mel" 38*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains("TUNE_FEATURES", "bigendian", " -mbig-endian", " -mlittle-endian", d)}" 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun# Clang does not yet support big.LITTLE performance tunes, so use the LITTLE for tunes 41*4882a593SmuzhiyunTUNE_CCARGS:remove:toolchain-clang = "-mcpu=cortex-a57.cortex-a53 -mcpu=cortex-a72.cortex-a53 -mcpu=cortex-a15.cortex-a7 -mcpu=cortex-a17.cortex-a7 -mcpu=cortex-a72.cortex-a35 -mcpu=cortex-a73.cortex-a53 -mcpu=cortex-a75.cortex-a55 -mcpu=cortex-a76.cortex-a55" 42*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa53 cortexa57-cortexa53 cortexa73-cortexa53", " -mcpu=cortex-a53", "", d)}" 43*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa15-cortexa7 cortexa17-cortexa7", " -mcpu=cortex-a7", "", d)}" 44*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa35", " -mcpu=cortex-a35", "", d)}" 45*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa75-cortexa55 cortexa76-cortexa55", " -mcpu=cortex-a55", "", d)}" 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun# Clang does not support octeontx2 processor 48*4882a593SmuzhiyunTUNE_CCARGS:remove:toolchain-clang = "-mcpu=octeontx2" 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun# LLD does not yet support relaxation for RISCV e.g. https://reviews.freebsd.org/D25210 51*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang:riscv32 = " -mno-relax" 52*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang:riscv64 = " -mno-relax" 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun# Reconcile some ppc anamolies 55*4882a593SmuzhiyunTUNE_CCARGS:remove:toolchain-clang:powerpc = "-mhard-float -mno-spe" 56*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc64 = " -mlong-double-64" 57*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc64le = " -mlong-double-64" 58*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc = " -mlong-double-64" 59*4882a593Smuzhiyun# usrmerge workaround 60*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains("DISTRO_FEATURES", "usrmerge", " --dyld-prefix=/usr", "", d)}" 61*4882a593Smuzhiyun 62*4882a593SmuzhiyunTUNE_CCARGS:append:toolchain-clang = " -Qunused-arguments" 63*4882a593Smuzhiyun 64*4882a593SmuzhiyunLDFLAGS:append:toolchain-clang:class-nativesdk:x86-64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-x86-64.so.2" 65*4882a593SmuzhiyunLDFLAGS:append:toolchain-clang:class-nativesdk:x86 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux.so.2" 66*4882a593SmuzhiyunLDFLAGS:append:toolchain-clang:class-nativesdk:aarch64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-aarch64.so.1" 67*4882a593Smuzhiyun 68*4882a593SmuzhiyunLDFLAGS:toolchain-clang:class-nativesdk = "${BUILDSDK_LDFLAGS} \ 69*4882a593Smuzhiyun -Wl,-rpath-link,${STAGING_LIBDIR}/.. \ 70*4882a593Smuzhiyun -Wl,-rpath,${libdir}/.. " 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun# Enable lld globally" 73*4882a593SmuzhiyunLDFLAGS:append:toolchain-clang = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' -fuse-ld=lld', '', d)}" 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun# choose between 'gcc' 'clang' an empty '' can be used as well 76*4882a593SmuzhiyunTOOLCHAIN ??= "gcc" 77*4882a593Smuzhiyun# choose between 'gnu' 'llvm' 78*4882a593SmuzhiyunRUNTIME ??= "gnu" 79*4882a593Smuzhiyun#RUNTIME:toolchain-gcc = "gnu" 80*4882a593SmuzhiyunRUNTIME:armeb = "gnu" 81*4882a593SmuzhiyunRUNTIME:armv5 = "gnu" 82*4882a593Smuzhiyun 83*4882a593SmuzhiyunTOOLCHAIN:class-native = "gcc" 84*4882a593SmuzhiyunTOOLCHAIN:class-nativesdk = "gcc" 85*4882a593SmuzhiyunTOOLCHAIN:class-cross-canadian = "gcc" 86*4882a593SmuzhiyunTOOLCHAIN:class-crosssdk = "gcc" 87*4882a593SmuzhiyunTOOLCHAIN:class-cross = "gcc" 88*4882a593Smuzhiyun 89*4882a593SmuzhiyunOVERRIDES =. "${@['', 'toolchain-${TOOLCHAIN}:']['${TOOLCHAIN}' != '']}" 90*4882a593SmuzhiyunOVERRIDES =. "${@['', 'runtime-${RUNTIME}:']['${RUNTIME}' != '']}" 91*4882a593SmuzhiyunOVERRIDES[vardepsexclude] += "TOOLCHAIN RUNTIME" 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun 94*4882a593SmuzhiyunYOCTO_ALTERNATE_EXE_PATH:toolchain-clang:class-target = "${STAGING_BINDIR}/llvm-config" 95*4882a593SmuzhiyunYOCTO_ALTERNATE_LIBDIR:toolchain-clang:class-target = "/${BASELIB}" 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun#YOCTO_ALTERNATE_EXE_PATH:toolchain-clang:class-target[export] = "1" 98*4882a593Smuzhiyun#YOCTO_ALTERNATE_LIBDIR:toolchain-clang:class-target[export] = "1" 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun#DEPENDS:append:toolchain-clang:class-target = " clang-cross-${TARGET_ARCH} " 101*4882a593Smuzhiyun#DEPENDS:remove:toolchain-clang:allarch = "clang-cross-${TARGET_ARCH}" 102*4882a593Smuzhiyun 103*4882a593Smuzhiyundef clang_base_deps(d): 104*4882a593Smuzhiyun if not d.getVar('INHIBIT_DEFAULT_DEPS', False): 105*4882a593Smuzhiyun if not oe.utils.inherits(d, 'allarch') : 106*4882a593Smuzhiyun ret = " ${MLPREFIX}clang-cross-${TARGET_ARCH} virtual/libc " 107*4882a593Smuzhiyun if (d.getVar('RUNTIME').find('android') != -1): 108*4882a593Smuzhiyun ret += " libcxx" 109*4882a593Smuzhiyun return ret 110*4882a593Smuzhiyun if (d.getVar('RUNTIME').find('llvm') != -1): 111*4882a593Smuzhiyun ret += " compiler-rt" 112*4882a593Smuzhiyun elif (d.getVar('COMPILER_RT').find('-rtlib=compiler-rt') != -1): 113*4882a593Smuzhiyun ret += " compiler-rt " 114*4882a593Smuzhiyun else: 115*4882a593Smuzhiyun ret += " libgcc " 116*4882a593Smuzhiyun if (d.getVar('RUNTIME').find('llvm') != -1): 117*4882a593Smuzhiyun ret += " libcxx" 118*4882a593Smuzhiyun elif (d.getVar('COMPILER_RT').find('--unwindlib=libunwind') != -1): 119*4882a593Smuzhiyun ret += " libcxx " 120*4882a593Smuzhiyun elif (d.getVar('LIBCPLUSPLUS').find('-stdlib=libc++') != -1): 121*4882a593Smuzhiyun ret += " libcxx " 122*4882a593Smuzhiyun else: 123*4882a593Smuzhiyun ret += " virtual/${TARGET_PREFIX}compilerlibs " 124*4882a593Smuzhiyun return ret 125*4882a593Smuzhiyun return "" 126*4882a593Smuzhiyun 127*4882a593SmuzhiyunBASE_DEFAULT_DEPS:toolchain-clang:class-target = "${@clang_base_deps(d)}" 128*4882a593SmuzhiyunBASE_DEFAULT_DEPS:append:class-native:toolchain-clang:runtime-llvm = " libcxx-native compiler-rt-native" 129*4882a593SmuzhiyunBASE_DEFAULT_DEPS:append:class-nativesdk:toolchain-clang:runtime-llvm = " clang-native nativesdk-libcxx nativesdk-compiler-rt" 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun# do_populate_sysroot needs STRIP 132*4882a593SmuzhiyunPOPULATESYSROOTDEPS:toolchain-clang:class-target = "${MLPREFIX}clang-cross-${TARGET_ARCH}:do_populate_sysroot" 133*4882a593Smuzhiyun 134*4882a593Smuzhiyuncmake_do_generate_toolchain_file:append:toolchain-clang () { 135*4882a593Smuzhiyun cat >> ${WORKDIR}/toolchain.cmake <<EOF 136*4882a593Smuzhiyunset( CMAKE_CLANG_TIDY ${HOST_PREFIX}clang-tidy ) 137*4882a593SmuzhiyunEOF 138*4882a593Smuzhiyun sed -i 's/ -mmusl / /g' ${WORKDIR}/toolchain.cmake 139*4882a593Smuzhiyun} 140*4882a593Smuzhiyun# 141*4882a593Smuzhiyun# dump recipes which still use gcc 142*4882a593Smuzhiyun#python __anonymous() { 143*4882a593Smuzhiyun# toolchain = d.getVar("TOOLCHAIN") 144*4882a593Smuzhiyun# if not toolchain or toolchain == "clang" or 'class-target' not in d.getVar('OVERRIDES').split(':'): 145*4882a593Smuzhiyun# return 146*4882a593Smuzhiyun# pkgn = d.getVar("PN") 147*4882a593Smuzhiyun# bb.warn("%s - %s" % (pkgn, toolchain)) 148*4882a593Smuzhiyun#} 149