summaryrefslogtreecommitdiffstats
path: root/classes/clang-legacy.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'classes/clang-legacy.bbclass')
-rw-r--r--classes/clang-legacy.bbclass145
1 files changed, 145 insertions, 0 deletions
diff --git a/classes/clang-legacy.bbclass b/classes/clang-legacy.bbclass
new file mode 100644
index 0000000..dbd600f
--- /dev/null
+++ b/classes/clang-legacy.bbclass
@@ -0,0 +1,145 @@
1# Add the necessary override
2CCACHE_COMPILERCHECK:toolchain-clang ?= "%compiler% -v"
3HOST_CC_ARCH:prepend:toolchain-clang:class-target = "-target ${HOST_SYS} "
4HOST_CC_ARCH:prepend:toolchain-clang:class-nativesdk = "-target ${HOST_SYS} "
5LD:toolchain-clang:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', '${HOST_PREFIX}ld.lld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}', '${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}', d)}"
6LD:toolchain-clang:class-nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', '${HOST_PREFIX}ld.lld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}', '${HOST_PREFIX}ld${TOOLCHAIN_OPTIONS} ${HOST_LD_ARCH}', d)}"
7
8LTO:toolchain-clang:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', '-flto=thin', '-flto -fuse-ld=lld', d)}"
9LTO:toolchain-clang:class-nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', '-flto=thin', '-flto -fuse-ld=lld', d)}"
10
11COMPILER_RT ??= ""
12COMPILER_RT:armeb = "-rtlib=libgcc ${UNWINDLIB}"
13COMPILER_RT:libc-klibc = "-rtlib=libgcc ${UNWINDLIB}"
14
15UNWINDLIB ??= ""
16UNWINDLIB:armeb = "--unwindlib=libgcc"
17UNWINDLIB_libc-klibc = "--unwindlib=libgcc"
18
19LIBCPLUSPLUS ??= ""
20LIBCPLUSPLUS:armv5 = "-stdlib=libstdc++"
21
22CXXFLAGS:append:toolchain-clang = " ${LIBCPLUSPLUS}"
23LDFLAGS:append:toolchain-clang = " ${COMPILER_RT} ${LIBCPLUSPLUS}"
24
25# Clang does not yet support big.LITTLE performance tunes, so use the LITTLE for tunes
26TUNE_CCARGS:remove:toolchain-clang = "\
27 -mcpu=cortex-a57.cortex-a53${TUNE_CCARGS_MARCH_OPTS} \
28 -mcpu=cortex-a72.cortex-a53${TUNE_CCARGS_MARCH_OPTS} \
29 -mcpu=cortex-a15.cortex-a7${TUNE_CCARGS_MARCH_OPTS} \
30 -mcpu=cortex-a17.cortex-a7${TUNE_CCARGS_MARCH_OPTS} \
31 -mcpu=cortex-a72.cortex-a35${TUNE_CCARGS_MARCH_OPTS} \
32 -mcpu=cortex-a73.cortex-a53${TUNE_CCARGS_MARCH_OPTS} \
33 -mcpu=cortex-a75.cortex-a55${TUNE_CCARGS_MARCH_OPTS} \
34 -mcpu=cortex-a76.cortex-a55${TUNE_CCARGS_MARCH_OPTS}"
35TUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa53 cortexa57-cortexa53 cortexa73-cortexa53", " -mcpu=cortex-a53${TUNE_CCARGS_MARCH_OPTS}", "", d)}"
36TUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa15-cortexa7 cortexa17-cortexa7", " -mcpu=cortex-a7${TUNE_CCARGS_MARCH_OPTS}", "", d)}"
37TUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa35", " -mcpu=cortex-a35${TUNE_CCARGS_MARCH_OPTS}", "", d)}"
38TUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa75-cortexa55 cortexa76-cortexa55", " -mcpu=cortex-a55${TUNE_CCARGS_MARCH_OPTS}", "", d)}"
39
40# Workaround for https://github.com/llvm/llvm-project/issues/85699
41# needed for 64bit rpi3/rpi4 machines
42TUNE_CCARGS_MARCH_OPTS:append:toolchain-clang = "${@bb.utils.contains_any("DEFAULTTUNE", "cortexa72 cortexa53", "+nocrypto", "", d)}"
43
44# Clang does not support octeontx2 processor
45TUNE_CCARGS:remove:toolchain-clang = "-mcpu=octeontx2${TUNE_CCARGS_MARCH_OPTS}"
46
47# Reconcile some ppc anamolies
48TUNE_CCARGS:remove:toolchain-clang:powerpc = "-mhard-float -mno-spe"
49TUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc64 = " -mlong-double-64"
50TUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc64le = " -mlong-double-64"
51TUNE_CCARGS:append:toolchain-clang:libc-musl:powerpc = " -mlong-double-64"
52# usrmerge workaround
53TUNE_CCARGS:append:toolchain-clang = "${@bb.utils.contains("DISTRO_FEATURES", "usrmerge", " --dyld-prefix=/usr", "", d)}"
54
55TUNE_CCARGS:append:toolchain-clang = " -Qunused-arguments"
56
57LDFLAGS:append:toolchain-clang:class-nativesdk:x86-64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-x86-64.so.2"
58LDFLAGS:append:toolchain-clang:class-nativesdk:x86 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux.so.2"
59LDFLAGS:append:toolchain-clang:class-nativesdk:aarch64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-aarch64.so.1"
60
61LDFLAGS:toolchain-clang:class-nativesdk = "${BUILDSDK_LDFLAGS} \
62 -Wl,-rpath-link,${STAGING_LIBDIR}/.. \
63 -Wl,-rpath,${libdir}/.. "
64
65# Enable lld globally except for ppc32 where it causes random segfaults in Qemu usermode
66LDFLAGS:append:toolchain-clang:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' -fuse-ld=lld', '', d)}"
67LDFLAGS:append:toolchain-clang:class-nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' -fuse-ld=lld', '', d)}"
68LDFLAGS:remove:toolchain-clang:powerpc = "-fuse-ld=lld"
69
70# Remove gcc specific -fcanon-prefix-map option, added in gcc-13+
71# clang does not support it yet
72DEBUG_PREFIX_MAP:remove:toolchain-clang = "-fcanon-prefix-map"
73
74# choose between 'gnu' 'llvm'
75TC_CXX_RUNTIME ??= "gnu"
76# Using gcc or llvm runtime is only available when using clang for compiler
77#TC_CXX_RUNTIME:toolchain-gcc = "gnu"
78TC_CXX_RUNTIME:armeb = "gnu"
79TC_CXX_RUNTIME:armv5 = "gnu"
80
81#TOOLCHAIN:class-native = "gcc"
82#TOOLCHAIN:class-nativesdk = "gcc"
83#TOOLCHAIN:class-cross-canadian = "gcc"
84#TOOLCHAIN:class-crosssdk = "gcc"
85#TOOLCHAIN:class-cross = "gcc"
86
87#OVERRIDES =. "${@['', 'toolchain-${TOOLCHAIN}:']['${TOOLCHAIN}' != '']}"
88OVERRIDES =. "${@['', 'runtime-${TC_CXX_RUNTIME}:']['${TC_CXX_RUNTIME}' != '']}"
89OVERRIDES[vardepsexclude] += "TC_CXX_RUNTIME"
90
91YOCTO_ALTERNATE_EXE_PATH:toolchain-clang:class-target = "${STAGING_BINDIR}/llvm-config"
92YOCTO_ALTERNATE_LIBDIR:toolchain-clang:class-target = "/${BASELIB}"
93
94#YOCTO_ALTERNATE_EXE_PATH:toolchain-clang:class-target[export] = "1"
95#YOCTO_ALTERNATE_LIBDIR:toolchain-clang:class-target[export] = "1"
96
97#DEPENDS:append:toolchain-clang:class-target = " clang-cross-${TARGET_ARCH} "
98#DEPENDS:remove:toolchain-clang:allarch = "clang-cross-${TARGET_ARCH}"
99
100def clang_base_deps(d):
101 if not d.getVar('INHIBIT_DEFAULT_DEPS', False):
102 if not oe.utils.inherits(d, 'allarch') :
103 ret = " ${MLPREFIX}clang-cross-${TARGET_ARCH} virtual/libc "
104 if (d.getVar('TC_CXX_RUNTIME').find('android') != -1):
105 ret += " libcxx"
106 return ret
107 if (d.getVar('TC_CXX_RUNTIME').find('llvm') != -1):
108 ret += " compiler-rt"
109 elif (d.getVar('COMPILER_RT').find('-rtlib=compiler-rt') != -1):
110 ret += " compiler-rt "
111 else:
112 ret += " libgcc "
113 if (d.getVar('TC_CXX_RUNTIME').find('llvm') != -1):
114 ret += " libcxx"
115 elif (d.getVar('COMPILER_RT').find('--unwindlib=libunwind') != -1):
116 ret += " libcxx "
117 elif (d.getVar('LIBCPLUSPLUS').find('-stdlib=libc++') != -1):
118 ret += " libcxx "
119 else:
120 ret += " virtual/${MLPREFIX}compilerlibs "
121 return ret
122 return ""
123
124BASE_DEFAULT_DEPS:append:class-target:toolchain-clang:class-target = " ${@clang_base_deps(d)}"
125BASE_DEFAULT_DEPS:append:class-native:runtime-llvm = " libcxx-native compiler-rt-native"
126BASE_DEFAULT_DEPS:append:class-nativesdk:runtime-llvm = " clang-native nativesdk-libcxx nativesdk-compiler-rt"
127
128# do_populate_sysroot needs STRIP
129POPULATESYSROOTDEPS:toolchain-clang:class-target = "${MLPREFIX}clang-cross-${TARGET_ARCH}:do_populate_sysroot"
130
131cmake_do_generate_toolchain_file:append:toolchain-clang () {
132 cat >> ${WORKDIR}/toolchain.cmake <<EOF
133set( CMAKE_CLANG_TIDY ${HOST_PREFIX}clang-tidy )
134EOF
135 sed -i 's/ -mmusl / /g' ${WORKDIR}/toolchain.cmake
136}
137
138# dump recipes which still use gcc
139#python __anonymous() {
140# toolchain = d.getVar("TOOLCHAIN")
141# if not toolchain or toolchain == "clang" or 'class-target' not in d.getVar('OVERRIDES').split(':'):
142# return
143# pkgn = d.getVar("PN")
144# bb.warn("%s - %s" % (pkgn, toolchain))
145#}