Установка пути включения с помощью bindgen
Я пишу интерфейс Rust для небольшой библиотеки C, заголовки которой расположены в нескольких местах. Это не системная библиотека, и обычно используется некоторыми исполняемыми файлами в одном пакете; В настоящее время я включаю его как подмодуль git в мой проект Cargo.
Создание библиотеки кажется довольно простым; Я решил использовать gcc
ящик из build.rs
:
gcc::Config::new()
.file("external/foo/dir1/file1.c")
.file("external/foo/dir2/file2.c")
.include("external/foo/dir1/")
.include("external/foo/dir2/")
.include("external/foo/config_a/")
.compile("libfoo.a");
Теперь я надеялся использовать bindgen
Ящик для создания интерфейса FFI без лишней суеты, но, похоже, нет способа установки путей включения.
Я могу создать wrapper.h
как предложено в этом блоге и включают несколько заголовков, но если dir1/dir1.h
включает в себя conf.h
непосредственно, который работает при строительстве из-за .include("external/foo/config_a/")
это не может быть найдено.
Я ничего не могу найти в bindgen
здесь поможет API (по сути я хочу передать эквивалент gcc/clang -I
опция). Я что-то пропустил?
Наилучший вариант, который я могу себе представить, - это скопировать различные заголовки из источника библиотеки во временный каталог в build.rs
и беги bindgen
на этом, но это кажется несколько грязным, если есть более хороший путь.
1 ответ
С API вы можете использовать Builder::clang_arg
с произвольными аргументами:
let b = bindgen::builder().header("foo.h").clang_arg("-I/path")`;
Из командной строки вы можете сделать то же самое, добавив аргументы после --
, лайк:
bindgen foo.h -- -I/path