Skip to content

Commit

Permalink
Merge pull request #3235 from rgrinberg/2896-take-2
Browse files Browse the repository at this point in the history
Reproduce #2896
  • Loading branch information
rgrinberg authored Mar 4, 2020
2 parents d56caf6 + 2fb4995 commit a61f3e8
Show file tree
Hide file tree
Showing 175 changed files with 597 additions and 380 deletions.
230 changes: 225 additions & 5 deletions test/blackbox-tests/dune.inc
Original file line number Diff line number Diff line change
Expand Up @@ -2082,14 +2082,196 @@
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-vlib)
(alias virtual-libraries-double-implementation)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/vlib)
(source_tree test-cases/virtual-libraries/double-implementation))
(action
(chdir
test-cases/virtual-libraries/double-implementation
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-dune-package-info)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/dune-package-info))
(action
(chdir
test-cases/virtual-libraries/dune-package-info
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-github2896)
(deps (package dune) (source_tree test-cases/virtual-libraries/github2896))
(action
(chdir
test-cases/virtual-libraries/github2896
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-lib-interface-module)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-lib-interface-module))
(action
(chdir
test-cases/virtual-libraries/impl-lib-interface-module
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-not-virtual)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-not-virtual))
(action
(chdir
test-cases/virtual-libraries/impl-not-virtual
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-not-virtual-external)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-not-virtual-external)
(package dune-configurator))
(action
(chdir
test-cases/virtual-libraries/vlib
test-cases/virtual-libraries/impl-not-virtual-external
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-private-modules)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-private-modules))
(action
(chdir
test-cases/virtual-libraries/impl-private-modules
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-public-modules)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-public-modules))
(action
(chdir
test-cases/virtual-libraries/impl-public-modules
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-impl-using-vlib-modules)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/impl-using-vlib-modules))
(action
(chdir
test-cases/virtual-libraries/impl-using-vlib-modules
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-implements-external)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/implements-external))
(action
(chdir
test-cases/virtual-libraries/implements-external
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-install-file)
(deps (package dune) (source_tree test-cases/virtual-libraries/install-file))
(action
(chdir
test-cases/virtual-libraries/install-file
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-invalid-virtual-lib)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/invalid-virtual-lib))
(action
(chdir
test-cases/virtual-libraries/invalid-virtual-lib
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-missing-implementation)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/missing-implementation))
(action
(chdir
test-cases/virtual-libraries/missing-implementation
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-module-fields)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/module-fields))
(action
(chdir
test-cases/virtual-libraries/module-fields
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-no-vlib-present)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/no-vlib-present))
(action
(chdir
test-cases/virtual-libraries/no-vlib-present
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-preprocess)
(deps (package dune) (source_tree test-cases/virtual-libraries/preprocess))
(action
(chdir
test-cases/virtual-libraries/preprocess
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-private-modules-overlapping-names)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/private-modules-overlapping-names))
(action
(chdir
test-cases/virtual-libraries/private-modules-overlapping-names
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-unwrapped)
(deps (package dune) (source_tree test-cases/virtual-libraries/unwrapped))
(action
(chdir
test-cases/virtual-libraries/unwrapped
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-variants-simple)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/variants-simple))
(action
(chdir
test-cases/virtual-libraries/variants-simple
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
(alias virtual-libraries-variants-sub-module)
(deps
(package dune)
(source_tree test-cases/virtual-libraries/variants-sub-module))
(action
(chdir
test-cases/virtual-libraries/variants-sub-module
(progn (run dune-cram run run.t) (diff? run.t run.t.corrected)))))

(rule
Expand Down Expand Up @@ -2446,7 +2628,26 @@
(alias vendor)
(alias vendor-dash-p-and-vendored-packages)
(alias vendor-do-not-install-vendored-packages)
(alias virtual-libraries-vlib)
(alias virtual-libraries-double-implementation)
(alias virtual-libraries-dune-package-info)
(alias virtual-libraries-github2896)
(alias virtual-libraries-impl-lib-interface-module)
(alias virtual-libraries-impl-not-virtual)
(alias virtual-libraries-impl-not-virtual-external)
(alias virtual-libraries-impl-private-modules)
(alias virtual-libraries-impl-public-modules)
(alias virtual-libraries-impl-using-vlib-modules)
(alias virtual-libraries-implements-external)
(alias virtual-libraries-install-file)
(alias virtual-libraries-invalid-virtual-lib)
(alias virtual-libraries-missing-implementation)
(alias virtual-libraries-module-fields)
(alias virtual-libraries-no-vlib-present)
(alias virtual-libraries-preprocess)
(alias virtual-libraries-private-modules-overlapping-names)
(alias virtual-libraries-unwrapped)
(alias virtual-libraries-variants-simple)
(alias virtual-libraries-variants-sub-module)
(alias virtual-libraries-vlib-default-impl)
(alias virtual-libraries-vlib-wrong-default-impl)
(alias windows-diff)
Expand Down Expand Up @@ -2679,7 +2880,26 @@
(alias vendor)
(alias vendor-dash-p-and-vendored-packages)
(alias vendor-do-not-install-vendored-packages)
(alias virtual-libraries-vlib)
(alias virtual-libraries-double-implementation)
(alias virtual-libraries-dune-package-info)
(alias virtual-libraries-github2896)
(alias virtual-libraries-impl-lib-interface-module)
(alias virtual-libraries-impl-not-virtual)
(alias virtual-libraries-impl-not-virtual-external)
(alias virtual-libraries-impl-private-modules)
(alias virtual-libraries-impl-public-modules)
(alias virtual-libraries-impl-using-vlib-modules)
(alias virtual-libraries-implements-external)
(alias virtual-libraries-install-file)
(alias virtual-libraries-invalid-virtual-lib)
(alias virtual-libraries-missing-implementation)
(alias virtual-libraries-module-fields)
(alias virtual-libraries-no-vlib-present)
(alias virtual-libraries-preprocess)
(alias virtual-libraries-private-modules-overlapping-names)
(alias virtual-libraries-unwrapped)
(alias virtual-libraries-variants-simple)
(alias virtual-libraries-variants-sub-module)
(alias virtual-libraries-vlib-default-impl)
(alias virtual-libraries-vlib-wrong-default-impl)
(alias windows-diff)
Expand Down
2 changes: 1 addition & 1 deletion test/blackbox-tests/gen_tests.ml
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ let exclusions =
(* for the following tests sandboxing is disabled because absolute paths end
up appearing in the output if we sandbox *)
; make "env/env-bins" ~disable_sandboxing:true
; make "virtual-libraries/vlib"
; make "virtual-libraries/impl-not-virtual-external"
~additional_deps:[ Sexp.strings [ "package"; "dune-configurator" ] ]
; make "pkg-config-quoting"
~additional_deps:[ Sexp.strings [ "package"; "dune-configurator" ] ]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Executable that tries to use two implementations for the same virtual lib
$ dune build
Error: Conflicting implementations for virtual library "vlib" in
_build/default/vlib:
- "impl1" in _build/default/impl1
-> required by library "bar" in _build/default
- "impl2" in _build/default/impl2
This cannot work.
-> required by executable foo in dune:2
[1]
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
Include variants and implementation information in dune-package
$ dune build | sed "s/(lang dune .*)/(lang dune <version>)/"
(lang dune <version>)
(name foo)
(library
(name foo.impl)
(kind normal)
(archives (byte impl/impl.cma) (native impl/impl.cmxa))
(plugins (byte impl/impl.cma) (native impl/impl.cmxs))
(native_archives impl/impl$ext_lib)
(requires foo.vlib)
(implements foo.vlib)
(main_module_name Vlib)
(modes byte native)
(modules
(wrapped
(main_module_name Vlib)
(modules
((name Vmod)
(obj_name vlib__Vmod)
(visibility public)
(kind impl_vmodule)
(impl)))
(alias_module
(name Vlib__impl__)
(obj_name vlib__impl__)
(visibility public)
(kind alias)
(impl))
(wrapped true))))
(library
(name foo.vlib)
(kind normal)
(virtual)
(native_archives vlib/vlib$ext_lib)
(main_module_name Vlib)
(modes byte native)
(modules
(wrapped
(main_module_name Vlib)
(modules
((name Vmod)
(obj_name vlib__Vmod)
(visibility public)
(kind virtual)
(intf)))
(alias_module
(name Vlib)
(obj_name vlib)
(visibility public)
(kind alias)
(impl))
(wrapped true))))
31 changes: 31 additions & 0 deletions test/blackbox-tests/test-cases/virtual-libraries/github2896/run.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
Reproduction of the issue in #2896

We have a dependency cycle of the form impl <- lib <- vlib

where vlib is a virtual library, and impl implements this library.

$ echo "(lang dune 2.3)" > dune-project
$ mkdir vlib impl lib
$ touch impl/vlib.ml
$ echo "val run : unit -> unit" > vlib/vlib.mli
$ cat >vlib/dune <<EOF
> (library (name vlib) (virtual_modules vlib))
> EOF
$ echo "let bar () = Vlib.run ();;" > lib/lib.ml
$ cat >lib/dune <<EOF
> (library (name lib) (libraries vlib))
> EOF
$ echo "let run () = Lib.bar ();;" > impl/vlib.ml
$ cat >impl/dune <<EOF
> (library (name impl) (implements vlib) (libraries lib))
> EOF

The implementation impl was built, but it's not usable:

$ echo 'Vlib.run ()' > foo.ml
$ echo "(executable (name foo) (libraries impl))" > dune
$ dune exec ./foo.exe
File "_none_", line 1:
Error: No implementations provided for the following modules:
Vlib referenced from lib/lib.cmxa(Lib)
[1]
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Implementations may not provide a library interface module unless it is virtual.
There should be an error message that clarifies this.

$ dune build
File "impl/dune", line 1, characters 0-41:
1 | (library
2 | (name impl)
3 | (implements vlib))
Error: Implementations of wrapped libraries cannot introduce new public
modules.
The following modules:
- Vlib
must all be marked as private using the (private_modules ..) field.
[1]
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Test that trying to implement external libraries that aren't virtual results in
an appropriate error message.
$ dune build
File "dune", line 7, characters 13-30:
7 | (implements dune.configurator))
^^^^^^^^^^^^^^^^^
Error: Library "dune-configurator" is not virtual. It cannot be implemented
by "foobar".
[1]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Test that trying to implement libraries that aren't virtual results in an
appropriate error message.
$ dune build
File "impl/dune", line 3, characters 13-16:
3 | (implements lib))
^^^
Error: Library "lib" is not virtual. It cannot be implemented by "impl".
[1]
Loading

0 comments on commit a61f3e8

Please sign in to comment.