@@ -2,53 +2,80 @@ open Stdune
22open Dune_file
33open 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
5444end
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 )
0 commit comments