summaryrefslogtreecommitdiffstats
path: root/ocamlbuild/configuration.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamlbuild/configuration.ml')
-rw-r--r--ocamlbuild/configuration.ml63
1 files changed, 63 insertions, 0 deletions
diff --git a/ocamlbuild/configuration.ml b/ocamlbuild/configuration.ml
new file mode 100644
index 000000000..6f1a7f3a5
--- /dev/null
+++ b/ocamlbuild/configuration.ml
@@ -0,0 +1,63 @@
+(***********************************************************************)
+(* ocamlbuild *)
+(* *)
+(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2007 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+(* Original author: Nicolas Pouillard *)
+open My_std
+open Log
+open Lexers
+
+type flag_list = (string * string) list
+
+type t = Lexers.conf
+
+let cache = Hashtbl.create 107
+let (configs, add_config) =
+ let configs = ref [] in
+ (fun () -> !configs),
+ (fun config -> configs := config :: !configs; Hashtbl.clear cache)
+
+let parse_string s =
+ let conf = Lexers.conf_lines None 1 (Printf.sprintf "string: %S" s) (Lexing.from_string s) in
+ add_config conf
+
+let parse_file ?dir file =
+ with_input_file file begin fun ic ->
+ let conf = Lexers.conf_lines dir 1 (Printf.sprintf "file: %S" file) (Lexing.from_channel ic) in
+ add_config conf
+ end
+
+let key_match = Glob.eval
+
+let apply_config s (config : t) init =
+ List.fold_left begin fun (tags, flags as acc) (key, v) ->
+ if key_match key s then
+ (List.fold_right Tags.add v.plus_tags (List.fold_right Tags.remove v.minus_tags tags),
+ List.fold_right Flags.add v.plus_flags (List.fold_right Flags.remove v.minus_flags flags))
+ else acc
+ end init config
+
+let apply_configs s =
+ let (tags, flags) =
+ List.fold_right (apply_config s) (configs ()) (Tags.empty, [])
+ in (tags, Flags.to_spec flags)
+
+let tags_and_flags_of_filename s =
+ try Hashtbl.find cache s
+ with Not_found ->
+ let res = apply_configs s in
+ let () = Hashtbl.replace cache s res in
+ res
+
+let tags_of_filename x = fst (tags_and_flags_of_filename x)
+let flags_of_filename x = snd (tags_and_flags_of_filename x)
+
+let has_tag tag = Tags.mem tag (tags_of_filename "")