处理OCaml项目中的C代码依赖关系

处理OCaml项目中的C代码依赖关系,ocaml,ocamlbuild,Ocaml,Ocamlbuild,我正在使用ocamlbuild来构建我的OCaml项目,该项目使用外部C库“cstub”。我在网上找到了一个非常好的解决方案,使用ocamlbuild-in将C库包括在编译过程中(添加pdep[“link”]“linkdep”(fun param->[param]);行到myocamlbuild.ml) 但是,我的C库本身有一个外部ASM依赖项,上面的解决方案无法捕获它。它无法与ASM函数链接,因为它未与ASM文件一起编译。因此,我的问题是:在编译C程序时,有没有一种方法可以调整上面给出的向AS

我正在使用ocamlbuild来构建我的OCaml项目,该项目使用外部C库“cstub”。我在网上找到了一个非常好的解决方案,使用ocamlbuild-in将C库包括在编译过程中(添加
pdep[“link”]“linkdep”(fun param->[param]);
行到
myocamlbuild.ml

但是,我的C库本身有一个外部ASM依赖项,上面的解决方案无法捕获它。它无法与ASM函数链接,因为它未与ASM文件一起编译。因此,我的问题是:在编译C程序时,有没有一种方法可以调整上面给出的向ASM文件添加支持的建议?例如,是否有额外的参数要添加到
pdep
命令以支持额外的编译功能


提前非常感谢

所有构建相关问题的默认前言。如果你有选择的话可以考虑使用。OCamlBuild即将退役,因此不要期望在这方面有太多帮助,也不要期望有好的现代文档。话虽如此,我明白这并不总是一个选项,我自己也在为我的主要项目使用
ocamlbuild

因此,您添加到ocamlbuild插件的
pdep
规则采用了一个参数,例如

<*.native>: linkdep(toto_c.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 ',')
  | _ -> ())

所有构建相关问题的默认前言。如果你有选择的话可以考虑使用。OCamlBuild即将退役,因此不要期望在这方面有太多帮助,也不要期望有好的现代文档。话虽如此,我明白这并不总是一个选项,我自己也在为我的主要项目使用
ocamlbuild

因此,您添加到ocamlbuild插件的
pdep
规则采用了一个参数,例如

<*.native>: linkdep(toto_c.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 ',')
  | _ -> ())

dune
是事实上的ocaml构建系统。。。考虑使用它使事情变得简单。
dune
是事实上的ocaml构建系统。。。考虑使用它使事情变得简单。