Skip to content

Commit d30e875

Browse files
committed
single context universal
Signed-off-by: Antonio Nuno Monteiro <anmonteiro@gmail.com>
1 parent 7ddf878 commit d30e875

5 files changed

Lines changed: 421 additions & 0 deletions

File tree

src/dune_rules/lib.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ module T = struct
393393
; implements : t Resolve.t option
394394
; project : Dune_project.t option
395395
; (* these fields cannot be forced until the library is instantiated *)
396+
(* TODO(anmonteiro): change this to Compilation_mode.By_mode.t *)
397+
(* default_implementation : t Resolve.t Memo.Lazy.t Compilation_mode.By_mode.t option *)
396398
default_implementation : t Resolve.t Memo.Lazy.t option
397399
; sub_systems : Sub_system0.Instance.t Memo.Lazy.t Sub_system_name.Map.t
398400
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
Test that paths in `node_modules` are correct for sub-libraries of the
2+
form `foo.bar.baz`
3+
4+
$ mkdir -p lib_for_melange lib_for_native app/lib
5+
6+
Set up 2 different libraries in 2 packages -- one has `(modes melange)`, the
7+
other has `(modes :standard)`
8+
9+
$ cat > lib_for_melange/dune-project <<EOF
10+
> (lang dune 3.24)
11+
> (package (name lib_for_melange))
12+
> (using melange 0.1)
13+
> EOF
14+
$ cat > lib_for_melange/dune <<EOF
15+
> (library
16+
> (modes melange)
17+
> (public_name lib_for_melange))
18+
> EOF
19+
$ cat > lib_for_melange/foo.ml <<EOF
20+
> let x = "lib for melange"
21+
> EOF
22+
23+
$ dune build --root lib_for_melange
24+
$ dune install --root lib_for_melange --prefix $PWD/prefix
25+
26+
$ cat > lib_for_native/dune-project <<EOF
27+
> (lang dune 3.24)
28+
> (package (name lib_for_native))
29+
> (using melange 0.1)
30+
> EOF
31+
$ cat > lib_for_native/dune <<EOF
32+
> (library
33+
> (modes :standard)
34+
> (public_name lib_for_native))
35+
> EOF
36+
$ cat > lib_for_native/foo.ml <<EOF
37+
> let x = "lib for native"
38+
> EOF
39+
40+
$ dune build --root lib_for_native
41+
$ dune install --root lib_for_native --prefix $PWD/prefix
42+
43+
$ cat > app/dune-project <<EOF
44+
> (lang dune 3.24)
45+
> (package (name app))
46+
> (using melange 0.1)
47+
> EOF
48+
49+
$ cat > app/lib/dune <<EOF
50+
> (library
51+
> (modes melange :standard)
52+
> (name lib_for_app)
53+
> (libraries lib_for_native)
54+
> (melange.libraries lib_for_melange)
55+
> (melange.preprocess (pps melange.ppx))
56+
> (public_name app))
57+
> EOF
58+
59+
$ cat > app/lib/common_intf.mli <<EOF
60+
> val print : string -> unit
61+
> EOF
62+
$ cat > app/lib/common_intf.ml <<EOF
63+
> let message = Lib_for_native.Foo.x
64+
> let print prefix = Format.eprintf "%s%s@." prefix message
65+
> EOF
66+
$ cat > app/lib/common_intf.melange.ml <<EOF
67+
> let message = Lib_for_melange.Foo.x
68+
> let print prefix = Js.log2 prefix message
69+
> EOF
70+
$ cat > app/lib/lib_for_app.ml <<EOF
71+
> let say_hello () = Common_intf.print "message: "
72+
> EOF
73+
74+
$ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build --root app
75+
$ dune install --root app --prefix $PWD/prefix
76+
$ cat prefix/lib/app/dune-package | grep requires
77+
(requires lib_for_native)
78+
(melange_requires lib_for_melange)
79+
80+
Now use the installed common library for an executable and a `melange.emit`
81+
82+
$ mkdir use-installed
83+
$ cat > use-installed/dune-project <<EOF
84+
> (lang dune 3.24)
85+
> (using melange 0.1)
86+
> EOF
87+
88+
$ cat > use-installed/dune <<EOF
89+
> (melange.emit
90+
> (target out)
91+
> (modules x)
92+
> (emit_stdlib false)
93+
> (libraries app))
94+
>
95+
> (executable
96+
> (name x)
97+
> (modules x)
98+
> (libraries app))
99+
> EOF
100+
$ cat > use-installed/x.ml <<EOF
101+
> let () = Lib_for_app.say_hello ()
102+
> EOF
103+
104+
$ cd use-installed
105+
$ OCAMLPATH=$PWD/../prefix/lib/:$OCAMLPATH dune build @all
106+
107+
$ node ./_build/default/out/x.js
108+
message: lib for melange
109+
110+
$ ./_build/default/x.exe
111+
message: lib for native

test/blackbox-tests/test-cases/melange/conditional-pps.t

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,74 @@ The field is available starting in Dune 3.24.
110110
$ dune build --root deps
111111
$ grep y deps/_build/default/.melange_src/foo.pp.ml
112112
let y = "from melange preprocessor"
113+
114+
Test that paths in `node_modules` are correct for sub-libraries of the
115+
form `foo.bar.baz`
116+
117+
$ mkdir a
118+
$ cat > a/dune-project <<EOF
119+
> (lang dune 3.24)
120+
> (package (name a))
121+
> (using melange 0.1)
122+
> EOF
123+
$ cat > a/dune <<EOF
124+
> (library
125+
> (modes melange :standard)
126+
> (name a)
127+
> (melange.preprocess (pps melange.ppx))
128+
> (public_name a.sub))
129+
> EOF
130+
131+
$ cat > a/foo.ml <<EOF
132+
> let x = "foo"
133+
> EOF
134+
$ cat > a/melange_only.melange.ml <<EOF
135+
> external x : unit -> < > Js.t = "" [@@mel.obj]
136+
> let x = x ()
137+
> EOF
138+
139+
$ dune build --root a
140+
$ find ./a/_build/default -type f | censor | sort
141+
./a/_build/default/.a.objs/byte/a.cmi
142+
./a/_build/default/.a.objs/byte/a.cmo
143+
./a/_build/default/.a.objs/byte/a.cmt
144+
./a/_build/default/.a.objs/byte/a__Foo.cmi
145+
./a/_build/default/.a.objs/byte/a__Foo.cmo
146+
./a/_build/default/.a.objs/byte/a__Foo.cmt
147+
./a/_build/default/.a.objs/melange/a.cmi
148+
./a/_build/default/.a.objs/melange/a.cmj
149+
./a/_build/default/.a.objs/melange/a.cmt
150+
./a/_build/default/.a.objs/melange/a__Foo.cmi
151+
./a/_build/default/.a.objs/melange/a__Foo.cmj
152+
./a/_build/default/.a.objs/melange/a__Foo.cmt
153+
./a/_build/default/.a.objs/melange/a__Melange_only.cmi
154+
./a/_build/default/.a.objs/melange/a__Melange_only.cmj
155+
./a/_build/default/.a.objs/melange/a__Melange_only.cmt
156+
./a/_build/default/.a.objs/native/a.cmx
157+
./a/_build/default/.a.objs/native/a.o
158+
./a/_build/default/.a.objs/native/a__Foo.cmx
159+
./a/_build/default/.a.objs/native/a__Foo.o
160+
./a/_build/default/.dune/configurator
161+
./a/_build/default/.dune/configurator.v2
162+
./a/_build/default/.melange_src/a.ml-gen
163+
./a/_build/default/.melange_src/foo.ml
164+
./a/_build/default/.melange_src/foo.pp.ml
165+
./a/_build/default/.melange_src/melange_only.ml
166+
./a/_build/default/.melange_src/melange_only.pp.ml
167+
./a/_build/default/.merlin-conf/lib-a.sub
168+
./a/_build/default/.ppx/$DIGEST/_ppx.ml-gen
169+
./a/_build/default/.ppx/$DIGEST/dune__exe___ppx.cmi
170+
./a/_build/default/.ppx/$DIGEST/dune__exe___ppx.cmo
171+
./a/_build/default/.ppx/$DIGEST/dune__exe___ppx.cmx
172+
./a/_build/default/.ppx/$DIGEST/dune__exe___ppx.o
173+
./a/_build/default/.ppx/$DIGEST/ppx.exe
174+
./a/_build/default/META.a
175+
./a/_build/default/a.a
176+
./a/_build/default/a.cma
177+
./a/_build/default/a.cmxa
178+
./a/_build/default/a.cmxs
179+
./a/_build/default/a.dune-package
180+
./a/_build/default/a.install
181+
./a/_build/default/a.ml-gen
182+
./a/_build/default/foo.ml
183+
./a/_build/default/melange_only.melange.ml
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
Test that paths in `node_modules` are correct for sub-libraries of the
2+
form `foo.bar.baz`
3+
4+
$ mkdir a app
5+
$ cat > a/dune-project <<EOF
6+
> (lang dune 3.8)
7+
> (package (name a))
8+
> (using melange 0.1)
9+
> EOF
10+
$ cat > a/dune <<EOF
11+
> (library
12+
> (modes melange :standard)
13+
> (name a)
14+
> (public_name a.sub))
15+
> EOF
16+
17+
$ cat > a/foo.ml <<EOF
18+
> let x = "foo"
19+
> EOF
20+
$ cat > a/melange_only.melange.ml <<EOF
21+
> let x = "melange"
22+
> EOF
23+
24+
25+
$ dune build --root a
26+
27+
$ dune install --root a --prefix $PWD/prefix --display short
28+
Installing $TESTCASE_ROOT/prefix/lib/a/META
29+
Installing $TESTCASE_ROOT/prefix/lib/a/dune-package
30+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.a
31+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cma
32+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cmi
33+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cmt
34+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cmx
35+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cmxa
36+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.ml
37+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a__Foo.cmi
38+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a__Foo.cmt
39+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a__Foo.cmx
40+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/foo.ml
41+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a.cmi
42+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a.cmj
43+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a.cmt
44+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a.ml
45+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Foo.cmi
46+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Foo.cmj
47+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Foo.cmt
48+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Melange_only.cmi
49+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Melange_only.cmj
50+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/a__Melange_only.cmt
51+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/foo.ml
52+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/melange/melange_only.ml
53+
Installing $TESTCASE_ROOT/prefix/lib/a/sub/a.cmxs
54+
55+
$ cat prefix/lib/a/dune-package | sed "s/(lang dune .*)/(lang dune <version>)/"
56+
(lang dune <version>)
57+
(name a)
58+
(sections
59+
(lib
60+
$TESTCASE_ROOT/prefix/lib/a)
61+
(libexec
62+
$TESTCASE_ROOT/prefix/lib/a))
63+
(files
64+
(lib
65+
(META
66+
dune-package
67+
sub/a.a
68+
sub/a.cma
69+
sub/a.cmi
70+
sub/a.cmt
71+
sub/a.cmx
72+
sub/a.cmxa
73+
sub/a.ml
74+
sub/a__Foo.cmi
75+
sub/a__Foo.cmt
76+
sub/a__Foo.cmx
77+
sub/foo.ml
78+
sub/melange/a.cmi
79+
sub/melange/a.cmj
80+
sub/melange/a.cmt
81+
sub/melange/a.ml
82+
sub/melange/a__Foo.cmi
83+
sub/melange/a__Foo.cmj
84+
sub/melange/a__Foo.cmt
85+
sub/melange/a__Melange_only.cmi
86+
sub/melange/a__Melange_only.cmj
87+
sub/melange/a__Melange_only.cmt
88+
sub/melange/foo.ml
89+
sub/melange/melange_only.ml))
90+
(libexec (sub/a.cmxs)))
91+
(library
92+
(name a.sub)
93+
(kind normal)
94+
(archives (byte sub/a.cma) (native sub/a.cmxa))
95+
(plugins (byte sub/a.cma) (native sub/a.cmxs))
96+
(native_archives sub/a.a)
97+
(main_module_name A)
98+
(modes melange byte native)
99+
(modules
100+
(wrapped
101+
(group
102+
(alias
103+
(obj_name a)
104+
(visibility public)
105+
(kind alias)
106+
(source (path A) (impl (path sub/a.ml-gen))))
107+
(name A)
108+
(modules
109+
(module
110+
(obj_name a__Foo)
111+
(visibility public)
112+
(source (path Foo) (impl (path sub/foo.ml))))))
113+
(wrapped true)))
114+
(melange_modules
115+
(wrapped
116+
(group
117+
(alias
118+
(obj_name a)
119+
(visibility public)
120+
(kind alias)
121+
(source (path A) (impl (path sub/a.ml-gen))))
122+
(name A)
123+
(modules
124+
(module
125+
(obj_name a__Foo)
126+
(visibility public)
127+
(source (path Foo) (impl (path sub/foo.ml))))
128+
(module
129+
(obj_name a__Melange_only)
130+
(visibility public)
131+
(source (path Melange_only) (impl (path sub/melange_only.ml))))))
132+
(wrapped true))))
133+
134+
$ cat >app/dune-project <<EOF
135+
> (lang dune 3.8)
136+
> (using melange 0.1)
137+
> EOF
138+
139+
$ cat > app/dune <<EOF
140+
> (melange.emit
141+
> (target dist)
142+
> (alias dist)
143+
> (emit_stdlib false)
144+
> (libraries a.sub))
145+
> EOF
146+
147+
$ cat > app/bar.ml <<EOF
148+
> let x = Js.log A.Foo.x
149+
> EOF
150+
151+
$ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build --root app @dist --display short 2>&1
152+
Entering directory 'app'
153+
melc dist/node_modules/a.sub/a.js
154+
melc dist/node_modules/a.sub/foo.js
155+
melc dist/node_modules/a.sub/melange_only.js
156+
melc .dist.mobjs/melange/melange__Bar.{cmi,cmj,cmt}
157+
melc dist/bar.js
158+
Leaving directory 'app'
159+
160+
161+
$ find app/_build/default/dist/node_modules/a.sub -type f | sort
162+
app/_build/default/dist/node_modules/a.sub/a.js
163+
app/_build/default/dist/node_modules/a.sub/foo.js
164+
app/_build/default/dist/node_modules/a.sub/melange_only.js

0 commit comments

Comments
 (0)