我尝试使用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"我的源目录中的文件,因为各个.proto
文件在源中相互导入。但是,我不确定如何在ocamlbuild中表达它们之间的这种依赖关系。如果将所有原始文件复制到_build
而不仅仅是~dep
答案 0 :(得分:0)
从规则操作内部对文件调用build
会将其注册为目标的动态依赖关系。你可以循环遍历你知道可能被当前文件访问的所有*.proto
文件(或者使用源目录,或者更巧妙地,如果它有任何好处,解析include语句)和build
它们
(考虑这个解决方案的另一种方法是注意,如果你想通过foo.proto
的某些预处理步骤生成一些foo.proto.pp
文件,那么你需要任何编译需要{{} 1}}实际上在其上调用foo.proto
。)
请参阅新手册草稿的dynamic dependencies部分。
P.S。:我对protobuf一无所知,但是从build
看来protoc --help
可能会以某种格式给出protoc --include-imports --descriptor_set_out FILE
依赖项的列表。解析它并在所有这些上调用.proto
,并且你有一个很好的强大规则。