From 5212b69f892af8c9b080fee2c21533a2bbdd2755 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Thu, 31 Jul 2025 20:12:13 +0100 Subject: [PATCH] clang: split lld into a separate lld recipe The lld linker is a standalone project under the LLVM umbrella that just depends on libLLVM and nothing else, such as clang. To reduce the build time of clang if lld is not being used, split it out into a separate recipe. To ensure that lld is present if needed, the clang-cross recipe will depend on lld-native if ld-is-lld is enable. Signed-off-by: Ross Burton Signed-off-by: Mathieu Dubois-Briand Signed-off-by: Richard Purdie --- meta/conf/distro/include/maintainers.inc | 1 + .../clang/clang-cross-canadian_git.bb | 2 +- .../recipes-devtools/clang/clang-cross_git.bb | 6 +++-- .../clang/clang-crosssdk_git.bb | 3 ++- meta/recipes-devtools/clang/clang_git.bb | 12 ++++----- meta/recipes-devtools/clang/lld_git.bb | 26 +++++++++++++++++++ 6 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 meta/recipes-devtools/clang/lld_git.bb diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc index ed1bc18ba3..96d5a0819c 100644 --- a/meta/conf/distro/include/maintainers.inc +++ b/meta/conf/distro/include/maintainers.inc @@ -480,6 +480,7 @@ RECIPE_MAINTAINER:pn-linux-yocto = "Bruce Ashfield " RECIPE_MAINTAINER:pn-linux-yocto-dev = "Bruce Ashfield " 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-project-source-20.1.8 = "Khem Raj " RECIPE_MAINTAINER:pn-llvm-tblgen-native = "Khem Raj " diff --git a/meta/recipes-devtools/clang/clang-cross-canadian_git.bb b/meta/recipes-devtools/clang/clang-cross-canadian_git.bb index c966861578..18bd6ecfde 100644 --- a/meta/recipes-devtools/clang/clang-cross-canadian_git.bb +++ b/meta/recipes-devtools/clang/clang-cross-canadian_git.bb @@ -11,7 +11,7 @@ PN = "clang-cross-canadian-${TRANSLATED_TARGET_ARCH}" inherit cross-canadian -DEPENDS = "nativesdk-clang binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} virtual/nativesdk-cross-binutils virtual/nativesdk-libc" +DEPENDS = "nativesdk-clang binutils-cross-canadian-${TRANSLATED_TARGET_ARCH} virtual/nativesdk-cross-binutils virtual/nativesdk-libc ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'nativesdk-lld', '', d)}" do_install() { install -d ${D}${bindir} diff --git a/meta/recipes-devtools/clang/clang-cross_git.bb b/meta/recipes-devtools/clang/clang-cross_git.bb index bd72ee4e6d..33b01e4234 100644 --- a/meta/recipes-devtools/clang/clang-cross_git.bb +++ b/meta/recipes-devtools/clang/clang-cross_git.bb @@ -11,7 +11,7 @@ PN = "clang-cross-${TARGET_ARCH}" inherit cross -DEPENDS = "clang-native virtual/cross-binutils" +DEPENDS = "clang-native virtual/cross-binutils ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld-native', '', d)}" do_install() { install -d ${D}${bindir} @@ -19,6 +19,8 @@ do_install() { llvm-nm llvm-ar llvm-as llvm-ranlib llvm-strip llvm-objcopy llvm-objdump llvm-readelf \ llvm-addr2line llvm-dwp llvm-size llvm-strings llvm-cov do - ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool + if [ -x ${STAGING_BINDIR_NATIVE}/$tool ]; then + ln -sf ../$tool ${D}${bindir}/${TARGET_PREFIX}$tool + fi done } diff --git a/meta/recipes-devtools/clang/clang-crosssdk_git.bb b/meta/recipes-devtools/clang/clang-crosssdk_git.bb index 320579d8f1..9b527975a9 100644 --- a/meta/recipes-devtools/clang/clang-crosssdk_git.bb +++ b/meta/recipes-devtools/clang/clang-crosssdk_git.bb @@ -11,7 +11,8 @@ PN = "clang-crosssdk-${SDK_SYS}" inherit crosssdk -DEPENDS = "clang-native nativesdk-clang-glue virtual/nativesdk-cross-binutils virtual/nativesdk-libc" +DEPENDS = "clang-native nativesdk-clang-glue virtual/nativesdk-cross-binutils virtual/nativesdk-libc \ + ${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-lld', 'lld-native', '', d)}" do_install() { install -d ${D}${bindir} diff --git a/meta/recipes-devtools/clang/clang_git.bb b/meta/recipes-devtools/clang/clang_git.bb index cade4ca4a2..79525258be 100644 --- a/meta/recipes-devtools/clang/clang_git.bb +++ b/meta/recipes-devtools/clang/clang_git.bb @@ -57,7 +57,7 @@ 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[lld] = "-DCLANG_DEFAULT_LINKER=lld,,," PACKAGECONFIG[lto] = "-DLLVM_ENABLE_LTO=Full -DLLVM_BINUTILS_INCDIR=${STAGING_INCDIR},,binutils," PACKAGECONFIG[pfm] = "-DLLVM_ENABLE_LIBPFM=ON,-DLLVM_ENABLE_LIBPFM=OFF,libpfm," PACKAGECONFIG[rtti] = "-DLLVM_ENABLE_RTTI=ON,-DLLVM_ENABLE_RTTI=OFF,," @@ -89,7 +89,7 @@ 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;lld" +LLVM_PROJECTS ?= "clang;clang-tools-extra" # linux hosts (.so) on Windows .pyd SOLIBSDEV:mingw32 = ".pyd" @@ -141,8 +141,8 @@ DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native llvm-tblgen-native" DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_SYS} virtual/nativesdk-cross-binutils" DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)}" -RRECOMMENDS:${PN} = "binutils" -RRECOMMENDS:${PN}:append:class-target = "${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', ' libcxx-dev', '', 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() { @@ -370,10 +370,8 @@ 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} - # LLDTargets.cmake references the lld executable(!) that some modules/plugins link to - install -d ${SYSROOT_DESTDIR}${bindir} - binaries="lld diagtool clang-${MAJOR_VER} clang-format clang-offload-packager + 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 diff --git a/meta/recipes-devtools/clang/lld_git.bb b/meta/recipes-devtools/clang/lld_git.bb new file mode 100644 index 0000000000..02006e0edc --- /dev/null +++ b/meta/recipes-devtools/clang/lld_git.bb @@ -0,0 +1,26 @@ +SUMMARY = "LLD - the LLVM Linker" +DESCRIPTION = "LLD is a linker from the LLVM project that is a drop-in replacement for system linkers and runs much faster than them." +HOMEPAGE = "https://lld.llvm.org" +SECTION = "devel" + +require common-clang.inc +require common-source.inc + +LIC_FILES_CHKSUM = "file://lld/LICENSE.TXT;md5=ae7dc7c027b1fa89b5b013d391d3ee2b" + +inherit cmake pkgconfig + +DEPENDS = "llvm-tblgen-native llvm" + +OECMAKE_SOURCEPATH = "${S}/lld" + +# Explicitly disable RPATHs as otherwise they're stipped out of the binaries, +# and are then non-reproducible. +# +# Explicitly enable symlinks as the lld build doesn't call into the llvm setup +# and turn that on. +EXTRA_OECMAKE = "-DCMAKE_SKIP_BUILD_RPATH=ON \ + -DLLVM_INCLUDE_TESTS=OFF -DLLVM_USE_SYMLINKS=ON \ + -DLLVM_TABLEGEN_EXE=${STAGING_BINDIR_NATIVE}/llvm-tblgen" + +BBCLASSEXTEND = "native nativesdk" -- 2.47.2