X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatitadep.ml;h=7f75a057bd21a751501604a5a5de934c22300a62;hb=4216d3e6b09d1be8784ee9394f6c7f5aed4300a7;hp=20dc415fda1366aafd2d1b3b659d6877a81feb48;hpb=22c9ee038d411eed74b303e84bb18a55316762d7;p=helm.git diff --git a/matita/matitadep.ml b/matita/matitadep.ml index 20dc415fd..7f75a057b 100644 --- a/matita/matitadep.ml +++ b/matita/matitadep.ml @@ -51,10 +51,10 @@ let main () = let buri = buri alias in if buri <> current_buri then Some buri else None in MatitaInit.fill_registry (); - let do_dot = ref false in + let dot_file = ref "" in MatitaInit.add_cmdline_spec - ["-dot",Arg.Unit (fun () -> do_dot:=true), - "Generate deps for dot instead of make"]; + ["-dot", Arg.Set_string dot_file, + " Save dependency graph in dot format to the given file"]; MatitaInit.parse_cmdline (); MatitaInit.load_configuration_file (); let include_paths = @@ -97,15 +97,43 @@ let main () = ma_files; Hashtbl.iter (fun file alias -> - let dep = resolve alias (Hashtbl.find baseuri_of file) in - match dep with - | None -> () - | Some u -> - Hashtbl.add include_deps file (obj_file_of_baseuri false u)) + try + let dep = resolve alias (Hashtbl.find baseuri_of file) in + match dep with + | None -> () + | Some u -> + Hashtbl.add include_deps file (obj_file_of_baseuri false u) + with Not_found -> + prerr_endline ("File "^ file^" has no baseuri. Use set baseuri"); + exit 1) uri_deps; - if !do_dot then + let gcp x y = + (* explode and implode from the OCaml Expert FAQ. *) + let explode s = + let rec exp i l = + if i < 0 then l else exp (i - 1) (s.[i] :: l) in + exp (String.length s - 1) [] + in + let implode l = + let res = String.create (List.length l) in + let rec imp i = function + | [] -> res + | c :: l -> res.[i] <- c; imp (i + 1) l in + imp 0 l + in + let rec aux = function + | x::tl1,y::tl2 when x = y -> x::(aux (tl1,tl2)) + | _ -> [] + in + implode (aux (explode x,explode y)) + in + let max_path = List.hd ma_files in + let max_path = List.fold_left gcp max_path ma_files in + let short x = Pcre.replace ~pat:("^"^max_path) x in + if !dot_file <> "" then (* generate dependency graph if required *) begin - let fmt = Format.formatter_of_out_channel stdout in + let oc = open_out !dot_file in + let fmt = Format.formatter_of_out_channel oc in GraphvizPp.Dot.header (* ~graph_attrs:["rankdir","LR"] *) fmt; List.iter (fun ma_file -> @@ -119,25 +147,28 @@ let main () = in let deps = List.fast_sort Pervasives.compare deps in let deps = HExtlib.list_uniq deps in - GraphvizPp.Dot.node ma_file fmt; - List.iter (fun dep -> GraphvizPp.Dot.edge ma_file dep fmt) deps) + GraphvizPp.Dot.node (short ma_file) fmt; + List.iter (fun dep -> GraphvizPp.Dot.edge (short ma_file) (short dep) fmt) deps) ma_files; GraphvizPp.Dot.trailer fmt; - close_out stdout - end - else - begin - List.iter - (fun ma_file -> - let deps = Hashtbl.find_all include_deps ma_file in - let deps = List.fast_sort Pervasives.compare deps in - let deps = HExtlib.list_uniq deps in - let deps = ma_file :: deps in - let baseuri = Hashtbl.find baseuri_of ma_file in - let moo = obj_file_of_baseuri true baseuri in - Printf.printf "%s: %s\n%s: %s\n%s: %s\n" moo (String.concat " " deps) - (Filename.basename (Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file)) moo - (Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file) moo) - ma_files - end -;; + close_out oc + end; + List.iter (* (always) generate regular .depend output *) + (fun ma_file -> + try + let deps = Hashtbl.find_all include_deps ma_file in + let deps = List.fast_sort Pervasives.compare deps in + let deps = HExtlib.list_uniq deps in + let deps = ma_file :: deps in + let baseuri = Hashtbl.find baseuri_of ma_file in + let moo = obj_file_of_baseuri true baseuri in + Printf.printf "%s: %s\n%s: %s\n%s: %s\n%s: %s\n" + moo (String.concat " " deps) + (Filename.basename(Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file)) moo + (Pcre.replace ~pat:"ma$" ~templ:"mo" ma_file) moo + (Pcre.replace ~pat:"ma$" ~templ:"mo" (short ma_file)) moo + with Not_found -> + prerr_endline ("File "^ma_file^" has no baseuri. Use set baseuri"); + exit 1) + ma_files +