Skip to content

Commit bb95755

Browse files
committed
Refactor Lib_file_deps handling
* Move setting up glob aliases to Lib_file_deps * Allow only fixed number of extensions as we only setup a few of them * Do not setup extraneous dependencies for cmo's Signed-off-by: Rudi Grinberg <[email protected]>
1 parent 2e96c6b commit bb95755

File tree

4 files changed

+101
-64
lines changed

4 files changed

+101
-64
lines changed

src/compilation_context.ml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module Includes = struct
1616
let cmi_includes =
1717
Arg_spec.S [ iflags
1818
; Hidden_deps
19-
(Lib_file_deps.L.file_deps sctx libs ~exts:[".cmi"])
19+
(Lib_file_deps.file_deps sctx libs ~groups:[Cmi])
2020
]
2121
in
2222
let cmx_includes =
@@ -26,12 +26,13 @@ module Includes = struct
2626
( if opaque then
2727
List.map libs ~f:(fun lib ->
2828
(lib, if Lib.is_local lib then
29-
[".cmi"]
29+
[Lib_file_deps.Group.Cmi]
3030
else
31-
[".cmi"; ".cmx"]))
32-
|> Lib_file_deps.L.file_deps_with_exts sctx
31+
[Cmi; Cmx]))
32+
|> Lib_file_deps.file_deps_with_exts sctx
3333
else
34-
Lib_file_deps.L.file_deps sctx libs ~exts:[".cmi"; ".cmx"]
34+
Lib_file_deps.file_deps sctx libs
35+
~groups:[Lib_file_deps.Group.Cmi; Cmx]
3536
)
3637
]
3738
in

src/lib_file_deps.ml

Lines changed: 76 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,80 @@ open Stdune
22
open Dune_file
33
open Build_system
44

5-
let string_of_exts = String.concat ~sep:"-and-"
6-
7-
let lib_files_alias ~dir ~name ~exts =
8-
Alias.make (sprintf "lib-%s%s-all"
9-
(Lib_name.to_string name) (string_of_exts exts)) ~dir
10-
11-
let setup_file_deps_alias t ~dir ~exts lib files =
12-
Super_context.add_alias_deps t
13-
(lib_files_alias ~dir ~name:(Library.best_name lib) ~exts) files
14-
15-
let setup_file_deps_group_alias t ~dir ~exts lib =
16-
setup_file_deps_alias t lib ~dir ~exts
17-
(List.map exts ~f:(fun ext ->
18-
Alias.stamp_file
19-
(lib_files_alias ~dir ~name:(Library.best_name lib) ~exts:[ext]))
20-
|> Path.Set.of_list)
21-
22-
let setup_file_deps sctx ~dir ~lib ~modules =
23-
let add_cms ~cm_kind ~init = List.fold_left ~init ~f:(fun acc m ->
24-
match Module.cm_public_file m cm_kind with
25-
| None -> acc
26-
| Some fn -> Path.Set.add acc fn)
27-
in
28-
List.iter Cm_kind.all ~f:(fun cm_kind ->
29-
let files = add_cms ~cm_kind ~init:Path.Set.empty modules in
30-
setup_file_deps_alias sctx ~dir lib ~exts:[Cm_kind.ext cm_kind]
31-
files);
32-
33-
setup_file_deps_group_alias sctx ~dir lib ~exts:[".cmi"; ".cmx"];
34-
setup_file_deps_alias sctx ~dir lib ~exts:[".h"]
35-
(List.map lib.install_c_headers ~f:(fun header ->
36-
Path.relative dir (header ^ ".h"))
37-
|> Path.Set.of_list)
38-
39-
module L = struct
40-
let file_deps_of_lib t (lib : Lib.t) ~exts =
41-
if Lib.is_local lib then
42-
Alias.stamp_file
43-
(lib_files_alias ~dir:(Lib.src_dir lib) ~name:(Lib.name lib) ~exts)
44-
else
45-
(* suppose that all the files of an external lib are at the same place *)
46-
Build_system.stamp_file_for_files_of (Super_context.build_system t)
47-
~dir:(Obj_dir.public_cmi_dir (Lib.obj_dir lib)) ~ext:(string_of_exts exts)
48-
49-
let file_deps_with_exts t lib_exts =
50-
List.rev_map lib_exts ~f:(fun (lib, exts) -> file_deps_of_lib t lib ~exts)
51-
52-
let file_deps t libs ~exts =
53-
List.rev_map libs ~f:(file_deps_of_lib t ~exts)
5+
module Group = struct
6+
type t =
7+
| Cmi
8+
| Cmx
9+
| Header
10+
11+
let to_string = function
12+
| Cmi -> ".cmi"
13+
| Cmx -> ".cmx"
14+
| Header -> ".h"
15+
16+
let of_cm_kind = function
17+
| Cm_kind.Cmx -> Cmx
18+
| Cmi -> Cmi
19+
| Cmo -> Exn.code_error "Lib_file_deps.Group.of_cm_kind: Cmo" []
20+
21+
module L = struct
22+
let to_string l =
23+
List.map l ~f:to_string
24+
|> List.sort ~compare:String.compare
25+
|> String.concat ~sep:"-and-"
26+
27+
let alias t ~dir ~name =
28+
sprintf "lib-%s%s-all" (Lib_name.to_string name) (to_string t)
29+
|> Alias.make ~dir
30+
31+
let setup_alias t ~sctx ~dir ~lib ~files =
32+
Super_context.add_alias_deps
33+
sctx
34+
(alias t ~dir ~name:(Library.best_name lib))
35+
files
36+
37+
let setup_file_deps_group_alias t ~sctx ~dir ~lib =
38+
setup_alias t ~sctx ~dir ~lib ~files:(
39+
List.map t ~f:(fun t ->
40+
Alias.stamp_file (alias [t] ~dir ~name:(Library.best_name lib)))
41+
|> Path.Set.of_list
42+
)
43+
end
5444
end
45+
46+
let setup_file_deps =
47+
let cm_kinds = [Cm_kind.Cmx; Cmi] in
48+
let groups = List.map ~f:Group.of_cm_kind cm_kinds in
49+
fun sctx ~dir ~lib ~modules ->
50+
let add_cms ~cm_kind =
51+
List.fold_left ~f:(fun acc m ->
52+
match Module.cm_public_file m cm_kind with
53+
| None -> acc
54+
| Some fn -> Path.Set.add acc fn)
55+
in
56+
List.iter cm_kinds ~f:(fun cm_kind ->
57+
let files = add_cms ~cm_kind ~init:Path.Set.empty modules in
58+
let groups = [Group.of_cm_kind cm_kind] in
59+
Group.L.setup_alias groups ~sctx ~dir ~lib ~files);
60+
Group.L.setup_file_deps_group_alias groups ~sctx ~dir ~lib;
61+
Group.L.setup_alias [Header] ~sctx ~dir ~lib ~files:(
62+
List.map lib.install_c_headers ~f:(fun header ->
63+
Path.relative dir (header ^ ".h"))
64+
|> Path.Set.of_list)
65+
66+
let file_deps_of_lib t (lib : Lib.t) ~groups =
67+
if Lib.is_local lib then
68+
Alias.stamp_file
69+
(Group.L.alias groups ~dir:(Lib.src_dir lib) ~name:(Lib.name lib))
70+
else
71+
(* suppose that all the files of an external lib are at the same place *)
72+
Build_system.stamp_file_for_files_of
73+
(Super_context.build_system t)
74+
~dir:(Obj_dir.public_cmi_dir (Lib.obj_dir lib))
75+
~ext:(Group.L.to_string groups)
76+
77+
let file_deps_with_exts t =
78+
List.rev_map ~f:(fun (lib, groups) -> file_deps_of_lib t lib ~groups)
79+
80+
let file_deps t libs ~groups =
81+
List.rev_map libs ~f:(file_deps_of_lib t ~groups)

src/lib_file_deps.mli

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
open Stdune
22

3-
module L : sig
3+
module Group : sig
4+
type t =
5+
| Cmi
6+
| Cmx
7+
| Header
8+
end
49

5-
(** [file_deps t libs ~ext] returns a list of path dependencies for all the
6-
files with extension [ext] of libraries [libs]. *)
7-
val file_deps : Super_context.t -> Lib.L.t -> exts:string list -> Path.t list
10+
(** [file_deps t libs ~files] returns a list of path dependencies for all the
11+
files with extension [files] of libraries [libs]. *)
12+
val file_deps
13+
: Super_context.t
14+
-> Lib.L.t
15+
-> groups:Group.t list
16+
-> Path.t list
817

9-
val file_deps_with_exts
10-
: Super_context.t
11-
-> (Lib.t * string list) list
12-
-> Path.t list
13-
end
18+
val file_deps_with_exts
19+
: Super_context.t
20+
-> (Lib.t * Group.t list) list
21+
-> Path.t list
1422

1523
(** Setup alias dependencies for library artifacts grouped by extensions *)
1624
val setup_file_deps

src/lib_rules.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,8 @@ module Gen (P : Install_rules.Params) = struct
282282
[ Hidden_deps h_files
283283
; Arg_spec.of_result_map requires ~f:(fun libs ->
284284
S [ Lib.L.c_include_flags libs ~stdlib_dir:ctx.stdlib_dir
285-
; Hidden_deps (Lib_file_deps.L.file_deps sctx libs ~exts:[".h"])
285+
; Hidden_deps (Lib_file_deps.file_deps sctx libs
286+
~groups:[Lib_file_deps.Group.Header])
286287
])
287288
]
288289
in

0 commit comments

Comments
 (0)