From patchwork Tue Aug 5 19:11:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 68108 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10E94C87FD1 for ; Tue, 5 Aug 2025 19:11:27 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.7754.1754421080950182709 for ; Tue, 05 Aug 2025 12:11:21 -0700 Authentication-Results: mx.groups.io; dkim=none (message not signed); spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4D822150C for ; Tue, 5 Aug 2025 12:11:12 -0700 (PDT) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D5F043F673 for ; Tue, 5 Aug 2025 12:11:19 -0700 (PDT) From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [RFC PATCH] clang: split llvm out into a separate recipe again Date: Tue, 5 Aug 2025 20:11:15 +0100 Message-ID: <20250805191115.608912-1-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Tue, 05 Aug 2025 19:11:27 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/221486 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 --- 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 RECIPE_MAINTAINER:pn-linux-yocto-tiny = "Bruce Ashfield " RECIPE_MAINTAINER:pn-lld = "Khem Raj " RECIPE_MAINTAINER:pn-lldb = "Khem Raj " +RECIPE_MAINTAINER:pn-llvm = "Khem Raj " RECIPE_MAINTAINER:pn-llvm-project-source-20.1.8 = "Khem Raj " RECIPE_MAINTAINER:pn-llvm-tblgen-native = "Khem Raj " RECIPE_MAINTAINER:pn-logrotate = "Yi Zhao " 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 +# 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"