ocaml/tools/read_cmt.ml

81 lines
3.5 KiB
OCaml

(***********************************************************************)
(* *)
(* OCaml *)
(* *)
(* Fabrice Le Fessant, INRIA Saclay *)
(* *)
(* Copyright 2012 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the Q Public License version 1.0. *)
(* *)
(***********************************************************************)
let gen_annot = ref false
let gen_ml = ref false
let print_info_arg = ref false
let target_filename = ref None
let arg_list = [
"-o", Arg.String (fun s ->
target_filename := Some s
), " FILE (or -) : dump to file FILE (or stdout)";
"-annot", Arg.Set gen_annot, " : generate the corresponding .annot file";
"-src", Arg.Set gen_ml, " : generate an equivalent of the original source file (without comments) from a .cmt or a .cmti file";
"-info", Arg.Set print_info_arg, " : print information on the file";
]
let arg_usage = "read_cmt [OPTIONS] FILE.cmt : read FILE.cmt and print related information"
let print_info cmt =
let open Cmt_format in
Printf.printf "module name: %s\n" cmt.cmt_modname;
begin match cmt.cmt_annots with
Packed (_, list) -> Printf.printf "pack: %s\n" (String.concat " " list)
| Implementation _ -> Printf.printf "kind: implementation\n"
| Interface _ -> Printf.printf "kind: interface\n"
| Partial_implementation _ -> Printf.printf "kind: implementation with errors\n"
| Partial_interface _ -> Printf.printf "kind: interface with errors\n"
end;
Printf.printf "command: %s\n" (String.concat " " (Array.to_list cmt.cmt_args));
begin match cmt.cmt_sourcefile with
None -> ()
| Some name ->
Printf.printf "sourcefile: %s\n" name;
end;
Printf.printf "build directory: %s\n" cmt.cmt_builddir;
List.iter (fun dir -> Printf.printf "load path: %s\n%!" dir) cmt.cmt_loadpath;
begin
match cmt.cmt_source_digest with
None -> ()
| Some digest -> Printf.printf "source digest: %s\n" (Digest.to_hex digest);
end;
begin
match cmt.cmt_interface_digest with
None -> ()
| Some digest -> Printf.printf "interface digest: %s\n" (Digest.to_hex digest);
end;
List.iter (fun (name, digest) ->
Printf.printf "import: %s %s\n" name (Digest.to_hex digest);
) (List.sort compare cmt.cmt_imports);
Printf.printf "%!";
()
let _ =
Clflags.annotations := true;
Arg.parse arg_list (fun filename ->
if
Filename.check_suffix filename ".cmt" ||
Filename.check_suffix filename ".cmti"
then begin
(* init_path(); *)
let cmt = Cmt_format.read_cmt filename in
if !gen_annot then Cmt2annot.gen_annot !target_filename filename cmt;
if !gen_ml then Cmt2annot.gen_ml !target_filename filename cmt;
if !print_info_arg || not (!gen_ml || !gen_annot) then print_info cmt;
end else begin
Printf.fprintf stderr "Error: the file must have an extension in .cmt or .cmti.\n%!";
Arg.usage arg_list arg_usage
end
) arg_usage