Message ID | 20250805191115.608912-1-ross.burton@arm.com |
---|---|
State | New |
Headers | show |
Series | [RFC] clang: split llvm out into a separate recipe again | expand |
On Tue, Aug 5, 2025 at 12:11 PM Ross Burton via lists.openembedded.org <ross.burton=arm.com@lists.openembedded.org> wrote: > > There are plenty of cases where you want libLLVM on the target but don't > need to build clang at all, or only natively. Unfortunately, clang is > very slow to build as it's so large. > > This patch splits clang and llvm back into separate recipes again, so > we can only build the pieces that are needed. > > Some caveats: > - The list of PACKAGECONFIGs might need revising and there's not great > separation of concerns in the llvm CMake scripts > - llvm-config no longer gets a versioned symlink. There was no way for > this to be actually useful with multiple versions of llvm in parallel > without further work, so I've removed it. > - clang-tools-extras are no longer built. If any of these tools are > needed then we should be able to bring them back. We do assume clang-tidy and clangd as part of clang package which come from clang-tools-extra, I think it should be kept building either part of clang recipe or a separate recipe I am fine either way. > > Signed-off-by: Ross Burton <ross.burton@arm.com> > --- > meta/conf/distro/include/maintainers.inc | 1 + > meta/recipes-devtools/clang/clang_git.bb | 152 +++-------------------- > meta/recipes-devtools/clang/llvm_git.bb | 114 +++++++++++++++++ > 3 files changed, 129 insertions(+), 138 deletions(-) > create mode 100644 meta/recipes-devtools/clang/llvm_git.bb > > diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc > index 96d5a0819c8..588565cdc08 100644 > --- a/meta/conf/distro/include/maintainers.inc > +++ b/meta/conf/distro/include/maintainers.inc > @@ -482,6 +482,7 @@ RECIPE_MAINTAINER:pn-linux-yocto-rt = "Bruce Ashfield <bruce.ashfield@gmail.com> > RECIPE_MAINTAINER:pn-linux-yocto-tiny = "Bruce Ashfield <bruce.ashfield@gmail.com>" > RECIPE_MAINTAINER:pn-lld = "Khem Raj <raj.khem@gmail.com>" > RECIPE_MAINTAINER:pn-lldb = "Khem Raj <raj.khem@gmail.com>" > +RECIPE_MAINTAINER:pn-llvm = "Khem Raj <raj.khem@gmail.com>" > RECIPE_MAINTAINER:pn-llvm-project-source-20.1.8 = "Khem Raj <raj.khem@gmail.com>" > RECIPE_MAINTAINER:pn-llvm-tblgen-native = "Khem Raj <raj.khem@gmail.com>" > RECIPE_MAINTAINER:pn-logrotate = "Yi Zhao <yi.zhao@windriver.com>" > diff --git a/meta/recipes-devtools/clang/clang_git.bb b/meta/recipes-devtools/clang/clang_git.bb > index 0009a95628d..cd59bc9b393 100644 > --- a/meta/recipes-devtools/clang/clang_git.bb > +++ b/meta/recipes-devtools/clang/clang_git.bb > @@ -28,72 +28,31 @@ LDFLAGS:append:class-target:mips = " -Wl,--no-as-needed -latomic -Wl,--as-needed > > inherit cmake pkgconfig multilib_header python3-dir > > -PACKAGECONFIG_CLANG_COMMON = "build-id eh libedit rtti shared-libs libclang-python \ > - ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld', '', d)} \ > - ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcplusplus libomp unwindlib', '', d)} \ > - " > - > -PACKAGECONFIG ??= "${PACKAGECONFIG_CLANG_COMMON} \ > +PACKAGECONFIG ??= "build-id libedit shared-libs libclang-python \ > ${@bb.utils.filter('DISTRO_FEATURES', 'lto thin-lto', d)} \ > + ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld', '', d)} \ > + ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcplusplus libomp unwindlib', '', d)} \ > " > -PACKAGECONFIG:class-native = "clangd \ > - ${PACKAGECONFIG_CLANG_COMMON} \ > - " > -PACKAGECONFIG:class-nativesdk = "clangd \ > - ${PACKAGECONFIG_CLANG_COMMON} \ > - ${@bb.utils.filter('DISTRO_FEATURES', 'lto thin-lto', d)} \ > - " > > PACKAGECONFIG[build-id] = "-DENABLE_LINKER_BUILD_ID=ON,-DENABLE_LINKER_BUILD_ID=OFF,," > -PACKAGECONFIG[clangd] = "-DCLANG_ENABLE_CLANGD=ON,-DCLANG_ENABLE_CLANGD=OFF,," > - > -# Activate to build the dexp tool in clangd > -# Disabled by default for -native since it is known to trigger compiler failure on Debian 11 > -# See: https://bugzilla.yoctoproject.org/show_bug.cgi?id=15803 > -PACKAGECONFIG[clangd-dexp] = "-DCLANGD_BUILD_DEXP=ON,-DCLANGD_BUILD_DEXP=OFF,," > - > PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,," > -PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF,," > PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,," > PACKAGECONFIG[libedit] = "-DLLVM_ENABLE_LIBEDIT=ON,-DLLVM_ENABLE_LIBEDIT=OFF,libedit libedit-native" > PACKAGECONFIG[libomp] = "-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp,," > PACKAGECONFIG[lld] = "-DCLANG_DEFAULT_LINKER=lld,,," > PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," > -PACKAGECONFIG[opt-viewer] = "-DLLVM_HAVE_OPT_VIEWER_MODULES=ON,-DLLVM_HAVE_OPT_VIEWER_MODULES=OFF, \ > - python3-pyyaml-native python3-pygments-native python3-pyyaml python3-pygments, \ > - python3-pyyaml python3-pygments," > PACKAGECONFIG[pfm] = "-DLLVM_ENABLE_LIBPFM=ON,-DLLVM_ENABLE_LIBPFM=OFF,libpfm," > -PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF,," > PACKAGECONFIG[shared-libs] = "-DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON,,," > -PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF,," > PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," > PACKAGECONFIG[unwindlib] = "-DCLANG_DEFAULT_UNWINDLIB=libunwind,-DCLANG_DEFAULT_UNWINDLIB=libgcc,," > PACKAGECONFIG[libclang-python] = "-DCLANG_PYTHON_BINDINGS_VERSIONS=${PYTHON_BASEVERSION},," > > -OECMAKE_SOURCEPATH = "${S}/llvm" > - > -# By default we build all the supported CPU architectures, and the GPU targets > -# if the opengl or vulkan DISTRO_FEATURES are enabled. > -# > -# For target builds we default to building that specific architecture, BPF, and the GPU targets if required. > -# > -# The available target list can be seen in the source code > -# in the LLVM_ALL_TARGETS assignment: > -# https://github.com/llvm/llvm-project/blob/main/llvm/CMakeLists.txt > -LLVM_TARGETS_GPU ?= "${@bb.utils.contains_any('DISTRO_FEATURES', 'opengl vulkan', 'AMDGPU;NVPTX;SPIRV', '', d)}" > -LLVM_TARGETS_TO_BUILD ?= "AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86;LoongArch;${LLVM_TARGETS_GPU}" > -LLVM_TARGETS_TO_BUILD:class-target ?= "${@get_clang_host_arch(bb, d)};BPF;${LLVM_TARGETS_GPU}" > - > -LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ?= "" > +OECMAKE_SOURCEPATH = "${S}/clang" > > HF = "" > HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}" > HF[vardepvalue] = "${HF}" > > -# Ensure that LLVM_PROJECTS does not contain compiler runtime components e.g. libcxx etc > -# they are enabled via LLVM_ENABLE_RUNTIMES > -LLVM_PROJECTS ?= "clang;clang-tools-extra" > - > # linux hosts (.so) on Windows .pyd > SOLIBSDEV:mingw32 = ".pyd" > > @@ -101,25 +60,18 @@ SOLIBSDEV:mingw32 = ".pyd" > > EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \ > -DLLVM_APPEND_VC_REV=OFF \ > - -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \ > -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ > -DLLVM_ENABLE_PIC=ON \ > -DCLANG_DEFAULT_PIE_ON_LINUX=ON \ > - -DLLVM_BINDINGS_LIST='' \ > - -DLLVM_ENABLE_FFI=ON \ > -DLLVM_ENABLE_ZSTD=ON \ > -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ > -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \ > -DCMAKE_SYSTEM_NAME=Linux \ > -DCMAKE_BUILD_TYPE=Release \ > -DLLVM_ENABLE_PROJECTS='${LLVM_PROJECTS}' \ > - -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \ > -DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \ > - -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ > - -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \ > - -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}' \ > - -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ > - -DLLVM_HEADERS_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-min-tblgen \ > + -DLLVM_CMAKE_DIR=${STAGING_LIBDIR}/cmake/llvm \ > + -DLLVM_INCLUDE_TESTS=OFF \ > " > > EXTRA_OECMAKE:append:class-nativesdk = "\ > @@ -130,6 +82,9 @@ EXTRA_OECMAKE:append:class-nativesdk = "\ > -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \ > " > EXTRA_OECMAKE:append:class-target = "\ > + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ > + -DLLVM_TABLEGEN_EXE=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ > + -DLLVM_HEADERS_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-min-tblgen \ > -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \ > -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \ > -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \ > @@ -140,31 +95,13 @@ EXTRA_OECMAKE:append:class-target = "\ > -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \ > " > > -DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native llvm-tblgen-native" > +DEPENDS = "llvm-tblgen-native llvm binutils zlib zstd libffi libxml2 libxml2-native" > DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_SYS} virtual/nativesdk-cross-binutils" > DEPENDS:append:class-target = " ${MLPREFIX}clang-cross-${TARGET_ARCH} ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)}" > > RDEPENDS:${PN}:append:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' lld', '', d)}" > RRECOMMENDS:${PN}:append:class-target = "binutils ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', ' libcxx-dev', '', d)}" > > -# patch out build host paths for reproducibility > -reproducible_build_variables() { > - sed -i -e "s,${DEBUG_PREFIX_MAP},,g" \ > - -e "s,--sysroot=${RECIPE_SYSROOT},,g" \ > - -e "s,${STAGING_DIR_HOST},,g" \ > - -e "s,${S}/llvm,,g" \ > - -e "s,${B},,g" \ > - ${B}/tools/llvm-config/BuildVariables.inc > -} > - > -do_configure:append:class-target() { > - reproducible_build_variables > -} > - > -do_configure:append:class-nativesdk() { > - reproducible_build_variables > -} > - > do_install:append() { > for t in clang-pseudo clang-pseudo-gen clang-rename; do > if [ -e ${B}${BINPATHPREFIX}/bin/$t ]; then > @@ -172,22 +109,10 @@ do_install:append() { > fi > done > > - oe_multilib_header llvm/Config/llvm-config.h > oe_multilib_header clang/Config/config.h > } > > do_install:append:class-target () { > - # Allow bin path to change based on YOCTO_ALTERNATE_EXE_PATH > - sed -i 's;${_IMPORT_PREFIX}/bin;${_IMPORT_PREFIX_BIN};g' ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake > - > - # Insert function to populate Import Variables > - sed -i "4i\ > -if(DEFINED ENV{YOCTO_ALTERNATE_EXE_PATH})\n\ > - execute_process(COMMAND \"llvm-config\" \"--bindir\" OUTPUT_VARIABLE _IMPORT_PREFIX_BIN OUTPUT_STRIP_TRAILING_WHITESPACE)\n\ > -else()\n\ > - set(_IMPORT_PREFIX_BIN \"\${_IMPORT_PREFIX}/bin\")\n\ > -endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake > - > if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then > mkdir -p ${D}${nonarch_libdir} > mv ${D}${libdir}/clang ${D}${nonarch_libdir}/clang > @@ -198,25 +123,10 @@ endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake > llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov; do > ln -sf $t ${D}${bindir}/${TARGET_PREFIX}$t > done > - > - # reproducibility > - sed -i -e 's,${B},,g' ${D}${libdir}/cmake/llvm/LLVMConfig.cmake > } > > do_install:append:class-native () { > - if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then > - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clangd-indexer ${D}${bindir}/clangd-indexer > - fi > - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen > - > - for f in `find ${D}${bindir} -executable -type f -not -type l`; do > - test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f > - echo "stripped $f" > - done > ln -sf llvm-config ${D}${bindir}/llvm-config${PV} > - > - # These are provided by llvm-tblgen-native > - rm ${D}${bindir}/*-tblgen > } > > do_install:append:class-nativesdk () { > @@ -226,16 +136,8 @@ do_install:append:class-nativesdk () { > if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then > install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clangd-indexer ${D}${bindir}/clangd-indexer > fi > - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen > - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen > - for f in `find ${D}${bindir} -executable -type f -not -type l`; do > - test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f > - done > + > ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV} > - ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} > - ln -sf llvm-config ${D}${bindir}/llvm-config${PV} > - rm -rf ${D}${datadir}/llvm/cmake > - rm -rf ${D}${datadir}/llvm > > #reproducibility > if [ -e ${D}${libdir}/cmake/llvm/LLVMConfig.cmake ] ; then > @@ -243,12 +145,7 @@ do_install:append:class-nativesdk () { > fi > } > > -PROVIDES:append:class-native = " llvm-native" > -PROVIDES:append:class-target = " llvm" > -PROVIDES:append:class-nativesdk = " nativesdk-llvm" > - > -PACKAGES =+ "${PN}-libllvm ${PN}-libclang-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools \ > - libclang llvm-linker-tools" > +PACKAGES =+ "${PN}-libclang-python ${PN}-libclang-cpp ${PN}-format ${PN}-tools libclang" > > BBCLASSEXTEND = "native nativesdk" > > @@ -264,15 +161,10 @@ RDEPENDS:${PN}-tools += "\ > perl-module-term-ansicolor \ > " > > -RRECOMMENDS:${PN}-tidy += "${PN}-tools" > - > -FILES:llvm-linker-tools = "${libdir}/LLVMgold* ${libdir}/libLTO.so.* ${libdir}/LLVMPolly*" > - > FILES:${PN}-libclang-cpp = "${libdir}/libclang-cpp.so.*" > > FILES:${PN}-libclang-python = "${PYTHON_SITEPACKAGES_DIR}/clang/*" > > -FILES:${PN}-tidy = "${bindir}/*clang-tidy*" > FILES:${PN}-format = "${bindir}/*clang-format*" > > FILES:${PN}-tools = "${bindir}/analyze-build \ > @@ -317,7 +209,6 @@ FILES:${PN}-tools = "${bindir}/analyze-build \ > ${libexecdir}/intercept-cc \ > ${datadir}/scan-build/* \ > ${datadir}/scan-view/* \ > - ${datadir}/opt-viewer/* \ > ${datadir}/clang/* \ > " > > @@ -330,12 +221,6 @@ FILES:${PN} += "\ > ${nonarch_libdir}/${BPN}/*/include/ \ > " > > -FILES:${PN}-libllvm =+ "\ > - ${libdir}/libLLVM.so.${MAJOR_VER}.${MINOR_VER} \ > - ${libdir}/libLLVM-${MAJOR_VER}.so \ > - ${libdir}/libRemarks.so.* \ > -" > - > FILES:libclang = "\ > ${libdir}/libclang.so.* \ > " > @@ -356,7 +241,6 @@ FILES:${PN}:remove = "${libdir}/${BPN}/*" > > INSANE_SKIP:${PN} += "already-stripped" > #INSANE_SKIP:${PN}-dev += "dev-elf" > -INSANE_SKIP:${PN}-libllvm = "dev-so" > > #Avoid SSTATE_SCAN_COMMAND running sed over llvm-config. > SSTATE_SCAN_FILES:remove = "*-config" > @@ -370,19 +254,11 @@ SYSROOT_PREPROCESS_FUNCS:append:class-target = " clang_sysroot_preprocess" > SYSROOT_PREPROCESS_FUNCS:append:class-nativesdk = " clang_sysroot_preprocess" > > clang_sysroot_preprocess() { > - install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ > - install -m 0755 ${S}/llvm/tools/llvm-config/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ > - ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV} > + install -d ${SYSROOT_DESTDIR}${bindir}/ > > binaries="diagtool clang-${MAJOR_VER} clang-format clang-offload-packager > clang-offload-bundler clang-scan-deps clang-repl > - clang-refactor clang-check clang-extdef-mapping clang-apply-replacements > - clang-reorder-fields clang-tidy clang-change-namespace clang-doc clang-include-fixer > - find-all-symbols clang-move clang-query pp-trace modularize" > - > - if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then > - binaries="${binaries} clangd" > - fi > + clang-refactor clang-check clang-extdef-mapping" > > for f in ${binaries} > do > diff --git a/meta/recipes-devtools/clang/llvm_git.bb b/meta/recipes-devtools/clang/llvm_git.bb > new file mode 100644 > index 00000000000..8316adc4d02 > --- /dev/null > +++ b/meta/recipes-devtools/clang/llvm_git.bb > @@ -0,0 +1,114 @@ > +# Copyright (C) 2017 Khem Raj <raj.khem@gmail.com> > +# Released under the MIT license (see COPYING.MIT for the terms) > + > +SUMMARY = "The LLVM Compiler Infrastructure" > +HOMEPAGE = "http://llvm.org" > +LICENSE = "Apache-2.0-with-LLVM-exception" > +SECTION = "devel" > + > +require common-clang.inc > +require common-source.inc > + > +LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe" > + > +DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd" > + > +inherit cmake pkgconfig lib_package > + > +OECMAKE_SOURCEPATH = "${S}/llvm" > + > +# By default we build all the supported CPU architectures, and the GPU targets > +# if the opengl or vulkan DISTRO_FEATURES are enabled. > +# > +# For target builds we default to building that specific architecture, BPF, and the GPU targets if required. > +# > +# The available target list can be seen in the source code > +# in the LLVM_ALL_TARGETS assignment: > +# https://github.com/llvm/llvm-project/blob/main/llvm/CMakeLists.txt > +LLVM_TARGETS_GPU ?= "${@bb.utils.contains_any('DISTRO_FEATURES', 'opengl vulkan', 'AMDGPU;NVPTX;SPIRV', '', d)}" > +LLVM_TARGETS ?= "AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86;LoongArch;${LLVM_TARGETS_GPU}" > +LLVM_TARGETS:class-target ?= "${@get_clang_host_arch(bb, d)};BPF;${LLVM_TARGETS_GPU}" > + > +ARM_INSTRUCTION_SET:armv5 = "arm" > +ARM_INSTRUCTION_SET:armv4t = "arm" > + > +EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=Release \ > + -DLLVM_ENABLE_ASSERTIONS=OFF \ > + -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ > + -DLLVM_ENABLE_PIC=ON \ > + -DLLVM_BINDINGS_LIST='' \ > + -DLLVM_BUILD_LLVM_DYLIB=ON \ > + -DLLVM_LINK_LLVM_DYLIB=ON \ > + -DLLVM_ENABLE_FFI=ON \ > + -DLLVM_ENABLE_RTTI=ON \ > + -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS}' \ > + -DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \ > + -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ > + -DLLVM_INCLUDE_TESTS=OFF \ > + -DLLVM_INCLUDE_EXAMPLES=OFF \ > + -DLLVM_TOOL_LLVM_EXEGESIS_BUILD=OFF \ > + -DLLVM_TOOL_OBJ2YAML_BUILD=OFF \ > + -DLLVM_TOOL_YAML2OBJ_BUILD=OFF \ > + -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ > + " > + > +EXTRA_OECMAKE:append:class-target = "\ > + -DLLVM_HOST_TRIPLE=${TARGET_SYS} \ > + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \ > + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ > + " > + > +EXTRA_OECMAKE:append:class-nativesdk = "\ > + -DLLVM_HOST_TRIPLE=${SDK_SYS} \ > + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \ > + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ > + " > + > +PACKAGECONFIG ??= "eh rtti" > +PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF" > +PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF" > +PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF" > +PACKAGECONFIG[opt-viewer] = "-DLLVM_HAVE_OPT_VIEWER_MODULES=ON,-DLLVM_HAVE_OPT_VIEWER_MODULES=OFF, \ > + python3-pyyaml-native python3-pygments-native python3-pyyaml python3-pygments, \ > + python3-pyyaml python3-pygments" > + > +reproducible_build_variables() { > + sed -i -e "s,${DEBUG_PREFIX_MAP},,g" \ > + -e "s,--sysroot=${RECIPE_SYSROOT},,g" \ > + -e "s,${STAGING_DIR_HOST},,g" \ > + -e "s,${S}/llvm,,g" \ > + -e "s,${B},,g" \ > + ${B}/tools/llvm-config/BuildVariables.inc > +} > + > +do_configure:append:class-target() { > + reproducible_build_variables > +} > +do_configure:append:class-nativesdk() { > + reproducible_build_variables > +} > + > +do_install:append() { > + # llvm harcodes usr/lib as install path, so this corrects it to actual libdir > + mv -T -n ${D}/${prefix}/lib ${D}/${libdir} || true > + > + # reproducibility > + sed -i -e 's,${WORKDIR},,g' ${D}/${libdir}/cmake/llvm/LLVMConfig.cmake > +} > + > +do_install:append:class-native() { > + # These are provided by llvm-tblgen-native > + rm ${D}${bindir}/*-tblgen > +} > + > +SYSROOT_PREPROCESS_FUNCS:append:class-target = " llvm_sysroot_preprocess" > +SYSROOT_PREPROCESS_FUNCS:append:class-nativesdk = " llvm_sysroot_preprocess" > + > +llvm_sysroot_preprocess() { > + install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ > + install -m 0755 ${S}/llvm/tools/llvm-config/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ > +} > + > +FILES:${PN}-dev += "${libdir}/llvm-config" > + > +BBCLASSEXTEND = "native nativesdk" > -- > 2.43.0 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#221486): https://lists.openembedded.org/g/openembedded-core/message/221486 > Mute This Topic: https://lists.openembedded.org/mt/114554152/1997914 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
On 5 Aug 2025, at 20:15, Khem Raj <raj.khem@gmail.com> wrote: > > We do assume clang-tidy and clangd as part of clang package which come from > clang-tools-extra, I think it should be kept building either part of > clang recipe or a > separate recipe I am fine either way. Do we actually though? Is anyone _actually_ using these? Ross
On Tue, Aug 5, 2025 at 12:17 PM Ross Burton via lists.openembedded.org <ross.burton=arm.com@lists.openembedded.org> wrote: > > On 5 Aug 2025, at 20:15, Khem Raj <raj.khem@gmail.com> wrote: > > > > We do assume clang-tidy and clangd as part of clang package which come from > > clang-tools-extra, I think it should be kept building either part of > > clang recipe or a > > separate recipe I am fine either way. > > Do we actually though? Is anyone _actually_ using these? > Yes, clang-tidy is used by our CI pipelines, clangd not yet but it's used as well from outside OE. > Ross > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#221488): https://lists.openembedded.org/g/openembedded-core/message/221488 > Mute This Topic: https://lists.openembedded.org/mt/114554152/1997914 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
On 5 Aug 2025, at 20:20, Khem Raj <raj.khem@gmail.com> wrote: >> Do we actually though? Is anyone _actually_ using these? >> > > Yes, clang-tidy is used by our CI pipelines, clangd not yet but it's > used as well from outside OE. <grumble> fine ;) This is slightly non-trivial because despite what the clang-tools-extra README says, it’s not a standalone project. But the repository is full of subcomponents that can optionally be built standalone, so I’ll copy-and-paste CMake until it works. ;) (clangd is a surprisingly slow build, so removing that from the critical path is a good win) Ross
Thank you for your submission. Patchtest identified one or more issues with the patch. Please see the log below for more information: --- Testing patch /home/patchtest/share/mboxes/RFC-clang-split-llvm-out-into-a-separate-recipe-again.patch FAIL: test lic files chksum modified not mentioned: LIC_FILES_CHKSUM changed without "License-Update:" tag and description in commit message (test_metadata.TestMetadata.test_lic_files_chksum_modified_not_mentioned) PASS: pretest src uri left files (test_metadata.TestMetadata.pretest_src_uri_left_files) PASS: test CVE check ignore (test_metadata.TestMetadata.test_cve_check_ignore) PASS: test Signed-off-by presence (test_mbox.TestMbox.test_signed_off_by_presence) PASS: test author valid (test_mbox.TestMbox.test_author_valid) PASS: test commit message presence (test_mbox.TestMbox.test_commit_message_presence) PASS: test commit message user tags (test_mbox.TestMbox.test_commit_message_user_tags) PASS: test max line length (test_metadata.TestMetadata.test_max_line_length) PASS: test mbox format (test_mbox.TestMbox.test_mbox_format) PASS: test non-AUH upgrade (test_mbox.TestMbox.test_non_auh_upgrade) PASS: test shortlog format (test_mbox.TestMbox.test_shortlog_format) PASS: test shortlog length (test_mbox.TestMbox.test_shortlog_length) PASS: test src uri left files (test_metadata.TestMetadata.test_src_uri_left_files) PASS: test target mailing list (test_mbox.TestMbox.test_target_mailing_list) SKIP: pretest pylint: No python related patches, skipping test (test_python_pylint.PyLint.pretest_pylint) SKIP: test CVE tag format: No new CVE patches introduced (test_patch.TestPatch.test_cve_tag_format) SKIP: test Signed-off-by presence: No new CVE patches introduced (test_patch.TestPatch.test_signed_off_by_presence) SKIP: test Upstream-Status presence: No new CVE patches introduced (test_patch.TestPatch.test_upstream_status_presence_format) SKIP: test bugzilla entry format: No bug ID found (test_mbox.TestMbox.test_bugzilla_entry_format) SKIP: test lic files chksum presence: No added recipes, skipping test (test_metadata.TestMetadata.test_lic_files_chksum_presence) SKIP: test license presence: No added recipes, skipping test (test_metadata.TestMetadata.test_license_presence) SKIP: test pylint: No python related patches, skipping test (test_python_pylint.PyLint.test_pylint) SKIP: test series merge on head: Merge test is disabled for now (test_mbox.TestMbox.test_series_merge_on_head) SKIP: test summary presence: No added recipes, skipping test (test_metadata.TestMetadata.test_summary_presence) --- Please address the issues identified and submit a new revision of the patch, or alternatively, reply to this email with an explanation of why the patch should be accepted. If you believe these results are due to an error in patchtest, please submit a bug at https://bugzilla.yoctoproject.org/ (use the 'Patchtest' category under 'Yocto Project Subprojects'). For more information on specific failures, see: https://wiki.yoctoproject.org/wiki/Patchtest. Thank you!
diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc index 96d5a0819c8..588565cdc08 100644 --- a/meta/conf/distro/include/maintainers.inc +++ b/meta/conf/distro/include/maintainers.inc @@ -482,6 +482,7 @@ RECIPE_MAINTAINER:pn-linux-yocto-rt = "Bruce Ashfield <bruce.ashfield@gmail.com> RECIPE_MAINTAINER:pn-linux-yocto-tiny = "Bruce Ashfield <bruce.ashfield@gmail.com>" RECIPE_MAINTAINER:pn-lld = "Khem Raj <raj.khem@gmail.com>" RECIPE_MAINTAINER:pn-lldb = "Khem Raj <raj.khem@gmail.com>" +RECIPE_MAINTAINER:pn-llvm = "Khem Raj <raj.khem@gmail.com>" RECIPE_MAINTAINER:pn-llvm-project-source-20.1.8 = "Khem Raj <raj.khem@gmail.com>" RECIPE_MAINTAINER:pn-llvm-tblgen-native = "Khem Raj <raj.khem@gmail.com>" RECIPE_MAINTAINER:pn-logrotate = "Yi Zhao <yi.zhao@windriver.com>" diff --git a/meta/recipes-devtools/clang/clang_git.bb b/meta/recipes-devtools/clang/clang_git.bb index 0009a95628d..cd59bc9b393 100644 --- a/meta/recipes-devtools/clang/clang_git.bb +++ b/meta/recipes-devtools/clang/clang_git.bb @@ -28,72 +28,31 @@ LDFLAGS:append:class-target:mips = " -Wl,--no-as-needed -latomic -Wl,--as-needed inherit cmake pkgconfig multilib_header python3-dir -PACKAGECONFIG_CLANG_COMMON = "build-id eh libedit rtti shared-libs libclang-python \ - ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld', '', d)} \ - ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcplusplus libomp unwindlib', '', d)} \ - " - -PACKAGECONFIG ??= "${PACKAGECONFIG_CLANG_COMMON} \ +PACKAGECONFIG ??= "build-id libedit shared-libs libclang-python \ ${@bb.utils.filter('DISTRO_FEATURES', 'lto thin-lto', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld', '', d)} \ + ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcplusplus libomp unwindlib', '', d)} \ " -PACKAGECONFIG:class-native = "clangd \ - ${PACKAGECONFIG_CLANG_COMMON} \ - " -PACKAGECONFIG:class-nativesdk = "clangd \ - ${PACKAGECONFIG_CLANG_COMMON} \ - ${@bb.utils.filter('DISTRO_FEATURES', 'lto thin-lto', d)} \ - " PACKAGECONFIG[build-id] = "-DENABLE_LINKER_BUILD_ID=ON,-DENABLE_LINKER_BUILD_ID=OFF,," -PACKAGECONFIG[clangd] = "-DCLANG_ENABLE_CLANGD=ON,-DCLANG_ENABLE_CLANGD=OFF,," - -# Activate to build the dexp tool in clangd -# Disabled by default for -native since it is known to trigger compiler failure on Debian 11 -# See: https://bugzilla.yoctoproject.org/show_bug.cgi?id=15803 -PACKAGECONFIG[clangd-dexp] = "-DCLANGD_BUILD_DEXP=ON,-DCLANGD_BUILD_DEXP=OFF,," - PACKAGECONFIG[compiler-rt] = "-DCLANG_DEFAULT_RTLIB=compiler-rt,," -PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF,," PACKAGECONFIG[libcplusplus] = "-DCLANG_DEFAULT_CXX_STDLIB=libc++,," PACKAGECONFIG[libedit] = "-DLLVM_ENABLE_LIBEDIT=ON,-DLLVM_ENABLE_LIBEDIT=OFF,libedit libedit-native" PACKAGECONFIG[libomp] = "-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp,," PACKAGECONFIG[lld] = "-DCLANG_DEFAULT_LINKER=lld,,," PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," -PACKAGECONFIG[opt-viewer] = "-DLLVM_HAVE_OPT_VIEWER_MODULES=ON,-DLLVM_HAVE_OPT_VIEWER_MODULES=OFF, \ - python3-pyyaml-native python3-pygments-native python3-pyyaml python3-pygments, \ - python3-pyyaml python3-pygments," PACKAGECONFIG[pfm] = "-DLLVM_ENABLE_LIBPFM=ON,-DLLVM_ENABLE_LIBPFM=OFF,libpfm," -PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF,," PACKAGECONFIG[shared-libs] = "-DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON,,," -PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF,," PACKAGECONFIG[thin-lto] = "-DLLVM_ENABLE_LTO=Thin -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," PACKAGECONFIG[unwindlib] = "-DCLANG_DEFAULT_UNWINDLIB=libunwind,-DCLANG_DEFAULT_UNWINDLIB=libgcc,," PACKAGECONFIG[libclang-python] = "-DCLANG_PYTHON_BINDINGS_VERSIONS=${PYTHON_BASEVERSION},," -OECMAKE_SOURCEPATH = "${S}/llvm" - -# By default we build all the supported CPU architectures, and the GPU targets -# if the opengl or vulkan DISTRO_FEATURES are enabled. -# -# For target builds we default to building that specific architecture, BPF, and the GPU targets if required. -# -# The available target list can be seen in the source code -# in the LLVM_ALL_TARGETS assignment: -# https://github.com/llvm/llvm-project/blob/main/llvm/CMakeLists.txt -LLVM_TARGETS_GPU ?= "${@bb.utils.contains_any('DISTRO_FEATURES', 'opengl vulkan', 'AMDGPU;NVPTX;SPIRV', '', d)}" -LLVM_TARGETS_TO_BUILD ?= "AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86;LoongArch;${LLVM_TARGETS_GPU}" -LLVM_TARGETS_TO_BUILD:class-target ?= "${@get_clang_host_arch(bb, d)};BPF;${LLVM_TARGETS_GPU}" - -LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ?= "" +OECMAKE_SOURCEPATH = "${S}/clang" HF = "" HF:class-target = "${@ bb.utils.contains('TUNE_CCARGS_MFLOAT', 'hard', 'hf', '', d)}" HF[vardepvalue] = "${HF}" -# Ensure that LLVM_PROJECTS does not contain compiler runtime components e.g. libcxx etc -# they are enabled via LLVM_ENABLE_RUNTIMES -LLVM_PROJECTS ?= "clang;clang-tools-extra" - # linux hosts (.so) on Windows .pyd SOLIBSDEV:mingw32 = ".pyd" @@ -101,25 +60,18 @@ SOLIBSDEV:mingw32 = ".pyd" EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \ -DLLVM_APPEND_VC_REV=OFF \ - -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \ -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ -DLLVM_ENABLE_PIC=ON \ -DCLANG_DEFAULT_PIE_ON_LINUX=ON \ - -DLLVM_BINDINGS_LIST='' \ - -DLLVM_ENABLE_FFI=ON \ -DLLVM_ENABLE_ZSTD=ON \ -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS='${LLVM_PROJECTS}' \ - -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR} \ -DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \ - -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ - -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS_TO_BUILD}' \ - -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD}' \ - -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ - -DLLVM_HEADERS_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-min-tblgen \ + -DLLVM_CMAKE_DIR=${STAGING_LIBDIR}/cmake/llvm \ + -DLLVM_INCLUDE_TESTS=OFF \ " EXTRA_OECMAKE:append:class-nativesdk = "\ @@ -130,6 +82,9 @@ EXTRA_OECMAKE:append:class-nativesdk = "\ -DCMAKE_STRIP=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-strip \ " EXTRA_OECMAKE:append:class-target = "\ + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ + -DLLVM_TABLEGEN_EXE=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ + -DLLVM_HEADERS_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-min-tblgen \ -DCMAKE_RANLIB=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ranlib \ -DCMAKE_AR=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-ar \ -DCMAKE_NM=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}llvm-nm \ @@ -140,31 +95,13 @@ EXTRA_OECMAKE:append:class-target = "\ -DLLVM_LIBDIR_SUFFIX=${LLVM_LIBDIR_SUFFIX} \ " -DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native llvm-tblgen-native" +DEPENDS = "llvm-tblgen-native llvm binutils zlib zstd libffi libxml2 libxml2-native" DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_SYS} virtual/nativesdk-cross-binutils" DEPENDS:append:class-target = " ${MLPREFIX}clang-cross-${TARGET_ARCH} ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)}" RDEPENDS:${PN}:append:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', ' lld', '', d)}" RRECOMMENDS:${PN}:append:class-target = "binutils ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', ' libcxx-dev', '', d)}" -# patch out build host paths for reproducibility -reproducible_build_variables() { - sed -i -e "s,${DEBUG_PREFIX_MAP},,g" \ - -e "s,--sysroot=${RECIPE_SYSROOT},,g" \ - -e "s,${STAGING_DIR_HOST},,g" \ - -e "s,${S}/llvm,,g" \ - -e "s,${B},,g" \ - ${B}/tools/llvm-config/BuildVariables.inc -} - -do_configure:append:class-target() { - reproducible_build_variables -} - -do_configure:append:class-nativesdk() { - reproducible_build_variables -} - do_install:append() { for t in clang-pseudo clang-pseudo-gen clang-rename; do if [ -e ${B}${BINPATHPREFIX}/bin/$t ]; then @@ -172,22 +109,10 @@ do_install:append() { fi done - oe_multilib_header llvm/Config/llvm-config.h oe_multilib_header clang/Config/config.h } do_install:append:class-target () { - # Allow bin path to change based on YOCTO_ALTERNATE_EXE_PATH - sed -i 's;${_IMPORT_PREFIX}/bin;${_IMPORT_PREFIX_BIN};g' ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake - - # Insert function to populate Import Variables - sed -i "4i\ -if(DEFINED ENV{YOCTO_ALTERNATE_EXE_PATH})\n\ - execute_process(COMMAND \"llvm-config\" \"--bindir\" OUTPUT_VARIABLE _IMPORT_PREFIX_BIN OUTPUT_STRIP_TRAILING_WHITESPACE)\n\ -else()\n\ - set(_IMPORT_PREFIX_BIN \"\${_IMPORT_PREFIX}/bin\")\n\ -endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake - if [ -n "${LLVM_LIBDIR_SUFFIX}" ]; then mkdir -p ${D}${nonarch_libdir} mv ${D}${libdir}/clang ${D}${nonarch_libdir}/clang @@ -198,25 +123,10 @@ endif()\n" ${D}${libdir}/cmake/llvm/LLVMExports-release.cmake llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov; do ln -sf $t ${D}${bindir}/${TARGET_PREFIX}$t done - - # reproducibility - sed -i -e 's,${B},,g' ${D}${libdir}/cmake/llvm/LLVMConfig.cmake } do_install:append:class-native () { - if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clangd-indexer ${D}${bindir}/clangd-indexer - fi - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen - - for f in `find ${D}${bindir} -executable -type f -not -type l`; do - test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f - echo "stripped $f" - done ln -sf llvm-config ${D}${bindir}/llvm-config${PV} - - # These are provided by llvm-tblgen-native - rm ${D}${bindir}/*-tblgen } do_install:append:class-nativesdk () { @@ -226,16 +136,8 @@ do_install:append:class-nativesdk () { if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clangd-indexer ${D}${bindir}/clangd-indexer fi - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tblgen ${D}${bindir}/clang-tblgen - install -Dm 0755 ${B}${BINPATHPREFIX}/bin/clang-tidy-confusable-chars-gen ${D}${bindir}/clang-tidy-confusable-chars-gen - for f in `find ${D}${bindir} -executable -type f -not -type l`; do - test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f - done + ln -sf clang-tblgen ${D}${bindir}/clang-tblgen${PV} - ln -sf llvm-tblgen ${D}${bindir}/llvm-tblgen${PV} - ln -sf llvm-config ${D}${bindir}/llvm-config${PV} - rm -rf ${D}${datadir}/llvm/cmake - rm -rf ${D}${datadir}/llvm #reproducibility if [ -e ${D}${libdir}/cmake/llvm/LLVMConfig.cmake ] ; then @@ -243,12 +145,7 @@ do_install:append:class-nativesdk () { fi } -PROVIDES:append:class-native = " llvm-native" -PROVIDES:append:class-target = " llvm" -PROVIDES:append:class-nativesdk = " nativesdk-llvm" - -PACKAGES =+ "${PN}-libllvm ${PN}-libclang-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools \ - libclang llvm-linker-tools" +PACKAGES =+ "${PN}-libclang-python ${PN}-libclang-cpp ${PN}-format ${PN}-tools libclang" BBCLASSEXTEND = "native nativesdk" @@ -264,15 +161,10 @@ RDEPENDS:${PN}-tools += "\ perl-module-term-ansicolor \ " -RRECOMMENDS:${PN}-tidy += "${PN}-tools" - -FILES:llvm-linker-tools = "${libdir}/LLVMgold* ${libdir}/libLTO.so.* ${libdir}/LLVMPolly*" - FILES:${PN}-libclang-cpp = "${libdir}/libclang-cpp.so.*" FILES:${PN}-libclang-python = "${PYTHON_SITEPACKAGES_DIR}/clang/*" -FILES:${PN}-tidy = "${bindir}/*clang-tidy*" FILES:${PN}-format = "${bindir}/*clang-format*" FILES:${PN}-tools = "${bindir}/analyze-build \ @@ -317,7 +209,6 @@ FILES:${PN}-tools = "${bindir}/analyze-build \ ${libexecdir}/intercept-cc \ ${datadir}/scan-build/* \ ${datadir}/scan-view/* \ - ${datadir}/opt-viewer/* \ ${datadir}/clang/* \ " @@ -330,12 +221,6 @@ FILES:${PN} += "\ ${nonarch_libdir}/${BPN}/*/include/ \ " -FILES:${PN}-libllvm =+ "\ - ${libdir}/libLLVM.so.${MAJOR_VER}.${MINOR_VER} \ - ${libdir}/libLLVM-${MAJOR_VER}.so \ - ${libdir}/libRemarks.so.* \ -" - FILES:libclang = "\ ${libdir}/libclang.so.* \ " @@ -356,7 +241,6 @@ FILES:${PN}:remove = "${libdir}/${BPN}/*" INSANE_SKIP:${PN} += "already-stripped" #INSANE_SKIP:${PN}-dev += "dev-elf" -INSANE_SKIP:${PN}-libllvm = "dev-so" #Avoid SSTATE_SCAN_COMMAND running sed over llvm-config. SSTATE_SCAN_FILES:remove = "*-config" @@ -370,19 +254,11 @@ SYSROOT_PREPROCESS_FUNCS:append:class-target = " clang_sysroot_preprocess" SYSROOT_PREPROCESS_FUNCS:append:class-nativesdk = " clang_sysroot_preprocess" clang_sysroot_preprocess() { - install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ - install -m 0755 ${S}/llvm/tools/llvm-config/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ - ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV} + install -d ${SYSROOT_DESTDIR}${bindir}/ binaries="diagtool clang-${MAJOR_VER} clang-format clang-offload-packager clang-offload-bundler clang-scan-deps clang-repl - clang-refactor clang-check clang-extdef-mapping clang-apply-replacements - clang-reorder-fields clang-tidy clang-change-namespace clang-doc clang-include-fixer - find-all-symbols clang-move clang-query pp-trace modularize" - - if ${@bb.utils.contains('PACKAGECONFIG', 'clangd', 'true', 'false', d)}; then - binaries="${binaries} clangd" - fi + clang-refactor clang-check clang-extdef-mapping" for f in ${binaries} do diff --git a/meta/recipes-devtools/clang/llvm_git.bb b/meta/recipes-devtools/clang/llvm_git.bb new file mode 100644 index 00000000000..8316adc4d02 --- /dev/null +++ b/meta/recipes-devtools/clang/llvm_git.bb @@ -0,0 +1,114 @@ +# Copyright (C) 2017 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +SUMMARY = "The LLVM Compiler Infrastructure" +HOMEPAGE = "http://llvm.org" +LICENSE = "Apache-2.0-with-LLVM-exception" +SECTION = "devel" + +require common-clang.inc +require common-source.inc + +LIC_FILES_CHKSUM = "file://LICENSE.TXT;md5=8a15a0759ef07f2682d2ba4b893c9afe" + +DEPENDS = "llvm-tblgen-native libffi libxml2 zlib zstd" + +inherit cmake pkgconfig lib_package + +OECMAKE_SOURCEPATH = "${S}/llvm" + +# By default we build all the supported CPU architectures, and the GPU targets +# if the opengl or vulkan DISTRO_FEATURES are enabled. +# +# For target builds we default to building that specific architecture, BPF, and the GPU targets if required. +# +# The available target list can be seen in the source code +# in the LLVM_ALL_TARGETS assignment: +# https://github.com/llvm/llvm-project/blob/main/llvm/CMakeLists.txt +LLVM_TARGETS_GPU ?= "${@bb.utils.contains_any('DISTRO_FEATURES', 'opengl vulkan', 'AMDGPU;NVPTX;SPIRV', '', d)}" +LLVM_TARGETS ?= "AArch64;ARM;BPF;Mips;PowerPC;RISCV;X86;LoongArch;${LLVM_TARGETS_GPU}" +LLVM_TARGETS:class-target ?= "${@get_clang_host_arch(bb, d)};BPF;${LLVM_TARGETS_GPU}" + +ARM_INSTRUCTION_SET:armv5 = "arm" +ARM_INSTRUCTION_SET:armv4t = "arm" + +EXTRA_OECMAKE += "-DCMAKE_BUILD_TYPE=Release \ + -DLLVM_ENABLE_ASSERTIONS=OFF \ + -DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \ + -DLLVM_ENABLE_PIC=ON \ + -DLLVM_BINDINGS_LIST='' \ + -DLLVM_BUILD_LLVM_DYLIB=ON \ + -DLLVM_LINK_LLVM_DYLIB=ON \ + -DLLVM_ENABLE_FFI=ON \ + -DLLVM_ENABLE_RTTI=ON \ + -DLLVM_TARGETS_TO_BUILD='${LLVM_TARGETS}' \ + -DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \ + -DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \ + -DLLVM_INCLUDE_TESTS=OFF \ + -DLLVM_INCLUDE_EXAMPLES=OFF \ + -DLLVM_TOOL_LLVM_EXEGESIS_BUILD=OFF \ + -DLLVM_TOOL_OBJ2YAML_BUILD=OFF \ + -DLLVM_TOOL_YAML2OBJ_BUILD=OFF \ + -DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen \ + " + +EXTRA_OECMAKE:append:class-target = "\ + -DLLVM_HOST_TRIPLE=${TARGET_SYS} \ + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \ + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ + " + +EXTRA_OECMAKE:append:class-nativesdk = "\ + -DLLVM_HOST_TRIPLE=${SDK_SYS} \ + -DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config \ + -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \ + " + +PACKAGECONFIG ??= "eh rtti" +PACKAGECONFIG[eh] = "-DLLVM_ENABLE_EH=ON,-DLLVM_ENABLE_EH=OFF" +PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF" +PACKAGECONFIG[split-dwarf] = "-DLLVM_USE_SPLIT_DWARF=ON,-DLLVM_USE_SPLIT_DWARF=OFF" +PACKAGECONFIG[opt-viewer] = "-DLLVM_HAVE_OPT_VIEWER_MODULES=ON,-DLLVM_HAVE_OPT_VIEWER_MODULES=OFF, \ + python3-pyyaml-native python3-pygments-native python3-pyyaml python3-pygments, \ + python3-pyyaml python3-pygments" + +reproducible_build_variables() { + sed -i -e "s,${DEBUG_PREFIX_MAP},,g" \ + -e "s,--sysroot=${RECIPE_SYSROOT},,g" \ + -e "s,${STAGING_DIR_HOST},,g" \ + -e "s,${S}/llvm,,g" \ + -e "s,${B},,g" \ + ${B}/tools/llvm-config/BuildVariables.inc +} + +do_configure:append:class-target() { + reproducible_build_variables +} +do_configure:append:class-nativesdk() { + reproducible_build_variables +} + +do_install:append() { + # llvm harcodes usr/lib as install path, so this corrects it to actual libdir + mv -T -n ${D}/${prefix}/lib ${D}/${libdir} || true + + # reproducibility + sed -i -e 's,${WORKDIR},,g' ${D}/${libdir}/cmake/llvm/LLVMConfig.cmake +} + +do_install:append:class-native() { + # These are provided by llvm-tblgen-native + rm ${D}${bindir}/*-tblgen +} + +SYSROOT_PREPROCESS_FUNCS:append:class-target = " llvm_sysroot_preprocess" +SYSROOT_PREPROCESS_FUNCS:append:class-nativesdk = " llvm_sysroot_preprocess" + +llvm_sysroot_preprocess() { + install -d ${SYSROOT_DESTDIR}${bindir_crossscripts}/ + install -m 0755 ${S}/llvm/tools/llvm-config/llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/ +} + +FILES:${PN}-dev += "${libdir}/llvm-config" + +BBCLASSEXTEND = "native nativesdk"
There are plenty of cases where you want libLLVM on the target but don't need to build clang at all, or only natively. Unfortunately, clang is very slow to build as it's so large. This patch splits clang and llvm back into separate recipes again, so we can only build the pieces that are needed. Some caveats: - The list of PACKAGECONFIGs might need revising and there's not great separation of concerns in the llvm CMake scripts - llvm-config no longer gets a versioned symlink. There was no way for this to be actually useful with multiple versions of llvm in parallel without further work, so I've removed it. - clang-tools-extras are no longer built. If any of these tools are needed then we should be able to bring them back. Signed-off-by: Ross Burton <ross.burton@arm.com> --- meta/conf/distro/include/maintainers.inc | 1 + meta/recipes-devtools/clang/clang_git.bb | 152 +++-------------------- meta/recipes-devtools/clang/llvm_git.bb | 114 +++++++++++++++++ 3 files changed, 129 insertions(+), 138 deletions(-) create mode 100644 meta/recipes-devtools/clang/llvm_git.bb