• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ocaml / dune / 28971

05 Nov 2024 10:23PM UTC coverage: 6.913%. Remained the same
28971

push

github

web-flow
chore(nix): always include ocaml-lsp in dev tools (#11102)

Signed-off-by: Rudi Grinberg <me@rgrinberg.com>

2933 of 42427 relevant lines covered (6.91%)

26850.21 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/dune_rules/virtual_rules.ml
1
open Import
2
open Memo.O
3

4
let setup_copy_rules_for_impl ~sctx ~dir vimpl =
5
  let ctx = Super_context.context sctx in
×
6
  let vlib = Vimpl.vlib vimpl in
×
7
  let impl = Vimpl.impl vimpl in
×
8
  let impl_obj_dir = Library.obj_dir ~dir impl in
×
9
  let vlib_obj_dir = Lib.info vlib |> Lib_info.obj_dir in
×
10
  let add_rule = Super_context.add_rule sctx ~dir in
×
11
  let copy_to_obj_dir ~src ~dst =
×
12
    add_rule ~loc:(Loc.of_pos __POS__) (Action_builder.symlink ~src ~dst)
×
13
  in
14
  let* { Lib_config.has_native; ext_obj; _ } =
15
    let+ ocaml = Context.ocaml ctx in
×
16
    ocaml.lib_config
×
17
  in
18
  let { Lib_mode.Map.ocaml = { byte; native }; melange } =
×
19
    Mode_conf.Lib.Set.eval impl.modes ~has_native
20
  in
21
  let copy_obj_file m kind =
×
22
    let src = Obj_dir.Module.cm_file_exn vlib_obj_dir m ~kind in
×
23
    let dst = Obj_dir.Module.cm_file_exn impl_obj_dir m ~kind in
×
24
    copy_to_obj_dir ~src ~dst
×
25
  in
26
  let copy_ocamldep_file m =
27
    match Obj_dir.to_local vlib_obj_dir with
×
28
    | None -> Memo.return ()
×
29
    | Some vlib_obj_dir ->
×
30
      let src = Obj_dir.Module.dep vlib_obj_dir (Immediate (m, Impl)) |> Path.build in
×
31
      let dst = Obj_dir.Module.dep impl_obj_dir (Immediate (m, Impl)) in
×
32
      copy_to_obj_dir ~src ~dst
×
33
  in
34
  let copy_interface_to_impl ~src kind () =
35
    let dst = Obj_dir.Module.cm_public_file_exn impl_obj_dir src ~kind in
×
36
    let src = Obj_dir.Module.cm_public_file_exn vlib_obj_dir src ~kind in
×
37
    copy_to_obj_dir ~src ~dst
×
38
  in
39
  let copy_objs src =
40
    Memo.when_ (byte || native) (fun () -> copy_obj_file src (Ocaml Cmi))
×
41
    >>> Memo.when_ melange (fun () -> copy_obj_file src (Melange Cmi))
×
42
    >>> Memo.when_
×
43
          (Module.visibility src = Public
×
44
           && Obj_dir.need_dedicated_public_dir impl_obj_dir)
×
45
          (fun () ->
46
            Memo.when_ (byte || native) (copy_interface_to_impl ~src (Ocaml Cmi))
×
47
            >>> Memo.when_ melange (copy_interface_to_impl ~src (Melange Cmi)))
×
48
    >>> Memo.when_ (Module.has src ~ml_kind:Impl) (fun () ->
×
49
      Memo.when_ byte (fun () -> copy_obj_file src (Ocaml Cmo))
×
50
      >>> Memo.when_ melange (fun () ->
×
51
        copy_obj_file src (Melange Cmj) >>> copy_ocamldep_file src)
×
52
      >>> Memo.when_ native (fun () ->
×
53
        copy_obj_file src (Ocaml Cmx)
×
54
        >>>
55
        let object_file dir = Obj_dir.Module.o_file_exn dir src ~ext_obj in
×
56
        copy_to_obj_dir ~src:(object_file vlib_obj_dir) ~dst:(object_file impl_obj_dir)))
×
57
  in
58
  let vlib_modules = Vimpl.vlib_modules vimpl in
59
  Modules.fold vlib_modules ~init:(Memo.return ()) ~f:(fun m acc -> acc >>> copy_objs m)
×
60
;;
61

62
let impl sctx ~(lib : Library.t) ~scope =
63
  match lib.implements with
×
64
  | None -> Memo.return None
×
65
  | Some (loc, implements) ->
×
66
    Lib.DB.find (Scope.libs scope) implements
×
67
    >>= (function
68
     | None ->
×
69
       User_error.raise
70
         ~loc
71
         [ Pp.textf
×
72
             "Cannot implement %s as that library isn't available"
73
             (Lib_name.to_string implements)
×
74
         ]
75
     | Some vlib ->
×
76
       let info = Lib.info vlib in
77
       let virtual_ =
×
78
         match Lib_info.virtual_ info with
79
         | Some v -> v
×
80
         | None ->
×
81
           User_error.raise
×
82
             ~loc:lib.buildable.loc
83
             [ Pp.textf
×
84
                 "Library %s isn't virtual and cannot be implemented"
85
                 (Lib_name.to_string implements)
×
86
             ]
87
       in
88
       let+ vlib_modules, vlib_foreign_objects =
89
         let foreign_objects = Lib_info.foreign_objects info in
90
         match virtual_, foreign_objects with
×
91
         | External _, Local | Local, External _ -> assert false
92
         | External modules, External fa -> Memo.return (modules, fa)
×
93
         | Local, Local ->
×
94
           let name = Lib.name vlib in
95
           let vlib = Lib.Local.of_lib_exn vlib in
×
96
           let* dir_contents =
×
97
             let info = Lib.Local.info vlib in
98
             let dir = Lib_info.src_dir info in
×
99
             Dir_contents.get sctx ~dir
×
100
           in
101
           let* ocaml = Context.ocaml (Super_context.context sctx) in
×
102
           let* modules =
×
103
             let db = Scope.libs scope in
104
             let* preprocess =
×
105
               (* TODO wrong, this should be delayed *)
106
               Preprocess.Per_module.with_instrumentation
107
                 lib.buildable.preprocess
108
                 ~instrumentation_backend:(Lib.DB.instrumentation_backend db)
×
109
               |> Resolve.Memo.read_memo
×
110
             in
111
             Dir_contents.ocaml dir_contents
×
112
             >>= Ml_sources.modules
×
113
                   ~libs:db
114
                   ~for_:(Library (Lib_info.lib_id info |> Lib_id.to_local_exn))
×
115
             >>=
116
             let pp_spec =
117
               Staged.unstage (Pp_spec.pped_modules_map preprocess ocaml.version)
×
118
             in
119
             Modules.map_user_written ~f:(fun m -> Memo.return (pp_spec m))
×
120
           in
121
           let+ foreign_objects =
×
122
             Dir_contents.foreign_sources dir_contents
×
123
             >>| Foreign_sources.for_lib ~name
×
124
             >>| (let ext_obj = ocaml.lib_config.ext_obj in
×
125
                  let dir = Obj_dir.obj_dir (Lib.Local.obj_dir vlib) in
×
126
                  Foreign.Sources.object_files ~ext_obj ~dir)
×
127
             >>| List.map ~f:Path.build
×
128
           in
129
           modules, foreign_objects
×
130
       in
131
       Some (Vimpl.make ~impl:lib ~vlib ~vlib_modules ~vlib_foreign_objects))
×
132
;;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc