~ubuntu-branches/ubuntu/wily/coq-doc/wily

« back to all changes in this revision

Viewing changes to toplevel/coqtop.ml

  • Committer: Bazaar Package Importer
  • Author(s): Stéphane Glondu, Stéphane Glondu, Samuel Mimram
  • Date: 2010-01-07 22:50:39 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20100107225039-n3cq82589u0qt0s2
Tags: 8.2pl1-1
[ Stéphane Glondu ]
* New upstream release (Closes: #563669)
  - remove patches
* Packaging overhaul:
  - use git, advertise it in Vcs-* fields of debian/control
  - use debhelper 7 and dh with override
  - use source format 3.0 (quilt)
* debian/control:
  - set Maintainer to d-o-m, set Uploaders to Sam and myself
  - add Homepage field
  - bump Standards-Version to 3.8.3
* Register PDF documentation into doc-base
* Add debian/watch
* Update debian/copyright

[ Samuel Mimram ]
* Change coq-doc's description to mention that it provides documentation in
  pdf format, not postscript, closes: #543545.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
(************************************************************************)
 
2
(*  v      *   The Coq Proof Assistant  /  The Coq Development Team     *)
 
3
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
 
4
(*   \VV/  **************************************************************)
 
5
(*    //   *      This file is distributed under the terms of the       *)
 
6
(*         *       GNU Lesser General Public License Version 2.1        *)
 
7
(************************************************************************)
 
8
 
 
9
(* $Id: coqtop.ml 11830 2009-01-22 06:45:13Z notin $ *)
 
10
 
 
11
open Pp
 
12
open Util
 
13
open System
 
14
open Flags
 
15
open Names
 
16
open Libnames
 
17
open Nameops
 
18
open States
 
19
open Toplevel
 
20
open Coqinit
 
21
 
 
22
let get_version_date () =
 
23
  try
 
24
    let coqlib = Envars.coqlib () in 
 
25
    let ch = open_in (Filename.concat coqlib "revision") in
 
26
    let ver = input_line ch in
 
27
    let rev = input_line ch in
 
28
      (ver,rev)
 
29
  with _ -> (Coq_config.version,Coq_config.date)
 
30
 
 
31
let print_header () =
 
32
  let (ver,rev) = (get_version_date ()) in
 
33
    Printf.printf "Welcome to Coq %s (%s)\n" ver rev;
 
34
    flush stdout
 
35
 
 
36
let output_context = ref false
 
37
 
 
38
let memory_stat = ref false
 
39
 
 
40
let print_memory_stat () = 
 
41
  if !memory_stat then
 
42
    Format.printf "total heap size = %d kbytes\n" (heap_size_kb ())
 
43
 
 
44
let _ = at_exit print_memory_stat
 
45
 
 
46
let engagement = ref None
 
47
let set_engagement c = engagement := Some c
 
48
let engage () =
 
49
  match !engagement with Some c -> Global.set_engagement c | None -> ()
 
50
  
 
51
let set_batch_mode () = batch_mode := true
 
52
 
 
53
let toplevel_default_name = make_dirpath [id_of_string "Top"]
 
54
let toplevel_name = ref (Some toplevel_default_name)
 
55
let set_toplevel_name dir =
 
56
  if dir = empty_dirpath then error "Need a non empty toplevel module name";
 
57
  toplevel_name := Some dir
 
58
let unset_toplevel_name () = toplevel_name := None
 
59
 
 
60
let remove_top_ml () = Mltop.remove ()
 
61
 
 
62
let inputstate = ref None
 
63
let set_inputstate s = inputstate:= Some s
 
64
let inputstate () =
 
65
  match !inputstate with
 
66
    | Some "" -> ()
 
67
    | Some s -> intern_state s
 
68
    | None -> intern_state "initial.coq"
 
69
 
 
70
let outputstate = ref ""
 
71
let set_outputstate s = outputstate:=s
 
72
let outputstate () = if !outputstate <> "" then extern_state !outputstate
 
73
 
 
74
let set_default_include d = push_include (d,Nameops.default_root_prefix)
 
75
let set_default_rec_include d = push_rec_include(d,Nameops.default_root_prefix)
 
76
let set_include d p =
 
77
  let p = dirpath_of_string p in
 
78
  Library.check_coq_overwriting p;
 
79
  push_include (d,p)
 
80
let set_rec_include d p =
 
81
  let p = dirpath_of_string p in 
 
82
  Library.check_coq_overwriting p;
 
83
  push_rec_include(d,p)
 
84
 
 
85
let load_vernacular_list = ref ([] : (string * bool) list)
 
86
let add_load_vernacular verb s =
 
87
  load_vernacular_list := ((make_suffix s ".v"),verb) :: !load_vernacular_list
 
88
let load_vernacular () =
 
89
  List.iter
 
90
    (fun (s,b) -> 
 
91
      if Flags.do_beautify () then
 
92
        with_option beautify_file (Vernac.load_vernac b) s
 
93
      else
 
94
        Vernac.load_vernac b s)
 
95
    (List.rev !load_vernacular_list)
 
96
 
 
97
let load_vernacular_obj = ref ([] : string list)
 
98
let add_vernac_obj s = load_vernacular_obj := s :: !load_vernacular_obj
 
99
let load_vernac_obj () = 
 
100
  List.iter (fun f -> Library.require_library_from_file None f None)
 
101
    (List.rev !load_vernacular_obj)
 
102
 
 
103
let require_list = ref ([] : string list)
 
104
let add_require s = require_list := s :: !require_list
 
105
let require () =
 
106
  List.iter (fun s -> Library.require_library_from_file None s (Some false))
 
107
    (List.rev !require_list)
 
108
 
 
109
let compile_list = ref ([] : (bool * string) list)
 
110
let add_compile verbose s =
 
111
  set_batch_mode ();
 
112
  Flags.make_silent true; 
 
113
  compile_list := (verbose,s) :: !compile_list
 
114
let compile_files () =
 
115
  let init_state = States.freeze() in
 
116
  let coqdoc_init_state = Dumpglob.coqdoc_freeze () in
 
117
    List.iter
 
118
      (fun (v,f) ->
 
119
         States.unfreeze init_state;
 
120
         Dumpglob.coqdoc_unfreeze coqdoc_init_state;
 
121
         if Flags.do_beautify () then
 
122
           with_option beautify_file (Vernac.compile v) f
 
123
         else
 
124
           Vernac.compile v f)
 
125
      (List.rev !compile_list)
 
126
 
 
127
let re_exec_version = ref ""
 
128
let set_byte () = re_exec_version := "byte"
 
129
let set_opt () = re_exec_version := "opt"
 
130
 
 
131
(* Re-exec Coq in bytecode or native code if necessary. [s] is either
 
132
   ["byte"] or ["opt"]. Notice that this is possible since the nature of
 
133
   the toplevel has already been set in [Mltop] by the main file created
 
134
   by coqmktop (see scripts/coqmktop.ml). *)
 
135
 
 
136
let re_exec is_ide =
 
137
  let s = !re_exec_version in
 
138
  let is_native = Mltop.is_native in
 
139
  (* Unix.readlink is not implemented on Windows architectures :-(
 
140
     let prog =
 
141
       try Unix.readlink "/proc/self/exe"
 
142
       with Unix.Unix_error _ -> Sys.argv.(0) in
 
143
  *)
 
144
  let prog = Sys.argv.(0) in
 
145
  if (is_native && s = "byte") || ((not is_native) && s = "opt")
 
146
  then begin
 
147
    let s = if s = "" then if is_native then "opt" else "byte" else s in
 
148
    let newprog = 
 
149
      let dir = Filename.dirname prog in
 
150
      let coqtop = if is_ide then "coqide." else "coqtop." in
 
151
      let com = coqtop ^ s ^ Coq_config.exec_extension in
 
152
      if dir <> "." then Filename.concat dir com else com 
 
153
    in
 
154
    Sys.argv.(0) <- newprog;
 
155
    Unix.handle_unix_error (Unix.execvp newprog) Sys.argv
 
156
  end
 
157
 
 
158
(*s options for the virtual machine *)
 
159
 
 
160
let boxed_val = ref false
 
161
let boxed_def = ref false
 
162
let use_vm = ref false
 
163
 
 
164
let set_vm_opt () =
 
165
  Vm.set_transp_values (not !boxed_val);
 
166
  Flags.set_boxed_definitions !boxed_def;
 
167
  Vconv.set_use_vm !use_vm
 
168
 
 
169
(*s Parsing of the command line.
 
170
    We no longer use [Arg.parse], in order to use share [Usage.print_usage]
 
171
    between coqtop and coqc. *)
 
172
 
 
173
let usage () =
 
174
  if !batch_mode then
 
175
    Usage.print_usage_coqc ()
 
176
  else
 
177
    Usage.print_usage_coqtop () ;
 
178
  flush stderr ;
 
179
  exit 1
 
180
 
 
181
let warning s = msg_warning (str s)
 
182
 
 
183
 
 
184
let ide_args = ref []
 
185
let parse_args is_ide =
 
186
  let glob_opt = ref false in
 
187
  let rec parse = function
 
188
    | [] -> ()
 
189
    | "-with-geoproof" :: s :: rem -> 
 
190
        if s = "yes" then Coq_config.with_geoproof := true
 
191
        else if s = "no" then Coq_config.with_geoproof := false
 
192
        else usage ();
 
193
        parse rem
 
194
    | "-impredicative-set" :: rem -> 
 
195
        set_engagement Declarations.ImpredicativeSet; parse rem
 
196
 
 
197
    | ("-I"|"-include") :: d :: "-as" :: p :: rem -> set_include d p; parse rem
 
198
    | ("-I"|"-include") :: d :: "-as" :: [] -> usage ()
 
199
    | ("-I"|"-include") :: d :: rem -> set_default_include d; parse rem
 
200
    | ("-I"|"-include") :: []       -> usage ()
 
201
 
 
202
    | "-R" :: d :: "-as" :: p :: rem -> set_rec_include d p;parse rem
 
203
    | "-R" :: d :: "-as" :: [] -> usage ()
 
204
    | "-R" :: d :: p :: rem -> set_rec_include d p;parse rem
 
205
    | "-R" :: ([] | [_]) -> usage ()
 
206
 
 
207
    | "-top" :: d :: rem -> set_toplevel_name (dirpath_of_string d); parse rem
 
208
    | "-top" :: [] -> usage ()
 
209
 
 
210
    | "-exclude-dir" :: f :: rem -> exclude_search_in_dirname f; parse rem
 
211
    | "-exclude-dir" :: [] -> usage ()
 
212
 
 
213
    | "-notop" :: rem -> unset_toplevel_name (); parse rem
 
214
    | "-q" :: rem -> no_load_rc (); parse rem
 
215
 
 
216
    | "-opt" :: rem -> set_opt(); parse rem
 
217
    | "-byte" :: rem -> set_byte(); parse rem
 
218
    | "-full" :: rem -> warning "option -full deprecated\n"; parse rem
 
219
 
 
220
    | "-batch" :: rem -> set_batch_mode (); parse rem
 
221
    | "-boot" :: rem -> boot := true; no_load_rc (); parse rem       
 
222
    | "-quality" :: rem -> term_quality := true; no_load_rc (); parse rem
 
223
    | "-outputstate" :: s :: rem -> set_outputstate s; parse rem
 
224
    | "-outputstate" :: []       -> usage ()
 
225
 
 
226
    | "-nois" :: rem -> set_inputstate ""; parse rem
 
227
             
 
228
    | ("-inputstate"|"-is") :: s :: rem -> set_inputstate s; parse rem
 
229
    | ("-inputstate"|"-is") :: []       -> usage ()
 
230
 
 
231
    | "-load-ml-object" :: f :: rem -> Mltop.dir_ml_load f; parse rem
 
232
    | "-load-ml-object" :: []       -> usage ()
 
233
 
 
234
    | "-load-ml-source" :: f :: rem -> Mltop.dir_ml_use f; parse rem
 
235
    | "-load-ml-source" :: []       -> usage ()
 
236
 
 
237
    | ("-load-vernac-source"|"-l") :: f :: rem -> 
 
238
        add_load_vernacular false f; parse rem
 
239
    | ("-load-vernac-source"|"-l") :: []       -> usage ()
 
240
 
 
241
    | ("-load-vernac-source-verbose"|"-lv") :: f :: rem -> 
 
242
        add_load_vernacular true f; parse rem
 
243
    | ("-load-vernac-source-verbose"|"-lv") :: []       -> usage ()
 
244
 
 
245
    | "-load-vernac-object" :: f :: rem -> add_vernac_obj f; parse rem
 
246
    | "-load-vernac-object" :: []       -> usage ()
 
247
 
 
248
    | "-dump-glob" :: "stdout" :: rem -> Dumpglob.dump_to_stdout (); glob_opt := true; parse rem
 
249
          (* À ne pas documenter : l'option 'stdout' n'étant
 
250
             éventuellement utile que pour le debugging... *)
 
251
    | "-dump-glob" :: f :: rem -> Dumpglob.dump_into_file f; glob_opt := true; parse rem
 
252
    | "-dump-glob" :: []       -> usage ()
 
253
    | ("-no-glob" | "-noglob") :: rem -> Dumpglob.noglob (); glob_opt := true; parse rem
 
254
 
 
255
    | "-require" :: f :: rem -> add_require f; parse rem
 
256
    | "-require" :: []       -> usage ()
 
257
 
 
258
    | "-compile" :: f :: rem -> add_compile false f; if not !glob_opt then Dumpglob.dump_to_dotglob (); parse rem
 
259
    | "-compile" :: []       -> usage ()
 
260
 
 
261
    | "-compile-verbose" :: f :: rem -> add_compile true f;  if not !glob_opt then Dumpglob.dump_to_dotglob (); parse rem
 
262
    | "-compile-verbose" :: []       -> usage ()
 
263
 
 
264
    | "-dont-load-proofs" :: rem -> Flags.dont_load_proofs := true; parse rem
 
265
 
 
266
    | "-beautify" :: rem -> make_beautify true; parse rem
 
267
 
 
268
    | "-unsafe" :: f :: rem -> add_unsafe f; parse rem
 
269
    | "-unsafe" :: []       -> usage ()
 
270
 
 
271
    | "-debug" :: rem -> set_debug (); parse rem
 
272
 
 
273
    | "-vm" :: rem -> use_vm := true; parse rem
 
274
    | "-emacs" :: rem -> Flags.print_emacs := true; Pp.make_pp_emacs(); parse rem
 
275
    | "-emacs-U" :: rem -> Flags.print_emacs := true; 
 
276
        Flags.print_emacs_safechar := true; Pp.make_pp_emacs(); parse rem
 
277
            
 
278
    | "-unicode" :: rem -> Flags.unicode_syntax := true; parse rem
 
279
 
 
280
    | "-coqlib" :: d :: rem -> Flags.coqlib_spec:=true; Flags.coqlib:=d; parse rem
 
281
    | "-coqlib" :: [] -> usage ()
 
282
 
 
283
    | "-where" :: _ -> print_endline (Envars.coqlib ()); exit 0
 
284
 
 
285
    | ("-config"|"--config") :: _ -> Usage.print_config (); exit 0
 
286
 
 
287
    | ("-quiet"|"-silent") :: rem -> Flags.make_silent true; parse rem
 
288
 
 
289
    | ("-?"|"-h"|"-H"|"-help"|"--help") :: _ -> usage ()
 
290
 
 
291
    | ("-v"|"--version") :: _ -> Usage.version ()
 
292
 
 
293
    | "-init-file" :: f :: rem -> set_rcfile f; parse rem
 
294
    | "-init-file" :: []       -> usage ()
 
295
 
 
296
    | "-user" :: u :: rem -> set_rcuser u; parse rem
 
297
    | "-user" :: []       -> usage ()
 
298
 
 
299
    | "-notactics" :: rem -> remove_top_ml (); parse rem
 
300
 
 
301
    | "-just-parsing" :: rem -> Vernac.just_parsing := true; parse rem
 
302
 
 
303
    | ("-m" | "--memory") :: rem -> memory_stat := true; parse rem
 
304
 
 
305
    | "-xml" :: rem -> Flags.xml_export := true; parse rem
 
306
 
 
307
    | "-output-context" :: rem -> output_context := true; parse rem
 
308
 
 
309
    (* Scanned in Flags. *)
 
310
    | "-v7" :: rem -> error "This version of Coq does not support v7 syntax"
 
311
    | "-v8" :: rem -> parse rem
 
312
 
 
313
    | "-no-hash-consing" :: rem -> Flags.hash_cons_proofs := false; parse rem
 
314
 
 
315
    | s :: rem -> 
 
316
        if is_ide then begin
 
317
          ide_args := s :: !ide_args;
 
318
          parse rem
 
319
        end else begin
 
320
          prerr_endline ("Don't know what to do with " ^ s); usage ()
 
321
        end
 
322
  in
 
323
  try
 
324
    parse (List.tl (Array.to_list Sys.argv))
 
325
  with 
 
326
    | UserError(_,s) as e -> begin
 
327
        try
 
328
          Stream.empty s; exit 1
 
329
        with Stream.Failure ->
 
330
          msgnl (Cerrors.explain_exn e); exit 1
 
331
      end
 
332
    | e -> begin msgnl (Cerrors.explain_exn e); exit 1 end
 
333
 
 
334
let init is_ide =
 
335
  Sys.catch_break false; (* Ctrl-C is fatal during the initialisation *)
 
336
  Lib.init();
 
337
  begin
 
338
    try
 
339
      parse_args is_ide;
 
340
      re_exec is_ide;
 
341
      if_verbose print_header ();
 
342
      init_load_path ();
 
343
      inputstate ();
 
344
      set_vm_opt ();
 
345
      engage ();
 
346
      if (not !batch_mode|| !compile_list=[]) && Global.env_is_empty() then
 
347
        Option.iter Declaremods.start_library !toplevel_name;
 
348
      init_library_roots ();
 
349
      load_vernac_obj ();
 
350
      require ();
 
351
      load_rcfile();
 
352
      load_vernacular ();
 
353
      compile_files ();
 
354
      outputstate ()
 
355
    with e ->
 
356
      flush_all();
 
357
      if not !batch_mode then message "Error during initialization:";
 
358
      msgnl (Toplevel.print_toplevel_error e);
 
359
      exit 1
 
360
  end;
 
361
  if !batch_mode then
 
362
    (flush_all(); 
 
363
     if !output_context then
 
364
       Pp.ppnl (with_option raw_print Prettyp.print_full_pure_context ());
 
365
     Profile.print_profile (); 
 
366
     exit 0);
 
367
  Lib.declare_initial_state ()
 
368
 
 
369
let init_ide () = init true; List.rev !ide_args
 
370
 
 
371
let start () =
 
372
  init false;
 
373
  Toplevel.loop();
 
374
  (* Initialise and launch the Ocaml toplevel *)
 
375
  Coqinit.init_ocaml_path();
 
376
  Mltop.ocaml_toploop();
 
377
  exit 1
 
378
 
 
379
(* [Coqtop.start] will be called by the code produced by coqmktop *)