1
+ open Dune_config
1
2
open Import
2
3
open Pkg_common
3
4
module Package_version = Dune_pkg. Package_version
@@ -66,11 +67,75 @@ let resolve_project_pins project_pins =
66
67
Pin_stanza. resolve project_pins ~scan_project
67
68
;;
68
69
70
+ let solve_multiple_envs
71
+ base_solver_env
72
+ version_preference
73
+ repos
74
+ ~pins
75
+ ~local_packages
76
+ ~constraints
77
+ =
78
+ let open Fiber.O in
79
+ let solve_for_env env =
80
+ Dune_pkg.Opam_solver. solve_lock_dir
81
+ env
82
+ version_preference
83
+ repos
84
+ ~pins
85
+ ~local_packages
86
+ ~constraints
87
+ in
88
+ let portable_solver_env =
89
+ (* TODO: make sure nothing system-specific sneaks into the environment here *)
90
+ Dune_pkg.Solver_env. unset_multi
91
+ base_solver_env
92
+ Dune_lang.Package_variable_name. platform_specific
93
+ in
94
+ let + results =
95
+ Fiber. parallel_map Dune_pkg.Solver_env. popular_platform_envs ~f: (fun platform_env ->
96
+ let solver_env = Dune_pkg.Solver_env. extend portable_solver_env platform_env in
97
+ solve_for_env solver_env)
98
+ in
99
+ let results, errors =
100
+ List. partition_map results ~f: (function
101
+ | Ok result -> Left result
102
+ | Error (`Diagnostic_message message ) -> Right message)
103
+ in
104
+ match results with
105
+ | [] -> Error errors
106
+ | x :: xs ->
107
+ Ok (List. fold_left xs ~init: x ~f: Dune_pkg.Opam_solver.Solver_result. merge, errors)
108
+ ;;
109
+
110
+ let solve_single_env
111
+ solver_env
112
+ version_preference
113
+ repos
114
+ ~pins
115
+ ~local_packages
116
+ ~constraints
117
+ =
118
+ let open Fiber.O in
119
+ let + result =
120
+ Dune_pkg.Opam_solver. solve_lock_dir
121
+ solver_env
122
+ version_preference
123
+ repos
124
+ ~pins
125
+ ~local_packages
126
+ ~constraints
127
+ in
128
+ match result with
129
+ | Ok result -> Ok (result, [] )
130
+ | Error (`Diagnostic_message message ) -> Error [ message ]
131
+ ;;
132
+
69
133
let solve_lock_dir
70
134
workspace
71
135
~local_packages
72
136
~project_pins
73
137
~print_perf_stats
138
+ ~portable_lock_dir
74
139
version_preference
75
140
solver_env_from_current_system
76
141
lock_dir_path
@@ -109,7 +174,8 @@ let solve_lock_dir
109
174
let * pins = resolve_project_pins project_pins in
110
175
let time_solve_start = Unix. gettimeofday () in
111
176
progress_state := Some Progress_indicator.Per_lockdir.State. Solving ;
112
- Dune_pkg.Opam_solver. solve_lock_dir
177
+ let solve = if portable_lock_dir then solve_multiple_envs else solve_single_env in
178
+ solve
113
179
solver_env
114
180
(Pkg_common.Version_preference. choose
115
181
~from_arg: version_preference
@@ -121,8 +187,11 @@ let solve_lock_dir
121
187
(Package_name.Map. map local_packages ~f: Dune_pkg.Local_package. for_solver)
122
188
~constraints: (constraints_of_workspace workspace ~lock_dir_path )
123
189
>> = function
124
- | Error (`Diagnostic_message message ) -> Fiber. return (Error (lock_dir_path, message))
125
- | Ok { lock_dir; files; pinned_packages; num_expanded_packages } ->
190
+ | Error messages -> Fiber. return (Error (lock_dir_path, messages))
191
+ | Ok ({ lock_dir; files; pinned_packages; num_expanded_packages } , _errors ) ->
192
+ (* TODO: Users might want to know if no solution was found on certain
193
+ platforms. Give the option to print the solver errors, even if a
194
+ solution was found on some platforms. *)
126
195
let time_end = Unix. gettimeofday () in
127
196
let maybe_perf_stats =
128
197
if print_perf_stats
@@ -149,7 +218,13 @@ let solve_lock_dir
149
218
in
150
219
progress_state := None ;
151
220
let + lock_dir = Lock_dir. compute_missing_checksums ~pinned_packages lock_dir in
152
- Ok (Lock_dir.Write_disk. prepare ~lock_dir_path ~files lock_dir, summary_message)
221
+ Ok
222
+ ( Lock_dir.Write_disk. prepare
223
+ ~portable: portable_lock_dir
224
+ ~lock_dir_path
225
+ ~files
226
+ lock_dir
227
+ , summary_message )
153
228
;;
154
229
155
230
let solve
@@ -160,6 +235,7 @@ let solve
160
235
~version_preference
161
236
~lock_dirs
162
237
~print_perf_stats
238
+ ~portable_lock_dir
163
239
=
164
240
let open Fiber.O in
165
241
(* a list of thunks that will perform all the file IO side
@@ -182,6 +258,7 @@ let solve
182
258
~local_packages
183
259
~project_pins
184
260
~print_perf_stats
261
+ ~portable_lock_dir
185
262
version_preference
186
263
solver_env_from_current_system
187
264
lockdir_path
@@ -196,9 +273,9 @@ let solve
196
273
| Error errors ->
197
274
User_error. raise
198
275
([ Pp. text " Unable to solve dependencies for the following lock directories:" ]
199
- @ List. concat_map errors ~f: (fun (path , message ) ->
276
+ @ List. concat_map errors ~f: (fun (path , messages ) ->
200
277
[ Pp. textf " Lock directory %s:" (Path.Source. to_string_maybe_quoted path)
201
- ; Pp. hovbox message
278
+ ; Pp. hovbox ( Pp. concat ~sep: Pp. newline messages)
202
279
]))
203
280
| Ok write_disks_with_summaries ->
204
281
let write_disk_list, summary_messages = List. split write_disks_with_summaries in
@@ -214,7 +291,7 @@ let project_pins =
214
291
Pin_stanza.DB. combine_exn acc (Dune_project. pins project))
215
292
;;
216
293
217
- let lock ~version_preference ~lock_dirs_arg ~print_perf_stats =
294
+ let lock ~version_preference ~lock_dirs_arg ~print_perf_stats ~ portable_lock_dir =
218
295
let open Fiber.O in
219
296
let * solver_env_from_current_system =
220
297
Dune_pkg.Sys_poll. make ~path: (Env_path. path Stdune.Env. initial)
@@ -240,6 +317,7 @@ let lock ~version_preference ~lock_dirs_arg ~print_perf_stats =
240
317
~version_preference
241
318
~lock_dirs
242
319
~print_perf_stats
320
+ ~portable_lock_dir
243
321
;;
244
322
245
323
let term =
@@ -250,7 +328,12 @@ let term =
250
328
let builder = Common.Builder. forbid_builds builder in
251
329
let common, config = Common. init builder in
252
330
Scheduler. go ~common ~config (fun () ->
253
- lock ~version_preference ~lock_dirs_arg ~print_perf_stats )
331
+ let portable_lock_dir =
332
+ match Config. get Dune_rules.Compile_time. portable_lock_dir with
333
+ | `Enabled -> true
334
+ | `Disabled -> false
335
+ in
336
+ lock ~version_preference ~lock_dirs_arg ~print_perf_stats ~portable_lock_dir )
254
337
;;
255
338
256
339
let info =
0 commit comments