Paolo Bonzini <pbonz...@redhat.com> writes:

> On 10/15/24 14:07, Manos Pitsidianakis wrote:
>> Add stub definition of memory_order enum in wrapper.h.
>> Creating Rust bindings from C code is done by passing the wrapper.h
>> header to `bindgen`. This fails when library dependencies that use
>> compiler headers are enabled, and the libclang that bindgen detects does
>> not match the expected clang version. So far this has only been observed
>> with the memory_order enum symbols from stdatomic.h. If we add the enum
>> definition to wrapper.h ourselves, the error does not happen.
>> Before this commit, if the mismatch happened the following error could
>> come up:
>>    /usr/include/liburing/barrier.h:72:10: error: use of undeclared identifier
>> 'memory_order_release'
>>    /usr/include/liburing/barrier.h:75:9: error: use of undeclared identifier 
>> 'memory_order_acquire'
>>    /usr/include/liburing/barrier.h:75:9: error: use of undeclared identifier 
>> 'memory_order_acquire'
>>    /usr/include/liburing/barrier.h:68:9: error: use of undeclared identifier 
>> 'memory_order_relaxed'
>>    /usr/include/liburing/barrier.h:65:17: error: use of undeclared 
>> identifier 'memory_order_relaxed'
>>    /usr/include/liburing/barrier.h:75:9: error: use of undeclared identifier 
>> 'memory_order_acquire'
>>    /usr/include/liburing/barrier.h:75:9: error: use of undeclared identifier 
>> 'memory_order_acquire'
>>    /usr/include/liburing/barrier.h:72:10: error: use of undeclared 
>> identifier 'memory_order_release'
>>    panicked at 
>> [..]/.cargo/registry/src/index.crates.io-6f17d22bba15001f/bindgen-cli-0.70.1/main.rs:45:36:
>>    Unable to generate bindings
>> To fix this (on my system) I would have to export CLANG_PATH and
>> LIBCLANG_PATH:
>>    export CLANG_PATH=/bin/clang-17
>>    export LIBCLANG_PATH=/usr/lib/llvm-17/lib
>> With these changes applied, bindgen is successful with both the
>> environment variables set and unset.
>> Since we're not using those symbols in the bindings (they are only used
>> by dependencies) this does not affect the generated bindings in any way.
>
> That is still likely to break, depending on what changes in the future in the
> headers that clang provides.
>
> We can do this (or alternatively, limit the number of files included in
> wrapper.h; in this case trying to remove use of io_uring's headers from
> include/block/aio.h) but probably we have to leave the warning in.
>
> Paolo

I agree with Paolo's comments. It was reported that using inconsistent
versions of clang and libclang can lead to unsound bindings even they
compile. I would recommend to keep that warning till a proper
resolution, e.g. clang-sys provides consistent paths, is present.

--
Best Regards
Junjie Mao

Reply via email to