From 4ebafd3a3f69afd375abd618be12793c69520de1 Mon Sep 17 00:00:00 2001 From: Alpha DIALLO Date: Wed, 20 Apr 2022 18:45:30 +0200 Subject: [PATCH] Fix bigarray config #5494 Implementing "Select" rule and "Re_export" witch is the same as "Direct". https://github.com/ocaml/dune/pull/5526#discussion_r853336241 is a good report for this fix. Signed-off-by: Alpha DIALLO --- src/dune_rules/lib.ml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/dune_rules/lib.ml b/src/dune_rules/lib.ml index 5aa41f8c3bd3..fa00208a7aea 100644 --- a/src/dune_rules/lib.ml +++ b/src/dune_rules/lib.ml @@ -1381,6 +1381,9 @@ end = struct } let resolve_complex_deps db deps ~private_deps : resolved_deps Memo.Build.t = + let ocaml_version = db.lib_config.ocaml_version in + let bigarray_in_std_libraries = Ocaml_version.has_bigarray_library ocaml_version in + let is_bigarray lib = String.equal "bigarray" (Lib_name.to_string lib) in let resolve_select { Lib_dep.Select.result_fn; choices; loc } = let open Memo.Build.O in let+ res, src_fn = @@ -1388,11 +1391,15 @@ end = struct Memo.Build.List.find_map choices ~f:(fun { required; forbidden; file } -> let forbidden = Lib_name.Set.to_list forbidden in + if List.exists ~f:(fun lib -> is_bigarray lib && bigarray_in_std_libraries) forbidden + then Memo.Build.return None + else let* exists = Memo.Build.List.exists forbidden ~f:(available_internal db) in if exists then Memo.Build.return None else + let required = Lib_name.Set.filter ~f:(fun lib -> not (is_bigarray lib) || bigarray_in_std_libraries) required in Resolve.Build.peek (let deps = Lib_name.Set.fold required ~init:[] ~f:(fun x acc -> @@ -1421,6 +1428,9 @@ end = struct let open Memo.Build.O in match (dep : Lib_dep.t) with | Re_export (loc, name) -> + if is_bigarray name && not bigarray_in_std_libraries + then Memo.Build.return (acc_res, acc_selects, acc_re_exports) + else let+ lib = resolve_dep db (loc, name) ~private_deps in let open Resolve.O in let acc_re_exports = @@ -1435,11 +1445,9 @@ end = struct in (acc_res, acc_selects, acc_re_exports) | Direct (loc, name) -> - let ocaml_version = db.lib_config.ocaml_version in - if String.equal "bigarray" (Lib_name.to_string name) - && not (Ocaml_version.has_bigarray_library ocaml_version) + if is_bigarray name && not bigarray_in_std_libraries then - Memo.Build.return (acc_res, acc_selects, acc_re_exports) + Memo.Build.return (acc_res, acc_selects, acc_re_exports) else let+ lib = resolve_dep db (loc, name) ~private_deps in let acc_res =