69 lines
2.2 KiB
OCaml
69 lines
2.2 KiB
OCaml
|
|
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
|