This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
|
|
@ -0,0 +1,185 @@
|
|||
Test optional executable
|
||||
========================
|
||||
|
||||
$ cat >dune <<EOF
|
||||
> (executable
|
||||
> (public_name x)
|
||||
> (libraries does-not-exist)
|
||||
> (optional))
|
||||
>
|
||||
> (rule
|
||||
> (alias run-x)
|
||||
> (action (run %{exe:x.exe})))
|
||||
> EOF
|
||||
|
||||
$ cat >dune-project <<EOF
|
||||
> (lang dune 2.0)
|
||||
> (package (name x))
|
||||
> EOF
|
||||
|
||||
$ touch x.ml
|
||||
|
||||
$ dune build @install
|
||||
|
||||
$ dune build @all
|
||||
File "dune", line 3, characters 12-26:
|
||||
3 | (libraries does-not-exist)
|
||||
^^^^^^^^^^^^^^
|
||||
Error: Library "does-not-exist" not found.
|
||||
-> required by _build/default/.x.eobjs/native/dune__exe__X.cmx
|
||||
-> required by _build/default/x.exe
|
||||
-> required by alias all
|
||||
[1]
|
||||
|
||||
$ dune build @run-x
|
||||
File "dune", line 3, characters 12-26:
|
||||
3 | (libraries does-not-exist)
|
||||
^^^^^^^^^^^^^^
|
||||
Error: Library "does-not-exist" not found.
|
||||
-> required by _build/default/.x.eobjs/native/dune__exe__X.cmx
|
||||
-> required by _build/default/x.exe
|
||||
-> required by %{exe:x.exe} at dune:8
|
||||
-> required by alias run-x in dune:6
|
||||
[1]
|
||||
|
||||
Reproduction case for a bug in dune < 2.4 where all executables where
|
||||
considered as optional:
|
||||
|
||||
$ cat >dune <<EOF
|
||||
> (executable
|
||||
> (public_name x)
|
||||
> (libraries does-not-exist))
|
||||
> EOF
|
||||
|
||||
The following command should fail because the executable is not optional:
|
||||
|
||||
$ dune build @install
|
||||
File "dune", line 3, characters 12-26:
|
||||
3 | (libraries does-not-exist))
|
||||
^^^^^^^^^^^^^^
|
||||
Error: Library "does-not-exist" not found.
|
||||
-> required by _build/default/.x.eobjs/native/dune__exe__X.cmx
|
||||
-> required by _build/default/x.exe
|
||||
-> required by _build/install/default/bin/x
|
||||
-> required by _build/default/x.install
|
||||
-> required by alias install
|
||||
[1]
|
||||
|
||||
A strange behavior discovered in #4786. Dune would ignore an executable if any
|
||||
of its dependencies were optional.
|
||||
|
||||
$ mkdir optional-binary
|
||||
$ cd optional-binary
|
||||
$ cat >dune-project <<EOF
|
||||
> (lang dune 3.0)
|
||||
> (package (name myfoo))
|
||||
> EOF
|
||||
|
||||
$ mkdir exe
|
||||
$ cat >exe/bar.ml <<EOF
|
||||
> print_endline "hello world"
|
||||
> EOF
|
||||
$ cat >exe/dune <<EOF
|
||||
> (executable
|
||||
> (public_name dunetestbar)
|
||||
> (name bar)
|
||||
> (libraries foo))
|
||||
> EOF
|
||||
|
||||
$ mkdir lib
|
||||
$ cat >lib/dune <<EOF
|
||||
> (library
|
||||
> (name foo)
|
||||
> (libraries xxx-does-not-exist)
|
||||
> (optional)
|
||||
> (modules ()))
|
||||
> EOF
|
||||
|
||||
$ cat >dune <<EOF
|
||||
> (rule
|
||||
> (alias run-x)
|
||||
> (action (echo %{exe:bar.exe})))
|
||||
> EOF
|
||||
|
||||
$ dune build @run-x
|
||||
Error: No rule found for bar.exe
|
||||
-> required by %{exe:bar.exe} at dune:3
|
||||
-> required by alias run-x in dune:1
|
||||
[1]
|
||||
|
||||
$ cd ..
|
||||
|
||||
When an optional binary is absent, the parent binary should be present. This is
|
||||
consistent with how libraries work. #4786 notes that this sort of shadowing is
|
||||
present even if the binary is not optional.
|
||||
|
||||
$ mkdir optional-binary-absent
|
||||
$ cd optional-binary-absent
|
||||
$ cat >dune-project <<EOF
|
||||
> (lang dune 3.0)
|
||||
> (package (name myfoo))
|
||||
> EOF
|
||||
|
||||
$ mkdir exe
|
||||
$ cat >exe/bar.ml <<EOF
|
||||
> print_endline "hello world"
|
||||
> EOF
|
||||
$ cat >exe/dune <<EOF
|
||||
> (executable
|
||||
> (public_name dunetestbar)
|
||||
> (libraries doesnotexistatall)
|
||||
> (name bar))
|
||||
> EOF
|
||||
|
||||
$ cat >dune <<EOF
|
||||
> (rule
|
||||
> (alias run-x)
|
||||
> (action (echo "binary path: %{bin:dunetestbar}")))
|
||||
> EOF
|
||||
|
||||
$ mkdir bin
|
||||
$ cat >bin/dunetestbar <<EOF
|
||||
> #!/usr/bin/env bash
|
||||
> echo shadow
|
||||
> EOF
|
||||
$ chmod +x ./bin/dunetestbar
|
||||
|
||||
$ PATH=./bin:$PATH dune build @run-x
|
||||
File "exe/dune", line 3, characters 12-29:
|
||||
3 | (libraries doesnotexistatall)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
Error: Library "doesnotexistatall" not found.
|
||||
-> required by _build/default/exe/.bar.eobjs/native/dune__exe__Bar.cmx
|
||||
-> required by _build/default/exe/bar.exe
|
||||
-> required by _build/install/default/bin/dunetestbar
|
||||
-> required by %{bin:dunetestbar} at dune:3
|
||||
-> required by alias run-x in dune:1
|
||||
[1]
|
||||
|
||||
Optional on the executable should be respected:
|
||||
|
||||
$ cat >exe/dune <<EOF
|
||||
> (executable
|
||||
> (public_name dunetestbar)
|
||||
> (libraries does-not-exist)
|
||||
> (optional)
|
||||
> (name bar))
|
||||
> EOF
|
||||
|
||||
$ PATH=./bin:$PATH dune build @run-x
|
||||
binary path: $TESTCASE_ROOT/optional-binary-absent/./bin/dunetestbar
|
||||
|
||||
In the same way as enabled_if:
|
||||
|
||||
$ cat >exe/dune <<EOF
|
||||
> (executable
|
||||
> (public_name dunetestbar)
|
||||
> (enabled_if false)
|
||||
> (name bar))
|
||||
> EOF
|
||||
|
||||
$ PATH=./bin:$PATH dune build @run-x --force
|
||||
binary path: $TESTCASE_ROOT/optional-binary-absent/./bin/dunetestbar
|
||||
|
||||
$ cd ..
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue