- 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))
- uri_deps;
- 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)
- (Helm_registry.get_list Helm_registry.string "matita.args")
+ 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;
+ 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 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 ->
+ let deps = Hashtbl.find_all include_deps_dot 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 (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 oc
+ end;
+ if !order_only then begin
+ let module OrdererString =
+ struct
+ type t = string
+ let compare = Pervasives.compare
+ end
+ in
+ let module Topo = HTopoSort.Make (OrdererString) in
+ let sorted_ma =
+ Topo.topological_sort !ma_topo_keys (Hashtbl.find_all ma_topo) in
+ List.iter print_endline sorted_ma
+ (*Hashtbl.iter (fun k v -> printf "%s: %s\n" k v) ma_topo*)
+ end else
+ List.iter (* 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 "%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