]> matita.cs.unibo.it Git - helm.git/commitdiff
-dot fixed, now the .dot file contains also edges
authorEnrico Tassi <enrico.tassi@inria.fr>
Fri, 11 Jan 2008 14:59:19 +0000 (14:59 +0000)
committerEnrico Tassi <enrico.tassi@inria.fr>
Fri, 11 Jan 2008 14:59:19 +0000 (14:59 +0000)
helm/software/matita/matitadep.ml

index fe7cab92075ee99c3dd74bfe57d71934e4cbbb99..0b64778ec8e9222da9169e5c80f9a1157c04a057 100644 (file)
@@ -35,7 +35,9 @@ let main () =
   let include_deps = Hashtbl.create 13 in
   let baseuri_of = Hashtbl.create 13 in
   let baseuri_of_inv = Hashtbl.create 13 in
+  let dot_name = "depends" in 
   let dot_file = ref "" in
+  let set_dot_file () = dot_file := dot_name^".dot" in
   (* helpers *)
   let include_paths = ref [] in
   let baseuri_of_script s = 
@@ -63,8 +65,8 @@ let main () =
   in
   (* initialization *)
   MatitaInit.add_cmdline_spec 
-    ["-dot", Arg.Set_string dot_file,
-    "<file> Save dependency graph in dot format to the given file";];
+    ["-dot", Arg.Unit set_dot_file,
+    "Save dependency graph in dot format and generate a png";];
   MatitaInit.parse_cmdline_and_configuration_file ();
   MatitaInit.initialize_environment ();
   let args = 
@@ -83,10 +85,17 @@ let main () =
          HExtlib.find ~test:(fun x -> Filename.check_suffix x ".ma") "."
       | _ ->
          let roots = List.map (HExtlib.chop_prefix (Sys.getcwd()^"/")) roots in
-         prerr_endline ("Too many roots found:\n\t" ^ String.concat "\n\t" roots);
+         prerr_endline ("Too many roots found:\n\t"^String.concat "\n\t" roots);
          prerr_endline ("\nEnter one of these directories and retry");
          exit 1
   in
+  let fix_name f =
+    let f = 
+      if Pcre.pmatch ~pat:"^\\./" f then String.sub f 2 (String.length f - 2)
+      else f
+    in 
+      HExtlib.normalize_path f
+  in
   let ma_files = args in
   (* here we go *)
   (* fills:
@@ -115,40 +124,7 @@ let main () =
                 Hashtbl.add include_deps ma_file path)
        dependencies)
    ma_files;
-  (* dot generation *)
-  if !dot_file <> "" then 
-    begin
-      let oc = open_out !dot_file in
-      let fmt = Format.formatter_of_out_channel oc in 
-      GraphvizPp.Dot.header fmt;
-      List.iter
-       (fun ma_file -> 
-        let deps = Hashtbl.find_all include_deps ma_file in
-        let deps = 
-          HExtlib.filter_map 
-            (fun u -> 
-              try Some (Hashtbl.find baseuri_of_inv u) 
-              with Not_found -> None) 
-            deps 
-        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)
-       ma_files;
-      GraphvizPp.Dot.trailer fmt;
-      close_out oc
-    end;
   (* generate regular depend output *)
-  let fix_name f =
-    let f = 
-      if Pcre.pmatch ~pat:"^\\./" f then
-        String.sub f 2 (String.length f - 2)
-      else 
-        f
-    in 
-      HExtlib.normalize_path f
-  in
   let deps =
     List.fold_left
      (fun acc ma_file -> 
@@ -171,6 +147,25 @@ let main () =
   in
   Librarian.write_deps_file (Sys.getcwd()) 
    (deps@HExtlib.list_uniq (List.sort Pervasives.compare (List.map (fun x ->
-           x,[]) extern)))
+           x,[]) extern)));
+  (* dot generation *)
+  if !dot_file <> "" then 
+    begin
+      let oc = open_out !dot_file in
+      let fmt = Format.formatter_of_out_channel oc in 
+      GraphvizPp.Dot.header fmt;
+      List.iter
+       (fun (ma_file,deps) -> 
+        GraphvizPp.Dot.node ma_file fmt;
+        List.iter (fun dep -> GraphvizPp.Dot.edge ma_file dep fmt) deps)
+       deps;
+      List.iter 
+        (fun x -> GraphvizPp.Dot.node ~attrs:["style","dashed"] x fmt) 
+        extern; 
+      GraphvizPp.Dot.trailer fmt;
+      close_out oc;
+      ignore(Sys.command ("tred "^ !dot_file^"| dot -Tpng -o"^dot_name^".png"));
+      HLog.message ("Type 'eog "^dot_name^".png' to view the graph"); 
+    end;
 ;;