On 8/31/2024 4:25 PM, Manos Pitsidianakis wrote:
On Fri, 30 Aug 2024 14:03, Alex Bennée <alex.ben...@linaro.org> wrote:
[.snip.]

It is there:

 /usr/lib/llvm-14/lib/clang/14.0.6/include/stdatomic.h

in the search path:

 clang -E -Wp,-v -
 clang -cc1 version 14.0.6 based upon LLVM 14.0.6 default target x86_64-pc-linux-gnu  ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
 ignoring nonexistent directory "/include"
 #include "..." search starts here:
 #include <...> search starts here:
  /usr/lib/llvm-14/lib/clang/14.0.6/include
  /usr/local/include
  /usr/include/x86_64-linux-gnu
  /usr/include
 End of search list.

but not in the list above. Have we told clang not to include system
search paths in the bindgen invocation?

stdatomic.h was first included in c11, and compilers already shipped the header on their own (since they use builtin operations). The compiler header paths are considered special system header paths by compilers, and what's happening here is a bug in the manual searching logic in libclang like explained in the other

Do you mean the manual searching logic in the *clang-sys* crate?

There is also a related issue [1] on GitHub.

[1] https://github.com/rust-lang/rust-bindgen/issues/2682

replies. The bindgen invocation looks at system search paths otherwise, or it'd fail to find headers used in QEMU.

Another approach to work around that issue is to define BOTH CLANG_PATH and LIBCLANG_PATH env vars, e.g., CLANG_PATH=/usr/bin/clang-13 LIBCLANG_PATH=/lib/x86_64-linux-gnu/libclang-13.so. That works in my environment.

The following is a draft to do it in meson.build. It does NOT work yet as bindgen() does not allow customizing environment variables. I'm checking how to make it in meson.

diff --git a/meson.build b/meson.build
index 68d5b53684..1f6fc21f8d 100644
--- a/meson.build
+++ b/meson.build
@@ -3879,6 +3879,30 @@ if have_rust and have_system
     capture : true,
     check: true).stdout().strip().split()

+  host_clang = find_program(
+    'clang', version: '>=5.0.0',
+    required: true, native: true)
+  host_libclang = run_command(
+    host_clang,
+    '-print-file-name=libclang.so',
+    capture: true,
+    check: true).stdout().strip()
+  # Clang prints an absolute path when the library is found
+  if not host_libclang.startswith('/')
+    host_clang_major = host_clang.version().split('.')[0]
+    host_libclang = run_command(
+      host_clang,
+      '-print-file-name=libclang-' + host_clang_major + '.so',
+      capture: true,
+      check: true).stdout().strip()
+  endif
+  if not host_libclang.startswith('/')
+    error('Cannot find libclang.so for ' + host_clang.full_path())
+  endif
+  message('Found libclang: ' + host_libclang)
+
+  # TODO: set CLANG_PATH to host_clang.full_path() and LIBCLANG_PATH to
+  # host_libclang when invoking bindgen
   bindings_rs = import('rust').bindgen(
     input: 'rust/wrapper.h',
     dependencies: common_ss.all_dependencies(),


Reply via email to