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/fixed/12628.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Add Melange compilation to the `@all` alias in libraries (#12628,
@anmonteiro)
29 changes: 24 additions & 5 deletions src/dune_rules/alias_builder.ml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
open Import
open Action_builder

module Alias_status = struct
module T = struct
Expand All @@ -21,7 +20,7 @@ module Alias_status = struct
include Monoid.Make (T)
end

let alias a = dep (Dep.alias a)
let alias a = Action_builder.dep (Dep.alias a)

module Alias_build_info = struct
type t =
Expand All @@ -40,7 +39,7 @@ module Alias_build_info = struct
end

let dep_on_alias_build_info_if_exists alias =
let open O in
let open Action_builder.O in
Load_rules.load_dir ~dir:(Path.build (Alias.dir alias))
|> Action_builder.of_memo
>>= function
Expand All @@ -62,8 +61,8 @@ let dep_on_alias_build_info_if_exists alias =
module Alias_rec (Traverse : sig
val traverse
: Path.Build.t
-> f:(path:Path.Build.t -> Alias_build_info.t t)
-> Alias_status.t t
-> f:(path:Path.Build.t -> Alias_build_info.t Action_builder.t)
-> Alias_status.t Action_builder.t
end) =
struct
open Traverse
Expand All @@ -73,3 +72,23 @@ struct
traverse dir ~f
;;
end

let define_all_alias ?predicate_dir ~project ~js_targets dir =
let deps =
let predicate =
if Dune_project.explicit_js_mode project
then Predicate_lang.true_
else (
List.iter js_targets ~f:(fun js_target ->
assert (Path.Build.equal (Path.Build.parent_exn js_target) dir));
Predicate_lang.not
(Predicate_lang.Glob.of_string_set
(String.Set.of_list_map js_targets ~f:Path.Build.basename)))
in
let only_generated_files = Dune_project.dune_version project >= (3, 0) in
let dir = Option.value predicate_dir ~default:dir in
File_selector.of_predicate_lang ~dir:(Path.build dir) ~only_generated_files predicate
|> Action_builder.paths_matching_unit ~loc:Loc.none
in
Rules.Produce.Alias.add_deps (Alias.make Alias0.all ~dir) deps
;;
7 changes: 7 additions & 0 deletions src/dune_rules/alias_builder.mli
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,10 @@ module Alias_rec (_ : sig
in at least one directory, and [Not_defined] otherwise. *)
val dep_on_alias_rec : Alias.Name.t -> Path.Build.t -> Alias_status.t Action_builder.t
end

val define_all_alias
: ?predicate_dir:Path.Build.t
-> project:Dune_project.t
-> js_targets:Path.Build.t list
-> Path.Build.t
-> unit Memo.t
28 changes: 6 additions & 22 deletions src/dune_rules/gen_rules.ml
Original file line number Diff line number Diff line change
Expand Up @@ -192,25 +192,6 @@ end = struct
;;
end

let define_all_alias ~dir ~project ~js_targets =
let deps =
let predicate =
if Dune_project.explicit_js_mode project
then Predicate_lang.true_
else (
List.iter js_targets ~f:(fun js_target ->
assert (Path.Build.equal (Path.Build.parent_exn js_target) dir));
Predicate_lang.not
(Predicate_lang.Glob.of_string_set
(String.Set.of_list_map js_targets ~f:Path.Build.basename)))
in
let only_generated_files = Dune_project.dune_version project >= (3, 0) in
File_selector.of_predicate_lang ~dir:(Path.build dir) ~only_generated_files predicate
|> Action_builder.paths_matching_unit ~loc:Loc.none
in
Rules.Produce.Alias.add_deps (Alias.make Alias0.all ~dir) deps
;;

let gen_rules_for_stanzas sctx dir_contents cctxs expander ~dune_file ~dir:ctx_dir =
let src_dir = Dune_file.dir dune_file in
let* stanzas = Dune_file.stanzas dune_file
Expand Down Expand Up @@ -295,7 +276,7 @@ let gen_rules_for_stanzas sctx dir_contents cctxs expander ~dune_file ~dir:ctx_d
| _ -> Memo.return ())
and+ () =
let project = Dune_file.project dune_file in
define_all_alias ~dir:ctx_dir ~project ~js_targets
Alias_builder.define_all_alias ~project ~js_targets ctx_dir
in
cctxs
;;
Expand All @@ -311,7 +292,10 @@ let gen_rules_source_only sctx ~dir source_dir =
let* sctx = sctx in
let+ () = gen_format_and_cram_rules sctx ~dir source_dir
and+ () =
define_all_alias ~dir ~js_targets:[] ~project:(Source_tree.Dir.project source_dir)
Alias_builder.define_all_alias
~js_targets:[]
~project:(Source_tree.Dir.project source_dir)
dir
in
())
;;
Expand All @@ -329,7 +313,7 @@ let gen_rules_group_part_or_root sctx dir_contents cctxs ~source_dir ~dir
>>= gen_rules_for_stanzas sctx dir_contents cctxs ~dune_file ~dir
| None ->
let project = Source_tree.Dir.project source_dir in
let+ () = define_all_alias ~dir ~js_targets:[] ~project in
let+ () = Alias_builder.define_all_alias ~js_targets:[] ~project dir in
[]
in
contexts
Expand Down
12 changes: 9 additions & 3 deletions src/dune_rules/module_compilation.ml
Original file line number Diff line number Diff line change
Expand Up @@ -383,12 +383,18 @@ let build_module ?(force_write_cmi = false) ?(precompiled_cmi = false) cctx m =
Super_context.add_rule sctx ~dir action_with_targets)))
in
Memo.when_ melange (fun () ->
let+ () = build_cm ~cm_kind:(Melange Cmj) ~phase:None
and+ () =
let* () = build_cm ~cm_kind:(Melange Cmj) ~phase:None
and* () =
Memo.when_ (not precompiled_cmi) (fun () ->
build_cm ~cm_kind:(Melange Cmi) ~phase:None)
in
())
let project = Compilation_context.scope cctx |> Scope.project in
let dir = Compilation_context.dir cctx in
let predicate_dir =
let obj_dir = Compilation_context.obj_dir cctx in
Obj_dir.melange_dir obj_dir
in
Alias_builder.define_all_alias ~project ~predicate_dir ~js_targets:[] dir)
;;

let ocamlc_i ~deps cctx (m : Module.t) ~output =
Expand Down
1 change: 1 addition & 0 deletions test/blackbox-tests/test-cases/melange/dune-rules.t
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Test dune rules
Calling dune rules with the 'all' alias works fine

$ dune rules @all | grep In_build_dir
(File (In_build_dir _build/default/main.ml))))
(In_build_dir _build/default/.output.mobjs/melange/melange__Main.cmj))))

Calling dune rules with the alias works fine
Expand Down
9 changes: 7 additions & 2 deletions test/blackbox-tests/test-cases/melange/melange-alias-all.t
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,10 @@ Melange compilation is added to `@all`
> EOF

$ dune build @all
$ find _build/default | grep '\.cm'
[1]
$ find _build/default | grep '\.cm' | sort
_build/default/lib/.mlib.objs/melange/mlib.cmi
_build/default/lib/.mlib.objs/melange/mlib.cmj
_build/default/lib/.mlib.objs/melange/mlib.cmt
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmi
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmj
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmt
4 changes: 2 additions & 2 deletions test/blackbox-tests/test-cases/melange/transitive-ppx.t
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Test interaction of melange.emit library ppx dependencies
^^^^^^^^^^^
Error: Library "not-present" not found.
-> required by library "mel-subdir" in _build/default/lib/impl
-> required by melange target dist
-> required by alias lib/test/all
-> required by _build/default/META.mel-subdir
-> required by alias all
-> required by alias default
[1]
Loading