2

我正在尝试使用 ocamlbuild 自动调用piqi从 protobuf 定义中生成 ocaml 模块。这是一个 2 步过程,我必须从%.protobuf文件转到 a %.proto.piqi,最后转到%_piqi.ml.

我的第一步规则如下:

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

4

1 回答 1

1

从规则操作内部调用build文件会将其注册为目标的动态依赖项。您可以遍历所有*.proto您知道当前文件可能访问的文件(或者通配源目录,或者更巧妙地,如果这有任何好处,则解析包含语句)和build它们。

(考虑此解决方案的另一种方法是注意,如果您想foo.proto通过 a 的某些预处理步骤生成一些文件foo.proto.pp,那么您将需要任何需要foo.proto实际调用build它的编译。)

请参阅新手册草案的动态依赖项部分。

PS:我对protobuf一无所知,但protoc --help看起来protoc --include-imports --descriptor_set_out FILE可能会给你.proto某种格式的依赖项列表。解析它并调用build所有这些,你就有了一个很好且强大的规则。

于 2015-10-29T14:08:45.333 回答