我想在生成的文档中包含源代码。当我像这样在命令行上调用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
但这仅包括没有相应接口(interface)文件的文件源-与here所说的相反,它看起来像
ocamlbuild
在存在.ml
文件时拒绝将ocamldoc
文件传递给.mli
。有办法哄骗ocamlbuild来做我想要的吗? 最佳答案
由于我需要破解一些东西来做类似的事情,因此,如果我将其发布为答案(至少直到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
文件中,应该从实现和接口(interface)生成文档的文件就可以解决问题。使用上面的代码,还可以通过添加诸如
merge(A)
之类的标签(合并所有标签)来添加合并选项。请注意,这是一种hack,可能会破坏复杂项目中的内容。值得注意的是,我没有使用
camlp[45]
处理过的文件,也没有使用4.0.1以外的OCamlbuild版本进行测试。关于ocaml - 使ocamlbuild将.ml和.mli文件都传递给ocamldoc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13828221/