summaryrefslogtreecommitdiffstats
path: root/external/meta-clang/classes
diff options
context:
space:
mode:
Diffstat (limited to 'external/meta-clang/classes')
-rw-r--r--external/meta-clang/classes/clang.bbclass88
-rw-r--r--external/meta-clang/classes/cmake-native.bbclass15
-rw-r--r--external/meta-clang/classes/lto.bbclass7
-rw-r--r--external/meta-clang/classes/scan-build.bbclass51
4 files changed, 116 insertions, 45 deletions
diff --git a/external/meta-clang/classes/clang.bbclass b/external/meta-clang/classes/clang.bbclass
index 4d20ff07..a00eef69 100644
--- a/external/meta-clang/classes/clang.bbclass
+++ b/external/meta-clang/classes/clang.bbclass
@@ -1,27 +1,68 @@
# Add the necessary override
+CCACHE_COMPILERCHECK_toolchain-clang = "%compiler% -v"
+HOST_CC_ARCH_prepend_toolchain-clang = "-target ${HOST_SYS} "
CC_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
CXX_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang++ ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
CPP_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS} -E"
CCLD_toolchain-clang = "${CCACHE}${HOST_PREFIX}clang ${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS}"
-RANLIB_toolchain-clang = "${HOST_PREFIX}ranlib"
-AR_toolchain-clang = "${HOST_PREFIX}ar"
-NM_toolchain-clang = "${HOST_PREFIX}nm"
+RANLIB_toolchain-clang = "${HOST_PREFIX}llvm-ranlib"
+AR_toolchain-clang = "${HOST_PREFIX}llvm-ar"
+NM_toolchain-clang = "${HOST_PREFIX}llvm-nm"
+
+export CLANG_TIDY_toolchain-clang = "${HOST_PREFIX}clang-tidy"
+
+COMPILER_RT ??= "${@bb.utils.contains("RUNTIME", "llvm", "-rtlib=compiler-rt ${UNWINDLIB}", "", d)}"
+COMPILER_RT_powerpc = "--rtlib=libgcc ${UNWINDLIB}"
+COMPILER_RT_armeb = "--rtlib=libgcc ${UNWINDLIB}"
+
+UNWINDLIB ??= "${@bb.utils.contains("RUNTIME", "llvm", "--unwindlib=libgcc", "", d)}"
+UNWINDLIB_riscv64 = "--unwindlib=libgcc"
+UNWINDLIB_riscv32 = "--unwindlib=libgcc"
+UNWINDLIB_powerpc = "--unwindlib=libgcc"
+UNWINDLIB_armeb = "--unwindlib=libgcc"
+
+LIBCPLUSPLUS ??= "${@bb.utils.contains("RUNTIME", "llvm", "--stdlib=libc++", "", d)}"
+
+TARGET_CXXFLAGS_append_toolchain-clang = " ${LIBCPLUSPLUS}"
+TUNE_CCARGS_append_toolchain-clang = " ${COMPILER_RT} ${LIBCPLUSPLUS}"
-THUMB_TUNE_CCARGS_remove_toolchain-clang = "-mthumb-interwork"
TUNE_CCARGS_remove_toolchain-clang = "-meb"
TUNE_CCARGS_remove_toolchain-clang = "-mel"
TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains("TUNE_FEATURES", "bigendian", " -mbig-endian", " -mlittle-endian", d)}"
+# Clang does not yet support big.LITTLE performance tunes, so use the LITTLE for tunes
+TUNE_CCARGS_remove_toolchain-clang = "-mtune=cortex-a57.cortex-a53 -mtune=cortex-a72.cortex-a53 -mtune=cortex-a15.cortex-a7 -mtune=cortex-a17.cortex-a7 -mtune=cortex-a72.cortex-a35 -mtune=cortex-a73.cortex-a53 -mtune=cortex-a75.cortex-a55 -mtune=cortex-a76.cortex-a55"
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa53 cortexa57-cortexa53 cortexa73-cortexa53", " -mtune=cortex-a53", "", d)}"
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa15-cortexa7 cortexa17-cortexa7", " -mtune=cortex-a7", "", d)}"
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa72-cortexa35", " -mtune=cortex-a35", "", d)}"
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains_any("TUNE_FEATURES", "cortexa75-cortex-a55 cortexa76-cortex-a55", " -mtune=cortex-a55", "", d)}"
+
TUNE_CCARGS_remove_toolchain-clang_powerpc = "-mhard-float"
TUNE_CCARGS_remove_toolchain-clang_powerpc = "-mno-spe"
-TUNE_CCARGS_append_toolchain-clang = " --rtlib=compiler-rt -Wno-error=unused-command-line-argument -Qunused-arguments"
+TUNE_CCARGS_append_toolchain-clang = " -Qunused-arguments"
+TUNE_CCARGS_append_toolchain-clang_libc-musl_powerpc64 = " -mlong-double-64"
+TUNE_CCARGS_append_toolchain-clang_libc-musl_powerpc64le = " -mlong-double-64"
+# usrmerge workaround
+TUNE_CCARGS_append_toolchain-clang = "${@bb.utils.contains("DISTRO_FEATURES", "usrmerge", " --dyld-prefix=/usr", "", d)}"
+
+LDFLAGS_append_toolchain-clang_class-nativesdk_x86-64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-x86-64.so.2"
+LDFLAGS_append_toolchain-clang_class-nativesdk_x86 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux.so.2"
+LDFLAGS_append_toolchain-clang_class-nativesdk_aarch64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-aarch64.so.1"
+
+LDFLAGS_toolchain-clang_class-nativesdk = "${BUILDSDK_LDFLAGS} \
+ -Wl,-rpath-link,${STAGING_LIBDIR}/.. \
+ -Wl,-rpath,${libdir}/.. "
-TOOLCHAIN_OPTIONS_append_toolchain-clang_class-nativesdk_x86-64 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux-x86-64.so.2"
-TOOLCHAIN_OPTIONS_append_toolchain-clang_class-nativesdk_x86 = " -Wl,-dynamic-linker,${base_libdir}/ld-linux.so.2"
+# Enable lld globally"
+LDFLAGS_append_toolchain-clang = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' -fuse-ld=lld', '', d)}"
# choose between 'gcc' 'clang' an empty '' can be used as well
TOOLCHAIN ??= "gcc"
+# choose between 'gnu' 'llvm'
+RUNTIME ??= "gnu"
+RUNTIME_toolchain-gcc = "gnu"
+RUNTIME_armeb = "gnu"
TOOLCHAIN_class-native = "gcc"
TOOLCHAIN_class-nativesdk = "gcc"
@@ -29,24 +70,35 @@ TOOLCHAIN_class-cross-canadian = "gcc"
TOOLCHAIN_class-crosssdk = "gcc"
TOOLCHAIN_class-cross = "gcc"
-# -fmacro-prefix-map does not exist in clang 7.x
-DEBUG_PREFIX_MAP_toolchain-clang = " "
-
OVERRIDES =. "${@['', 'toolchain-${TOOLCHAIN}:']['${TOOLCHAIN}' != '']}"
-OVERRIDES[vardepsexclude] += "TOOLCHAIN"
+OVERRIDES =. "${@['', 'runtime-${RUNTIME}:']['${RUNTIME}' != '']}"
+OVERRIDES[vardepsexclude] += "TOOLCHAIN RUNTIME"
#DEPENDS_append_toolchain-clang_class-target = " clang-cross-${TARGET_ARCH} "
#DEPENDS_remove_toolchain-clang_allarch = "clang-cross-${TARGET_ARCH}"
-def clang_dep_prepend(d):
+def clang_base_deps(d):
if not d.getVar('INHIBIT_DEFAULT_DEPS', False):
if not oe.utils.inherits(d, 'allarch') :
- return " clang-cross-${TARGET_ARCH} compiler-rt libcxx"
+ ret = " clang-cross-${TARGET_ARCH} virtual/libc "
+ if (d.getVar('COMPILER_RT').find('--rtlib=compiler-rt') != -1):
+ ret += " compiler-rt "
+ else:
+ ret += " libgcc "
+ if (d.getVar('COMPILER_RT').find('--unwindlib=libunwind') != -1):
+ ret += " libcxx "
+ if (d.getVar('LIBCPLUSPLUS').find('--stdlib=libc++') != -1):
+ ret += " libcxx "
+ else:
+ ret += " virtual/${TARGET_PREFIX}compilerlibs "
+ return ret
return ""
-BASEDEPENDS_remove_toolchain-clang_class-target = "virtual/${TARGET_PREFIX}gcc"
-BASEDEPENDS_append_toolchain-clang_class-target = "${@clang_dep_prepend(d)}"
+BASE_DEFAULT_DEPS_toolchain-clang_class-target = "${@clang_base_deps(d)}"
+
+cmake_do_generate_toolchain_file_append_toolchain-clang () {
+ cat >> ${WORKDIR}/toolchain.cmake <<EOF
+set( CMAKE_CLANG_TIDY ${CLANG_TIDY} )
+EOF
+}
-PREFERRED_PROVIDER_libunwind = "libunwind"
-PREFERRED_PROVIDER_libunwind_mipsarch = "libunwind"
-PREFERRED_PROVIDER_libunwind_toolchain-clang = "libcxx"
diff --git a/external/meta-clang/classes/cmake-native.bbclass b/external/meta-clang/classes/cmake-native.bbclass
index 911476e1..116cdd1a 100644
--- a/external/meta-clang/classes/cmake-native.bbclass
+++ b/external/meta-clang/classes/cmake-native.bbclass
@@ -1,10 +1,9 @@
-# We need to unset CCACHE otherwise cmake gets too confused
-CCACHE = ""
-
# Native C/C++ compiler (without cpu arch/tune arguments)
OECMAKE_NATIVE_C_COMPILER ?= "`echo ${BUILD_CC} | sed 's/^\([^ ]*\).*/\1/'`"
OECMAKE_NATIVE_CXX_COMPILER ?= "`echo ${BUILD_CXX} | sed 's/^\([^ ]*\).*/\1/'`"
OECMAKE_NATIVE_AR ?= "${BUILD_AR}"
+OECMAKE_NATIVE_RANLIB ?= "${BUILD_RANLIB}"
+OECMAKE_NATIVE_NM ?= "${BUILD_NM}"
# Native compiler flags
OECMAKE_NATIVE_C_FLAGS ?= "${BUILD_CC_ARCH} ${BUILD_CFLAGS}"
@@ -24,6 +23,8 @@ set( CMAKE_C_COMPILER ${OECMAKE_NATIVE_C_COMPILER} )
set( CMAKE_CXX_COMPILER ${OECMAKE_NATIVE_CXX_COMPILER} )
set( CMAKE_ASM_COMPILER ${OECMAKE_NATIVE_C_COMPILER} )
set( CMAKE_AR ${OECMAKE_NATIVE_AR} CACHE FILEPATH "Archiver" )
+set( CMAKE_RANLIB ${OECMAKE_NATIVE_RANLIB} CACHE FILEPATH "Archive Indexer" )
+set( CMAKE_NM ${OECMAKE_NATIVE_NM} CACHE FILEPATH "Symbol Lister" )
set( CMAKE_C_FLAGS "${OECMAKE_NATIVE_C_FLAGS}" CACHE STRING "CFLAGS" )
set( CMAKE_CXX_FLAGS "${OECMAKE_NATIVE_CXX_FLAGS}" CACHE STRING "CXXFLAGS" )
set( CMAKE_ASM_FLAGS "${OECMAKE_NATIVE_C_FLAGS}" CACHE STRING "ASM FLAGS" )
@@ -41,6 +42,14 @@ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
# Use native cmake modules
list(APPEND CMAKE_MODULE_PATH "${STAGING_DATADIR_NATIVE}/cmake/Modules/")
+
+# add for non /usr/lib libdir, e.g. /usr/lib64
+set( CMAKE_LIBRARY_PATH ${STAGING_BASE_LIBDIR_NATIVE} ${STAGING_LIBDIR_NATIVE})
+
+# add include dir to implicit includes in case it differs from /usr/include
+list(APPEND CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES ${STAGING_INCDIR_NATIVE})
+list(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES ${STAGING_INCDIR_NATIVE})
+
EOF
}
diff --git a/external/meta-clang/classes/lto.bbclass b/external/meta-clang/classes/lto.bbclass
new file mode 100644
index 00000000..80a3d4da
--- /dev/null
+++ b/external/meta-clang/classes/lto.bbclass
@@ -0,0 +1,7 @@
+# Enable LTO based on global distro settings
+TOOLCHAIN_OPTIONS_append_toolchain-clang = "${@bb.utils.contains('DISTRO_FEATURES', 'thin-lto', ' -flto=thin -fuse-ld=gold', '', d)}"
+TOOLCHAIN_OPTIONS_append_toolchain-clang = "${@bb.utils.contains('DISTRO_FEATURES', 'full-lto', ' -flto=full -fuse-ld=gold', '', d)}"
+RANLIB_toolchain-clang = "${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib"
+AR_toolchain-clang = "${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar"
+NM_toolchain-clang = "${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm"
+
diff --git a/external/meta-clang/classes/scan-build.bbclass b/external/meta-clang/classes/scan-build.bbclass
index e0de56bb..6d3fe652 100644
--- a/external/meta-clang/classes/scan-build.bbclass
+++ b/external/meta-clang/classes/scan-build.bbclass
@@ -1,33 +1,27 @@
# Copyright (C) 2018 Khem Raj <raj.khem@gmail.com>
# Released under the MIT license (see COPYING.MIT for the terms)
-CFLAGS =+ "${TARGET_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
-CXXFLAGS =+ "${TARGET_CC_ARCH} ${TOOLCHAIN_OPTIONS}"
+EXTRA_ANALYZER_OPTIONS += "-analyze-headers"
+EXTRA_ANALYZER_OPTIONS += "--force-analyze-debug-code"
+SCAN_BUILD ??= "1"
+SCAN_BUILD_class-native = ""
+SCAN_BUILD_class-nativesdk = ""
+SCAN_BUILD_class-cross = ""
+SCAN_BUILD_class-crosssdk = ""
+SCAN_BUILD_class-cross-canadian = ""
-#EXTRA_ANALYZER_OPTIONS ?= "-analyze-headers"
-CLANG_SCAN_ENABLED ??= "1"
#CLANG_SCAN_SERVER_IP ??= "127.0.0.1"
CLANG_SCAN_SERVER_IP ??= "10.0.0.10"
CLANG_SCAN_PORT ??= "8181"
SCAN_RESULTS_DIR ?= "${TMPDIR}/static-scan/${PN}"
-scanbuild_munge_cc_cxx() {
- cc="`echo ${CC} | cut -f1 -d " "`"
- cxx="`echo ${CXX} | cut -f1 -d " "`"
- export CC="${cc}"
- export CXX="${cxx}"
-}
-
-do_configure[prefuncs] += "scanbuild_munge_cc_cxx"
+CCSCAN ?= "${HOST_PREFIX}${TOOLCHAIN}"
+CXXSCAN_toolchain-clang ?= "${HOST_PREFIX}clang++"
+CXXSCAN_toolchain-gcc ?= "${HOST_PREFIX}g++"
do_scanbuild() {
- cc="`echo ${CC} | cut -f1 -d " "`"
- cxx="`echo ${CXX} | cut -f1 -d " "`"
- #mk="scan-build --use-cc=${cc} --use-c++=${cxx} --analyzer-target=${HOST_SYS} --html-title="${BP}" -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} make"
- #export MAKE="${mk}"
- export CC="${cc}"
- export CXX="${cxx}"
- scan-build --use-cc=${cc} --use-c++=${cxx} --analyzer-target=${HOST_SYS} --html-title="${BP}" -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} ${MAKE} ${EXTRA_OEMAKE}
+ rm -rf ${SCAN_RESULTS_DIR}
+ scan-build --use-cc ${CCSCAN} --use-c++ ${CXXSCAN} --analyzer-target ${HOST_SYS} --html-title ${BP} -o ${SCAN_RESULTS_DIR} ${EXTRA_ANALYZER_OPTIONS} ${MAKE} ${PARALLEL_MAKE} ${EXTRA_OEMAKE}
}
do_scanview() {
@@ -39,7 +33,8 @@ do_scanview() {
}
do_scanview[depends] += "${PN}:do_scanbuild"
-do_scanbuild[cleandirs] += "${SCAN_RESULTS_DIR}"
+do_scanbuild[depends] += "clang-native:do_populate_sysroot"
+#do_scanbuild[cleandirs] += "${SCAN_RESULTS_DIR}"
do_scanbuild[dirs] += "${B}"
do_scanview[dirs] += "${SCAN_RESULTS_DIR}"
#do_build[recrdeptask] += "do_scanbuild"
@@ -48,11 +43,19 @@ do_scanbuild[doc] = "Build and scan static analysis data using clang"
do_scanview[doc] = "Start a webserver to visualize static analysis data"
addtask scanbuild after do_configure before do_compile
-addtask scanview
-
+addtask scanview after do_scanbuild
python () {
- # Remove scanbuild task when scanning is not enabled
- if not(d.getVar('CLANG_SCAN_ENABLED') == "1"):
+ # Remove scanbuild task when scanning is not enabled or recipe does not have do_configure
+ if not(d.getVar('SCAN_BUILD') == "1") or not(d.getVar('TOOLCHAIN') == "clang") or oe.utils.inherits(d, 'allarch'):
for i in ['do_scanbuild', 'do_scanview']:
bb.build.deltask(i, d)
+ else:
+ cflags = d.getVar('CFLAGS', False) + d.getVar('TARGET_CC_ARCH', False) + d.getVar('TOOLCHAIN_OPTIONS', False)
+ cxxflags = d.getVar('CXXFLAGS', False) + d.getVar('TARGET_CC_ARCH', False) + d.getVar('TOOLCHAIN_OPTIONS', False)
+ d.setVar('CFLAGS', cflags)
+ d.setVar('CXXFLAGS', cxxflags)
+ if oe.utils.inherits(d, 'autotools'):
+ cachedvar = d.getVar('CACHED_CONFIGUREVARS', False)
+ cachedvar = cachedvar + " scan-build " + " --analyzer-target " + d.getVar('HOST_SYS', False) + " --use-cc " + d.getVar('CCSCAN', False) + " --use-c++ " + d.getVar('CXXSCAN', False)
+ d.setVar('CACHED_CONFIGUREVARS', cachedvar)
}