Заставить ocamlbuild передавать файлы.ml и.mli в ocamldoc
Я хочу включить исходный код в мои сгенерированные документы. Это работает, когда я призываю ocamldoc
в командной строке вот так: ocamldoc -I _build -html -keep-code -colorize-code *.{ml,mli} -d .docdir
, Тем не менее, у меня проблемы с интеграцией этого с ocamlbuild
,
Я использую следующий код в myocamlbuild.ml
:
open Ocamlbuild_plugin;;
dispatch begin function
| After_options ->
Options.ocamldoc := S[A"ocamldoc"; A"-keep-code"; A"-colorize-code"]
| _ -> ()
end
Но это включает только исходный код для файлов без соответствующего файла интерфейса - в отличие от того, что здесь сказано, похоже ocamlbuild
отказывается проходить .ml
файлы в ocamldoc
когда есть .mli
файл присутствует. Есть ли способ заставить ocamlbuild делать то, что я хочу?
2 ответа
Поскольку мне нужно было что-то взломать, чтобы сделать схожие вещи, возможно, это поможет, если я опубликую это здесь как ответ (по крайней мере, до тех пор, пока это не будет реализовано в OCamlbuild). Итак, вот соответствующая часть моего myocamlbuild.ml
:
open Ocamlbuild_plugin;;
dispatch begin function
| After_rules ->
(* Using both .ml and .mli files to build documentation: *)
rule "ocaml: ml & mli -> odoc"
~insert:`top
~tags:["ocaml"; "doc"; "doc_use_interf_n_implem"]
~prod:"%.odoc"
(* "%.cmo" so that cmis of ml dependencies are already built: *)
~deps:["%.ml"; "%.mli"; "%.cmo"]
begin fun env build ->
let mli = env "%.mli" and ml = env "%.ml" and odoc = env "%.odoc" in
let tags =
(Tags.union (tags_of_pathname mli) (tags_of_pathname ml))
++"doc_use_interf_n_implem"++"ocaml"++"doc" in
let include_dirs = Pathname.include_dirs_of (Pathname.dirname ml) in
let include_flags =
List.fold_right (fun p acc -> A"-I" :: A p :: acc) include_dirs [] in
Cmd (S [!Options.ocamldoc; A"-dump"; Px odoc;
T (tags++"doc"++"pp"); S (include_flags);
A"-intf"; P mli; A"-impl"; P ml])
end;
(* Specifying merge options with tags: *)
pflag ["ocaml"; "doc"; "doc_use_interf_n_implem"] "merge"
(fun s -> S[A"-m"; A s]);
end
Затем добавив тег doc_use_interf_n_implem
в .ml
и / или .mli
файлы, для которых документация должна быть сгенерирована как из реализации, так и из интерфейса, должны делать свое дело.
С помощью приведенного выше кода добавление параметров слияния можно также выполнить, добавив теги, например, merge(A)
(объединить все).
Обратите внимание, что это хак, который может сломать вещи в сложных проектах. Примечательно, что я не проверял это с camlp[45]
-обработанные файлы, а также версии OCamlbuild, отличные от 4.00.1.
Кажется, что в настоящее время нет поддержки этого в OCamlbuild. Не могли бы вы отправить запрос функции для этого на bugtracker?