Ocamlbuild将依赖复制到_build



我试图使用ocamlbuild来自动调用piqi从protobuf定义生成ocaml模块。这是一个两步的过程,我必须从%.protobuf文件到%.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文件在源目录中相互导入。但是,我不确定如何在ocamlbuild中表达它们之间的依赖关系。如果所有的原始文件都复制到_build,而不仅仅是~dep

从规则操作内部调用文件上的build将把它注册为目标的动态依赖项。您可以循环遍历所有您知道可能被当前文件访问的*.proto文件(可以将源目录全局化,或者更聪明的是,如果有任何好处,可以解析include语句)并将它们build

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

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

注::我对protobuf一无所知,但从protoc --help来看,protoc --include-imports --descriptor_set_out FILE可能会以某种格式给你.proto依赖项的列表。解析它并对它们调用build,您就得到了一个漂亮而健壮的规则。

相关内容

最新更新