2017-03-11 104 views
1

我正在寫一個Rust接口到a small C library,它有幾個位置的標頭。它不是一個系統庫,通常由同一個包中的一些可執行文件使用;我目前在我的Cargo項目中將它作爲git子模塊加入。使用bindgen設置包含路徑

建立圖書館似乎很容易;我選擇使用從build.rsgcc箱:

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通過this blog的建議,其中包括幾個頭,但如果dir1/dir1.h包括conf.h直接,其建築物因.include("external/foo/config_a/")時,它無法找到工作。

我找不到bindgen的API來幫助這裏(實質上我想通過相當於gcc/clang的-I選項)。我錯過了什麼?

我能想到的迄今爲止最好的選擇是不同的頭從庫源拷貝到某個臨時目錄中build.rs和運行上bindgen,但似乎有點混亂,如果有一個更好的方式。

回答

3

有了可以使用Builder::clang_arg任意參數的API:

let b = bindgen::builder().header("foo.h").clang_arg("-I/path")`; 

在命令行中,你可以通過附加參數--後做同樣的,如:

bindgen foo.h -- -I/path