diff options
Diffstat (limited to 'ocamlbuild/configuration.ml')
-rw-r--r-- | ocamlbuild/configuration.ml | 63 |
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 "") |