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 строить.

Другие вопросы по тегам