ocamlbuild включает дополнительные пакеты
Я работаю над учебником по LLVM ocaml и использую следующую командную строку для компиляции:
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"];;
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, но содержит дополнительные флаги для каждого тега вместо того, чтобы включать их все сразу.
-g
заменяется true: debug
в _tags
,
-I
параметры в идеале должны быть заменены на соответствующий пакет ocamlfind, например, вызов ocamlbuild -use-ocamlfind
и указав true: package(llvm,llvm_analysis)
в _tags
и / или как называются другие пакеты (и удалить ocaml_lib
звонит в myocamlbuild.ml
).
На заметке, просто создайте Makefile
с чем угодно ocamlbuild
вызов нужен и запустить make
строить.