@@ -56,19 +56,22 @@ def get_llvm_arch(bb, d, arch_var):
def get_llvm_host_arch(bb, d):
return get_llvm_arch(bb, d, 'HOST_ARCH')
-PACKAGECONFIG ??= "libllvm"
+PACKAGECONFIG ??= "libllvm libclc"
# if optviewer OFF, force the modules to be not found or the ones on the host would be found
PACKAGECONFIG[optviewer] = ",-DPY_PYGMENTS_FOUND=OFF -DPY_PYGMENTS_LEXERS_C_CPP_FOUND=OFF -DPY_YAML_FOUND=OFF,python3-pygments python3-pyyaml,python3-pygments python3-pyyaml"
PACKAGECONFIG[libllvm] = ""
+PACKAGECONFIG[libclc] = ""
#
# Default to build all OE-Core supported target arches (user overridable).
#
-LLVM_TARGETS ?= "AMDGPU;${@get_llvm_host_arch(bb, d)}"
+LLVM_TARGETS ?= "AMDGPU;NVPTX;SPIRV;${@get_llvm_host_arch(bb, d)}"
ARM_INSTRUCTION_SET:armv5 = "arm"
ARM_INSTRUCTION_SET:armv4t = "arm"
+LLVM_PROJECTS = "${@bb.utils.contains('PACKAGECONFIG', 'libclc', 'clang;libclc', '', d)}"
+
EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_ENABLE_EXPENSIVE_CHECKS=OFF \
-DLLVM_ENABLE_PIC=ON \
@@ -82,6 +85,7 @@ EXTRA_OECMAKE += "-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_VERSION_SUFFIX='${VER_SUFFIX}' \
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
-DCMAKE_BUILD_TYPE=Release \
+ -DLLVM_ENABLE_PROJECTS='${LLVM_PROJECTS}' \
"
EXTRA_OECMAKE:append:class-target = "\
@@ -89,6 +93,7 @@ EXTRA_OECMAKE:append:class-target = "\
-DLLVM_HOST_TRIPLE=${TARGET_SYS} \
-DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \
-DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \
+ -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \
"
EXTRA_OECMAKE:append:class-nativesdk = "\
@@ -96,6 +101,7 @@ EXTRA_OECMAKE:append:class-nativesdk = "\
-DLLVM_HOST_TRIPLE=${SDK_SYS} \
-DLLVM_TABLEGEN=${STAGING_BINDIR_NATIVE}/llvm-tblgen${PV} \
-DLLVM_CONFIG_PATH=${STAGING_BINDIR_NATIVE}/llvm-config${PV} \
+ -DLLVM_NATIVE_TOOL_DIR=${STAGING_BINDIR_NATIVE} \
"
# patch out build host paths for reproducibility
@@ -124,17 +130,39 @@ do_install() {
# Remove opt-viewer: https://llvm.org/docs/Remarks.html
rm -rf ${D}${datadir}/opt-viewer
- rmdir ${D}${datadir}
# reproducibility
sed -i -e 's,${WORKDIR},,g' ${D}/${libdir}/cmake/llvm/LLVMConfig.cmake
fi
+
+ # Remove clang bits from target packages, we are not providing it for the system
+ if ${@bb.utils.contains('PACKAGECONFIG', 'libclc', 'true', 'false', d)} &&
+ [ "${CLASSOVERRIDE}" != "class-native" ] ; then
+ rm -f ${D}${bindir}/clang*
+ rm -fr ${D}${libdir}/clang
+ rm -fr ${D}${datadir}/clang
+
+ rm -f ${D}${bindir}/scan*
+ rm -fr ${D}${libdir}/libscanbuild
+ rm -fr ${D}${datadir}/scan-build
+ rm -fr ${D}${datadir}/scan-view
+
+ rm -fr ${D}${libdir}/libear
+ fi
+
+ # Try to clean up datadir if it is empty, but don't fail if there are
+ # libclc files there
+ rmdir ${D}${datadir} || true
}
do_install:append:class-native() {
install -D -m 0755 ${B}/bin/llvm-tblgen ${D}${bindir}/llvm-tblgen${PV}
install -D -m 0755 ${B}/bin/llvm-config ${D}${bindir}/llvm-config${PV}
ln -sf llvm-config${PV} ${D}${bindir}/llvm-config
+
+ if ${@bb.utils.contains('PACKAGECONFIG', 'libclc', 'true', 'false', d)} ; then
+ install -D -m 0755 ${B}/bin/prepare_builtins ${D}${bindir}/prepare_builtins
+ fi
}
SYSROOT_PREPROCESS_FUNCS:append:class-target = " llvm_sysroot_preprocess"
@@ -146,9 +174,11 @@ llvm_sysroot_preprocess() {
ln -sf llvm-config ${SYSROOT_DESTDIR}${bindir_crossscripts}/llvm-config${PV}
}
-PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto"
+PACKAGES =+ "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-libllvm ${PN}-liboptremarks ${PN}-liblto ${PN}-clc"
+PROVIDES = "${@bb.utils.filter('PACKAGECONFIG', 'libclc', d)}"
RRECOMMENDS:${PN}-dev += "${PN}-bugpointpasses ${PN}-llvmhello ${PN}-liboptremarks"
+RPROVIDES:${PN}-clc += "libclc"
FILES:${PN}-bugpointpasses = "\
${libdir}/BugpointPasses.so \
@@ -181,6 +211,8 @@ FILES:${PN}-staticdev += "\
${libdir}/*.a \
"
+FILES:${PN}-clc += "${datadir}/clc"
+
INSANE_SKIP:${PN}-libllvm += "dev-so"
BBCLASSEXTEND = "native nativesdk"
Current Mesa requires libclc in order to build Intel Gallium (iris) or Vulkan drivers. In order to unblock Mesa updates, build libclc as a part of the LLVM build process. The libclc requires Clang for building, so enable Clang too via LLVM_PROJECTS. Remove clang from the DESTDIR, so that it is only used during the build process. Proper handling of Clang as a toolchain is a separate and much more complicated topic. Clang is enabled for all kinds of builds as it is a requirement for libclc to build. Cleaning of ${datadir} has been moved to happen at the end of do_install to be performed after do clang removal and made not to fail if ${datadir} is not empty, as libclc install files into that location. NVPTX and SPIRV targets are enabled since they are required for the libclc to link. LLVM_NATIVE_TOOL_DIR is used to pass a path to the native tools built via llvm-native instead of building them during the target and/or nativesdk build. The llvm-clc package is set to RPROVIDE libclc (and the recipe also PROVIDEs libclc) in order to be compatible with the meta-clang packages (and to be future-compatible with the split package after proper Clang support is introduced to OE-Core). Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> --- meta/recipes-devtools/llvm/llvm_20.1.0.bb | 40 +++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-)