Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions doc/changes/added/13397.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Add support for generating `.cms` files using oxcaml and adding `.cms` or
`.cmt` files as compilation dependencies (#13397, @spiessimon)
14 changes: 11 additions & 3 deletions src/dune_lang/dune_env.ml
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,13 @@ type config =
; error_on_use : User_message.t option
; warn_on_load : User_message.t option
; bin_annot : bool option
; bin_annot_cms : bool option
}

let dyn_of_config { bin_annot; _ } =
let dyn_of_config { bin_annot; bin_annot_cms; _ } =
let open Dyn in
record [ "bin_annot", option bool bin_annot ]
record
[ "bin_annot", option bool bin_annot; "bin_annot_cms", option bool bin_annot_cms ]
;;

let equal_config
Expand All @@ -109,6 +111,7 @@ let equal_config
; error_on_use
; warn_on_load
; bin_annot
; bin_annot_cms
}
t
=
Expand All @@ -131,6 +134,7 @@ let equal_config
&& Option.equal User_message.equal error_on_use t.error_on_use
&& Option.equal User_message.equal warn_on_load t.warn_on_load
&& Option.equal Bool.equal bin_annot t.bin_annot
&& Option.equal Bool.equal bin_annot_cms t.bin_annot_cms
;;

let hash_config = Poly.hash
Expand All @@ -152,6 +156,7 @@ let empty_config =
; error_on_use = None
; warn_on_load = None
; bin_annot = None
; bin_annot_cms = None
}
;;

Expand Down Expand Up @@ -231,6 +236,7 @@ let wasm_of_ocaml_field =
;;

let bin_annot = field_o "bin_annot" (Syntax.since Stanza.syntax (3, 8) >>> bool)
let bin_annot_cms = field_o "bin_annot_cms" (Syntax.since Oxcaml.syntax (0, 1) >>> bool)

let config =
let+ flags = Ocaml_flags.Spec.decode
Expand All @@ -251,7 +257,8 @@ let config =
and+ coq = Coq_env.decode
and+ rocq = Rocq_env.decode
and+ format_config = Format_config.field ~since:(2, 8)
and+ bin_annot = bin_annot in
and+ bin_annot = bin_annot
and+ bin_annot_cms = bin_annot_cms in
let menhir =
match menhir_flags, menhir with
| Some flags, None -> { Menhir_env.empty with flags }
Expand All @@ -276,6 +283,7 @@ let config =
; error_on_use = None
; warn_on_load = None
; bin_annot
; bin_annot_cms
}
;;

Expand Down
1 change: 1 addition & 0 deletions src/dune_lang/dune_env.mli
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ type config =
; error_on_use : User_message.t option
; warn_on_load : User_message.t option
; bin_annot : bool option
; bin_annot_cms : bool option
}

type pattern =
Expand Down
7 changes: 6 additions & 1 deletion src/dune_rules/check_rules.ml
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
open Import

let dev_files =
[ Ml_kind.cmt_ext Impl; Ml_kind.cmt_ext Intf; Cm_kind.ext Cmi ]
[ Ml_kind.cmt_ext Impl
; Ml_kind.cmt_ext Intf
; Ml_kind.cms_ext Impl
; Ml_kind.cms_ext Intf
; Cm_kind.ext Cmi
]
|> List.map ~f:(String.drop_prefix_if_exists ~prefix:".")
|> Glob.matching_extensions
;;
Expand Down
27 changes: 26 additions & 1 deletion src/dune_rules/compilation_context.ml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ type t =
; melange_package_name : Lib_name.t option
; modes : Lib_mode.Map.Set.t
; bin_annot : bool
; bin_annot_cms : bool
; cms_cmt_dependency : Workspace.Context.Cms_cmt_dependency.t
; loc : Loc.t option
; ocaml : Ocaml_toolchain.t
; for_ : Compilation_mode.t
Expand Down Expand Up @@ -126,6 +128,8 @@ let melange_package_name t = t.melange_package_name
let implements t = t.implements
let modes t = t.modes
let bin_annot t = t.bin_annot
let bin_annot_cms t = t.bin_annot_cms
let cms_cmt_dependency t = t.cms_cmt_dependency
let context t = Super_context.context t.super_context
let dep_graphs t = t.modules.dep_graphs
let ocaml t = t.ocaml
Expand Down Expand Up @@ -160,6 +164,8 @@ let create
?parameters
?modes
?bin_annot
?bin_annot_cms
?cms_cmt_dependency
?loc
?instances
for_
Expand Down Expand Up @@ -209,6 +215,16 @@ let create
match bin_annot with
| Some b -> Memo.return b
| None -> Env_stanza_db.bin_annot ~dir:(Obj_dir.dir obj_dir)
and+ bin_annot_cms =
match bin_annot_cms with
| Some b -> Memo.return b
| None -> Env_stanza_db.bin_annot_cms ~dir:(Obj_dir.dir obj_dir)
and+ cms_cmt_dependency =
match cms_cmt_dependency with
| Some v -> Memo.return v
| None ->
let context = Super_context.context super_context in
Memo.return (Context.cms_cmt_dependency context)
in
{ super_context
; scope
Expand All @@ -230,6 +246,8 @@ let create
; melange_package_name
; modes
; bin_annot
; bin_annot_cms
; cms_cmt_dependency
; loc
; ocaml
; instances
Expand Down Expand Up @@ -341,7 +359,14 @@ let for_plugin_executable t ~embed_in_plugin_libraries =
{ t with requires_link }
;;

let without_bin_annot t = { t with bin_annot = false }
let without_bin_annot t =
{ t with
bin_annot = false
; bin_annot_cms = false
; cms_cmt_dependency = Workspace.Context.Cms_cmt_dependency.No_dependency
}
;;

let set_obj_dir t obj_dir = { t with obj_dir }
let set_modes t ~modes = { t with modes }

Expand Down
4 changes: 4 additions & 0 deletions src/dune_rules/compilation_context.mli
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ val create
-> ?parameters:Lib.t list Resolve.Memo.t
-> ?modes:Lib_mode.Map.Set.t
-> ?bin_annot:bool
-> ?bin_annot_cms:bool
-> ?cms_cmt_dependency:Workspace.Context.Cms_cmt_dependency.t
-> ?loc:Loc.t
-> ?instances:Parameterised_instances.t Resolve.Memo.t
-> Compilation_mode.t
Expand Down Expand Up @@ -82,6 +84,8 @@ val for_module_generated_at_link_time

val for_plugin_executable : t -> embed_in_plugin_libraries:(Loc.t * Lib_name.t) list -> t
val bin_annot : t -> bool
val bin_annot_cms : t -> bool
val cms_cmt_dependency : t -> Workspace.Context.Cms_cmt_dependency.t
val without_bin_annot : t -> t

(** The dependency graph for the modules of the library. *)
Expand Down
5 changes: 5 additions & 0 deletions src/dune_rules/context.ml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ type builder =
; target_exec : (string * string list) option
; for_host : (Context_name.t * t Memo.t) option
; path : Path.t list
; cms_cmt_dependency : Workspace.Context.Cms_cmt_dependency.t
}

and t =
Expand Down Expand Up @@ -118,6 +119,7 @@ module Builder = struct
; target_exec = None
; for_host = None
; path = []
; cms_cmt_dependency = Workspace.Context.Cms_cmt_dependency.No_dependency
}
;;

Expand Down Expand Up @@ -154,6 +156,7 @@ module Builder = struct
; dynamically_linked_foreign_archives
; instrument_with
; merlin
; cms_cmt_dependency
}
=
let env =
Expand All @@ -173,6 +176,7 @@ module Builder = struct
; env = Memo.return env
; findlib_toolchain = toolchain
; target_exec = None
; cms_cmt_dependency
}
;;
end
Expand All @@ -199,6 +203,7 @@ let fdo_target_exe t = t.builder.fdo_target_exe
let instrument_with t = t.builder.instrument_with
let merlin t = t.builder.merlin
let profile t = t.builder.profile
let cms_cmt_dependency t = t.builder.cms_cmt_dependency
let equal x y = Context_name.equal x.builder.name y.builder.name
let hash t = Context_name.hash t.builder.name
let build_context t = t.build_context
Expand Down
1 change: 1 addition & 0 deletions src/dune_rules/context.mli
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ val findlib_toolchain : t -> Context_name.t option
val instrument_with : t -> Lib_name.t list
val profile : t -> Profile.t
val merlin : t -> bool
val cms_cmt_dependency : t -> Workspace.Context.Cms_cmt_dependency.t
val equal : t -> t -> bool
val hash : t -> int
val to_dyn : t -> Dyn.t
Expand Down
14 changes: 14 additions & 0 deletions src/dune_rules/env_stanza_db.ml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,20 @@ let bin_annot ~dir =
value ~default:true ~dir ~f:(fun (t : Dune_env.config) -> Memo.return t.bin_annot)
;;

let bin_annot_cms ~dir =
let* explicit =
value ~default:None ~dir ~f:(fun (t : Dune_env.config) ->
Memo.return (Option.map t.bin_annot_cms ~f:Option.some))
in
match explicit with
| Some b -> Memo.return b
| None ->
(* Enabled by default for OxCaml *)
let* context = Context.DB.by_dir dir in
let+ ocaml = Context.ocaml context in
Ocaml_config.ox ocaml.ocaml_config
;;

let inline_tests ~dir =
value ~default:None ~dir ~f:(fun (t : Dune_env.config) ->
Memo.return
Expand Down
1 change: 1 addition & 0 deletions src/dune_rules/env_stanza_db.mli
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ val value_opt

val profile : dir:Path.Build.t -> Profile.t Memo.t
val bin_annot : dir:Path.Build.t -> bool Memo.t
val bin_annot_cms : dir:Path.Build.t -> bool Memo.t
val inline_tests : dir:Path.Build.t -> Dune_env.Inline_tests.t Memo.t

(** [inherited ~name ~root ~f] create a function that computes a value derived
Expand Down
17 changes: 15 additions & 2 deletions src/dune_rules/install_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,8 @@ end = struct
in
let set_dir m = List.rev_map ~f:(fun (cm_kind, p) -> cm_dir m cm_kind, p) in
let+ modules_impl =
let+ bin_annot = Env_stanza_db.bin_annot ~dir in
let+ bin_annot = Env_stanza_db.bin_annot ~dir
and+ bin_annot_cms = Env_stanza_db.bin_annot_cms ~dir in
List.rev_concat_map installable_modules.impl ~f:(fun m ->
let cmt_files =
match bin_annot with
Expand All @@ -350,7 +351,19 @@ end = struct
condition
(kind, Obj_dir.Module.cmt_file obj_dir m ~ml_kind ~cm_kind:kind)))
in
List.rev_append (common m) cmt_files |> set_dir m)
let cms_files =
match bin_annot_cms with
| false -> []
| true ->
List.rev_concat_map Ml_kind.all ~f:(fun ml_kind ->
List.rev_concat_map
[ native || byte, Lib_mode.Cm_kind.Ocaml Cmi ]
~f:(fun (condition, kind) ->
if_
condition
(kind, Obj_dir.Module.cms_file obj_dir m ~ml_kind ~cm_kind:kind)))
in
List.rev_append (common m) (List.rev_append cmt_files cms_files) |> set_dir m)
in
let modules_vlib =
List.rev_concat_map installable_modules.vlib ~f:(fun m ->
Expand Down
Loading
Loading