Skip to content

Commit ce22e00

Browse files
authored
fix(melange): add melange module compilation as part of @all alias (#12628)
* fix(melange): add melange module compilation as part of `@all` alias Signed-off-by: Antonio Nuno Monteiro <[email protected]> * fix: tests Signed-off-by: Antonio Nuno Monteiro <[email protected]> * add changelog entry Signed-off-by: Antonio Nuno Monteiro <[email protected]> --------- Signed-off-by: Antonio Nuno Monteiro <[email protected]>
1 parent 968e255 commit ce22e00

File tree

8 files changed

+58
-34
lines changed

8 files changed

+58
-34
lines changed

doc/changes/fixed/12628.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- Add Melange compilation to the `@all` alias in libraries (#12628,
2+
@anmonteiro)

src/dune_rules/alias_builder.ml

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
open Import
2-
open Action_builder
32

43
module Alias_status = struct
54
module T = struct
@@ -21,7 +20,7 @@ module Alias_status = struct
2120
include Monoid.Make (T)
2221
end
2322

24-
let alias a = dep (Dep.alias a)
23+
let alias a = Action_builder.dep (Dep.alias a)
2524

2625
module Alias_build_info = struct
2726
type t =
@@ -40,7 +39,7 @@ module Alias_build_info = struct
4039
end
4140

4241
let dep_on_alias_build_info_if_exists alias =
43-
let open O in
42+
let open Action_builder.O in
4443
Load_rules.load_dir ~dir:(Path.build (Alias.dir alias))
4544
|> Action_builder.of_memo
4645
>>= function
@@ -62,8 +61,8 @@ let dep_on_alias_build_info_if_exists alias =
6261
module Alias_rec (Traverse : sig
6362
val traverse
6463
: Path.Build.t
65-
-> f:(path:Path.Build.t -> Alias_build_info.t t)
66-
-> Alias_status.t t
64+
-> f:(path:Path.Build.t -> Alias_build_info.t Action_builder.t)
65+
-> Alias_status.t Action_builder.t
6766
end) =
6867
struct
6968
open Traverse
@@ -73,3 +72,23 @@ struct
7372
traverse dir ~f
7473
;;
7574
end
75+
76+
let define_all_alias ?predicate_dir ~project ~js_targets dir =
77+
let deps =
78+
let predicate =
79+
if Dune_project.explicit_js_mode project
80+
then Predicate_lang.true_
81+
else (
82+
List.iter js_targets ~f:(fun js_target ->
83+
assert (Path.Build.equal (Path.Build.parent_exn js_target) dir));
84+
Predicate_lang.not
85+
(Predicate_lang.Glob.of_string_set
86+
(String.Set.of_list_map js_targets ~f:Path.Build.basename)))
87+
in
88+
let only_generated_files = Dune_project.dune_version project >= (3, 0) in
89+
let dir = Option.value predicate_dir ~default:dir in
90+
File_selector.of_predicate_lang ~dir:(Path.build dir) ~only_generated_files predicate
91+
|> Action_builder.paths_matching_unit ~loc:Loc.none
92+
in
93+
Rules.Produce.Alias.add_deps (Alias.make Alias0.all ~dir) deps
94+
;;

src/dune_rules/alias_builder.mli

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,10 @@ module Alias_rec (_ : sig
3838
in at least one directory, and [Not_defined] otherwise. *)
3939
val dep_on_alias_rec : Alias.Name.t -> Path.Build.t -> Alias_status.t Action_builder.t
4040
end
41+
42+
val define_all_alias
43+
: ?predicate_dir:Path.Build.t
44+
-> project:Dune_project.t
45+
-> js_targets:Path.Build.t list
46+
-> Path.Build.t
47+
-> unit Memo.t

src/dune_rules/gen_rules.ml

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -192,25 +192,6 @@ end = struct
192192
;;
193193
end
194194

195-
let define_all_alias ~dir ~project ~js_targets =
196-
let deps =
197-
let predicate =
198-
if Dune_project.explicit_js_mode project
199-
then Predicate_lang.true_
200-
else (
201-
List.iter js_targets ~f:(fun js_target ->
202-
assert (Path.Build.equal (Path.Build.parent_exn js_target) dir));
203-
Predicate_lang.not
204-
(Predicate_lang.Glob.of_string_set
205-
(String.Set.of_list_map js_targets ~f:Path.Build.basename)))
206-
in
207-
let only_generated_files = Dune_project.dune_version project >= (3, 0) in
208-
File_selector.of_predicate_lang ~dir:(Path.build dir) ~only_generated_files predicate
209-
|> Action_builder.paths_matching_unit ~loc:Loc.none
210-
in
211-
Rules.Produce.Alias.add_deps (Alias.make Alias0.all ~dir) deps
212-
;;
213-
214195
let gen_rules_for_stanzas sctx dir_contents cctxs expander ~dune_file ~dir:ctx_dir =
215196
let src_dir = Dune_file.dir dune_file in
216197
let* stanzas = Dune_file.stanzas dune_file
@@ -295,7 +276,7 @@ let gen_rules_for_stanzas sctx dir_contents cctxs expander ~dune_file ~dir:ctx_d
295276
| _ -> Memo.return ())
296277
and+ () =
297278
let project = Dune_file.project dune_file in
298-
define_all_alias ~dir:ctx_dir ~project ~js_targets
279+
Alias_builder.define_all_alias ~project ~js_targets ctx_dir
299280
in
300281
cctxs
301282
;;
@@ -311,7 +292,10 @@ let gen_rules_source_only sctx ~dir source_dir =
311292
let* sctx = sctx in
312293
let+ () = gen_format_and_cram_rules sctx ~dir source_dir
313294
and+ () =
314-
define_all_alias ~dir ~js_targets:[] ~project:(Source_tree.Dir.project source_dir)
295+
Alias_builder.define_all_alias
296+
~js_targets:[]
297+
~project:(Source_tree.Dir.project source_dir)
298+
dir
315299
in
316300
())
317301
;;
@@ -329,7 +313,7 @@ let gen_rules_group_part_or_root sctx dir_contents cctxs ~source_dir ~dir
329313
>>= gen_rules_for_stanzas sctx dir_contents cctxs ~dune_file ~dir
330314
| None ->
331315
let project = Source_tree.Dir.project source_dir in
332-
let+ () = define_all_alias ~dir ~js_targets:[] ~project in
316+
let+ () = Alias_builder.define_all_alias ~js_targets:[] ~project dir in
333317
[]
334318
in
335319
contexts

src/dune_rules/module_compilation.ml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,12 +383,18 @@ let build_module ?(force_write_cmi = false) ?(precompiled_cmi = false) cctx m =
383383
Super_context.add_rule sctx ~dir action_with_targets)))
384384
in
385385
Memo.when_ melange (fun () ->
386-
let+ () = build_cm ~cm_kind:(Melange Cmj) ~phase:None
387-
and+ () =
386+
let* () = build_cm ~cm_kind:(Melange Cmj) ~phase:None
387+
and* () =
388388
Memo.when_ (not precompiled_cmi) (fun () ->
389389
build_cm ~cm_kind:(Melange Cmi) ~phase:None)
390390
in
391-
())
391+
let project = Compilation_context.scope cctx |> Scope.project in
392+
let dir = Compilation_context.dir cctx in
393+
let predicate_dir =
394+
let obj_dir = Compilation_context.obj_dir cctx in
395+
Obj_dir.melange_dir obj_dir
396+
in
397+
Alias_builder.define_all_alias ~project ~predicate_dir ~js_targets:[] dir)
392398
;;
393399

394400
let ocamlc_i ~deps cctx (m : Module.t) ~output =

test/blackbox-tests/test-cases/melange/dune-rules.t

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Test dune rules
1919
Calling dune rules with the 'all' alias works fine
2020

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

2425
Calling dune rules with the alias works fine

test/blackbox-tests/test-cases/melange/melange-alias-all.t

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@ Melange compilation is added to `@all`
1616
> EOF
1717

1818
$ dune build @all
19-
$ find _build/default | grep '\.cm'
20-
[1]
19+
$ find _build/default | grep '\.cm' | sort
20+
_build/default/lib/.mlib.objs/melange/mlib.cmi
21+
_build/default/lib/.mlib.objs/melange/mlib.cmj
22+
_build/default/lib/.mlib.objs/melange/mlib.cmt
23+
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmi
24+
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmj
25+
_build/default/lib/.mlib.objs/melange/mlib__Hello.cmt

test/blackbox-tests/test-cases/melange/transitive-ppx.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Test interaction of melange.emit library ppx dependencies
3434
^^^^^^^^^^^
3535
Error: Library "not-present" not found.
3636
-> required by library "mel-subdir" in _build/default/lib/impl
37-
-> required by melange target dist
38-
-> required by alias lib/test/all
37+
-> required by _build/default/META.mel-subdir
38+
-> required by alias all
3939
-> required by alias default
4040
[1]

0 commit comments

Comments
 (0)