diff --git a/CHANGES.md b/CHANGES.md index 07df077637..5b863b3463 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,12 @@ ### Changed - Drop support for OCaml < 4.08 (@jonludlam, #1300) +- Added suport for overriding tmp directories in odoc_driver_monorepo + (@jonludlam, #1304) + +### Fixed + +- Fix bug causing stack overflow in odoc_driver_monorepo (@jonludlam, #1304) # 3.0.0~beta1 diff --git a/src/driver/bin/odoc_driver.ml b/src/driver/bin/odoc_driver.ml index b4a8eef9db..e747a123b9 100644 --- a/src/driver/bin/odoc_driver.ml +++ b/src/driver/bin/odoc_driver.ml @@ -1,11 +1,6 @@ (* Odoc driver *) open Odoc_driver_lib -let with_dir dir pat f = - match dir with - | None -> Bos.OS.Dir.with_tmp pat f () |> Result.get_ok - | Some dir -> f dir () - let run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep ~generate_grep ~index_grep ~remap ~index_mld packages { @@ -17,7 +12,7 @@ let run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep odoc_md_bin; generate_json; _; - } = + } () = Option.iter (fun odoc_bin -> Odoc.odoc := Bos.Cmd.v odoc_bin) odoc_bin; Option.iter (fun odoc_md_bin -> Odoc.odoc_md := Bos.Cmd.v odoc_md_bin) @@ -135,38 +130,16 @@ let run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep if stats then Stats.bench_results html_dir -let run odoc_dir odocl_dir index_dir mld_dir compile_grep link_grep - generate_grep index_grep remap packages index_mld common () = - with_dir odoc_dir "odoc-%s" @@ fun odoc_dir () -> - with_dir odocl_dir "odocl-%s" @@ fun odocl_dir () -> - with_dir index_dir "index-%s" @@ fun index_dir () -> - with_dir mld_dir "mld-%s" @@ fun mld_dir () -> - let () = - run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep - ~generate_grep ~index_grep ~remap ~index_mld packages common +let run dirs compile_grep link_grep generate_grep index_grep remap packages + index_mld common : unit = + let fn = + run_inner ~compile_grep ~link_grep ~generate_grep ~index_grep ~remap + ~index_mld packages common in - () + Common_args.with_dirs dirs fn open Cmdliner -let odoc_dir = - let doc = "Directory in which the intermediate odoc files go" in - Arg.(value & opt (some Common_args.fpath_arg) None & info [ "odoc-dir" ] ~doc) - -let odocl_dir = - let doc = "Directory in which the intermediate odocl files go" in - Arg.( - value & opt (some Common_args.fpath_arg) None & info [ "odocl-dir" ] ~doc) - -let index_dir = - let doc = "Directory in which the intermediate index files go" in - Arg.( - value & opt (some Common_args.fpath_arg) None & info [ "index-dir" ] ~doc) - -let mld_dir = - let doc = "Directory in which the auto-generated mld files go" in - Arg.(value & opt (some Common_args.fpath_arg) None & info [ "mld-dir" ] ~doc) - let compile_grep = let doc = "Show compile commands containing the string" in Arg.( @@ -212,10 +185,10 @@ let index_mld = & info [ "index-mld" ] ~docv:"INDEX" ~doc) let cmd_term = + let module A = Common_args in Term.( - const run $ odoc_dir $ odocl_dir $ index_dir $ mld_dir $ compile_grep - $ link_grep $ generate_grep $ index_grep $ remap $ packages $ index_mld - $ Common_args.term $ const ()) + const run $ A.dirs_term $ compile_grep $ link_grep $ generate_grep + $ index_grep $ remap $ packages $ index_mld $ Common_args.term) let cmd = let doc = diff --git a/src/driver/bin/odoc_driver_monorepo.ml b/src/driver/bin/odoc_driver_monorepo.ml index e00e4fa39b..3edf4a54e3 100644 --- a/src/driver/bin/odoc_driver_monorepo.ml +++ b/src/driver/bin/odoc_driver_monorepo.ml @@ -6,7 +6,7 @@ open Odoc_driver_lib -let run path extra_pkgs extra_libs +let real_run ~odoc_dir ~odocl_dir ~index_dir ~mld_dir path extra_pkgs extra_libs { Common_args.verbose; html_dir; @@ -16,16 +16,12 @@ let run path extra_pkgs extra_libs odoc_md_bin; generate_json; _; - } = + } () = Option.iter (fun odoc_bin -> Odoc.odoc := Bos.Cmd.v odoc_bin) odoc_bin; Option.iter (fun odoc_md_bin -> Odoc.odoc_md := Bos.Cmd.v odoc_md_bin) odoc_md_bin; - let odoc_dir = Fpath.v "_odoc" in - let odocl_dir = Fpath.v "_odocl" in - let mld_dir = Fpath.v "_mld" in - let index_dir = Fpath.v "_index" in let _ = Voodoo.find_universe_and_version "foo" in Eio_main.run @@ fun env -> Eio.Switch.run @@ fun sw -> @@ -86,6 +82,10 @@ let run path extra_pkgs extra_libs if stats then Stats.bench_results html_dir +let run dirs path extra_pkgs extra_libs common : unit = + let fn = real_run path extra_pkgs extra_libs common in + Common_args.with_dirs dirs fn + open Cmdliner let path = @@ -106,7 +106,10 @@ let extra_libs = let cmd = let doc = "Generate documentation from a dune monorepo" in let info = Cmd.info "odoc_driver_monorepo" ~doc in + let module A = Common_args in Cmd.v info - Term.(const run $ path $ extra_pkgs $ extra_libs $ Common_args.term) + Term.( + const run $ A.dirs_term $ path $ extra_pkgs $ extra_libs + $ Common_args.term) let _ = exit (Cmd.eval cmd) diff --git a/src/driver/common_args.ml b/src/driver/common_args.ml index 90448815cf..cfc8f78da1 100644 --- a/src/driver/common_args.ml +++ b/src/driver/common_args.ml @@ -46,6 +46,22 @@ let generate_json = Arg.( value & flag & info [ "json-output" ] ~doc ~docs:Manpage.s_common_options) +let odoc_dir = + let doc = "Directory in which the intermediate odoc files go" in + Arg.(value & opt (some fpath_arg) None & info [ "odoc-dir" ] ~doc) + +let odocl_dir = + let doc = "Directory in which the intermediate odocl files go" in + Arg.(value & opt (some fpath_arg) None & info [ "odocl-dir" ] ~doc) + +let index_dir = + let doc = "Directory in which the intermediate index files go" in + Arg.(value & opt (some fpath_arg) None & info [ "index-dir" ] ~doc) + +let mld_dir = + let doc = "Directory in which the auto-generated mld files go" in + Arg.(value & opt (some fpath_arg) None & info [ "mld-dir" ] ~doc) + type t = { verbose : bool; html_dir : Fpath.t; @@ -56,10 +72,35 @@ type t = { generate_json : bool; } +type dirs = { + odoc_dir : Fpath.t option; + odocl_dir : Fpath.t option; + mld_dir : Fpath.t option; + index_dir : Fpath.t option; +} + +let with_dirs dirs fn : unit = + let with_dir = Util.with_dir in + let { odoc_dir; odocl_dir; mld_dir; index_dir } = dirs in + with_dir odoc_dir "odoc-%s" @@ fun odoc_dir () -> + with_dir odocl_dir "odocl-%s" @@ fun odocl_dir () -> + with_dir index_dir "index-%s" @@ fun index_dir () -> + with_dir mld_dir "mld-%s" @@ fun mld_dir () -> + fn ~odoc_dir ~odocl_dir ~index_dir ~mld_dir () + +open Term + +let ( let+ ) t f = const f $ t +let ( and+ ) a b = const (fun x y -> (x, y)) $ a $ b + +let dirs_term = + let+ odoc_dir = odoc_dir + and+ odocl_dir = odocl_dir + and+ mld_dir = mld_dir + and+ index_dir = index_dir in + { odoc_dir; odocl_dir; mld_dir; index_dir } + let term = - let open Term in - let ( let+ ) t f = const f $ t in - let ( and+ ) a b = const (fun x y -> (x, y)) $ a $ b in let+ verbose = verbose and+ html_dir = html_dir and+ stats = stats diff --git a/src/driver/monorepo_style.ml b/src/driver/monorepo_style.ml index bc0559dbdb..4088e36019 100644 --- a/src/driver/monorepo_style.ml +++ b/src/driver/monorepo_style.ml @@ -102,13 +102,13 @@ let of_dune_build dir ~extra_pkgs ~extra_libs = let all_lib_deps = List.fold_left (fun acc (l : library) -> - Util.StringMap.add l.name - ("stdlib" - :: List.filter_map - (fun uid -> Util.StringMap.find_opt uid uid_to_libname) - l.requires - |> Util.StringSet.of_list) - acc) + let libs = + List.filter_map + (fun uid -> Util.StringMap.find_opt uid uid_to_libname) + l.requires + in + let libs = if l.name = "stdlib" then libs else "stdlib" :: libs in + Util.StringMap.add l.name (libs |> Util.StringSet.of_list) acc) Util.StringMap.empty (local_libs @ global_libs) in diff --git a/src/driver/util.ml b/src/driver/util.ml index 305e029980..08b8a56311 100644 --- a/src/driver/util.ml +++ b/src/driver/util.ml @@ -4,6 +4,11 @@ open Bos module StringSet = Set.Make (String) module StringMap = Map.Make (String) +let with_dir dir pat f = + match dir with + | None -> OS.Dir.with_tmp pat f () |> Result.get_ok + | Some dir -> f dir () + let lines_of_channel ic = let rec inner acc = try