Заставить 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?

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