2012-04-18 28 views
5

我正在使用camlp4.macro啓用條件編譯。我有 問題通知OCamlbuild某些標記爲「use_jscore」 的文件必須使用給定的camlp4選項進行預處理。這是我目前有的:OCamlbuild和camlp4選項

let _ = dispatch begin function 
    | After_rules -> 
    flag ["ocaml"; "use_jscore"] (S[A"-package"; A"camlp4.macro"; A"-syntax"; A"camlp4o"; A"-ppopt"; A"-DUSE_JSCORE"]); 

但是這被OCamlbuild錯過了。我正在使用ocamlfind,因此我基本上想告訴OCamlbuild,所有標記爲 「use_jscore」的OCaml文件都必須由camlp4.macro進行預處理,該命令也會給出 -DUSE_JSCORE選項。

回答

3

您在標誌列表中缺少一個標誌你匹配:

let options = S[...] in 
flag ["ocaml"; "compile"; "use_jscore"] options; 
flag ["ocaml"; "ocamldep"; "use_jscore"] options 

事實上,你想,當你計算在啓用了「ocamldep」標誌的依賴(僅使用您的camlp4選項)和編譯(其中「編譯」標誌被啓用),但不是當你使用預處理器(其中「pp」標誌被啓用)或者當你鏈接時(當「鏈接」標誌被啓用時)。

所以,現在如果你使用ocamlbuild -use-ocamlfind <target>它應該正常工作。

+0

但不會有我要重複完全相同的語句,但與S /編譯/ DEP /?有沒有辦法避免重複? – 2012-04-18 18:16:12

+0

你是對的,你可能不得不重複'dep'語句。如果不想重複,可以將'S(...)'的內容存儲在局部變量中。 – Thomas 2012-04-18 21:53:32

4

一個_tags和命令行方法應該也可以,儘管它不會針對單個文件。

_tags的內容:

<*.*>: syntax(camlp4o), package(camlp4.macro) 

命令行:

ocamlbuild -use-ocamlfind -cflags -ppopt,-DUSE_JSCORE ...