diff mbox series

[v2,2/2] libclc: split out of clang

Message ID 20250717134806.2790027-2-ross.burton@arm.com
State New
Headers show
Series [v2,1/2] cmake: remove CMAKE_SYSTEM_* from the native toolchain | expand

Commit Message

Ross Burton July 17, 2025, 1:48 p.m. UTC
Split the libclc subproject out of the clang recipe and into a dedicated
libclc recipe.

Verified that nothing is dropped by adding clang and libclc to an image
and verifying that the file list is the same before and after this
change.

We need to patch the libclc CMakeLists to allow it to use an out-of-tree
prepare_builtins binary, discussion is ongoing with upstream to resolve
this properly.

Signed-off-by: Ross Burton <ross.burton@arm.com>
---
 meta/conf/distro/include/maintainers.inc      |  1 +
 ...sting-prepare-builtins-in-standalone.patch | 53 +++++++++++++++++++
 meta/recipes-devtools/clang/clang_git.bb      | 17 +++---
 meta/recipes-devtools/clang/common.inc        |  1 +
 meta/recipes-devtools/clang/libclc_git.bb     | 43 +++++++++++++++
 5 files changed, 104 insertions(+), 11 deletions(-)
 create mode 100644 meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
 create mode 100644 meta/recipes-devtools/clang/libclc_git.bb

Comments

patchtest@automation.yoctoproject.org July 17, 2025, 2:01 p.m. UTC | #1
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/v2-2-2-libclc-split-out-of-clang.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 CVE tag format (test_patch.TestPatch.test_cve_tag_format)
PASS: test Signed-off-by presence (test_mbox.TestMbox.test_signed_off_by_presence)
PASS: test Signed-off-by presence (test_patch.TestPatch.test_signed_off_by_presence)
PASS: test Upstream-Status presence (test_patch.TestPatch.test_upstream_status_presence_format)
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 lic files chksum presence (test_metadata.TestMetadata.test_lic_files_chksum_presence)
PASS: test license presence (test_metadata.TestMetadata.test_license_presence)
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 summary presence (test_metadata.TestMetadata.test_summary_presence)
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 bugzilla entry format: No bug ID found (test_mbox.TestMbox.test_bugzilla_entry_format)
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)

---

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!
Khem Raj July 17, 2025, 5:16 p.m. UTC | #2
On Thu, Jul 17, 2025 at 6:48 AM Ross Burton via lists.openembedded.org
<ross.burton=arm.com@lists.openembedded.org> wrote:
>
> Split the libclc subproject out of the clang recipe and into a dedicated
> libclc recipe.
>

It would be good to document the rationale for this  change, helps in reminding
why this was done.

> Verified that nothing is dropped by adding clang and libclc to an image
> and verifying that the file list is the same before and after this
> change.

OK

>
> We need to patch the libclc CMakeLists to allow it to use an out-of-tree
> prepare_builtins binary, discussion is ongoing with upstream to resolve
> this properly.

Would be good to get it done upstream. Building out of tree is not common
amongst clang/llvm devs

>
> Signed-off-by: Ross Burton <ross.burton@arm.com>
> ---
>  meta/conf/distro/include/maintainers.inc      |  1 +
>  ...sting-prepare-builtins-in-standalone.patch | 53 +++++++++++++++++++
>  meta/recipes-devtools/clang/clang_git.bb      | 17 +++---
>  meta/recipes-devtools/clang/common.inc        |  1 +
>  meta/recipes-devtools/clang/libclc_git.bb     | 43 +++++++++++++++
>  5 files changed, 104 insertions(+), 11 deletions(-)
>  create mode 100644 meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
>  create mode 100644 meta/recipes-devtools/clang/libclc_git.bb
>
> diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc
> index 6bfc2efb162..927aac16d6d 100644
> --- a/meta/conf/distro/include/maintainers.inc
> +++ b/meta/conf/distro/include/maintainers.inc
> @@ -328,6 +328,7 @@ RECIPE_MAINTAINER:pn-libcap-ng = "Yi Zhao <yi.zhao@windriver.com>"
>  RECIPE_MAINTAINER:pn-libcap-ng-python = "Yi Zhao <yi.zhao@windriver.com>"
>  RECIPE_MAINTAINER:pn-libcgroup = "Unassigned <unassigned@yoctoproject.org>"
>  RECIPE_MAINTAINER:pn-libcheck = "Yi Zhao <yi.zhao@windriver.com>"
> +RECIPE_MAINTAINER:pn-libclc = "Khem Raj <raj.khem@gmail.com>"
>  RECIPE_MAINTAINER:pn-libcomps = "Unassigned <unassigned@yoctoproject.org>"
>  RECIPE_MAINTAINER:pn-libconvert-asn1-perl = "Tim Orling <tim.orling@konsulko.com>"
>  RECIPE_MAINTAINER:pn-libcxx = "Khem Raj <raj.khem@gmail.com>"
> diff --git a/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch b/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
> new file mode 100644
> index 00000000000..2b40f541a6b
> --- /dev/null
> +++ b/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
> @@ -0,0 +1,53 @@
> +From 348f846b206780646430d6477c04b7793b669f34 Mon Sep 17 00:00:00 2001
> +From: Ross Burton <ross.burton@arm.com>
> +Date: Wed, 16 Jul 2025 23:24:21 +0100
> +Subject: [PATCH] allow external prepare_builtins
> +
> +Upstream-Status: Pending
> +Signed-off-by: Ross Burton <ross.burton@arm.com>
> +---
> + libclc/CMakeLists.txt | 23 +++++++++++++++++------
> + 1 file changed, 17 insertions(+), 6 deletions(-)
> +
> +diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
> +index 43e213b385f5..d4a6d096169e 100644
> +--- a/libclc/CMakeLists.txt
> ++++ b/libclc/CMakeLists.txt
> +@@ -181,17 +181,28 @@ set(LLVM_LINK_COMPONENTS
> +   IRReader
> +   Support
> + )
> ++
> + if( LIBCLC_STANDALONE_BUILD )
> +-  add_llvm_executable( prepare_builtins utils/prepare-builtins.cpp )
> +-  set( prepare_builtins_exe prepare_builtins )
> +-  set( prepare_builtins_target prepare_builtins )
> ++  message("cross ${CMAKE_CROSSCOMPILING}")
> ++  if(CMAKE_CROSSCOMPILING)
> ++    find_program(PREPARE_BUILTINS prepare_builtins REQUIRED)
> ++    message("found ${PREPARE_BUILTINS}")
> ++    set( prepare_builtins_exe ${PREPARE_BUILTINS} )
> ++  else()
> ++    add_llvm_executable( prepare_builtins utils/prepare-builtins.cpp )
> ++    set( prepare_builtins_exe prepare_builtins )
> ++    set( prepare_builtins_target prepare_builtins )
> ++    target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
> ++    # These were not properly reported in early LLVM and we don't need them
> ++    target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
> ++  endif()
> + else()
> +   add_llvm_utility( prepare_builtins utils/prepare-builtins.cpp )
> +   setup_host_tool( prepare_builtins PREPARE_BUILTINS prepare_builtins_exe prepare_builtins_target )
> ++  target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
> ++  # These were not properly reported in early LLVM and we don't need them
> ++  target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
> + endif()
> +-target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
> +-# These were not properly reported in early LLVM and we don't need them
> +-target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
> +
> + # Setup arch devices
> + set( r600--_devices cedar cypress barts cayman )
> +--
> +2.43.0
> +
> diff --git a/meta/recipes-devtools/clang/clang_git.bb b/meta/recipes-devtools/clang/clang_git.bb
> index ed6e2d7da7f..884398dcaa3 100644
> --- a/meta/recipes-devtools/clang/clang_git.bb
> +++ b/meta/recipes-devtools/clang/clang_git.bb
> @@ -130,7 +130,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;libclc;lld"
> +LLVM_PROJECTS ?= "clang;clang-tools-extra;lld"
>
>  # linux hosts (.so) on Windows .pyd
>  SOLIBSDEV:mingw32 = ".pyd"
> @@ -191,7 +191,7 @@ EXTRA_OECMAKE:append:class-target = "\
>
>  DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native ninja-native swig-native spirv-tools-native llvm-tblgen-native"
>  DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_SYS} virtual/nativesdk-cross-binutils nativesdk-python3"
> -DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)} spirv-llvm-translator-native"
> +DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 ${@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)}"
> @@ -258,7 +258,6 @@ do_install:append:class-native () {
>          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
> -    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/prepare_builtins ${D}${bindir}/prepare_builtins
>
>      for f in `find ${D}${bindir} -executable -type f -not -type l`; do
>          test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f
> @@ -294,11 +293,11 @@ do_install:append:class-nativesdk () {
>      fi
>  }
>
> -PROVIDES:append:class-native = " llvm-native libclc-native"
> -PROVIDES:append:class-target = " llvm libclc"
> -PROVIDES:append:class-nativesdk = " nativesdk-llvm nativesdk-libclc"
> +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 ${PN}-clc \
> +PACKAGES =+ "${PN}-libllvm ${PN}-libclang-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools \
>               libclang llvm-linker-tools"
>
>  BBCLASSEXTEND = "native nativesdk"
> @@ -315,8 +314,6 @@ RDEPENDS:${PN}-tools += "\
>    perl-module-term-ansicolor \
>  "
>
> -RPROVIDES:${PN}-clc = "${MLPREFIX}libclc"
> -
>  RRECOMMENDS:${PN}-tidy += "${PN}-tools"
>
>  FILES:llvm-linker-tools = "${libdir}/LLVMgold* ${libdir}/libLTO.so.* ${libdir}/LLVMPolly*"
> @@ -383,8 +380,6 @@ FILES:${PN} += "\
>    ${nonarch_libdir}/${BPN}/*/include/ \
>  "
>
> -FILES:${PN}-clc += "${datadir}/clc"
> -
>  FILES:${PN}-libllvm =+ "\
>    ${libdir}/libLLVM.so.${MAJOR_VER}.${MINOR_VER} \
>    ${libdir}/libLLVM-${MAJOR_VER}.so \
> diff --git a/meta/recipes-devtools/clang/common.inc b/meta/recipes-devtools/clang/common.inc
> index d66f9059b2e..d6280c2fbe3 100644
> --- a/meta/recipes-devtools/clang/common.inc
> +++ b/meta/recipes-devtools/clang/common.inc
> @@ -59,6 +59,7 @@ SRC_URI = "\
>      file://0036-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch \
>      file://0037-compiler-rt-Exclude-sync_fetch_and_-for-any-pre-ARMv.patch \
>      file://0038-compiler-rt-Hardcode-uptr-sptr-typedefs-on-Mips-Linu.patch \
> +    file://0001-libclc-allow-existing-prepare-builtins-in-standalone.patch \
>  "
>  # Fallback to no-PIE if not set
>  GCCPIE ??= ""
> diff --git a/meta/recipes-devtools/clang/libclc_git.bb b/meta/recipes-devtools/clang/libclc_git.bb
> new file mode 100644
> index 00000000000..ed31de503ae
> --- /dev/null
> +++ b/meta/recipes-devtools/clang/libclc_git.bb
> @@ -0,0 +1,43 @@
> +SUMMARY = "Implementation of the library requirements of the OpenCL C programming language."
> +HOMEPAGE = "https://libclc.llvm.org"
> +SECTION = "devel"
> +
> +require common-clang.inc
> +require common-source.inc
> +
> +LIC_FILES_CHKSUM = "file://libclc/LICENSE.TXT;md5=7cc795f6cbb2d801d84336b83c8017db"
> +
> +inherit cmake pkgconfig
> +
> +# Depend explicitly on clang-native instead of using TOOLCHAIN as the build
> +# objects from this recipe are build explicitly using clang for GPU targets.
> +# We could INHIBIT_DEFAULT_DEPS to avoid any other toolchain but then we need
> +# to wrestle CMake to configure without a toolchain.
> +DEPENDS += "clang-native spirv-llvm-translator-native"
> +
> +OECMAKE_SOURCEPATH = "${S}/libclc"
> +B_NATIVE = "${B}-native"
> +
> +# Semicolon-separated list of targets to build
> +LIBCLC_TARGETS ?= "all"
> +
> +EXTRA_OECMAKE = "-DLIBCLC_TARGETS_TO_BUILD=${LIBCLC_TARGETS} \
> +                 -DPREPARE_BUILTINS=${B_NATIVE}/prepare_builtins"
> +
> +# Need to build a native prepare_builtins binary in target builds. The easiest
> +# way to do this is with a second native cmake build tree.
> +do_build_prepare_builtins() {
> +    cmake --fresh -G Ninja \
> +        -S ${OECMAKE_SOURCEPATH} -B ${B_NATIVE} \
> +        -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${WORKDIR}/toolchain-native.cmake \
> +        -DLIBCLC_TARGETS_TO_BUILD=
> +    cmake --build ${B_NATIVE} --target prepare_builtins
> +}
> +do_build_prepare_builtins:class-native() {
> +    :
> +}
> +do_configure[prefuncs] += "do_build_prepare_builtins"
> +
> +FILES:${PN} += "${datadir}/clc"
> +
> +BBCLASSEXTEND = "native nativesdk"
> --
> 2.43.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#220545): https://lists.openembedded.org/g/openembedded-core/message/220545
> Mute This Topic: https://lists.openembedded.org/mt/114203430/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta/conf/distro/include/maintainers.inc b/meta/conf/distro/include/maintainers.inc
index 6bfc2efb162..927aac16d6d 100644
--- a/meta/conf/distro/include/maintainers.inc
+++ b/meta/conf/distro/include/maintainers.inc
@@ -328,6 +328,7 @@  RECIPE_MAINTAINER:pn-libcap-ng = "Yi Zhao <yi.zhao@windriver.com>"
 RECIPE_MAINTAINER:pn-libcap-ng-python = "Yi Zhao <yi.zhao@windriver.com>"
 RECIPE_MAINTAINER:pn-libcgroup = "Unassigned <unassigned@yoctoproject.org>"
 RECIPE_MAINTAINER:pn-libcheck = "Yi Zhao <yi.zhao@windriver.com>"
+RECIPE_MAINTAINER:pn-libclc = "Khem Raj <raj.khem@gmail.com>"
 RECIPE_MAINTAINER:pn-libcomps = "Unassigned <unassigned@yoctoproject.org>"
 RECIPE_MAINTAINER:pn-libconvert-asn1-perl = "Tim Orling <tim.orling@konsulko.com>"
 RECIPE_MAINTAINER:pn-libcxx = "Khem Raj <raj.khem@gmail.com>"
diff --git a/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch b/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
new file mode 100644
index 00000000000..2b40f541a6b
--- /dev/null
+++ b/meta/recipes-devtools/clang/clang/0001-libclc-allow-existing-prepare-builtins-in-standalone.patch
@@ -0,0 +1,53 @@ 
+From 348f846b206780646430d6477c04b7793b669f34 Mon Sep 17 00:00:00 2001
+From: Ross Burton <ross.burton@arm.com>
+Date: Wed, 16 Jul 2025 23:24:21 +0100
+Subject: [PATCH] allow external prepare_builtins
+
+Upstream-Status: Pending
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+---
+ libclc/CMakeLists.txt | 23 +++++++++++++++++------
+ 1 file changed, 17 insertions(+), 6 deletions(-)
+
+diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
+index 43e213b385f5..d4a6d096169e 100644
+--- a/libclc/CMakeLists.txt
++++ b/libclc/CMakeLists.txt
+@@ -181,17 +181,28 @@ set(LLVM_LINK_COMPONENTS
+   IRReader
+   Support
+ )
++
+ if( LIBCLC_STANDALONE_BUILD )
+-  add_llvm_executable( prepare_builtins utils/prepare-builtins.cpp )
+-  set( prepare_builtins_exe prepare_builtins )
+-  set( prepare_builtins_target prepare_builtins )
++  message("cross ${CMAKE_CROSSCOMPILING}")
++  if(CMAKE_CROSSCOMPILING)
++    find_program(PREPARE_BUILTINS prepare_builtins REQUIRED)
++    message("found ${PREPARE_BUILTINS}")
++    set( prepare_builtins_exe ${PREPARE_BUILTINS} )
++  else()
++    add_llvm_executable( prepare_builtins utils/prepare-builtins.cpp )
++    set( prepare_builtins_exe prepare_builtins )
++    set( prepare_builtins_target prepare_builtins )
++    target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
++    # These were not properly reported in early LLVM and we don't need them
++    target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
++  endif()
+ else()
+   add_llvm_utility( prepare_builtins utils/prepare-builtins.cpp )
+   setup_host_tool( prepare_builtins PREPARE_BUILTINS prepare_builtins_exe prepare_builtins_target )
++  target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
++  # These were not properly reported in early LLVM and we don't need them
++  target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
+ endif()
+-target_compile_definitions( prepare_builtins PRIVATE ${LLVM_VERSION_DEFINE} )
+-# These were not properly reported in early LLVM and we don't need them
+-target_compile_options( prepare_builtins PRIVATE -fno-rtti -fno-exceptions )
+ 
+ # Setup arch devices
+ set( r600--_devices cedar cypress barts cayman )
+-- 
+2.43.0
+
diff --git a/meta/recipes-devtools/clang/clang_git.bb b/meta/recipes-devtools/clang/clang_git.bb
index ed6e2d7da7f..884398dcaa3 100644
--- a/meta/recipes-devtools/clang/clang_git.bb
+++ b/meta/recipes-devtools/clang/clang_git.bb
@@ -130,7 +130,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;libclc;lld"
+LLVM_PROJECTS ?= "clang;clang-tools-extra;lld"
 
 # linux hosts (.so) on Windows .pyd
 SOLIBSDEV:mingw32 = ".pyd"
@@ -191,7 +191,7 @@  EXTRA_OECMAKE:append:class-target = "\
 
 DEPENDS = "binutils zlib zstd libffi libxml2 libxml2-native ninja-native swig-native spirv-tools-native llvm-tblgen-native"
 DEPENDS:append:class-nativesdk = " clang-crosssdk-${SDK_SYS} virtual/nativesdk-cross-binutils nativesdk-python3"
-DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 ${@bb.utils.contains('TC_CXX_RUNTIME', 'llvm', 'compiler-rt libcxx', '', d)} spirv-llvm-translator-native"
+DEPENDS:append:class-target = " clang-cross-${TARGET_ARCH} python3 ${@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)}"
@@ -258,7 +258,6 @@  do_install:append:class-native () {
         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
-    install -Dm 0755 ${B}${BINPATHPREFIX}/bin/prepare_builtins ${D}${bindir}/prepare_builtins
 
     for f in `find ${D}${bindir} -executable -type f -not -type l`; do
         test -n "`file -b $f|grep -i ELF`" && ${STRIP} $f
@@ -294,11 +293,11 @@  do_install:append:class-nativesdk () {
     fi
 }
 
-PROVIDES:append:class-native = " llvm-native libclc-native"
-PROVIDES:append:class-target = " llvm libclc"
-PROVIDES:append:class-nativesdk = " nativesdk-llvm nativesdk-libclc"
+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 ${PN}-clc \
+PACKAGES =+ "${PN}-libllvm ${PN}-libclang-python ${PN}-libclang-cpp ${PN}-tidy ${PN}-format ${PN}-tools \
              libclang llvm-linker-tools"
 
 BBCLASSEXTEND = "native nativesdk"
@@ -315,8 +314,6 @@  RDEPENDS:${PN}-tools += "\
   perl-module-term-ansicolor \
 "
 
-RPROVIDES:${PN}-clc = "${MLPREFIX}libclc"
-
 RRECOMMENDS:${PN}-tidy += "${PN}-tools"
 
 FILES:llvm-linker-tools = "${libdir}/LLVMgold* ${libdir}/libLTO.so.* ${libdir}/LLVMPolly*"
@@ -383,8 +380,6 @@  FILES:${PN} += "\
   ${nonarch_libdir}/${BPN}/*/include/ \
 "
 
-FILES:${PN}-clc += "${datadir}/clc"
-
 FILES:${PN}-libllvm =+ "\
   ${libdir}/libLLVM.so.${MAJOR_VER}.${MINOR_VER} \
   ${libdir}/libLLVM-${MAJOR_VER}.so \
diff --git a/meta/recipes-devtools/clang/common.inc b/meta/recipes-devtools/clang/common.inc
index d66f9059b2e..d6280c2fbe3 100644
--- a/meta/recipes-devtools/clang/common.inc
+++ b/meta/recipes-devtools/clang/common.inc
@@ -59,6 +59,7 @@  SRC_URI = "\
     file://0036-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch \
     file://0037-compiler-rt-Exclude-sync_fetch_and_-for-any-pre-ARMv.patch \
     file://0038-compiler-rt-Hardcode-uptr-sptr-typedefs-on-Mips-Linu.patch \
+    file://0001-libclc-allow-existing-prepare-builtins-in-standalone.patch \
 "
 # Fallback to no-PIE if not set
 GCCPIE ??= ""
diff --git a/meta/recipes-devtools/clang/libclc_git.bb b/meta/recipes-devtools/clang/libclc_git.bb
new file mode 100644
index 00000000000..ed31de503ae
--- /dev/null
+++ b/meta/recipes-devtools/clang/libclc_git.bb
@@ -0,0 +1,43 @@ 
+SUMMARY = "Implementation of the library requirements of the OpenCL C programming language."
+HOMEPAGE = "https://libclc.llvm.org"
+SECTION = "devel"
+
+require common-clang.inc
+require common-source.inc
+
+LIC_FILES_CHKSUM = "file://libclc/LICENSE.TXT;md5=7cc795f6cbb2d801d84336b83c8017db"
+
+inherit cmake pkgconfig
+
+# Depend explicitly on clang-native instead of using TOOLCHAIN as the build
+# objects from this recipe are build explicitly using clang for GPU targets.
+# We could INHIBIT_DEFAULT_DEPS to avoid any other toolchain but then we need
+# to wrestle CMake to configure without a toolchain.
+DEPENDS += "clang-native spirv-llvm-translator-native"
+
+OECMAKE_SOURCEPATH = "${S}/libclc"
+B_NATIVE = "${B}-native"
+
+# Semicolon-separated list of targets to build
+LIBCLC_TARGETS ?= "all"
+
+EXTRA_OECMAKE = "-DLIBCLC_TARGETS_TO_BUILD=${LIBCLC_TARGETS} \
+                 -DPREPARE_BUILTINS=${B_NATIVE}/prepare_builtins"
+
+# Need to build a native prepare_builtins binary in target builds. The easiest
+# way to do this is with a second native cmake build tree.
+do_build_prepare_builtins() {
+    cmake --fresh -G Ninja \
+        -S ${OECMAKE_SOURCEPATH} -B ${B_NATIVE} \
+        -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${WORKDIR}/toolchain-native.cmake \
+        -DLIBCLC_TARGETS_TO_BUILD=
+    cmake --build ${B_NATIVE} --target prepare_builtins
+}
+do_build_prepare_builtins:class-native() {
+    :
+}
+do_configure[prefuncs] += "do_build_prepare_builtins"
+
+FILES:${PN} += "${datadir}/clc"
+
+BBCLASSEXTEND = "native nativesdk"