2015-10-23 16 views
2

我试图使用ocamlbuild自动调用piqi来从protobuf定义生成ocaml模块。这是一个两步过程,我必须从%.protobuf文件到%.proto.piqi,最后到%_piqi.mlOcamlbuild通过依赖关系复制到_build

我的第一步规则如下所示:

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

回答

0

调用上的文件build从规则动作里将其注册为目标的动态依赖性的原文件。您可以循环遍历所有您可能会被当前目录访问的文件(或者匹配源目录,或者更聪明地说,如果这给出了任何好处,解析包含语句)以及它们。

(认为这个解决方案的另一种方法是此话的是,如果你想有通过从foo.proto.pp一些预处理步骤产生了一些foo.proto文件,那么你就需要任何编译需要foo.proto实际调用它的build。)

查看新手册草稿的dynamic dependencies部分。

P.S .:我对protobuf一无所知,但从protoc --help看起来好像protoc --include-imports --descriptor_set_out FILE可能会以某种格式给出.proto依赖关系的列表。解析并在所有这些电话上拨打build,并且您已经有了一个很好且强大的规则。