dune/src/compilation_context.ml

91 lines
2.7 KiB
OCaml

open Import
module SC = Super_context
module Includes = struct
type t = string list Arg_spec.t Cm_kind.Dict.t
let make sctx ~requires : _ Cm_kind.Dict.t =
match requires with
| Error exn -> Cm_kind.Dict.make_all (Arg_spec.Dyn (fun _ -> raise exn))
| Ok libs ->
let iflags =
Lib.L.include_flags libs ~stdlib_dir:(SC.context sctx).stdlib_dir
in
let cmi_includes =
Arg_spec.S [ iflags
; Hidden_deps
(SC.Libs.file_deps sctx libs ~ext:".cmi")
]
in
let cmi_and_cmx_includes =
Arg_spec.S [ iflags
; Hidden_deps
(SC.Libs.file_deps sctx libs ~ext:".cmi-and-.cmx")
]
in
{ cmi = cmi_includes
; cmo = cmi_includes
; cmx = cmi_and_cmx_includes
}
let empty =
Cm_kind.Dict.make_all (Arg_spec.As [])
end
type t =
{ super_context : Super_context.t
; scope : Scope.t
; dir : Path.t
; dir_kind : File_tree.Dune_file.Kind.t
; obj_dir : Path.t
; modules : Module.t Module.Name.Map.t
; alias_module : Module.t option
; lib_interface_module : Module.t option
; flags : Ocaml_flags.t
; requires : Lib.t list Or_exn.t
; includes : Includes.t
; preprocessing : Preprocessing.t
; no_keep_locs : bool
}
let super_context t = t.super_context
let scope t = t.scope
let dir t = t.dir
let dir_kind t = t.dir_kind
let obj_dir t = t.obj_dir
let modules t = t.modules
let alias_module t = t.alias_module
let lib_interface_module t = t.lib_interface_module
let flags t = t.flags
let requires t = t.requires
let includes t = t.includes
let preprocessing t = t.preprocessing
let no_keep_locs t = t.no_keep_locs
let create ~super_context ~scope ~dir ?(dir_kind=File_tree.Dune_file.Kind.Dune)
?(obj_dir=dir) ~modules ?alias_module ?lib_interface_module ~flags
~requires ?(preprocessing=Preprocessing.dummy) ?(no_keep_locs=false) () =
{ super_context
; scope
; dir
; dir_kind
; obj_dir
; modules
; alias_module
; lib_interface_module
; flags
; requires
; includes = Includes.make super_context ~requires
; preprocessing
; no_keep_locs
}
let for_alias_module t =
let flags = Ocaml_flags.default ~profile:(SC.profile t.super_context) in
{ t with
flags = Ocaml_flags.append_common flags ["-w"; "-49"]
; includes = Includes.empty
; alias_module = None
}