2015-10-23 15 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,並且您已經有了一個很好且強大的規則。