summaryrefslogtreecommitdiffstats
path: root/ocamlbuild/report.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamlbuild/report.ml')
-rw-r--r--ocamlbuild/report.ml61
1 files changed, 61 insertions, 0 deletions
diff --git a/ocamlbuild/report.ml b/ocamlbuild/report.ml
new file mode 100644
index 000000000..df9144cea
--- /dev/null
+++ b/ocamlbuild/report.ml
@@ -0,0 +1,61 @@
+(***********************************************************************)
+(* ocamlbuild *)
+(* *)
+(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *)
+(* *)
+(* Copyright 2007 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. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+(* Original author: Berke Durak *)
+(* Report *)
+
+open My_std
+open Log
+open Format
+open Solver
+
+let sources_glob = Glob.parse "<*.ml> or <*.mli> or <*.c> or <*.h>";;
+
+let rec analyze f bt =
+ match bt with
+ | Leaf r ->
+ fprintf f "Ocamlbuild knows of no rules that apply to a target named %a. \
+ This can happen if you ask Ocamlbuild to build a target with the \
+ wrong extension (e.g. .opt instead of .native) or if the source \
+ files live in directories that have not been specified as \
+ include directories."
+ Resource.print r;
+ false
+ | Depth(r, bt) ->
+ if Glob.eval sources_glob r then
+ begin
+ fprintf f "Ocamlbuild cannot find or build %a. A file with such a name would \
+ usually be a source file. I suspect you have given a wrong target \
+ name to Ocamlbuild."
+ Resource.print r;
+ false
+ end
+ else
+ analyze f bt
+ | Choice bl -> List.for_all (analyze f) bl
+ | Target(_, bt) -> analyze f bt
+
+let rec print_backtrace f =
+ function
+ | Target (name, backtrace) ->
+ fprintf f "@\n- @[<2>Failed to build the target %s%a@]" name print_backtrace backtrace
+ | Leaf r ->
+ fprintf f "@\n- @[<2>Building %a@]" Resource.print r
+ | Depth (r, backtrace) ->
+ fprintf f "@\n- @[<v2>Building %a:%a@]" Resource.print r print_backtrace backtrace
+ | Choice [backtrace] -> print_backtrace f backtrace
+ | Choice backtraces ->
+ fprintf f "@\n- @[<v2>Failed to build all of these:";
+ List.iter (print_backtrace f) backtraces;
+ fprintf f "@]"
+
+let print_backtrace_analyze f bt = ignore (analyze f bt)