Skip to content

Commit 26168b7

Browse files
committed
Add dune-style input style
Use as: odoc_driver --dune-style _build/default
1 parent 138a570 commit 26168b7

File tree

10 files changed

+93
-31
lines changed

10 files changed

+93
-31
lines changed

src/driver/compile.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ let compile partial ~output_dir ?linked_dir all =
135135
let odoc_file = Fpath.(output_dir // modty.m_intf.mif_odoc_file) in
136136
let odocl_file = Fpath.(linked_dir // modty.m_intf.mif_odocl_file) in
137137
let fibers =
138-
List.map
138+
Fiber.List.map
139139
(fun (n, h) ->
140140
match compile_other h with
141141
| Ok r -> Some r
@@ -202,7 +202,7 @@ let compile partial ~output_dir ?linked_dir all =
202202
result
203203
in
204204
let to_build = Util.StringMap.bindings hashes |> List.map fst in
205-
let mod_results = List.map compile to_build in
205+
let mod_results = Fiber.List.map compile to_build in
206206
let zipped_res = List.map2 (fun a b -> (a,b)) to_build mod_results in
207207
let zipped = List.filter_map (function (a, Ok b) -> Some (a,b) | _ -> None) zipped_res in
208208
let mods =

src/driver/dune_style.ml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
(* Dune build tree *)
2+
3+
let of_dune_build dir =
4+
let contents = Bos.OS.Dir.fold_contents ~dotfiles:true
5+
(fun p acc ->
6+
p::acc
7+
) [] Fpath.(v dir) in
8+
match contents with
9+
| Error _ -> Util.StringMap.empty
10+
| Ok c ->
11+
let sorted = List.sort (fun p1 p2 -> Fpath.compare p1 p2) c in
12+
let libs = List.filter_map (fun x ->
13+
match Fpath.segs x |> List.rev with
14+
| "byte" :: libname :: path ->
15+
let sz = String.length ".objs" in
16+
if Astring.String.is_suffix ~affix:".objs" libname && String.length libname > sz + 1 && libname.[0] = '.'
17+
then
18+
let libname = String.sub libname 1 (String.length libname - sz - 1) in
19+
Some (libname, Fpath.(v (String.concat dir_sep (List.rev path))))
20+
else None
21+
| _ -> None) sorted in
22+
let libs = List.map (fun (libname, path) ->
23+
let cmtidir = Fpath.(path / Printf.sprintf ".%s.objs" libname / "byte") in
24+
match Fpath.rem_prefix (Fpath.v dir) path with
25+
| Some pkg_dir ->
26+
(pkg_dir, Packages.Lib.v pkg_dir (Util.StringMap.singleton libname libname) libname path (Some cmtidir))
27+
| None -> failwith "Error") libs
28+
in
29+
let packages = List.filter_map (fun (pkg_dir, lib) ->
30+
match lib with
31+
| [lib] ->
32+
Some (lib.Packages.lib_name, {
33+
Packages.name = lib.Packages.lib_name;
34+
version="1.0";
35+
libraries=[lib];
36+
mlds = [];
37+
mld_odoc_dir = Fpath.v lib.Packages.lib_name;
38+
pkg_dir;
39+
other_docs = Fpath.Set.empty;
40+
})
41+
| _ -> None) libs in
42+
Util.StringMap.of_list packages

src/driver/ocamlobjinfo.ml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ let source_possibilities file =
1717
[ Astring.String.take ~max:pos file ^ "ml" ]
1818
else []
1919
in
20-
default @ generated @ pp
20+
pp @ default @ generated
2121

22-
let get_source file =
22+
let get_source file srcdirs =
2323
let cmd = Cmd.(ocamlobjinfo % p file) in
2424
let lines_res =
2525
Worker_pool.submit ("Ocamlobjinfo " ^ Fpath.to_string file) cmd None
@@ -43,14 +43,16 @@ let get_source file =
4343
(String.length line - String.length affix)
4444
in
4545
let name = Fpath.(filename (v name)) in
46-
let dir, _ = Fpath.split_base file in
4746
let possibilities =
48-
List.map
49-
(fun poss -> Fpath.(dir / poss))
50-
(source_possibilities name)
47+
List.map (fun dir ->
48+
List.map
49+
(fun poss -> Fpath.(dir / poss))
50+
(source_possibilities name)) srcdirs |> List.flatten
5151
in
5252
List.find_opt
53-
(fun f -> Sys.file_exists (Fpath.to_string f))
53+
(fun f ->
54+
Logs.debug (fun m -> m "src: checking %a" Fpath.pp f);
55+
Sys.file_exists (Fpath.to_string f))
5456
possibilities
5557
else None)
5658
lines

src/driver/ocamlobjinfo.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
val get_source : Fpath.t -> Fpath.t option
1+
val get_source : Fpath.t -> Fpath.t list -> Fpath.t option
22
(** use [ocamlobjinfo] binary to read the input compiled file and try to find
33
the source file *)

src/driver/odoc.ml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ let source_tree ?(ignore_output = false) ~parent ~output file =
182182
Cmd_outputs.(
183183
add_prefixed_output cmd source_tree_output (Fpath.to_string file) lines)
184184

185-
let classify dir =
185+
let classify dirs =
186186
let open Cmd in
187-
let cmd = !odoc % "classify" % p dir in
188-
let desc = Printf.sprintf "Classifying %s" (Fpath.to_string dir) in
187+
let cmd = List.fold_left (fun cmd d -> cmd % p d) (!odoc % "classify") dirs in
188+
let desc = Format.asprintf "Classifying [%a]" (Fmt.(list ~sep:sp) Fpath.pp) dirs in
189189
let lines =
190190
Cmd_outputs.submit desc cmd None |> List.filter (fun l -> l <> "")
191191
in

src/driver/odoc.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ val odoc : Bos.Cmd.t ref
1111

1212
type compile_deps = { digest : Digest.t; deps : (string * Digest.t) list }
1313
val compile_deps : Fpath.t -> (compile_deps, [> `Msg of string ]) result
14-
val classify : Fpath.t -> (string * string list) list
14+
val classify : Fpath.t list -> (string * string list) list
1515
val compile_impl :
1616
output_dir:Fpath.t ->
1717
input_file:Fpath.t ->

src/driver/odoc_driver.ml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ let render_stats env nprocs =
497497
in
498498
inner (0, 0, 0, 0, 0, 0, 0, 0))
499499

500-
let run libs verbose packages_dir odoc_dir odocl_dir html_dir stats nb_workers odoc_bin voodoo package_name blessed =
500+
let run libs verbose packages_dir odoc_dir odocl_dir html_dir stats nb_workers odoc_bin voodoo package_name blessed dune_style =
501501
Odoc.odoc := Bos.Cmd.v odoc_bin;
502502
let _ = Voodoo.find_universe_and_version "foo" in
503503
Eio_main.run @@ fun env ->
@@ -511,7 +511,10 @@ let run libs verbose packages_dir odoc_dir odocl_dir html_dir stats nb_workers o
511511
match package_name with
512512
| Some p -> Voodoo.of_voodoo p blessed
513513
| None -> failwith "Need a package name for voodoo"
514-
else
514+
else match dune_style with
515+
| Some dir ->
516+
Dune_style.of_dune_build dir
517+
| None ->
515518
let libs =
516519
if libs = [] then Ocamlfind.all ()
517520
else libs
@@ -623,13 +626,16 @@ let blessed =
623626
let doc = "Blessed" in
624627
Arg.(value & flag & info ["blessed"] ~doc)
625628

629+
let dune_style =
630+
let doc = "Dune style" in
631+
Arg.(value & opt (some string) None & info ["dune-style"] ~doc)
626632

627633
let cmd =
628634
let doc = "Generate odoc documentation" in
629635
let info = Cmd.info "odoc_driver" ~doc in
630636
Cmd.v info
631637
Term.(
632-
const run $ packages $ verbose $ packages_dir $ odoc_dir $ odocl_dir $ html_dir $ stats $ nb_workers $ odoc_bin $ voodoo $ package_name $ blessed)
638+
const run $ packages $ verbose $ packages_dir $ odoc_dir $ odocl_dir $ html_dir $ stats $ nb_workers $ odoc_bin $ voodoo $ package_name $ blessed $ dune_style)
633639

634640
(* let map = Ocamlfind.package_to_dir_map () in
635641
let _dirs = List.map (fun lib -> List.assoc lib map) deps in

src/driver/packages.ml

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ let pp_mld fmt m = Format.fprintf fmt "%a" Fpath.pp m.mld_path
4848

4949
type libty = {
5050
lib_name : string;
51-
dir : Fpath.t;
5251
odoc_dir : Fpath.t; (* Relative to [odoc] dir *)
5352
archive_name : string;
5453
modules : modulety list;
@@ -90,7 +89,8 @@ module Module = struct
9089

9190
let is_hidden name = Astring.String.is_infix ~affix:"__" name
9291

93-
let vs pkg_dir lib_name dir modules =
92+
let vs pkg_dir lib_name libsdir cmtidir modules =
93+
let dir = match cmtidir with | None -> libsdir | Some dir -> dir in
9494
let mk m_name =
9595
let exists ext =
9696
let p =
@@ -136,8 +136,16 @@ module Module = struct
136136
// add_ext "odoc" (v ("impl-" ^ String.uncapitalize_ascii m_name)))
137137
in
138138
let mip_odocl_file = Fpath.(set_ext "odocl" mip_odoc_file) in
139+
140+
(* Directories in which we should look for source files *)
141+
let src_dirs =
142+
match cmtidir with
143+
| None -> [libsdir]
144+
| Some d2 -> [libsdir; d2]
145+
in
146+
139147
let mip_src_info =
140-
match Ocamlobjinfo.get_source mip_path with
148+
match Ocamlobjinfo.get_source mip_path src_dirs with
141149
| None ->
142150
Logs.debug (fun m -> m "No source found for module %s" m_name);
143151
None
@@ -174,10 +182,15 @@ end
174182

175183
module Lib = struct
176184

177-
let v pkg_dir libname_of_archive pkg_name dir =
185+
let v pkg_dir libname_of_archive pkg_name dir cmtidir =
178186
Logs.debug (fun m ->
179187
m "Classifying dir %a for package %s" Fpath.pp dir pkg_name);
180-
let results = Odoc.classify dir in
188+
let dirs =
189+
match cmtidir with
190+
| None -> [dir]
191+
| Some dir2 -> [dir; dir2]
192+
in
193+
let results = Odoc.classify dirs in
181194
Logs.debug (fun m ->
182195
m "Got %d lines" (List.length results));
183196
List.filter_map
@@ -200,11 +213,11 @@ module Lib = struct
200213
);
201214
archive_name
202215
in
203-
let modules = Module.vs pkg_dir lib_name dir modules in
216+
let modules = Module.vs pkg_dir lib_name dir cmtidir modules in
204217
let odoc_dir =
205218
parent_of_lib pkg_dir lib_name
206219
in
207-
Some { lib_name; dir; odoc_dir; archive_name; modules }
220+
Some { lib_name; odoc_dir; archive_name; modules }
208221
with
209222
| _ ->
210223
Logs.err (fun m ->
@@ -213,8 +226,8 @@ module Lib = struct
213226
results
214227

215228
let pp ppf t =
216-
Fmt.pf ppf "path: %a archive: %a modules: [@[<hov 2>@,%a@]@,]" Fpath.pp
217-
t.dir Fmt.string t.archive_name
229+
Fmt.pf ppf "archive: %a modules: [@[<hov 2>@,%a@]@,]"
230+
Fmt.string t.archive_name
218231
Fmt.(list ~sep:sp Module.pp)
219232
t.modules
220233
end
@@ -365,7 +378,7 @@ let of_libs packages_dir libs =
365378
| Some pkg ->
366379
let pkg_dir = pkg_dir packages_dir pkg.name in
367380

368-
let libraries = Lib.v pkg_dir libname_of_archive pkg.name dir in
381+
let libraries = Lib.v pkg_dir libname_of_archive pkg.name dir None in
369382
let libraries =
370383
List.filter
371384
(fun l -> Util.StringSet.mem l.archive_name archives)

src/driver/packages.mli

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ val pp_mld : Format.formatter -> mld -> unit
6161

6262
type libty = {
6363
lib_name : string;
64-
dir : Fpath.t;
6564
odoc_dir : Fpath.t; (** Relative to dir where all odoc files are, e.g. [_odoc/] by default *)
6665
archive_name : string;
6766
modules : modulety list;
@@ -88,5 +87,5 @@ val parent_of_pkg : Fpath.t -> Fpath.t
8887

8988
module Lib : sig
9089

91-
val v : Fpath.t -> string Util.StringMap.t -> string -> Fpath.t -> libty list
90+
val v : Fpath.t -> string Util.StringMap.t -> string -> Fpath.t -> Fpath.t option -> libty list
9291
end

src/driver/voodoo.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ let process_package pkg =
117117
Logs.debug (fun m -> m "%s,%s\n%!" k v)) libname_of_archive;
118118
Some (List.map (fun directory ->
119119
Format.eprintf "Processing directory: %a\n%!" Fpath.pp directory;
120-
Packages.Lib.v (top_dir pkg) libname_of_archive pkg.name directory) Fpath.(Set.to_list directories)))
120+
Packages.Lib.v (top_dir pkg) libname_of_archive pkg.name directory None) Fpath.(Set.to_list directories)))
121121
metas in
122122
(* Check the main package lib directory even if there's no meta file *)
123123
let extra_libraries =
@@ -131,7 +131,7 @@ let extra_libraries =
131131
in
132132
List.map (fun libdir ->
133133
Logs.debug (fun m -> m "Processing directory without META: %a" Fpath.pp libdir);
134-
Packages.Lib.v (top_dir pkg) Util.StringMap.empty pkg.name Fpath.(pkg_path // libdir)) libdirs_without_meta
134+
Packages.Lib.v (top_dir pkg) Util.StringMap.empty pkg.name Fpath.(pkg_path // libdir) None) libdirs_without_meta
135135
in
136136
Printf.eprintf "Found %d metas" (List.length metas);
137137
let mld_odoc_dir = Packages.parent_of_pkg (top_dir pkg) in

0 commit comments

Comments
 (0)