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(),