diff mbox series

[RFC] clang: split llvm out into a separate recipe again

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

Commit Message

Ross Burton Aug. 5, 2025, 7:11 p.m. UTC
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

Comments

Khem Raj Aug. 5, 2025, 7:15 p.m. UTC | #1
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]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Ross Burton Aug. 5, 2025, 7:16 p.m. UTC | #2
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
Khem Raj Aug. 5, 2025, 7:20 p.m. UTC | #3
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]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Ross Burton Aug. 5, 2025, 7:27 p.m. UTC | #4
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
patchtest@automation.yoctoproject.org Aug. 5, 2025, 7:31 p.m. UTC | #5
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 mbox series

Patch

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"