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/
30 type thingsToInitilaize =
31 ConfigurationFile | Db | Environment | Getter | Makelib | CmdLine | Registry
33 exception FailedToInitialize of thingsToInitilaize
38 if not (List.exists (fun x -> x = item) l) then
39 raise (FailedToInitialize item))
42 let already_configured s l =
43 List.for_all (fun item -> List.exists (fun x -> x = item) l) s
45 let conffile = ref BuildTimeConf.matita_conf
47 let registry_defaults = [
48 "matita.debug", "false";
49 "matita.external_editor", "gvim -f -c 'go %p' %f";
50 "matita.preserve", "false";
51 "matita.profile", "true";
52 "matita.system", "false";
53 "matita.verbosity", "1";
54 "matita.bench", "false";
55 "matita.paste_unicode_as_tex", "false"
56 (** verbosity level: 1 is the default, 0 is intuitively "quiet", > 1 is
57 * intuitively verbose *)
60 let set_registry_values =
61 List.iter (fun key, value -> Helm_registry.set ~key ~value)
63 let fill_registry init_status =
64 if not (already_configured [ Registry ] init_status) then begin
65 set_registry_values registry_defaults;
66 Registry :: init_status
70 let load_configuration init_status =
71 wants [ Registry ] init_status;
72 if not (already_configured [ConfigurationFile] init_status) then
74 Helm_registry.load_from !conffile;
75 if not (Helm_registry.has "user.name") then begin
76 let login = (Unix.getpwuid (Unix.getuid ())).Unix.pw_name in
77 Helm_registry.set "user.name" login
79 let home = Helm_registry.get_string "matita.basedir" in
80 let user_conf_file = home ^ "/matita.conf.xml" in
81 if HExtlib.is_regular user_conf_file then
83 HLog.message ("Loading additional conf file from " ^ user_conf_file);
85 Helm_registry.load_from user_conf_file
88 ("While loading conf file: " ^ snd (MatitaExcPp.to_string exn))
90 ConfigurationFile::init_status
95 let initialize_db init_status =
96 wants [ ConfigurationFile; CmdLine ] init_status;
97 if not (already_configured [ Db ] init_status) then
99 if not (Helm_registry.get_bool "matita.system") then
100 MetadataTypes.ownerize_tables (Helm_registry.get "matita.owner");
101 LibraryDb.create_owner_environment ();
107 let initialize_makelib init_status =
108 wants [ConfigurationFile] init_status;
109 if not (already_configured [Makelib] init_status) then
111 MatitamakeLib.initialize ();
117 let initialize_environment init_status =
118 wants [ConfigurationFile] init_status;
119 if not (already_configured [Getter;Environment] init_status) then
122 if Helm_registry.get_bool "matita.system" then
123 Http_getter_storage.activate_system_mode ();
124 CicEnvironment.set_trust (* environment trust *)
126 Helm_registry.get_opt_default Helm_registry.get_bool
127 ~default:true "matita.environment_trust" in
129 Getter::Environment::init_status
136 let usages = Hashtbl.create 11 (** app name (e.g. "matitac") -> usage string *)
139 (fun (name, s) -> Hashtbl.replace usages name s)
142 Usage: matitac [ OPTION ... ] FILE
144 BuildTimeConf.version;
146 sprintf "Grafite Grep v%s
147 Usage: gragrep [ -r ] PATH
149 BuildTimeConf.version;
151 sprintf "Matita's prover v%s
152 Usage: matitaprover [ -tptppath ] FILE.p
154 BuildTimeConf.version;
157 Usage: matita [ OPTION ... ] [ FILE ... ]
159 BuildTimeConf.version;
163 Usage: cicbrowser [ URL | WHELP QUERY ]
165 BuildTimeConf.version;
167 sprintf "MatitaDep v%s
168 Usage: matitadep [ OPTION ... ] FILE ...
170 BuildTimeConf.version;
172 sprintf "MatitaClean v%s
173 Usage: matitaclean all
174 matitaclean [ (FILE | URI) ... ]
176 BuildTimeConf.version;
178 sprintf "MatitaMake v%s
179 Usage: matitamake [ OPTION ... ] (init | clean | list | destroy | build)
181 Parameters: name (the name of the development, required)
182 root (the directory in which the delopment is rooted,
183 optional, default is current working directory)
184 Description: tells matitamake that a new development radicated
185 in the current working directory should be handled.
187 Parameters: name (the name of the development to destroy, optional)
188 If omitted the development that holds the current working
189 directory is used (if any).
190 Description: clean the develpoment.
193 Description: lists the known developments and their roots.
195 Parameters: name (the name of the development to destroy, required)
196 Description: deletes a development (only from matitamake metadat, no
197 .ma files will be deleted).
199 Parameters: name (the name of the development to build, required)
200 Description: completely builds the develpoment.
202 Parameters: name (the name of the development to publish, required)
203 Description: cleans the development in the user space, rebuilds it
204 in the system space ('ro' repositories, that for this operation
207 If target is omitted an 'all' will be used as the default.
208 With -build you can build a development wherever it is.
209 If you specify a target it implicitly refers to the development that
210 holds the current working directory (if any).
212 BuildTimeConf.version;
215 sprintf "Matita v%s\nUsage: matita [ ARG ]\nOptions:" BuildTimeConf.version
218 let basename = Filename.basename Sys.argv.(0) in
220 try Filename.chop_extension basename with Invalid_argument _ -> basename
222 try Hashtbl.find usages usage_key with Not_found -> default_usage
224 let extra_cmdline_specs = ref []
225 let add_cmdline_spec l = extra_cmdline_specs := l @ !extra_cmdline_specs
227 let parse_cmdline init_status =
228 if not (already_configured [CmdLine] init_status) then begin
229 let includes = ref [] in
230 let default_includes = [
232 BuildTimeConf.stdlib_dir_devel;
233 BuildTimeConf.stdlib_dir_installed ; ]
236 if Pcre.pmatch ~pat:"^/" s then s else Sys.getcwd() ^"/"^s
239 let add_l l = fun s -> l := s :: !l in
240 let reduce_verbosity () =
241 Helm_registry.set_int "matita.verbosity"
242 (Helm_registry.get_int "matita.verbosity" - 1) in
243 let increase_verbosity () =
244 Helm_registry.set_int "matita.verbosity"
245 (Helm_registry.get_int "matita.verbosity" + 1) in
248 "-I", Arg.String (add_l includes),
249 ("<path> Adds path to the list of searched paths for the "
250 ^ "include command");
251 "-conffile", Arg.Set_string conffile,
252 (Printf.sprintf ("<filename> Read configuration from filename"
254 BuildTimeConf.matita_conf);
256 Arg.Unit (fun () -> Helm_registry.set_bool "matita.force" true),
257 ("Force actions that would not be executed per default");
259 Arg.Unit (fun () -> Helm_registry.set_bool "matita.profile" false),
260 "Turns off profiling printings";
262 Arg.String (fun rex -> Helm_registry.set "matita.profile_only" rex),
263 "Activates only profiler with label matching the provided regex";
265 Arg.Unit (fun () -> Helm_registry.set_bool "matita.bench" true),
266 "Turns on parsable output on stdout, that is timings for matitac...";
268 Arg.Unit (fun () -> Helm_registry.set_bool "matita.preserve" true),
269 "Turns off automatic baseuri cleaning";
270 "-q", Arg.Unit reduce_verbosity, "Reduce verbosity";
271 "-system", Arg.Unit (fun () ->
272 Helm_registry.set_bool "matita.system" true),
273 ("Act on the system library instead of the user one"
274 ^ "\n WARNING: not for the casual user");
275 "-v", Arg.Unit increase_verbosity, "Increase verbosity";
278 if BuildTimeConf.debug then
280 Arg.Unit (fun () -> Helm_registry.set_bool "matita.debug" true),
281 ("Do not catch top-level exception "
282 ^ "(useful for backtrace inspection)");
286 std_arg_spec @ debug_arg_spec @ !extra_cmdline_specs
288 let set_list ~key l =
289 Helm_registry.set_list Helm_registry.of_string ~key ~value:l
291 Arg.parse arg_spec (add_l args) (usage ());
293 List.map absolutize ((List.rev !includes) @ default_includes) in
294 set_list ~key:"matita.includes" includes;
295 let args = List.rev (List.filter (fun x -> x <> "") !args) in
296 set_list ~key:"matita.args" args;
297 HExtlib.set_profiling_printings
299 Helm_registry.get_bool "matita.profile" &&
301 ~pat:(Helm_registry.get_opt_default
302 Helm_registry.string ~default:".*" "matita.profile_only")
304 CmdLine :: init_status
309 print_endline (usage ());
312 let initialize_all () =
314 List.fold_left (fun s f -> f s) !status
315 [ fill_registry; parse_cmdline; load_configuration; initialize_makelib;
316 initialize_db; initialize_environment ]
317 (* initialize_notation
318 (initialize_environment
322 (parse_cmdline !status))))) *)
324 let load_configuration_file () =
325 status := load_configuration !status
327 let parse_cmdline () =
328 status := parse_cmdline !status
330 let fill_registry () =
331 status := fill_registry !status
334 Inversion_principle.init ()