2012-04-18 14 views
5

Tôi đang sử dụng camlp4.macro để bật biên dịch có điều kiện. Tôi đang gặp vấn đề thông báo cho OCamlbuild rằng một số tệp nhất định được gắn thẻ "use_jscore" phải được xử lý trước bằng tùy chọn camlp4 đã cho. Dưới đây là những gì tôi hiện có:Tùy chọn OCamlbuild và 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"]); 

Nhưng điều này được thoát hoàn toàn sai bởi OCamlbuild. Tôi đang sử dụng ocamlfind, do đó, về cơ bản những gì tôi muốn nói với OCamlbuild là tất cả các tệp OCaml được gắn thẻ với "use_jscore" phải được xử lý trước bởi camlp4.macro cũng được cung cấp tùy chọn -DUSE_JSCORE.

Trả lời

3

Bạn đang thiếu một lá cờ trong danh sách các cờ bạn đang so khớp với:

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

Thật vậy, bạn muốn sử dụng tùy chọn camlp4 của bạn chỉ khi bạn tính toán phụ thuộc (nơi "ocamldep" cờ được kích hoạt) và biên dịch (nơi cờ "biên dịch" được bật), nhưng không phải khi bạn sử dụng một bộ tiền xử lý (nơi cờ "trang" được bật) hoặc khi bạn liên kết (khi cờ "liên kết" được bật).

Vì vậy, bây giờ nếu bạn sử dụng ocamlbuild -use-ocamlfind <target> nó sẽ hoạt động chính xác.

+0

Nhưng sẽ không tôi phải lặp lại các tuyên bố tương tự chính xác nhưng với s/biên dịch/dep /? Có cách nào để tránh sự lặp lại? –

+0

Bạn nói đúng, bạn có thể phải lặp lại câu lệnh cho 'dep'. Bạn có thể lưu trữ nội dung của 'S (...)' trong một biến cục bộ nếu bạn không muốn lặp lại nó. – Thomas

4

Cách tiếp cận _tags và dòng lệnh cũng sẽ hoạt động, mặc dù nó sẽ không nhắm mục tiêu các tệp riêng lẻ.

Nội dung _tags:

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

dòng lệnh:

ocamlbuild -use-ocamlfind -cflags -ppopt,-DUSE_JSCORE ... 
Các vấn đề liên quan