Source file comExtraDeps.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
open Names
open CErrors
let rec ensure_only_one_path_contains from file acc = function
| [] ->
begin match acc with
| Some x -> x
| None ->
user_err Pp.(str "File " ++ str file ++ str " not found in " ++
DirPath.print from ++ str".")
end
| x :: xs ->
let abspath = x ^ "/" ^ file in
if Sys.file_exists abspath then begin
match acc with
| None -> ensure_only_one_path_contains from file (Some abspath) xs
| Some other ->
user_err Pp.(str "File " ++ str file ++ str " found twice in " ++
DirPath.print from ++ str":" ++ spc () ++ str other ++ str "," ++
spc() ++ str abspath ++ str ".")
end else
ensure_only_one_path_contains from file acc xs
let = Summary.ref ~name:"extra_deps" Id.Map.empty
let ?loc path id =
match Id.Map.find_opt id !extra_deps with
| Some (other,loc) ->
user_err Pp.(str "Extra dependency " ++ Id.print id ++
str " already bound to " ++ str other ++
pr_opt (fun x -> str " at " ++ Loc.pr x) loc ++ str ".")
| None -> extra_deps := Id.Map.add id (path,loc) !extra_deps
let ?loc ~from ~file id =
match Loadpath.find_with_logical_path from with
| _ :: _ as paths ->
let paths = List.map Loadpath.physical paths in
let file_path = ensure_only_one_path_contains from file None paths in
Option.iter (bind_extra_dep ?loc file_path) id
| [] -> user_err Pp.(str "No LoadPath found for " ++ DirPath.print from ++ str".")
let id = fst @@ Id.Map.find id !extra_deps