This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
PACKAGE_NAME=$1
|
||||
VERSION=$2
|
||||
|
||||
cat <<EOF
|
||||
(lang dune $VERSION)
|
||||
(package (name $PACKAGE_NAME))
|
||||
EOF
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
#!/bin/sh
|
||||
|
||||
mkdir -p $1/inner
|
||||
|
||||
cat > $1/inner/dune << EOF
|
||||
(library
|
||||
(public_name inner))
|
||||
EOF
|
||||
|
||||
cat > $1/inner/inner.ml << EOF
|
||||
(* Warning 69 is "unused-field" *)
|
||||
[@@@ocaml.warning "+69"]
|
||||
|
||||
(* This type is visible but opaque in the interface, so the field [x] is never
|
||||
used. *)
|
||||
type t = { x : int }
|
||||
EOF
|
||||
|
||||
cat > $1/inner/inner.mli << EOF
|
||||
type t
|
||||
EOF
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
(executable
|
||||
(public_name outer)
|
||||
(libraries inner))
|
||||
|
|
@ -0,0 +1 @@
|
|||
let () = print_endline "Hello, World!"
|
||||
|
|
@ -0,0 +1 @@
|
|||
(vendored_dirs *)
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
Repro for issue #7034.
|
||||
|
||||
This example is made up of two packages. The package "inner" defines a type with
|
||||
an unused field. The package "outer" vendors the package "inner". It will be
|
||||
demonstrated that "inner" builds with a warning on lang dune 3.2 and an error on
|
||||
3.3 (this isn't the problem - it's just to establish that the warning was
|
||||
changed to an error in 3.3). Then when "inner" is vendored inside of "outer", it
|
||||
will be shown that when the dune lang version of "outer" is 3.3, the vendored
|
||||
"inner" no longer builds, even though it's using lang dune 3.2 internally (this
|
||||
is the problem).
|
||||
|
||||
The "inner" package enables a warning (69: unused-field) in its source code.
|
||||
It builds on its own (with a warning) when lang dune is 3.2 or below:
|
||||
$ ./make-inner .
|
||||
$ ./gen-dune-project inner 3.2 > inner/dune-project
|
||||
$ dune printenv --root=inner --field flags
|
||||
Entering directory 'inner'
|
||||
(flags
|
||||
(-w
|
||||
@1..3@5..28@30..39@43@46..47@49..57@61..62-40
|
||||
-strict-sequence
|
||||
-strict-formats
|
||||
-short-paths
|
||||
-keep-locs))
|
||||
Leaving directory 'inner'
|
||||
$ dune build --root=inner
|
||||
Entering directory 'inner'
|
||||
File "inner.ml", line 6, characters 11-18:
|
||||
6 | type t = { x : int }
|
||||
^^^^^^^
|
||||
Warning 69 [unused-field]: unused record field x.
|
||||
File "inner.ml", line 6, characters 11-18:
|
||||
6 | type t = { x : int }
|
||||
^^^^^^^
|
||||
Warning 69 [unused-field]: unused record field x.
|
||||
Leaving directory 'inner'
|
||||
|
||||
|
||||
Note that in versions of lang dune above 3.2 this warning becomes an error:
|
||||
$ ./gen-dune-project inner 3.3 > inner/dune-project
|
||||
$ dune printenv --root=inner --field flags
|
||||
Entering directory 'inner'
|
||||
(flags
|
||||
(-w
|
||||
@1..3@5..28@30..39@43@46..47@49..57@61..62@67@69-40
|
||||
-strict-sequence
|
||||
-strict-formats
|
||||
-short-paths
|
||||
-keep-locs))
|
||||
Leaving directory 'inner'
|
||||
$ dune build --root=inner
|
||||
Entering directory 'inner'
|
||||
File "inner.ml", line 6, characters 11-18:
|
||||
6 | type t = { x : int }
|
||||
^^^^^^^
|
||||
Error (warning 69 [unused-field]): unused record field x.
|
||||
Leaving directory 'inner'
|
||||
[1]
|
||||
|
||||
Create another version of the inner package in outer/vendored:
|
||||
$ ./make-inner outer/vendored
|
||||
Change the version back to 3.2 so the inner package builds again:
|
||||
$ ./gen-dune-project inner 3.2 > outer/vendored/inner/dune-project
|
||||
|
||||
Building the outer project works when lang dune is 3.2 or below:
|
||||
|
||||
$ ./gen-dune-project outer 3.2 > outer/dune-project
|
||||
$ dune printenv --root=outer --field flags
|
||||
Entering directory 'outer'
|
||||
(flags
|
||||
(-w
|
||||
@1..3@5..28@30..39@43@46..47@49..57@61..62-40
|
||||
-strict-sequence
|
||||
-strict-formats
|
||||
-short-paths
|
||||
-keep-locs))
|
||||
Leaving directory 'outer'
|
||||
|
||||
$ dune build --root=outer
|
||||
Entering directory 'outer'
|
||||
File "vendored/inner/inner.ml", line 6, characters 11-18:
|
||||
6 | type t = { x : int }
|
||||
^^^^^^^
|
||||
Warning 69 [unused-field]: unused record field x.
|
||||
Leaving directory 'outer'
|
||||
|
||||
But when lang dune is 3.3 or higher the warning becomes an error:
|
||||
$ ./gen-dune-project outer 3.3 > outer/dune-project
|
||||
$ dune printenv --root=outer --field flags
|
||||
Entering directory 'outer'
|
||||
(flags
|
||||
(-w
|
||||
@1..3@5..28@30..39@43@46..47@49..57@61..62@67@69-40
|
||||
-strict-sequence
|
||||
-strict-formats
|
||||
-short-paths
|
||||
-keep-locs))
|
||||
Leaving directory 'outer'
|
||||
$ dune printenv outer/vendored/inner --root=outer --field flags
|
||||
Entering directory 'outer'
|
||||
(flags
|
||||
(-w
|
||||
@1..3@5..28@30..39@43@46..47@49..57@61..62@67@69-40
|
||||
-strict-sequence
|
||||
-strict-formats
|
||||
-short-paths
|
||||
-keep-locs))
|
||||
Leaving directory 'outer'
|
||||
|
||||
$ dune build --root=outer
|
||||
Entering directory 'outer'
|
||||
Leaving directory 'outer'
|
||||
$ pat="\-o [./a-zA-Z_]\{1,\}.cmx"
|
||||
$ log=outer/_build/log
|
||||
$ grep -o "$pat" $log | sort
|
||||
-o .outer.eobjs/native/dune__exe__Outer.cmx
|
||||
$ grep "$pat" $log | sort | grep -n -E -o "\-w [^ ]+"
|
||||
1:-w @1..3@5..28@30..39@43@46..47@49..57@61..62@67@69-40
|
||||
|
||||
This is unexpected as vendored projects should be built according to their
|
||||
declared dune-project rather than the dune-project of the outer project.
|
||||
|
||||
The problem seems related to the fact that the vendored project enables a
|
||||
warning in its source. Other warnings introduced into the vendored project are
|
||||
not visible when building the outer project (this is expected as vendored
|
||||
projects are supposed to be build with `-w -a` according to the docs).
|
||||
Loading…
Add table
Add a link
Reference in a new issue