From 3e9bc8c0c38cc0e390414d2b6dbfcc80c3a2a952 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 1 May 2018 00:13:50 +0700 Subject: [PATCH] Allow setting ENV vars in findlib.conf per toolchain This is useful for configuring PKG CONFIG for cross compilation --- src/context.ml | 4 ++++ src/env.ml | 5 +++++ src/env.mli | 3 +++ src/findlib.ml | 17 +++++++++++++---- src/findlib.mli | 2 ++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/context.ml b/src/context.ml index a38ffcfd..360c2e77 100644 --- a/src/context.ml +++ b/src/context.ml @@ -315,6 +315,10 @@ let create ~(kind : Kind.t) ~path ~env ~name ~merlin ~targets () = | Some host -> Env.get host.env "PATH" ) + |> Env.extend_env ( + Option.value ~default:Env.empty + (Option.map findlib_config ~f:Findlib.Config.env) + ) in let stdlib_dir = Path.of_string (Ocaml_config.standard_library ocfg) in let natdynlink_supported = Ocaml_config.natdynlink_supported ocfg in diff --git a/src/env.ml b/src/env.ml index 09cf9cd9..4eb5df57 100644 --- a/src/env.ml +++ b/src/env.ml @@ -22,6 +22,8 @@ let make vars = ; unix = None } +let empty = make Map.empty + let get t k = Map.find t.vars k let to_unix t = @@ -73,3 +75,6 @@ let diff x y = let update t ~var ~f = make (Map.update t.vars var ~f) + +let of_string_map m = + make (String.Map.foldi ~init:Map.empty ~f:(fun k v acc -> Map.add acc k v) m) diff --git a/src/env.mli b/src/env.mli index 25763588..8b20f1ae 100644 --- a/src/env.mli +++ b/src/env.mli @@ -9,6 +9,8 @@ type t module Map : Map.S with type key = Var.t +val empty : t + (** The environment when the process started *) val initial : t @@ -28,3 +30,4 @@ val update : t -> var:string -> f:(string option -> string option) -> t val sexp_of_t : t -> Sexp.t +val of_string_map : string String.Map.t -> t diff --git a/src/findlib.ml b/src/findlib.ml index e534ed3b..04ef1751 100644 --- a/src/findlib.ml +++ b/src/findlib.ml @@ -45,22 +45,24 @@ module Rules = struct ; add_rules : Rule.t list } - let interpret t ~preds = + let interpret' t ~preds = let rec find_set_rule = function - | [] -> "" + | [] -> None | rule :: rules -> if Rule.matches rule ~preds then - rule.value + Some rule.value else find_set_rule rules in let v = find_set_rule t.set_rules in List.fold_left t.add_rules ~init:v ~f:(fun v rule -> if Rule.matches rule ~preds then - v ^ " " ^ rule.value + Some ((Option.value ~default:"" v) ^ " " ^ rule.value) else v) + let interpret t ~preds = Option.value ~default:"" (interpret' t ~preds) + let of_meta_rules (rules : Meta.Simplified.Rules.t) = let add_rules = List.map rules.add_rules ~f:Rule.make in let set_rules = @@ -106,6 +108,13 @@ module Config = struct let get { vars; preds } var = Vars.get vars var preds + + let env t = + let preds = Ps.add t.preds (P.make "env") in + String.Map.filter_map ~f:(fun rules -> + Rules.interpret' rules ~preds + ) t.vars + |> Env.of_string_map end module Package = struct diff --git a/src/findlib.mli b/src/findlib.mli index 39c875d8..535332ac 100644 --- a/src/findlib.mli +++ b/src/findlib.mli @@ -62,4 +62,6 @@ module Config : sig type t val load : Path.t -> toolchain:string -> context:string -> t val get : t -> string -> string option + + val env : t -> Env.t end