From: Yogesh Tyagi <[email protected]>

bindgen uses the clang-sys crate to locate a 'clang' executable for
querying default include paths. clang-sys's search order is CLANG_PATH,
then libclang's directory, then 'llvm-config --bindir', then PATH.

When clang is used as the toolchain, the crossscripts llvm-config wrapper
honours YOCTO_ALTERNATE_EXE_PATH and reports the target sysroot bindir.
clang-sys's 'llvm-config --bindir' step then resolves to a target clang
that cannot execute on the build host, so bindgen fails with:

  could not run executable .../recipe-sysroot/usr/bin/clang-NN:
  No such file or directory (os error 2)

This is hit, for example, when building mesa with the rusticl/opencl
PACKAGECONFIG, whose do_compile runs the native bindgen against
rusticl_mesa_bindings.h, and when building rust-in-kernel via
kernel-yocto-rust.bbclass, which pulls in clang-native and
bindgen-cli-native.

Set CLANG_PATH to the clang that matches the wrapped libclang so
clang-sys uses the runnable binary first, short-circuiting the
llvm-config lookup. The wrapper already exports LIBCLANG_PATH the same
way.

The recipe is BBCLASSEXTEND = "native nativesdk", but only the native
variant had a wrapper. Add the equivalent nativesdk wrapper so an SDK
that runs bindgen (e.g. rust kernel-module development in the SDK) does
not hit the identical target-clang failure. The native wrapper uses
STAGING_*_NATIVE; the nativesdk wrapper uses the on-target ${libdir}/
${bindir} so create_wrapper's relocation rewrites the full path and the
shipped wrapper carries no build-time (TMPDIR) reference.

Signed-off-by: Yogesh Tyagi <[email protected]>
---
v2:
 - Add the missing nativesdk bindgen wrapper (v1 only wrapped native),
   so an SDK that runs bindgen does not hit the same target-clang failure.
 - The nativesdk wrapper uses the on-target ${libdir}/${bindir} rather
   than STAGING_LIBDIR/STAGING_BINDIR: the latter include the recipe
   sysroot (TMPDIR) prefix, which create_wrapper's relocation does not
   strip, so the shipped wrapper failed do_package_qa with a buildpaths
   (reference to TMPDIR) error.

 .../bindgen-cli/bindgen-cli_0.72.1.bb         | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/meta/recipes-devtools/bindgen-cli/bindgen-cli_0.72.1.bb 
b/meta/recipes-devtools/bindgen-cli/bindgen-cli_0.72.1.bb
index 72dadfe52f..2ef797c156 100644
--- a/meta/recipes-devtools/bindgen-cli/bindgen-cli_0.72.1.bb
+++ b/meta/recipes-devtools/bindgen-cli/bindgen-cli_0.72.1.bb
@@ -11,8 +11,25 @@ SRCREV = "d874de8d646d9b8a3e7ba2db2bcd52f2fba8f1f5"
 
 require ${BPN}-crates.inc
 
+# bindgen uses the clang-sys crate to locate a 'clang' executable for querying
+# default include paths. clang-sys's search order is: CLANG_PATH, libclang's 
dir,
+# 'llvm-config --bindir', then PATH. When clang is the toolchain, the 
crossscripts
+# llvm-config wrapper honours YOCTO_ALTERNATE_EXE_PATH and reports the target
+# sysroot bindir, so clang-sys's 'llvm-config --bindir' step resolves to a 
target
+# clang that cannot run on the build host (native bindgen then fails with
+# "could not run executable .../clang-NN: No such file or directory", e.g. when
+# building mesa with the rusticl/opencl PACKAGECONFIG). Set CLANG_PATH to the
+# native clang so the runnable host binary is used first.
 do_install:append:class-native() {
-       create_wrapper ${D}/${bindir}/bindgen 
LIBCLANG_PATH="${STAGING_LIBDIR_NATIVE}"
+       create_wrapper ${D}/${bindir}/bindgen \
+               LIBCLANG_PATH="${STAGING_LIBDIR_NATIVE}" \
+               CLANG_PATH="${STAGING_BINDIR_NATIVE}/clang"
+}
+
+do_install:append:class-nativesdk() {
+       create_wrapper ${D}/${bindir}/bindgen \
+               LIBCLANG_PATH="${libdir}" \
+               CLANG_PATH="${bindir}/clang"
 }
 
 BBCLASSEXTEND = "native nativesdk"
-- 
2.43.0

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#240725): 
https://lists.openembedded.org/g/openembedded-core/message/240725
Mute This Topic: https://lists.openembedded.org/mt/120230913/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to