ocaml/ocamlbuild/report.ml

62 lines
2.4 KiB
OCaml

(***********************************************************************)
(* 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. *)
(* *)
(***********************************************************************)
(* 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)