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