2012-04-18 3 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, состоит в том, что все файлы OCaml с тегами «use_jscore» должны быть предварительно обработаны camlp4.macro, которому также предоставляется опция -DUSE_JSCORE.

ответ

3

Вы пропускаете флаг в списке флаг вы сопрягать с:

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

В самом деле, вы хотите использовать параметры camlp4 только при вычислении зависимости (где включен флаг «ocamldep») и скомпилировать (где включен флаг «компиляция»), но не при использовании препроцессора (где включен флаг «pp») или когда вы связываете (когда включен флаг «link»).

Итак, теперь, если вы используете ocamlbuild -use-ocamlfind <target>, он должен работать правильно.

+0

Но не я должен повторить точно такое же заявление, но с s/компиляции/DEP /? Есть ли способ избежать повторения? –

+0

Вы правы, вам, возможно, придется повторить заявление для 'dep'. Вы можете хранить содержимое 'S (...)' в локальной переменной, если вы не хотите его повторять. – Thomas

4

Подход к _tags и командной строке также должен работать, хотя он не будет нацелен на отдельные файлы.

Содержание _tags:

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

Командная строка:

ocamlbuild -use-ocamlfind -cflags -ppopt,-DUSE_JSCORE ... 
Смежные вопросы