File: dep_info.ml

package info (click to toggle)
coq 9.1.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 35,964 kB
  • sloc: ml: 239,908; sh: 4,355; python: 2,985; ansic: 2,644; makefile: 874; lisp: 171; javascript: 63; xml: 24; sed: 2
file content (58 lines) | stat: -rw-r--r-- 2,134 bytes parent folder | download
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
53
54
55
56
57
58
(************************************************************************)
(* This file is licensed under The MIT License                          *)
(* See LICENSE for more information                                     *)
(************************************************************************)

module CD = Coqdeplib
module Dep_map = Map.Make(Path)

type t = CD.Dep_info.Dep.t list Dep_map.t

(* What a pita OCaml's stdlib missing basic stuff ... *)
let from_list l =
  List.fold_left (fun map { CD.Dep_info.name; deps } ->
      let name = Path.make name in
      let path = Path.add_extension ~ext:".v" name in
      Dep_map.add path deps map) Dep_map.empty l

let debug_coqdep = false
let debug = false

let coqdep_register_file vAccu file =
  (* if debug then Format.eprintf "cd regfile: %s@\n%!" file; *)
  CD.Common.treat_file_command_line vAccu (Path.to_string file)

(* From dir info + context *)
let make ~args ~(dir_info : _ Dir_info.t) =
  let args = "-dyndep" :: "opt" :: List.map Arg.to_string args in
  if debug_coqdep then Format.eprintf "coqdep: %s@\n%!" (String.concat " " args);
  let args = Coqdeplib.Args.parse (Coqdeplib.Args.make ()) args in
  (* We are sane w.r.t. path separators *)
  let make_separator_hack = false in
  let rocqenv, st = CD.Common.init ~make_separator_hack args in
  (* we always use -boot *)
  assert (rocqenv = Boot);
  let st =
    Dir_info.fold dir_info ~init:st ~f:(fun ~prefix:_ vAccu files ->
        let files = List.map Coq_module.source files in
        List.fold_left coqdep_register_file vAccu files) in
  CD.Common.compute_deps st |> from_list

let lookup ~dep_info file =
  if debug then Format.eprintf "lookup: %a@\n%!" Path.pp file;
  let file = Path.coqdep_fixup_dir file in
  Dep_map.find file dep_info

let pp_binding fmt (s, _) = Format.fprintf fmt "%a" Path.pp s

let lookup ~dep_info x =
  try lookup ~dep_info x
  with
  | Not_found ->
    if debug then
      begin
        Format.eprintf "@[<v>%a@]@\n%!"
          (Format.pp_print_list pp_binding) (Dep_map.bindings dep_info);
        Format.eprintf "@[dep: %a@\n%!@]" Path.pp x
      end;
    raise Not_found