This commit is contained in:
swrup 2025-11-11 02:07:51 +01:00
parent aa2ff7b2f0
commit 2f3113f55d
11742 changed files with 1223940 additions and 0 deletions

View file

@ -0,0 +1,328 @@
----------------------------------------------------------------------------------
Testsuite for the %{libexec...} and %{libexec-private...} variable.
$ cat >sdune <<'EOF'
> #!/usr/bin/env bash
> DUNE_SANDBOX=symlink dune "$@"
> EOF
$ chmod +x sdune
$ cat >dune-workspace <<EOF
> (lang dune 2.0)
> (context (default (name host)))
> (context (default
> (name target)
> (host host)))
> EOF
----------------------------------------------------------------------------------
* Find a host-context public library using the %{libexec:...} variable
$ echo "(lang dune 2.8)" > dune-project
$ mkdir -p src
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (enabled_if (= %{context_name} host))
> (public_name public_lib)
> (modules a))
> EOF
$ cat >dune <<EOF
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec:public_lib:a.ml}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec:public_lib:a.ml}")))
> EOF
$ cat >src/a.ml <<EOF
> let a = "A"
> EOF
$ cat >src/a.mli <<EOF
> val a : string
> EOF
$ touch public_lib.opam
$ ./sdune build @find-a-from-host
../install/host/lib/public_lib/a.ml
$ ./sdune build @find-a-from-target
../install/host/lib/public_lib/a.ml
----------------------------------------------------------------------------------
* Error when finding a host-context public library by its private name using the %{libexec:...} variable
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (enabled_if (= %{context_name} host))
> (public_name public_lib)
> (modules a))
> EOF
$ cat >dune <<EOF
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec:private_lib:a.ml}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec:private_lib:a.ml}")))
> EOF
$ ./sdune build @find-a-from-host
File "dune", line 4, characters 16-43:
4 | (action (echo "%{libexec:private_lib:a.ml}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The library "private_lib" is not public. The variable "libexec"
expands to the file's installation path which is not defined for private
libraries.
[1]
$ ./sdune build @find-a-from-target
File "dune", line 8, characters 16-43:
8 | (action (echo "%{libexec:private_lib:a.ml}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The library "private_lib" is not public. The variable "libexec"
expands to the file's installation path which is not defined for private
libraries.
[1]
----------------------------------------------------------------------------------
* Find a host-context private library using the %{libexec-private:...} variable
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (enabled_if (= %{context_name} host))
> (modules a))
> EOF
$ cat >dune <<EOF
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec-private:private_lib:a.ml}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec-private:private_lib:a.ml}")))
> EOF
$ ./sdune clean
$ ./sdune build @find-a-from-host
src/a.ml
$ ./sdune build @find-a-from-target
../host/src/a.ml
----------------------------------------------------------------------------------
* The %{libexec-private:...} variable works with public library names too
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (enabled_if (= %{context_name} host))
> (public_name public_lib)
> (modules a))
> EOF
$ cat >dune <<EOF
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec-private:public_lib:a.ml}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec-private:public_lib:a.ml}")))
> EOF
$ ./sdune clean
$ ./sdune build @find-a-from-host
src/a.ml
$ ./sdune build @find-a-from-target
../host/src/a.ml
----------------------------------------------------------------------------------
* The %{libexec-private:...} variable does not work with external libraries
$ mkdir -p external
$ cat >external/dune-project <<EOF
> (lang dune 2.8)
> (name external_library)
> EOF
$ cat >external/dune <<EOF
> (library
> (name extlib)
> (public_name external_library))
> EOF
$ touch external/external_library.opam
$ ( cd external && ../sdune build @install \
> && ../sdune install --prefix install --display short | dune_cmd sanitize)
Installing install/lib/external_library/META
Installing install/lib/external_library/dune-package
Installing install/lib/external_library/extlib.a
Installing install/lib/external_library/extlib.cma
Installing install/lib/external_library/extlib.cmi
Installing install/lib/external_library/extlib.cmt
Installing install/lib/external_library/extlib.cmx
Installing install/lib/external_library/extlib.cmxa
Installing install/lib/external_library/extlib.ml
Installing install/lib/external_library/opam
Installing install/lib/external_library/extlib.cmxs
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (public_name public_lib)
> (modules a))
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec-private:external_library:opam}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec-private:external_library:opam}")))
> EOF
$ touch src/public_lib.opam
$ echo "(lang dune 2.8)" > src/dune-project
$ echo "(name test-lib)" >> src/dune-project
$ export OCAMLPATH=$PWD/external/install/lib; ./sdune build @find-a-from-host --root=src --workspace=./dune-workspace
Entering directory 'src'
File "dune", line 8, characters 16-56:
8 | (action (echo "%{libexec-private:external_library:opam}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The variable "libexec-private" can only refer to libraries within the
same project. The current project's name is "test-lib", but the reference is
to an external library.
Leaving directory 'src'
[1]
$ export OCAMLPATH=$PWD/external/install/lib; ./sdune build @find-a-from-target --root=src --workspace=./dune-workspace
Entering directory 'src'
File "dune", line 12, characters 16-56:
12 | (action (echo "%{libexec-private:external_library:opam}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The variable "libexec-private" can only refer to libraries within the
same project. The current project's name is "test-lib", but the reference is
to an external library.
Leaving directory 'src'
[1]
----------------------------------------------------------------------------------
* The %{libexec-private:...} is only allowed within the same project
$ mkdir -p another
$ cat >another/dune <<EOF
> (library
> (name anotherlib)
> (enabled_if (= %{context_name} host))
> (public_name another_library))
> EOF
$ cat >src/dune <<EOF
> (library
> (name private_lib)
> (enabled_if (= %{context_name} host))
> (public_name public_lib)
> (modules a))
> (rule
> (alias find-a-from-host)
> (enabled_if (= %{context_name} host))
> (action (echo "%{libexec-private:another_library:file}")))
> (rule
> (alias find-a-from-target)
> (enabled_if (= %{context_name} target))
> (action (echo "%{libexec-private:another_library:file}")))
> EOF
$ touch another/another_library.opam
$ rm public_lib.opam
$ rm dune
$ echo "(lang dune 2.8)" > another/dune-project
$ echo "(name another-lib)" >> another/dune-project
$ ./sdune build @find-a-from-host
File "src/dune", line 9, characters 16-55:
9 | (action (echo "%{libexec-private:another_library:file}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The variable "libexec-private" can only refer to libraries within the
same project. The current project's name is "test-lib", but the reference is
to "another-lib".
[1]
$ ./sdune build @find-a-from-target
File "src/dune", line 13, characters 16-55:
13 | (action (echo "%{libexec-private:another_library:file}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: The variable "libexec-private" can only refer to libraries within the
same project. The current project's name is "test-lib", but the reference is
to "another-lib".
[1]
----------------------------------------------------------------------------------
* libexec-private with --only-packages
In this test, two packages are defined in the same project, but we may not
access the artifacts through %{libexec-private}
$ mkdir lib-private-only-packages
$ cd lib-private-only-packages
$ mkdir lib1 lib2
$ cat >dune-project <<EOF
> (lang dune 2.8)
> (name lib-private-test)
> (package (name public_lib1))
> (package (name public_lib2))
> EOF
$ cat >lib1/dune <<EOF
> (library
> (name lib1)
> (enabled_if (= %{context_name} host))
> (public_name public_lib1))
> EOF
$ touch lib1/lib1.ml
$ cat >lib2/dune <<EOF
> (library
> (name lib2)
> (public_name public_lib2))
> (rule
> (with-stdout-to lib2.ml (echo "let _ = {|%{libexec-private:lib1:lib1.ml}|}")))
> EOF
$ cat >dune <<EOF
> (alias
> (name host)
> (enabled_if (= %{context_name} host))
> (deps (alias_rec install)))
> (alias
> (name target)
> (enabled_if (= %{context_name} target))
> (deps (alias_rec install)))
> EOF
The build works in development:
$ dune build @host --workspace=../dune-workspace
But will fail when we release it, as it will need to run with -p:
$ dune build @target --workspace=../dune-workspace --only-packages public_lib2
File "lib2/dune", line 5, characters 42-73:
5 | (with-stdout-to lib2.ml (echo "let _ = {|%{libexec-private:lib1:lib1.ml}|}")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: Library "lib1" not found.
-> required by %{libexec-private:lib1:lib1.ml} at lib2/dune:5
-> required by _build/target/lib2/lib2.ml
-> required by _build/target/lib2/.lib2.objs/byte/lib2.cmi
-> required by _build/target/lib2/.lib2.objs/native/lib2.cmx
-> required by _build/target/lib2/lib2.a
-> required by _build/install/target/lib/public_lib2/lib2.a
-> required by _build/target/public_lib2.install
-> required by alias install (context target)
-> required by alias target (context target) in dune:5
[1]