xref: /OK3568_Linux_fs/yocto/meta-clang/classes/clang.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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