diff options
| author | filliatr | 2001-05-11 10:31:34 +0000 |
|---|---|---|
| committer | filliatr | 2001-05-11 10:31:34 +0000 |
| commit | 2a84370dce1e0f19cea46c473b1b2d236b72d9f8 (patch) | |
| tree | c8152fafb4455b4b98991504bd9539db26b37d82 /tools | |
| parent | 47b37874d6b0ec1b8a5f69655d4cab417ed4a05b (diff) | |
application patch Claudio
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@1746 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/coq_makefile.ml | 26 | ||||
| -rw-r--r-- | tools/coq_vo2xml.ml | 175 |
2 files changed, 194 insertions, 7 deletions
diff --git a/tools/coq_makefile.ml b/tools/coq_makefile.ml index ead690e50f..ce220b54ff 100644 --- a/tools/coq_makefile.ml +++ b/tools/coq_makefile.ml @@ -93,6 +93,11 @@ let standard sds = (fun x -> print "\t(cd "; print x; print " ; $(MAKE) depend)\n") sds; print "\n"; + print "xml::\n"; + List.iter + (fun x -> print "\t(cd "; print x; print " ; $(MAKE) xml)\n") + sds; + print "\n"; print "install:\n"; print "\t@if test -z $(TARGETDIR); then echo \"You must set TARGETDIR (for instance with 'make TARGETDIR=foobla install')\"; exit 1; fi\n"; if !some_vfile then print "\tcp -f *.vo $(TARGETDIR)\n"; @@ -131,7 +136,7 @@ let implicit () = print ".v.tex:\n\t$(COQ2LATEX) $< -latex -o $@\n\n" ; print ".v.g.html:\n\t$(GALLINA) -stdout $< | $(COQ2HTML) -f > $@\n\n" ; print - ".v.g.tex:\n\t$(GALLINA) -stdout $< | $(COQ2LATEX) - -latex -o $@\n\n" + ".v.g.tex:\n\t$(GALLINA) -stdout $< | $(COQ2LATEX) - -latex -o $@\n\n" ; and ml_suffixes = if !some_mlfile then [ ".mli" ; ".ml" ; ".cmo" ; ".cmi"; ".cmx" ] @@ -183,6 +188,7 @@ let variables l = print "CAMLLINK=ocamlc\n"; print "CAMLOPTLINK=ocamlopt\n"; print "COQDEP=$(COQBIN)coqdep -c\n"; + print "COQVO2XML=coq_vo2xml\n"; var_aux l; print "\n" @@ -234,7 +240,7 @@ let subdirs l = section "Special targets."; print ".PHONY: " ; print_list " " - ("all"::"opt"::"byte"::"archclean"::"clean"::"install"::"depend"::sds); + ("all"::"opt"::"byte"::"archclean"::"clean"::"install"::"depend"::"xml"::sds); print "\n\n"; sds @@ -242,17 +248,18 @@ let subdirs l = let rec other_files suff = function | V n :: r -> - let f = (Filename.chop_suffix n "vo") ^ suff in + let f = (Filename.chop_suffix n ".vo") ^ suff in f :: (other_files suff r) | _ :: r -> other_files suff r | [] -> [] -let gfiles = other_files "g" -let hfiles = other_files "html" -let tfiles = other_files "tex" -let vifiles = other_files "vi" +let gfiles = other_files ".g" +let hfiles = other_files ".html" +let tfiles = other_files ".tex" +let vifiles = other_files ".vi" let gtfiles l = List.map (fun f -> f^".tex") (gfiles l) let ghfiles l = List.map (fun f -> f^".html") (gfiles l) +let vofiles = other_files ".vo" let all_target l = let rec fnames = function @@ -281,6 +288,11 @@ let all_target l = print "\n\n"; print "gallinahtml: "; print_list "\\\n " (ghfiles l) ; print "\n\n"; + print "xml:: .xml_time_stamp\n" ; + print ".xml_time_stamp: "; print_list "\\\n " (vofiles l) ; + print "\n\t$(COQVO2XML) $(COQFLAGS) $(?:%.o=%)\n" ; + print "\ttouch .xml_time_stamp" ; + print "\n\n" end let parse f = diff --git a/tools/coq_vo2xml.ml b/tools/coq_vo2xml.ml new file mode 100644 index 0000000000..9b47fed030 --- /dev/null +++ b/tools/coq_vo2xml.ml @@ -0,0 +1,175 @@ +(* environment *) + +let environment = Unix.environment () + +let bindir = ref Coq_config.bindir +let binary = ref ("coqtop." ^ Coq_config.best) +let image = ref "" +let xml_library_root = ref ( + try + Sys.getenv "XML_LIBRARY_ROOT" + with Not_found -> "" +) + +(* the $COQBIN environment variable has priority over the Coq_config value *) +let _ = + try + let c = Sys.getenv "COQBIN" in + if c <> "" then bindir := c + with Not_found -> () + +(* coq_vo2xml options *) + +let keep = ref false + +(* Verifies that a string do not contains others caracters than letters, + digits, or `_` *) + +let check_module_name s = + let err () = + output_string stderr + "Modules names must only contain letters, digits, or underscores\n"; + output_string stderr + "and must begin with a letter\n"; + exit 1 + in + match String.get s 0 with + | 'a' .. 'z' | 'A' .. 'Z' -> + for i = 1 to (String.length s)-1 do + match String.get s i with + | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' -> () + | _ -> err () + done + | _ -> err () + + (* compilation of a file [file] with command [command] and args [args] *) + +let compile command args file = + let dirname = Filename.dirname file in + let basename = Filename.basename file in + let modulename = + if Filename.check_suffix basename ".vo" then + Filename.chop_suffix basename ".vo" + else + basename + in + check_module_name modulename; + let tmpfile = Filename.temp_file "coq_vo2xml" ".v" in + let args' = + command :: "-batch" :: "-silent" :: args + @ ["-load-vernac-source"; tmpfile] in + let devnull = + if Sys.os_type = "Unix" then + Unix.openfile "/dev/null" [] 0o777 + else + Unix.stdin + in + let oc = open_out tmpfile in + Printf.fprintf oc "Require Xml.\n" ; + Printf.fprintf oc "Require %s.\n" modulename; + Printf.fprintf oc "Print XML Module Disk \"%s\" %s.\n" !xml_library_root + modulename; + flush oc; + close_out oc; + try + let pid = + Unix.create_process_env command + (Array.of_list args') environment devnull Unix.stdout Unix.stderr in + let status = Unix.waitpid [] pid in + if not !keep then Sys.remove tmpfile ; + match status with + | _, Unix.WEXITED 0 -> () + | _, Unix.WEXITED 127 -> + Printf.printf "Cannot execute %s\n" command; + exit 1 + | _, Unix.WEXITED c -> exit c + | _ -> exit 1 + with _ -> + if not !keep then Sys.remove tmpfile; exit 1 + +(* parsing of the command line + * + * special treatment for -bindir and -i. + * other options are passed to coqtop *) + +let usage () = + Usage.print_usage + "Usage: coq_vo2xml <options> <Coq options> module...\n +options are: + -xml-library-root d specify the path to the root of the XML library + (overrides $XML_LIBRARY_ROOT) + -image f specify an alternative executable for Coq + -t keep temporary files\n\n" ; + flush stderr ; + exit 1 + +let parse_args () = + let rec parse (cfiles,args) = function + | [] -> + List.rev cfiles, List.rev args + | "-xml-library-root" :: v :: rem -> + xml_library_root := v ; parse (cfiles,args) rem + | "-t" :: rem -> + keep := true ; parse (cfiles,args) rem + | "-boot" :: rem -> + bindir:= Filename.concat Coq_config.coqtop "bin"; + parse (cfiles, "-boot"::args) rem + | "-bindir" :: d :: rem -> + bindir := d ; parse (cfiles,args) rem + | "-bindir" :: [] -> + usage () + | "-byte" :: rem -> + binary := "coqtop.byte"; parse (cfiles,args) rem + | "-opt" :: rem -> + binary := "coqtop.opt"; parse (cfiles,args) rem + | "-image" :: f :: rem -> + image := f; parse (cfiles,args) rem + | "-image" :: [] -> + usage () + | ("-?"|"-h"|"-H"|"-help"|"--help") :: _ -> usage () + | ("-libdir"|"-outputstate"|"-I"|"-include" + |"-inputstate"|"-is"|"-load-vernac-source"|"-load-vernac-object" + |"-load-ml-source"|"-require"|"-load-ml-object"|"-user" + |"-init-file" as o) :: rem -> + begin + match rem with + | s :: rem' -> parse (cfiles,s::o::args) rem' + | [] -> usage () + end + | "-R" as o :: s :: t :: rem -> parse (cfiles,t::s::o::args) rem + | ("-notactics"|"-debug"|"-db"|"-debugger"|"-nolib"|"-batch"|"-nois" + |"-q"|"-full"|"-profile"|"-just-parsing"|"-echo" |"-unsafe"|"-quiet" + |"-silent"|"-m" as o) :: rem -> + parse (cfiles,o::args) rem + | ("-v"|"--version") :: _ -> + Usage.version () + | "-where" :: _ -> + print_endline Coq_config.coqlib; exit 0 + | f :: rem -> parse (f::cfiles,args) rem + in + parse ([],[]) (List.tl (Array.to_list Sys.argv)) + +(* main: we parse the command line, define the command to compile files + * and then call the compilation on each file *) + +let main () = + let cfiles, args = parse_args () in + if cfiles = [] then begin + prerr_endline "coq_vo2xml: too few arguments" ; + usage () + end; + let coqtopname = + if !image <> "" then !image else Filename.concat !bindir (!binary ^ Coq_config.exec_extension) + in + if !xml_library_root = "" then + begin + prerr_endline "coq_vo2xml: you must either set $XML_LIBRARY_ROOT or use -xml-library-root"; + usage () + end + else + List.iter (compile coqtopname args) cfiles ; + prerr_endline + ("\nWARNING: all the URIs in the generated XML files are broken." ^ + "\n See the README in the XML contrib to learn how to fix them.\n") + +let _ = Printexc.print main (); exit 0 |
