我正在尝试构建一个 OCaml 二进制文件main.native
,main.ml
它也依赖于单个 C 文件custom.c
来实现一个新的原语。这个 C 文件需要编译和链接。有没有办法只用一个_tags
文件来做到这一点?明显的问题是 OCamlbuild 在扫描时没有检测到依赖关系main.ml
,因此需要明确告知依赖关系。
ocamlbuild main.native
OCamlbuild 知道将 *.c 文件编译为 *.o 文件的规则,但我不知道如何添加依赖项。
我正在尝试构建一个 OCaml 二进制文件main.native
,main.ml
它也依赖于单个 C 文件custom.c
来实现一个新的原语。这个 C 文件需要编译和链接。有没有办法只用一个_tags
文件来做到这一点?明显的问题是 OCamlbuild 在扫描时没有检测到依赖关系main.ml
,因此需要明确告知依赖关系。
ocamlbuild main.native
OCamlbuild 知道将 *.c 文件编译为 *.o 文件的规则,但我不知道如何添加依赖项。
第一件事是您需要标记main.native
as 以创建对 c-stub 的依赖关系并相应地链接。(顺便说一句,这假设 c-library 被称为cstub
,但它可以是你想要的任何东西)。
_tags
:
<*.{byte,native}> : use_cstub
<**/*.cm{x,}a> : use_cstub
然后,在myocamlbuild.ml
创建 c 库对标记的事物的依赖项时,
dep ["link";"ocaml";"use_cstub"] ["libcstub.a"]
OCamlbuild 具有创建库文件(*.so 和 *.a)的规则,但您需要在文件中添加要构建的.clib
文件列表,
cstub.clib
:
cobjfile1.o
cobjfile2.o
...
任何头文件也需要从主目录复制到_build/
目录。这是通过指定它们是对 c 中编译的依赖来完成的(在 中myocamlbuild.ml
,其中headers
是命名项目中的头文件的字符串列表。
dep ["c"; "compile"] headers;
最后,在我们将项目与 c-stub 库链接时添加标志(也在 中myocamlbuild.ml
),
flag ["link";"ocaml";"use_cstub"] (S[A"-dllib";A"-lcstub";A"-cclib";A"-lcstub"]);
我已接受上述答案,但想记录解决方案。正如评论中提到的,我使用以下方法创建了一个新的参数化linkdep()
标签myocamlbuild.ml
:
open Ocamlbuild_plugin;;
dispatch
( function
| After_rules -> pdep ["link"] "linkdep" (fun param -> [param])
| _ -> ()
)
新创建的标签用于_tags
添加链接依赖:
<*.ml>: annot
<*.byte>: linkdep(custom_unix_stubs.o),custom
<*.native>: linkdep(custom_unix_stubs.o)
这依赖于内置规则将 C 文件编译为目标文件。但是,这仍然会错过对头文件的依赖(我没有)。