aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorherbelin2010-04-10 15:18:17 +0000
committerherbelin2010-04-10 15:18:17 +0000
commitc6b7976677b943fbe8fa88a3e01e4b549e95ea90 (patch)
treebc319c32be930754ebb1441e4170ce5381aa2f17 /tools
parenta3d58682b063dcf56c3712562a0263822bfac30b (diff)
Fixing various coqdep bugs (#2118, #2242, #2274)
- Made resolution of clashing -I options consistent with coqc (bug #2242) - Made semantics of -R consistent with the one introduced by revision 11188 in coqc, i.e. -R now makes visible all intermediate qualification levels (bug #2274) - Added support for -I -as and -R -as syntax - Extended escaping of special chars of GNU make and used escaping more systematically (bug #2118) - Made warnings follow English typography git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@12916 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'tools')
-rw-r--r--tools/coqdep.ml4
-rw-r--r--tools/coqdep_common.ml89
2 files changed, 60 insertions, 33 deletions
diff --git a/tools/coqdep.ml b/tools/coqdep.ml
index 9be50c62ca..fe930a1de3 100644
--- a/tools/coqdep.ml
+++ b/tools/coqdep.ml
@@ -171,8 +171,12 @@ let rec parse = function
| "-boot" :: ll -> Flags.boot := true; parse ll
| "-sort" :: ll -> option_sort := true; parse ll
| ("-noglob" | "-no-glob") :: ll -> option_noglob := true; parse ll
+ | "-I" :: r :: "-as" :: ln :: ll -> add_dir add_known r [ln]; parse ll
+ | "-I" :: r :: "-as" :: [] -> usage ()
| "-I" :: r :: ll -> add_dir add_known r []; parse ll
| "-I" :: [] -> usage ()
+ | "-R" :: r :: "-as" :: ln :: ll -> add_rec_dir add_known r [ln]; parse ll
+ | "-R" :: r :: "-as" :: [] -> usage ()
| "-R" :: r :: ln :: ll -> add_rec_dir add_known r [ln]; parse ll
| "-R" :: ([] | [_]) -> usage ()
| "-coqlib" :: (r :: ll) -> Flags.coqlib_spec := true; Flags.coqlib := r; parse ll
diff --git a/tools/coqdep_common.ml b/tools/coqdep_common.ml
index dd609c788a..cb98bd4131 100644
--- a/tools/coqdep_common.ml
+++ b/tools/coqdep_common.ml
@@ -84,7 +84,9 @@ let safe_hash_add clq q (k,v) =
(k1,l1)::cltl when k=k1 -> (k1,v::l1)::cltl
| cl::cltl -> cl::add_clash cltl
| [] -> [(k,[v;v2])] in
- clq := add_clash !clq
+ clq := add_clash !clq;
+ (* overwrite previous bindings, as coqc does *)
+ Hashtbl.add q k v
with Not_found -> Hashtbl.add q k v
(** Files found in the loadpaths.
@@ -114,18 +116,18 @@ let coqlibKnown = (Hashtbl.create 19 : (string list, unit) Hashtbl.t)
let clash_v = ref ([]: (string list * string list) list)
let warning_module_notfound f s =
- eprintf "*** Warning : in file %s, library " f;
- eprintf "%s.v is required and has not been found in loadpath !\n"
+ eprintf "*** Warning: in file %s, library " f;
+ eprintf "%s.v is required and has not been found in loadpath!\n"
(String.concat "." s);
flush stderr
let warning_notfound f s =
- eprintf "*** Warning : in file %s, the file " f;
+ eprintf "*** Warning: in file %s, the file " f;
eprintf "%s.v is required and has not been found !\n" s;
flush stderr
let warning_declare f s =
- eprintf "*** Warning : in file %s, Declared ML Module " f;
+ eprintf "*** Warning: in file %s, declared ML module " f;
eprintf "%s has not been found !\n" s;
flush stderr
@@ -137,10 +139,10 @@ let warning_clash file dir =
let d2 = Filename.dirname f2 in
let dl = List.map Filename.dirname (List.rev fl) in
eprintf
- "*** Warning : in file %s, \n required library %s is ambiguous!\n (found %s.v in "
+ "*** Warning: in file %s, \n required library %s is ambiguous!\n (found %s.v in "
file (String.concat "." dir) f;
List.iter (fun s -> eprintf "%s, " s) dl;
- eprintf "%s and %s)\n" d2 d1
+ eprintf "%s and %s; used the latter)\n" d2 d1
| _ -> assert false
let safe_assoc verbose file k =
@@ -238,29 +240,42 @@ let traite_fichier_mllib md ext =
(!a_faire, !a_faire_opt)
with Sys_error _ -> ("","")
-let escape escaped_chars s =
- let n = ref 0 in
+(* Makefile's escaping rules are awful: $ is escaped by doubling and
+ other special characters are escaped by backslash prefixing while
+ backslashes themselves must be escaped only if part of a sequence
+ followed by a special character (i.e. in case of ambiguity with a
+ use of it as escaping character). Moreover (even if not crucial)
+ it is apparently not possible to directly escape ';' and leading '\t'. *)
+
+let escape =
+ let s' = Buffer.create 10 in
+ fun s ->
+ Buffer.clear s';
for i = 0 to String.length s - 1 do
- n := !n +
- (if List.mem s.[i] escaped_chars then 2 else 1)
+ let c = s.[i] in
+ if c = ' ' or c = '#' or c = ':' (* separators and comments *)
+ or c = '%' (* pattern *)
+ or c = '?' or c = '[' or c = ']' or c = '*' (* expansion in filenames *)
+ or i=0 && c = '~' && (String.length s = 1 || s.[1] = '/' ||
+ 'A' <= s.[1] && s.[1] <= 'Z' ||
+ 'a' <= s.[1] && s.[1] <= 'z') (* homedir expansion *)
+ then begin
+ let j = ref (i-1) in
+ while !j >= 0 && s.[!j] = '\\' do
+ Buffer.add_char s' '\\'; decr j (* escape all preceding '\' *)
+ done;
+ Buffer.add_char s' '\\';
+ end;
+ if c = '$' then Buffer.add_char s' '$';
+ Buffer.add_char s' c
done;
- if !n = String.length s then s else
- begin
- let s' = String.create !n in
- n := 0;
- for i = 0 to String.length s - 1 do
- if List.mem s.[i] escaped_chars then begin s'.[!n] <- '\\'; incr n end;
- s'.[!n] <- s.[i];
- incr n
- done;
- s'
- end
+ Buffer.contents s'
let canonize f =
let f' = absolute_dir (Filename.dirname f) // Filename.basename f in
match List.filter (fun (_,full) -> f' = full) !vAccu with
- | (f,_) :: _ -> escape ['#'] f
- | _ -> escape ['#'] f
+ | (f,_) :: _ -> escape f
+ | _ -> escape f
let traite_fichier_Coq verbose f =
try
@@ -298,7 +313,7 @@ let traite_fichier_Coq verbose f =
let declare suff dir s =
let base = file_name s dir in
let opt = if !option_natdynlk then " "^base^".cmxs" else "" in
- printf " %s%s%s" base suff opt
+ printf " %s%s%s" (escape base) suff opt
in
let decl str =
let s = basename_noext str in
@@ -336,42 +351,50 @@ let mL_dependencies () =
| None -> ""
| Some mldir -> " "^(file_name name mldir)^".cmi"
in
- printf "%s.cmo:%s%s\n" fullname dep intf;
- printf "%s.cmx:%s%s\n" fullname dep_opt intf;
+ let efullname = escape fullname in
+ printf "%s.cmo:%s%s\n" efullname dep intf;
+ printf "%s.cmx:%s%s\n" efullname dep_opt intf;
flush stdout)
(List.rev !mlAccu);
List.iter
(fun (name,dirname) ->
let fullname = file_name name dirname in
let (dep,_) = traite_fichier_ML fullname ".mli" in
- printf "%s.cmi:%s\n" fullname dep;
+ printf "%s.cmi:%s\n" (escape fullname) dep;
flush stdout)
(List.rev !mliAccu);
List.iter
(fun (name,dirname) ->
let fullname = file_name name dirname in
let (dep,dep_opt) = traite_fichier_mllib fullname ".mllib" in
- printf "%s.cma:%s\n" fullname dep;
- printf "%s.cmxa %s.cmxs:%s\n" fullname fullname dep_opt;
+ let efullname = escape fullname in
+ printf "%s.cma:%s\n" efullname dep;
+ printf "%s.cmxa %s.cmxs:%s\n" efullname efullname dep_opt;
flush stdout)
(List.rev !mllibAccu)
let coq_dependencies () =
List.iter
(fun (name,_) ->
- let glob = if !option_noglob then "" else " "^name^".glob" in
- printf "%s%s%s: %s.v" name !suffixe glob name;
+ let ename = escape name in
+ let glob = if !option_noglob then "" else " "^ename^".glob" in
+ printf "%s%s%s: %s.v" ename !suffixe glob ename;
traite_fichier_Coq true (name ^ ".v");
printf "\n";
flush stdout)
(List.rev !vAccu)
+let rec suffixes = function
+ | [] -> assert false
+ | [name] -> [[name]]
+ | dir::suffix as l -> l::suffixes suffix
+
let add_known phys_dir log_dir f =
match get_extension f [".v";".ml";".mli";".ml4";".mllib"] with
| (basename,".v") ->
let name = log_dir@[basename] in
let file = phys_dir//basename in
- let paths = [name;[basename]] in
+ let paths = suffixes name in
List.iter
(fun n -> safe_hash_add clash_v vKnown (n,file)) paths
| (basename,(".ml"|".ml4")) -> add_ml_known basename (Some phys_dir)