2014-01-14 3 views
1

я работаю через LLVM ocaml tutorial, и используя следующую командную строку для компиляции:ocamlbuild включает дополнительные пакеты

ocamlbuild -cflags -g,-I,+llvm-3.4 -lflags -I,+llvm-3.4 toy.byte 

Есть ли способ, чтобы переместить эти дополнительные CFLAGS и LFLAGS в _tags или myocamlbuild.ml файлы, так что мне не нужно вводить их/хранить в исходном управлении/создавать воспроизводимые сборки?

Вот файл _tags:

<{lexer,parser}.ml>: use_camlp4, pp(camlp4of) 
<*.{byte,native}>: g++, use_llvm, use_llvm_analysis 
<*.{byte,native}>: use_llvm_executionengine, use_llvm_target 
<*.{byte,native}>: use_llvm_scalar_opts, use_bindings 

А вот файл myocamlbuild.ml:

open Ocamlbuild_plugin;; 

ocaml_lib ~extern:true "llvm";; 
ocaml_lib ~extern:true "llvm_analysis";; 
ocaml_lib ~extern:true "llvm_executionengine";; 
ocaml_lib ~extern:true "llvm_target";; 
ocaml_lib ~extern:true "llvm_scalar_opts";; 

flag ["link"; "ocaml"; "g++"] (S[A"-cc"; A"g++ -rdynamic"]);; 
dep ["link"; "ocaml"; "use_bindings"] ["bindings.o"];; 
+0

Посмотрите другие файлы 'myocamlbuild.ml' на github и других местах. Это - и ваш другой вопрос - довольно легко определить из этих образцов. – nlucaroni

+0

У вас должно быть другое определение «легко определить», чем я. – brooks94

ответ

2

я сделать что-то вроде ...

let mlflags = [] 
and cflags = [] 
and clibs = [] 

let rec arg_weave p = function 
    | x::xs -> (A p) :: (A x) :: arg_weave p xs 
    | [] -> [] 
and arg x = A x 
... 
let() = dispatch begin function 
    | After_rules -> 
    flag ["ocaml"; "compile"] (S (List.map arg mlflags)); 
    flag ["c"; "compile"]  (S (arg_weave "-ccopt" cflags)); 
    flag ["c"; "link"]  (S (arg_weave "-cclib" clibs)); 
    ... 
    end 

Другой вариант это отметить дополнительные параметры. Например, в файле ocaml_specific.ml у них есть одна настройка для отладки и все комбинации параметров флага, где опция важна.

flag ["ocaml"; "debug"; "compile"; "byte"] (A "-g");; 
flag ["ocaml"; "debug"; "link"; "byte"; "program"] (A "-g");; 
flag ["ocaml"; "debug"; "pack"; "byte"] (A "-g");; 
flag ["ocaml"; "debug"; "compile"; "native"] (A "-g");; 
flag ["ocaml"; "debug"; "link"; "native"; "program"] (A "-g");; 
flag ["ocaml"; "debug"; "pack"; "native"] (A "-g");; 

затем, в файле _tags, вы можете иметь true : debug, чтобы включить его для всех файлов, или true можно заменить шаблон для ограничения вариант. Поэтому, если опция уже не существует, вы можете создать свою собственную, и вы увидите, что она похожа на полное решение myocamlbuild.ml, но дополнительные флаги для каждого тега вместо того, чтобы включать их все сразу.

1

-g заменен на true: debug в _tags.

-I варианты в идеале должны быть заменены соответствующим пакетом ocamlfind, например. вызывая ocamlbuild -use-ocamlfind с указанием true: package(llvm,llvm_analysis) в _tags и/или любых других пакетах (и удалите ocaml_lib звонки в myocamlbuild.ml).

На стороне заметьте, просто создайте Makefile с любым вызовом ocamlbuild и вызовите make для сборки.

+0

Прошу прощения, я не очень понимаю первые две части вашего ответа. Не могли бы вы привести пример того, что вы говорите о re: -use-ocamlfind? – brooks94

+0

Трюк в make-файле - вот что я сейчас на месте. Это просто казалось глупым. – brooks94

+0

В файле _tags вы можете иметь строки 'true: debug',' true: dtypes', 'true: profile',' true: rectypes', 'true: bin_annot',' true: output_obj', ... to включите эти конкретные параметры. Вы также можете заменить 'true' шаблонами для определенных файлов. Это встроенные флаги в файле 'ocaml/ocamlbuild/ocaml_specific.ml'. – nlucaroni

Смежные вопросы