Ocamlbuild copy over dependencies to _build
我正在尝试使用 ocamlbuild 自动调用 piqi 以从 protobuf 定义生成 ocaml 模块。这是一个两步过程,我必须从 %.protobuf 文件到 %.proto.piqi,最后到 %_piqi.ml.
我的第一步规则如下:
1 2 3 4 5 6 7 8 9
| rule"piqi: .proto -> .piqi"
~dep:"%.proto"
~prod:"%.proto.piqi"
begin fun env build ->
Cmd (S [ A piqi ; A"of-proto"
; A"-I"; P protobuf_include
; P (env"%.proto") ]
)
end; |
但这不起作用,因为 %.proto.piqi 目标实际上依赖于我的源目录中的所有"*.proto"文件,因为各个 .proto 文件在源中相互导入。但是,我不确定如何在 ocamlbuild 中表达它们之间的这种依赖关系。如果将所有原始文件都复制到 _build 而不仅仅是 ~dep
中的一个就足够了
从规则操作内部对文件调用 build 会将其注册为目标的动态依赖项。您可以遍历所有您知道当前文件可能访问的 *.proto 文件(通配源目录,或者更巧妙地,如果这有任何好处,则解析包含语句)和 build 它们。
(考虑这个解决方案的另一种方法是注意,如果你想通过 foo.proto.pp 的一些预处理步骤生成一些 foo.proto 文件,那么你需要任何需要 foo.proto 的编译才能实际调用build 就可以了。)
参见新手册草案的动态依赖部分。
P.S.:我对 protobuf 一无所知,但从 protoc --help 看来,protoc --include-imports --descriptor_set_out FILE 可能会以某种格式为您提供 .proto 依赖项的列表。解析它并在所有它们上调用 build,你就有了一个很好且健壮的规则。