Установка пути включения с помощью 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
Другие вопросы по тегам