diff --git a/src/findlib.ml b/src/findlib.ml index 6ae60d76..ca844560 100644 --- a/src/findlib.ml +++ b/src/findlib.ml @@ -118,6 +118,29 @@ module Vars = struct let get_words t var preds = String.extract_comma_space_separated_words (get t var preds) end +module Config = struct + type t = + { vars : Vars.t + ; preds : string list + } + + let load path ~toolchain ~context = + let path = Path.extend_basename path ~suffix:".d" in + let conf_file = Path.relative path (toolchain ^ ".conf") in + if not (Path.exists conf_file) then + die "@{Error@}: ocamlfind toolchain %s isn't defined in %a \ + (context: %s)" toolchain Path.pp path context; + let vars = + (Meta.simplify { name = "" + ; entries = Meta.load (Path.to_string conf_file) + }).vars + in + { vars = String_map.map vars ~f:Rules.of_meta_rules; preds = [toolchain] } + + let get { vars; preds } var = + Vars.get vars var preds +end + type package = { name : string ; dir : Path.t diff --git a/src/findlib.mli b/src/findlib.mli index 4a3648ce..3c44b9b8 100644 --- a/src/findlib.mli +++ b/src/findlib.mli @@ -82,3 +82,9 @@ val all_packages : t -> package list val all_unavailable_packages : t -> Package_not_available.t list val stdlib_with_archives : t -> package + +module Config : sig + type t + val load : Path.t -> toolchain:string -> context:string -> t + val get : t -> string -> string +end