diff options
Diffstat (limited to 'external/meta-clang/classes')
-rw-r--r-- | external/meta-clang/classes/clang.bbclass | 88 | ||||
-rw-r--r-- | external/meta-clang/classes/cmake-native.bbclass | 15 | ||||
-rw-r--r-- | external/meta-clang/classes/lto.bbclass | 7 | ||||
-rw-r--r-- | external/meta-clang/classes/scan-build.bbclass | 51 |
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) } |