From 8925ad61b56cd489ca9a4ac41be5ddb223dc3557 Mon Sep 17 00:00:00 2001 From: Antonio Nuno Monteiro Date: Thu, 23 Feb 2023 22:51:46 -0800 Subject: [PATCH] melange: interpret `melc --where` as a list of `:`-separated paths Signed-off-by: Antonio Nuno Monteiro --- src/dune_rules/melange/melange_binary.ml | 29 ++++++++++++++--------- src/dune_rules/melange/melange_binary.mli | 5 +--- src/dune_rules/merlin/merlin.ml | 17 +++++++++---- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/dune_rules/melange/melange_binary.ml b/src/dune_rules/melange/melange_binary.ml index ad9d352363c8..5e88d4b0d2f1 100644 --- a/src/dune_rules/melange/melange_binary.ml +++ b/src/dune_rules/melange/melange_binary.ml @@ -13,20 +13,27 @@ let where = @@ Process.run_capture_line ~display:Quiet Process.Strict bin [ "--where" ] in - Path.of_string where + where in let memo = - Memo.create "melange-where" ~input:(module Path) ~cutoff:Path.equal impl + Memo.create "melange-where" ~input:(module Path) ~cutoff:String.equal impl in fun sctx ~loc ~dir -> let open Memo.O in let* env = Super_context.env_node sctx ~dir >>= Env_node.external_env in - match Env.get env "MELANGELIB" with - | Some p -> Memo.return (Some (Path.of_string p)) - | None -> ( - let* melc = melc sctx ~loc ~dir in - match melc with - | Error _ -> Memo.return None - | Ok melc -> - let+ res = Memo.exec memo melc in - Some res) + let+ melange_dirs = + match Env.get env "MELANGELIB" with + | Some p -> Memo.return (Some p) + | None -> ( + let* melc = melc sctx ~loc ~dir in + match melc with + | Error _ -> Memo.return None + | Ok melc -> + let+ res = Memo.exec memo melc in + Some res) + in + Option.map + ~f:(fun dirs -> + String.split ~on:Bin.path_sep dirs |> List.map ~f:Path.of_string) + melange_dirs + |> Option.value ~default:[] diff --git a/src/dune_rules/melange/melange_binary.mli b/src/dune_rules/melange/melange_binary.mli index 0ffd13a73512..17429d73ca0d 100644 --- a/src/dune_rules/melange/melange_binary.mli +++ b/src/dune_rules/melange/melange_binary.mli @@ -7,7 +7,4 @@ val melc : -> Action.Prog.t Memo.t val where : - Super_context.t - -> loc:Loc.t option - -> dir:Path.Build.t - -> Path.t option Memo.t + Super_context.t -> loc:Loc.t option -> dir:Path.Build.t -> Path.t list Memo.t diff --git a/src/dune_rules/merlin/merlin.ml b/src/dune_rules/merlin/merlin.ml index e465f43e51a3..bc2b75195baf 100644 --- a/src/dune_rules/merlin/merlin.ml +++ b/src/dune_rules/merlin/merlin.ml @@ -466,12 +466,18 @@ module Unprocessed = struct } as t) sctx ~dir ~more_src_dirs ~expander = let open Action_builder.O in let+ config = - let* stdlib_dir = + let* stdlib_dir, extra_obj_dirs = Action_builder.of_memo @@ match t.config.mode with - | `Ocaml -> Memo.return (Some stdlib_dir) - | `Melange -> Melange_binary.where sctx ~loc:None ~dir + | `Ocaml -> Memo.return (Some stdlib_dir, []) + | `Melange -> ( + let open Memo.O in + let+ dirs = Melange_binary.where sctx ~loc:None ~dir in + match dirs with + | [] -> (None, []) + | [ stdlib_dir ] -> (Some stdlib_dir, []) + | stdlib_dir :: extra_obj_dirs -> (Some stdlib_dir, extra_obj_dirs)) in let* flags = flags and* src_dirs, obj_dirs = @@ -481,7 +487,10 @@ module Unprocessed = struct let+ dirs = src_dirs sctx lib in (lib, dirs)) >>| List.fold_left - ~init:(Path.set_of_source_paths source_dirs, objs_dirs) + ~init: + ( Path.set_of_source_paths source_dirs + , Path.Set.union objs_dirs (Path.Set.of_list extra_obj_dirs) + ) ~f:(fun (src_dirs, obj_dirs) (lib, more_src_dirs) -> ( Path.Set.union src_dirs more_src_dirs , let public_cmi_dir =