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