Ocamlbuild将依赖项复制到_build

Ocamlbuild将依赖项复制到_build,ocaml,ocamlbuild,Ocaml,Ocamlbuild,我试图使用ocamlbuild自动调用,从protobuf定义生成ocaml模块。这是一个两步过程,我必须从%.protobuf文件到%.proto.piqi,最后到%\u piqi.ml 我的第一步规则如下所示: rule "piqi: .proto -> .piqi" ~dep:"%.proto" ~prod:"%.proto.piqi" begin fun env build -> Cmd (S [ A piqi ; A "of-proto"

我试图使用ocamlbuild自动调用,从protobuf定义生成ocaml模块。这是一个两步过程,我必须从
%.protobuf
文件到
%.proto.piqi
,最后到
%\u 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中表达它们之间的依赖关系。如果复制到
\u build
的所有原型文件,而不仅仅是
~dep
中的一个,从规则操作内部对文件调用
build
,将其注册为目标的动态依赖项,这就足够了。您只需遍历当前目录可能访问的所有
*.proto
文件(可以全局搜索源目录,或者更聪明地分析include语句),然后
构建它们

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

请参阅新手册草稿的一节

注:我对protobuf一无所知,但从
protoc--help
看,它似乎是
protoc--include imports--descriptor\u set\u out FILE
可以以某种格式为您提供
.proto
依赖项列表。解析并调用
build
,您就得到了一个好的、健壮的规则