我试图使用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
,您就得到了一个漂亮而健壮的规则。