Rust bindgen ignore включает конкретное включение из файла заголовка
У меня есть файл заголовка, скажем, greetings.h:
include <hello.h>;
include <bye.h>;
include <hola.h>;
...
Я использую bindgen в ржавчине, чтобы сгенерировать этот файл от заголовка c до ржавчины. Но я хочу игнорировать создание
include <hola.h>
заголовок и сгенерируйте приветствие.h только с
helllo.h
а также
bye.h
. Я искал его в документации bindgen docs.rs, но не нашел намеков на это
1 ответ
Я смог решить эту проблему, догадавшись, что моя библиотека, которую я пытаюсь привязать от c к rust, имеет «пространство имен», в языке C на самом деле нет пространств имен, но люди, которые пишут открытый исходный код, склонны ставить перед своим кодом префикс «some_prefix*» . Итак, если файл h, который я хочу связать, выглядит так:
mylib.h:
include <hello.h>;
include <bye.h>;
include <hola.h>;
...
mylib_add_value(...);
mylib_remove_value(...);
mylib_display_value(...);
...
и я не хочу, чтобы генерировался hola.h, я могу отфильтровать вывод, разрешив и заблокировав функциональность bingden, например:
build.rs:
fn main() {
// Tell cargo to tell rustc to link the system nvpair of zfs
// shared library.
println!("cargo:rustc-link-lib=mylib");
// The bindgen::Builder is the main entry point
// to bindgen, and lets you build up options for
// the resulting bindings.
let bindings = bindgen::Builder::default()
// The input header we would like to generate
// bindings for.
.header("wrapper.h")
.allowlist_var(r#"(\w*mylib\w*)"#)
.allowlist_type(r#"(\w*mylib\w*)"#)
.allowlist_function(r#"(\w*mylib\w*)"#)
.blocklist_item(r#"(\w*hola\w*)"#)
.blocklist_type(r#"(\w*hola\w*)"#)
.blocklist_function(r#"(\w*hola\w*)"#)
.clang_args(vec!["-I/usr/include/mylib"])
.default_enum_style(bindgen::EnumVariation::Rust {
non_exhaustive: (true),
})
// Finish the builder and generate the bindings.
.generate()
// Unwrap the Result and panic on failure.
.expect("Unable to generate bindings");
// Write the bindings to the $OUT_DIR/bindings.rs file.
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
//.write_to_file(out_path)
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}
Bindgen сначала выведет все зависимости списка разрешений, и если некоторые из зависимостей включают