关于 ocaml:Ocamlbuild 将依赖项复制到 _build

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,你就有了一个很好且健壮的规则。