dune/src/import.ml

102 lines
2.1 KiB
OCaml

include Stdune
include Errors
(* To make bug reports usable *)
let () = Printexc.record_backtrace true
let sprintf = Printf.sprintf
let ksprintf = Printf.ksprintf
let initial_cwd = Sys.getcwd ()
module String_map = struct
include String.Map
let pp f fmt t =
Format.pp_print_list (fun fmt (k, v) ->
Format.fprintf fmt "@[<hov 2>(%s@ =@ %a)@]" k f v
) fmt (to_list t)
end
module Sys = struct
include Sys
let force_remove =
if win32 then
fun fn ->
try
remove fn
with Sys_error _ ->
(* Try to remove the "read-only" attribute, then retry. *)
(try Unix.chmod fn 0o666 with Unix.Unix_error _ -> ());
remove fn
else
remove
end
type ('a, 'b) eq = Eq : ('a, 'a) eq
type nothing = (int, string) eq
let protect = Exn.protect
let protectx = Exn.protectx
let warn fmt =
ksprintf (fun msg ->
prerr_endline ("Warning: jbuild: " ^ msg))
fmt
type fail = { fail : 'a. unit -> 'a }
let need_quoting s =
let len = String.length s in
len = 0 ||
let rec loop i =
if i = len then
false
else
match s.[i] with
| ' ' | '\"' -> true
| _ -> loop (i + 1)
in
loop 0
let quote_for_shell s =
if need_quoting s then
Filename.quote s
else
s
let suggest_function : (string -> string list -> string list) ref = ref (fun _ _ -> [])
let hint name candidates =
match !suggest_function name candidates with
| [] -> ""
| l ->
let rec mk_hint = function
| [a; b] -> sprintf "%s or %s" a b
| [a] -> a
| a :: l -> sprintf "%s, %s" a (mk_hint l)
| [] -> ""
in
sprintf "\nHint: did you mean %s?" (mk_hint l)
(* Disable file operations to force to use the IO module *)
let open_in = `Use_Io
let open_in_bin = `Use_Io
let open_in_gen = `Use_Io
let open_out = `Use_Io
let open_out_bin = `Use_Io
let open_out_gen = `Use_Io
(* We open this module at the top of module generating rules, to make sure they don't do
Io manually *)
module No_io = struct
module Io = struct end
end
(* This is ugly *)
let printer = ref (Printf.eprintf "%s%!")
let print_to_console s = !printer s