簡體   English   中英

處理 OCaml 項目內部的 C 代碼依賴項

[英]Dealing with C code dependencies inside OCaml projects

我正在使用 ocamlbuild 構建我的 OCaml 項目,該項目使用外部 C 庫“cstub”。 I found a very solution online to include the C library in the compilation process using ocamlbuild in http://l-lang.blogspot.com/2012/08/incorporating-c-code-in-ocaml-project.html (adding the pdep ["link";] "linkdep" (fun param -> [param]);myocamlbuild.ml的行)。

但是,我的 C 庫本身具有外部 ASM 依賴項,上面的解決方案無法捕獲它。 它無法與 ASM 函數鏈接,因為它沒有與 ASM 文件一起編譯。 因此,我的問題是:在編譯 C 程序時,有沒有辦法調整上面給出的建議以添加對 ASM 文件的支持? 例如,是否需要在pdep命令中添加額外的參數來支持額外的編譯功能?

非常感謝您!

所有與構建相關的問題的默認序言。 如果您有該選項,請考慮使用沙丘 OCamlBuild 即將退休,因此不要期望太多幫助或良好的現代文檔。 話雖如此,我知道這並不總是一種選擇,我自己在我的主要項目中使用ocamlbuild

因此,您添加到 ocamlbuild 插件的pdep規則采用了一個參數,例如,

<*.native>: linkdep(toto_c.o)

toto_c.o (或括號之間的任何內容)作為param傳遞,您需要將其轉換為路徑列表,因此如果您的 asm 文件編譯為foo.o ,您可以將其寫為

<*.native>: linkdep(toto_c.o,foo.o)

你的pdep規則應該是

pdep ["link"] "linkdep" (String.split_at_char ',')

如果您希望 ocamlbuild 從文件foo.s構建foo.o ,您還需要編寫一個用於組裝文件的規則,( ocamlbuild -documentation將向您顯示ocamlbuild已知的所有規則,我沒有找到任何規則*.s -> *.o模式)。

完全未經測試,但規則應該是這樣的,

let asm_rule () =
  let deps = ["%.s"] and prod = "%.o" in
  let action env _ =
    let src = env "%.s" and obj = env "%.o" in
    let tags = tags_of_pathname src ++ "compile" in
    Cmd (S [Sh "as"; T tags; P src; A "-o"; Px obj]) in
  rule "asm: s -> o" ~deps ~prod action

然后在Before_rules階段的dispatch中添加它,例如,

let () = dispatch (function
  | Before_rules -> 
    asm_rule ()
  | After_rules ->
    pdep ["link"] "linkdep" (String.split_on_char ',')
  | _ -> ())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM