1 (* Copyright (C) 2005, HELM Team.
3 * This file is part of HELM, an Hypertextual, Electronic
4 * Library of Mathematics, developed at the Computer Science
5 * Department, University of Bologna, Italy.
7 * HELM is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * HELM is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HELM; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 * For details, see the HELM World-Wide-Web page,
23 * http://helm.cs.unibo.it/
28 type thingsToInitialize =
29 ConfigurationFile | Db | Environment | Getter | CmdLine | Registry
31 exception FailedToInitialize of thingsToInitialize
36 if not (List.exists (fun x -> x = item) l) then
37 raise (FailedToInitialize item))
40 let already_configured s l =
41 List.for_all (fun item -> List.exists (fun x -> x = item) l) s
43 let conffile = ref BuildTimeConf.matita_conf
45 let registry_defaults = [
46 "matita.debug", "false";
47 "matita.debug_menu", "false";
48 "matita.external_editor", "gvim -f -c 'go %p' %f";
49 "matita.profile", "true";
50 "matita.system", "false";
51 "matita.verbose", "false";
52 "matita.paste_unicode_as_tex", "false";
53 "matita.noinnertypes", "false";
54 "matita.do_heavy_checks", "true";
56 "matita.extract", "false";
57 "matita.execcomments", "false";
60 let set_registry_values =
63 if not (Helm_registry.has key) then Helm_registry.set ~key ~value)
65 let fill_registry init_status =
66 if not (already_configured [ Registry ] init_status) then begin
67 set_registry_values registry_defaults;
68 Registry :: init_status
72 let load_configuration init_status =
73 if not (already_configured [ConfigurationFile] init_status) then
75 Helm_registry.load_from !conffile;
76 if not (Helm_registry.has "user.name") then begin
77 let login = (Unix.getpwuid (Unix.getuid ())).Unix.pw_name in
78 Helm_registry.set "user.name" login
80 let home = Helm_registry.get_string "matita.basedir" in
81 let user_conf_file = home ^ "/matita.conf.xml" in
82 if HExtlib.is_regular user_conf_file then
84 HLog.message ("Loading additional conf file from " ^ user_conf_file);
86 Helm_registry.load_from user_conf_file
89 ("While loading conf file: " ^ snd (MatitaExcPp.to_string exn))
91 ConfigurationFile::init_status
96 let initialize_db init_status =
97 wants [ ConfigurationFile; CmdLine ] init_status;
98 if not (already_configured [ Db ] init_status) then
100 if not (Helm_registry.get_bool "matita.system") then
101 ((* SQL does not allow dots in table names. Let's replace them
102 with underscore and let's quote underscores by doubling them *)
103 let owner = Helm_registry.get "matita.owner" in
104 let owner = Str.global_replace (Str.regexp "_") "__" owner in
105 let owner = Str.global_replace (Str.regexp "\\.") "_" owner in
106 if Str.string_match (Str.regexp "^[a-zA-Z][a-zA-Z0-9_]*$") owner 0 then
107 MetadataTypes.ownerize_tables owner
109 prerr_endline ("Error: the matita.owner configuration variable must contain only latin characters, digits and underscores. If the default configuration is used, the variable is set to the USER environment variable and can be changed prepending the USER=any_valid_name to the matita command.");
113 LibraryDb.create_owner_environment ();
119 let initialize_environment init_status =
120 wants [CmdLine] init_status;
121 if not (already_configured [Getter;Environment] init_status) then
124 if Helm_registry.get_bool "matita.system" then
125 Http_getter_storage.activate_system_mode ();
126 CicEnvironment.set_trust (* environment trust *)
128 Helm_registry.get_opt_default Helm_registry.get_bool
129 ~default:true "matita.environment_trust" in
131 Getter::Environment::init_status
138 let usages = Hashtbl.create 11 (** app name (e.g. "matitac") -> usage string *)
141 (fun (name, s) -> Hashtbl.replace usages name s)
143 Printf.sprintf "Matita batch compiler v%s
144 Usage: matitac [ OPTION ... ] FILE
146 BuildTimeConf.version;
148 Printf.sprintf "Matita (TPTP) prover v%s
149 Usage: matitaprover [ -tptppath ] FILE.p
151 BuildTimeConf.version;
153 Printf.sprintf "Matita interactive theorem prover v%s
154 Usage: matita [ OPTION ... ] [ FILE ]
156 BuildTimeConf.version;
158 Printf.sprintf "Matita depency file generator v%s
159 Usage: matitadep [ OPTION ... ]
161 BuildTimeConf.version;
163 Printf.sprintf "MatitaClean v%s
164 Usage: matitaclean all
165 matitaclean ( FILE | URI )
167 BuildTimeConf.version;
171 "Matita v%s\nUsage: matita [ ARG ]\nOptions:" BuildTimeConf.version
174 let basename = Filename.basename Sys.argv.(0) in
176 try Filename.chop_extension basename with Invalid_argument _ -> basename
178 try Hashtbl.find usages usage_key with Not_found -> default_usage
181 let extra_cmdline_specs = ref []
182 let add_cmdline_spec l = extra_cmdline_specs := l @ !extra_cmdline_specs
184 let parse_cmdline init_status =
185 if not (already_configured [CmdLine] init_status) then begin
186 wants [Registry] init_status;
187 let includes = ref [] in
188 let default_includes = [
189 BuildTimeConf.stdlib_dir_devel;
190 BuildTimeConf.stdlib_dir_installed ;
191 BuildTimeConf.new_stdlib_dir_devel;
192 BuildTimeConf.new_stdlib_dir_installed ;
196 if Pcre.pmatch ~pat:"^/" s then s else Sys.getcwd () ^"/"^s
199 let add_l l = fun s -> l := s :: !l in
200 let print_version () =
201 Printf.printf "%s\n" BuildTimeConf.version;exit 0 in
202 let no_innertypes () =
203 Helm_registry.set_bool "matita.noinnertypes" true in
205 match Str.split (Str.regexp "::") s with
206 | [path; uri] -> Helm_registry.set "matita.baseuri"
207 (HExtlib.normalize_path (absolutize path)^" "^uri)
208 | _ -> raise (Failure "bad baseuri, use -b 'path::uri'")
210 let no_default_includes = ref false in
211 let execcomments = ref false in
214 "-b", Arg.String set_baseuri, "<path::uri> forces the baseuri of path";
215 "-I", Arg.String (add_l includes),
216 ("<path> Adds path to the list of searched paths for the "
217 ^ "include command");
218 "-conffile", Arg.Set_string conffile,
219 (Printf.sprintf ("<filename> Read configuration from filename"
221 BuildTimeConf.matita_conf);
223 Arg.Unit (fun () -> Helm_registry.set_bool "matita.force" true),
224 ("Force actions that would not be executed per default");
226 Arg.Unit (fun () -> Helm_registry.set_bool "matita.profile" false),
227 "Turns off profiling printings";
228 "-noinnertypes", Arg.Unit no_innertypes,
229 "Turns off inner types generation while publishing";
231 Arg.String (fun rex -> Helm_registry.set "matita.profile_only" rex),
232 "Activates only profiler with label matching the provided regex";
233 "-system", Arg.Unit (fun () ->
234 Helm_registry.set_bool "matita.system" true),
235 ("Act on the system library instead of the user one"
236 ^ "\n WARNING: not for the casual user");
237 "-no-default-includes", Arg.Set no_default_includes,
238 "Do not include the default searched paths for the include command";
239 "-execcomments", Arg.Set execcomments,
240 "Execute the content of (** ... *) comments";
242 Arg.Unit (fun () -> Helm_registry.set_bool "matita.verbose" true),
244 "--version", Arg.Unit print_version, "Prints version"
247 if BuildTimeConf.debug then
249 Arg.Unit (fun () -> Helm_registry.set_bool "matita.debug" true),
250 ("Do not catch top-level exception "
251 ^ "(useful for backtrace inspection)");
253 Arg.Unit (fun () -> MultiPassDisambiguator.only_one_pass := true),
254 "Enable only one disambiguation pass";
258 std_arg_spec @ debug_arg_spec @ !extra_cmdline_specs
260 let set_list ~key l =
261 Helm_registry.set_list Helm_registry.of_string ~key ~value:l
263 Arg.parse arg_spec (add_l args) (usage ());
264 Helm_registry.set_bool ~key:"matita.execcomments" ~value:!execcomments;
265 let default_includes = if !no_default_includes then [] else default_includes in
267 List.map (fun x -> HExtlib.normalize_path (absolutize x))
268 ((List.rev !includes) @ default_includes)
270 set_list ~key:"matita.includes" includes;
271 let args = List.rev (List.filter (fun x -> x <> "") !args) in
272 set_list ~key:"matita.args" args;
273 HExtlib.set_profiling_printings
275 Helm_registry.get_bool "matita.profile" &&
277 ~pat:(Helm_registry.get_opt_default
278 Helm_registry.string ~default:".*" "matita.profile_only")
280 CmdLine :: init_status
285 print_endline (usage ());
288 let conf_components =
289 [ load_configuration; fill_registry; parse_cmdline]
291 let other_components =
292 [ initialize_db; initialize_environment ]
294 let initialize_all () =
296 List.fold_left (fun s f -> f s) !status
297 (conf_components @ other_components);
300 let parse_cmdline_and_configuration_file () =
301 status := List.fold_left (fun s f -> f s) !status conf_components
303 let initialize_environment () =
304 status := initialize_environment !status
308 Inversion_principle.init ();