首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使ocamlbuild同时将.ml和.mli文件传递给ocamldoc

使ocamlbuild同时将.ml和.mli文件传递给ocamldoc
EN

Stack Overflow用户
提问于 2012-12-12 04:44:21
回答 2查看 695关注 0票数 8

我想在我生成的文档中包含源代码。当我像这样在命令行上调用ocamldoc时,这是有效的:ocamldoc -I _build -html -keep-code -colorize-code *.{ml,mli} -d .docdir。但是,我在将其与ocamlbuild集成时遇到了问题。

我在myocamlbuild.ml中使用了以下代码

代码语言:javascript
复制
open Ocamlbuild_plugin;;

dispatch begin function
  | After_options ->
      Options.ocamldoc := S[A"ocamldoc"; A"-keep-code"; A"-colorize-code"]
  | _ -> ()
end

但这只包括没有相应接口文件的文件的源代码-与所说的here相反,当存在.ml文件时,看起来ocamlbuild拒绝将ocamldoc文件传递给.mli。有没有办法诱使ocamlbuild做我想做的事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-07 21:13:41

因为我需要破解一些东西来做类似的事情,如果我把它作为答案发布在这里可能会有所帮助(至少在OCamlbuild提供这个功能之前是这样)。所以,下面是我的myocamlbuild.ml的相关部分

代码语言:javascript
复制
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]-processed文件测试它,也没有使用4.00.1以外的OCamlbuild版本进行测试。

票数 4
EN

Stack Overflow用户

发布于 2012-12-12 23:21:41

目前在OCamlbuild中似乎还没有对此的支持。您可以提交此on the bugtracker的功能请求吗

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13828221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档