mte/unikernel/duniverse/dune_/bin/ocaml/doc.ml

69 lines
2.2 KiB
OCaml
Raw Normal View History

2025-11-11 02:07:51 +01:00
open Import
module Main = Import.Main
let doc = "Build and view the documentation of an OCaml project"
let man =
[ `S "DESCRIPTION"
; `P
{|$(b,dune ocaml doc) builds and then opens the documentation of an OCaml project in the users default browser.|}
; `Blocks Common.help_secs
]
;;
let info = Cmd.info "doc" ~doc ~man
let lock_odoc_if_dev_tool_enabled () =
match Lazy.force Lock_dev_tool.is_enabled with
| false -> Action_builder.return ()
| true -> Action_builder.of_memo (Lock_dev_tool.lock_dev_tool Odoc)
;;
let term =
let+ builder = Common.Builder.term in
let common, config = Common.init builder in
let request (setup : Main.build_system) =
let dir = Path.(relative root) (Common.prefix_target common ".") in
let open Action_builder.O in
let* () = lock_odoc_if_dev_tool_enabled () in
let+ () =
Alias.in_dir ~name:Dune_rules.Alias.doc ~recursive:true ~contexts:setup.contexts dir
|> Alias.request
in
let relative_toplevel_index_path =
let toplevel_index_path =
let is_default ctx = ctx |> Context.name |> Dune_engine.Context_name.is_default in
let doc_ctx = List.find_exn setup.contexts ~f:is_default in
Dune_rules.Odoc.Paths.toplevel_index doc_ctx
in
Path.(toplevel_index_path |> build |> to_string_maybe_quoted)
in
Console.print
[ Pp.textf "Docs built. Index can be found here: %s" relative_toplevel_index_path ];
match
let open Option.O in
let* cmd_name, args =
match Platform.OS.value with
| Darwin -> Some ("open", [])
| Other | FreeBSD | NetBSD | OpenBSD | Haiku | Linux -> Some ("xdg-open", [])
| Windows -> None
in
let+ open_command =
let path = Env_path.path Env.initial in
Bin.which ~path cmd_name
in
open_command, args @ [ relative_toplevel_index_path ]
with
| Some (cmd, args) ->
Proc.restore_cwd_and_execve (Path.to_absolute_filename cmd) args ~env:Env.initial
| None ->
User_warning.emit
[ Pp.text
"No browser could be found, you will have to open the documentation yourself."
]
in
Build.run_build_command ~common ~config ~request
;;
let cmd = Cmd.v info term