]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matitadep.ml
rc-1
[helm.git] / matita / matitadep.ml
index 20dc415fda1366aafd2d1b3b659d6877a81feb48..cfbc3783cbae5e624e842867e038a2ee576b88e0 100644 (file)
@@ -31,12 +31,12 @@ module U = UriManager
 let obj_file_of_baseuri writable baseuri = 
   try 
     LibraryMisc.obj_file_of_baseuri 
-     ~must_exist:true ~baseuri ~writable
+     ~must_exist:true ~baseuri ~writable 
   with 
   | Http_getter_types.Unresolvable_URI _ 
   | Http_getter_types.Key_not_found _ ->  
     LibraryMisc.obj_file_of_baseuri 
-     ~must_exist:false ~baseuri ~writable:true
+     ~must_exist:false ~baseuri ~writable:true 
 ;;
 
 let main () =
@@ -50,13 +50,12 @@ let main () =
   let resolve alias current_buri =
     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"];
-  MatitaInit.parse_cmdline ();
-  MatitaInit.load_configuration_file ();
+    ["-dot", Arg.Set_string dot_file,
+      "<file> Save dependency graph in dot format to the given file"];
+  MatitaInit.parse_cmdline_and_configuration_file ();
+  MatitaInit.initialize_environment ();
   let include_paths =
    Helm_registry.get_list Helm_registry.string "matita.includes" in
   let args = Helm_registry.get_list Helm_registry.string "matita.args" in
@@ -66,6 +65,13 @@ let main () =
       exit 1
     end;
   let ma_files = args in
+  let bof = Hashtbl.create 10 in
+  let baseuri_of_script s = 
+     try Hashtbl.find bof s 
+     with Not_found -> 
+       let b,_ = DependenciesParser.baseuri_of_script ~include_paths s in
+       Hashtbl.add bof s b; b
+  in
   List.iter
    (fun ma_file -> 
     let ic = open_in ma_file in
@@ -84,8 +90,7 @@ let main () =
           Hashtbl.add baseuri_of_inv uri ma_file
        | DependenciesParser.IncludeDep path -> 
           try 
-            let baseuri,_ =
-              DependenciesParser.baseuri_of_script ~include_paths path in
+            let baseuri = baseuri_of_script path in
             if not (Http_getter_storage.is_legacy baseuri) then
               (let moo_file = obj_file_of_baseuri false baseuri in
               Hashtbl.add include_deps ma_file moo_file;
@@ -97,15 +102,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 +152,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
+