@@ -68,7 +68,7 @@ let dune_describe dir =
68
68
let out = Worker_pool. submit " dune describe" cmd None in
69
69
match out with Error _ -> [] | Ok out -> of_dune_describe out.Run. output
70
70
71
- let of_dune_build dir =
71
+ let of_dune_build dir ~ extra_pkgs ~ extra_libs =
72
72
let root = Fpath. (dir / " _build" / " default" ) in
73
73
let contents =
74
74
Bos.OS.Dir. fold_contents ~dotfiles: true (fun p acc -> p :: acc) [] root
@@ -78,16 +78,11 @@ let of_dune_build dir =
78
78
| Ok c ->
79
79
let cset = Fpath.Set. of_list c in
80
80
let libs = dune_describe dir in
81
- let local_libs =
82
- List. filter_map
83
- (function Library l -> if l.local then Some l else None )
84
- libs
85
- in
86
81
87
- let global_libs =
88
- List. filter_map
89
- (function Library l -> if l.local then None else Some l )
90
- libs
82
+ let local_libs, global_libs =
83
+ List. partition
84
+ (function l -> l.local)
85
+ ( List. filter_map ( function Library l -> Some l) libs)
91
86
in
92
87
93
88
List. iter
@@ -97,11 +92,13 @@ let of_dune_build dir =
97
92
Fmt. (option (pair string Fpath. pp))
98
93
(internal_name_of_library lib)))
99
94
local_libs;
95
+
100
96
let uid_to_libname =
101
97
List. fold_left
102
98
(fun acc l -> Util.StringMap. add l.uid l.name acc)
103
- Util.StringMap. empty local_libs
99
+ Util.StringMap. empty ( local_libs @ global_libs)
104
100
in
101
+
105
102
let all_lib_deps =
106
103
List. fold_left
107
104
(fun acc (l : library ) ->
@@ -112,8 +109,35 @@ let of_dune_build dir =
112
109
l.requires
113
110
|> Util.StringSet. of_list)
114
111
acc)
115
- Util.StringMap. empty local_libs
112
+ Util.StringMap. empty (local_libs @ global_libs)
113
+ in
114
+
115
+ let rec with_trans_deps =
116
+ let cache = Hashtbl. create (List. length libs) in
117
+ fun lib_name ->
118
+ try Hashtbl. find cache lib_name
119
+ with Not_found ->
120
+ let libs =
121
+ try Util.StringMap. find lib_name all_lib_deps
122
+ with Not_found ->
123
+ Logs. debug (fun m -> m " No lib deps for library %s" lib_name);
124
+ Util.StringSet. empty
125
+ in
126
+ let result =
127
+ Util.StringSet. fold
128
+ (fun l acc -> Util.StringSet. union (with_trans_deps l) acc)
129
+ libs libs
130
+ in
131
+ Hashtbl. add cache lib_name result;
132
+ result
116
133
in
134
+
135
+ let all_lib_deps =
136
+ Util.StringMap. mapi
137
+ (fun lib_name _ -> with_trans_deps lib_name)
138
+ all_lib_deps
139
+ in
140
+
117
141
let colon = Fmt. any " :" in
118
142
Format. eprintf " all_lib_deps: %a@."
119
143
Fmt. (list ~sep: comma (pair ~sep: colon string (list ~sep: semi string )))
@@ -141,29 +165,31 @@ let of_dune_build dir =
141
165
in
142
166
let libs =
143
167
List. filter_map
144
- (fun (Library lib ) ->
168
+ (fun lib ->
145
169
match internal_name_of_library lib with
146
170
| None -> None
147
- | Some (_ , cmtidir ) ->
171
+ | Some (libname , cmtidir ) ->
148
172
let cmtidir = Fpath. (append dir cmtidir) in
149
173
let id_override =
150
174
Fpath. relativize
151
175
~root: Fpath. (v " _build/default" )
152
176
Fpath. (v lib.source_dir)
153
177
|> Option. map Fpath. to_string
154
178
in
155
- Logs. debug (fun m ->
156
- m " this should never be 'None': %a"
157
- Fmt.Dump. (option string )
158
- id_override);
179
+ (match id_override with
180
+ | None ->
181
+ Logs. warn (fun m ->
182
+ m " Could not determine id_override for library '%s'"
183
+ libname)
184
+ | _ -> () );
159
185
if Fpath.Set. mem cmtidir cset then
160
186
Some
161
187
(Packages.Lib. v ~libname_of_archive ~pkg_name: lib.name
162
188
~dir: (Fpath. append dir (Fpath. v lib.source_dir))
163
189
~cmtidir: (Some cmtidir) ~all_lib_deps ~cmi_only_libs: []
164
190
~id_override )
165
191
else None )
166
- libs
192
+ local_libs
167
193
in
168
194
let find_docs ext =
169
195
List. filter_map
@@ -182,22 +208,37 @@ let of_dune_build dir =
182
208
find_docs " .mld"
183
209
|> List. map (fun (p , r ) -> { Packages. mld_path = p; mld_rel_path = r })
184
210
in
185
-
211
+ let assets =
212
+ find_docs " .jpg"
213
+ |> List. map (fun (p , r ) ->
214
+ { Packages. asset_path = p; asset_rel_path = r })
215
+ in
186
216
let libs = List. flatten libs in
217
+ let global_config =
218
+ {
219
+ Global_config. deps =
220
+ {
221
+ packages = extra_pkgs;
222
+ libraries =
223
+ extra_libs
224
+ @ List. map (fun (lib : Packages.libty ) -> lib.lib_name) libs;
225
+ };
226
+ }
227
+ in
187
228
let local =
188
229
[
189
230
{
190
231
Packages. name = monorepo_pkg_name;
191
232
version = " 1.0" ;
192
233
libraries = libs;
193
234
mlds;
194
- assets = [] ;
235
+ assets;
195
236
selected = true ;
196
237
remaps = [] ;
197
238
pkg_dir = Fpath. v " ." ;
198
239
doc_dir = Fpath. v " ." ;
199
240
other_docs;
200
- config = Global_config. empty ;
241
+ config = global_config ;
201
242
};
202
243
]
203
244
in
0 commit comments