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,20 @@
Test when sites name which are ocaml keyword
---------------------------------
$ cat >dune-project <<EOF
> (lang dune 2.9)
> (using dune_site 0.1)
> (package
> (name my-package)
> (sites (lib include)))
> EOF
$ cat >dune <<EOF
> (library (name lib) (libraries dune-site dune-site.plugins))
>
> (generate_sites_module
> (module sites)
> (plugins (my-package include)))
> EOF
$ dune build

View file

@ -0,0 +1,16 @@
(cram
(applies_to :whole_subtree)
(deps
(package dune)
(package dune-site)))
; The test being broken on CI, we deactivate it when
; we detect that the CI environment variable is not
; set. Most CI systems set it.
(cram
(applies_to run_2_9 run)
(enabled_if
(and
(not %{env:CI=false})
(not %{env:INSIDE_NIX=false}))))

View file

@ -0,0 +1,9 @@
(executable
(name main)
(public_name main)
(promote (until-clean))
(libraries dune-build-info dune-site))
(generate_sites_module
(module SitesModule)
(sites github4389))

View file

@ -0,0 +1,6 @@
(lang dune 2.9)
(using dune_site 0.1)
(package
(name github4389)
(sites (share github4389)))

View file

@ -0,0 +1,10 @@
let version =
match Build_info.V1.version () with
| None -> "n/a"
| Some v -> Build_info.V1.Version.to_string v
let () =
Format.eprintf "%s@." version;
List.iter
(fun x -> Format.eprintf "%s@." x)
SitesModule.Sites.github4389

View file

@ -0,0 +1,12 @@
$ dune build @install
$ dune install --prefix _install --display short
Installing _install/lib/github4389/META
Installing _install/lib/github4389/dune-package
Installing _install/bin/main
$ grep sites _install/lib/github4389/dune-package
(sites (github4389 share))
$ grep -o '[^ ]*/_install/share/github4389' _install/lib/github4389/dune-package
$TESTCASE_ROOT/_install/share/github4389
$ _install/bin/main
n/a
$TESTCASE_ROOT/_install/share/github4389/github4389

View file

@ -0,0 +1,9 @@
(executable
(name main)
(public_name main)
(promote (until-clean))
(libraries dune-site))
(generate_sites_module
(module SitesModule)
(sites github4389))

View file

@ -0,0 +1,6 @@
(lang dune 2.9)
(using dune_site 0.1)
(package
(name github4389)
(sites (share github4389)))

View file

@ -0,0 +1,4 @@
let () =
List.iter
(fun x -> Format.eprintf "%s@." x)
SitesModule.Sites.github4389

View file

@ -0,0 +1,11 @@
$ dune build @install
$ dune install --prefix _install --display short
Installing _install/lib/github4389/META
Installing _install/lib/github4389/dune-package
Installing _install/bin/main
$ grep sites _install/lib/github4389/dune-package
(sites (github4389 share))
$ grep -o '[^ ]*/_install/share/github4389' _install/lib/github4389/dune-package
$TESTCASE_ROOT/_install/share/github4389
$ _install/bin/main
$TESTCASE_ROOT/_install/share/github4389/github4389

View file

@ -0,0 +1,40 @@
This checks that generated sites files correctly substituted with `dune install`.
See #10317.
$ cat > dune-project << EOF
> (lang dune 3.0)
> (using dune_site 0.1)
> (package
> (name a)
> (sites (share data)))
> EOF
$ cat > dune << EOF
> (library
> (public_name a)
> (libraries dune-site))
> (generate_sites_module
> (module s)
> (sites a))
> EOF
$ dune build
$ check_placeholder() {
> name=$1;
> if grep -q DUNE_PLACEHOLDER "$name"; then
> echo placeholder found in $name
> fi
> }
The generated module has placeholders.
$ check_placeholder _build/default/S.ml
placeholder found in _build/default/S.ml
$ dune install a --prefix out/ --datadir /nonexistent/data
We expect no placeholders to be present after installation.
$ find out -type f | sort | while read f ; do check_placeholder $f ; done

View file

@ -0,0 +1,96 @@
Test an approximation of an OPAM install / uninstall of a plugin package
This takes the sites-plugin.t blackbox test extracted from the manual and
changes its end to cover:
- dune install of both the application and its plugin,
- dune uninstall of the plugin, leaving an empty directory as OPAM would.
$ cat > dune-project <<EOF
> (lang dune 3.8)
> (using dune_site 0.1)
> (name app)
>
> (package
> (name app)
> (sites (lib plugins)))
> EOF
$ cat > dune <<EOF
> (executable
> (public_name app)
> (modules sites app)
> (libraries app.register dune-site dune-site.plugins))
>
> (library
> (public_name app.register)
> (name registration)
> (modules registration))
>
> (generate_sites_module
> (module sites)
> (plugins (app plugins)))
> EOF
$ cat > registration.ml <<EOF
> let todo : (unit -> unit) Queue.t = Queue.create ()
> EOF
$ cat > app.ml <<EOF
> (* load all the available plugins *)
> let () = Sites.Plugins.Plugins.load_all ()
>
> let () = print_endline "Main app starts..."
> (* Execute the code registered by the plugins *)
> let () = Queue.iter (fun f -> f ()) Registration.todo
> EOF
$ mkdir plugin
$ cat > plugin/dune-project <<EOF
> (lang dune 3.8)
> (using dune_site 0.1)
>
> (generate_opam_files true)
>
> (package
> (name plugin1))
> EOF
$ cat > plugin/dune <<EOF
> (library
> (public_name plugin1.plugin1_impl)
> (name plugin1_impl)
> (modules plugin1_impl)
> (libraries app.register))
>
> (plugin
> (name plugin1)
> (libraries plugin1.plugin1_impl)
> (site (app plugins)))
> EOF
$ cat > plugin/plugin1_impl.ml <<EOF
> let () =
> print_endline "Registration of Plugin1";
> Queue.add (fun () -> print_endline "Plugin1 is doing something...") Registration.todo
> EOF
$ dune build @install
$ dune install --prefix _install
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/app
Registration of Plugin1
Main app starts...
Plugin1 is doing something...
$ dune uninstall --prefix _install plugin1
Unfortunately, the fact that the `lib/app/plugins/plugin1` directory should be
removed along with plugin1 is lost in the OPAM metadata, so we simulate this
issue by recreating this empty directory.
$ mkdir -p _install/lib/app/plugins/plugin1
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/app
Main app starts...

View file

@ -0,0 +1,10 @@
(* load all the available plugins *)
let () =
try
Sites.Plugins.Plugins.load_all ()
with exn ->
Printf.printf "Error during dynamic linking: %s" (Printexc.to_string exn)
let () = print_endline "Main app starts..."
(* Execute the code registered by the plugins *)
let () = Queue.iter (fun f -> f ()) Registration.todo

View file

@ -0,0 +1,19 @@
(executable
(public_name app)
(modules sites app)
(libraries
app.register
dune-site
dune-site.plugins
;TOREMOVE threads
))
(library
(public_name app.register)
(name registration)
(modules registration))
(generate_sites_module
(module sites)
(plugins
(app plugins)))

View file

@ -0,0 +1,8 @@
(lang dune 2.8)
(using dune_site 0.1)
(name app)
(package
(name app)
(sites (lib plugins)))

View file

@ -0,0 +1,12 @@
(env (_ (flags -w -33)))
(library
(public_name plugin1.plugin1_impl)
(name plugin1_impl)
(modules plugin1_impl)
(libraries app.MyControls app.register result threads))
(plugin
(name plugin1)
(libraries threads plugin1.plugin1_impl)
(site (app plugins)))

View file

@ -0,0 +1,7 @@
(lang dune 2.8)
(using dune_site 0.1)
(generate_opam_files true)
(package
(name plugin1))

View file

@ -0,0 +1,20 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
depends: [
"dune" {>= "2.8"}
"odoc" {with-doc}
]
build: [
["dune" "subst"] {dev}
[
"dune"
"build"
"-p"
name
"-j"
jobs
"@install"
"@runtest" {with-test}
"@doc" {with-doc}
]
]

View file

@ -0,0 +1,8 @@
let () =
let open Result in
print_endline "Registration of Plugin1";
Queue.add (fun () ->
let th = Thread.create (fun () ->
print_endline "Plugin1 is doing something...") () in
Thread.join th
) Registration.todo

View file

@ -0,0 +1,15 @@
(env
(_
(flags -w -33)))
(library
(public_name plugin2.plugin2_impl)
(name plugin2_impl)
(modules plugin2_impl)
(libraries app.MyControls app.register result threads))
(plugin
(name plugin2)
(libraries threads plugin2.plugin2_impl)
(site
(app plugins)))

View file

@ -0,0 +1,8 @@
(lang dune 2.8)
(using dune_site 0.1)
(generate_opam_files true)
(package
(name plugin2))

View file

@ -0,0 +1,3 @@
let () =
print_endline "Registration of Plugin2";
Queue.add (fun () -> print_endline "Plugin2 is doing something...") Registration.todo

View file

@ -0,0 +1 @@
let todo : (unit -> unit) Queue.t = Queue.create ()

View file

@ -0,0 +1,19 @@
$ dune build ./app.exe @install
$ dune exec ./app.exe
The library is being used by two plugins finished initialization
Error during dynamic linking: It is not possible to dynamically link a plugin which uses the thread library
with an executable not already linked with the thread
library.Main app starts...
$ sed -e "s/;TOREMOVE//" dune > dune.tmp
$ mv -f dune.tmp dune
$ dune build ./app.exe @install
$ dune exec ./app.exe
The library is being used by two plugins finished initialization
Registration of Plugin1
Registration of Plugin2
Main app starts...
Plugin1 is doing something...
Plugin2 is doing something...

View file

@ -0,0 +1 @@
let () = print_endline "The library is being used by two plugins finished initialization"

View file

@ -0,0 +1,5 @@
(library
(public_name app.MyControls)
(name MyControls)
(modules MyControls)
(libraries))

View file

@ -0,0 +1,106 @@
$ mkdir -p b c
$ for i in b; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 3.0)
> (using dune_site 0.1)
> (name $i)
> (package (name $i) (depends c))
> EOF
> done
$ for i in c; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 3.0)
> (using dune_site 0.1)
> (name $i)
> (package (name $i) (sites (share data) (lib plugins)))
> EOF
> done
$ cat >b/dune <<EOF
> (library
> (public_name b.b.b)
> (name b)
> (libraries c.register dune-site))
> (generate_sites_module (module sites) (sites b))
> (plugin (name c-plugins-b.b) (libraries b.b.b) (site (c plugins)))
> EOF
$ cat >b/b.ml <<EOF
> let v = "b"
> let () = Printf.printf "run b\n%!"
> let () = C_register.registered := "b"::!C_register.registered
> EOF
$ cat >c/dune <<EOF
> (executable
> (public_name c)
> (promote (until-clean))
> (modules c sites)
> (libraries c.register dune-site dune-site.plugins))
> (library
> (public_name c.register)
> (name c_register)
> (modules c_register))
> (generate_sites_module (module sites) (plugins (c plugins)))
> (rule
> (targets out.log)
> (deps (package c))
> (action (with-stdout-to out.log (run %{bin:c} "c-plugins-b.b"))))
> EOF
$ cat >c/c_register.ml <<EOF
> let registered : string list ref = ref []
> EOF
$ cat >c/c.ml <<EOF
> let () = try Sites.Plugins.Plugins.load Sys.argv.(1)
> with exn -> print_endline (Printexc.to_string exn)
> let () = Printf.printf "run c: registered:%s.\n%!" (String.concat "," !C_register.registered)
> EOF
$ cat > dune-project << EOF
> (lang dune 2.2)
> EOF
Build everything
----------------
$ dune build
Test with dune exec
--------------------------------
$ dune exec -- c/c.exe "c-plugins-b.b"
run b
run c: registered:b.
Test error messages
--------------------------------
$ dune exec -- c/c.exe "inexistent"
The plugin "inexistent" can't be found in the search paths "$TESTCASE_ROOT/_build/install/default/lib/c/plugins".
run c: registered:.
$ cat >c/c.ml <<EOF
> let l = Lazy.force Dune_site.Private_.Helpers.ocamlpath
> let l = List.map (Printf.sprintf "OCAMLPATH=%s") l
> let () = print_string (String.concat ":" l)
> EOF
$ export BUILD_PATH_PREFIX_MAP="$(dune exe -- c/c.exe):$BUILD_PATH_PREFIX_MAP"
$ cat >c/c.ml <<EOF
> let () = try Dune_site_plugins.V1.load Sys.argv.(1)
> with exn -> print_endline (Printexc.to_string exn)
> EOF
$ dune exec -- c/c.exe "inexistent" 2>&1 | sed -e 's&default/lib:.*&default/lib:..."&g'
The library "inexistent" can't be found in the search paths "$TESTCASE_ROOT/_build/install/default/lib:..."
$ dune exec -- c/c.exe "b.b.b"
run b
$ dune exec -- c/c.exe "b.b.inexistent" 2>&1 | sed -e 's&default/lib:.*&default/lib:..."&g'
The sub-library "inexistent" can't be found in the library b.b in the search paths "$TESTCASE_ROOT/_build/install/default/lib:..."

View file

@ -0,0 +1,481 @@
Test embedding of sites locations information
-----------------------------------
$ mkdir -p a b c
$ mkdir -p a
$ cat >a/dune-project <<EOF
> (lang dune 3.0)
> (generate_opam_files true)
> (using dune_site 0.1)
> (name a)
> (version 0.a)
> (package (name a) (sites (share data)))
> EOF
$ for i in b d; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 3.0)
> (generate_opam_files true)
> (using dune_site 0.1)
> (name $i)
> (version 0.$i)
> (package (name $i) (sites (share data)) (depends c))
> EOF
> done
$ for i in c; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 3.0)
> (generate_opam_files true)
> (using dune_site 0.1)
> (name $i)
> (package (name $i) (sites (share data) (lib plugins)) (depends a))
> EOF
> done
$ cat >a/dune <<EOF
> (library
> (public_name a)
> (libraries dune-site))
> (generate_sites_module (module sites) (sites a))
> EOF
$ cat >a/a.ml <<EOF
> let v = "a"
> let () = Printf.printf "run a\n%!"
> let () = List.iter (Printf.printf "a: %s\n%!") Sites.Sites.data
> EOF
$ cat >b/dune <<EOF
> (library
> (public_name b.b.b)
> (name b)
> (libraries c.register dune-site))
> (generate_sites_module (module sites) (sites b))
> (plugin (name c-plugins-b) (libraries b.b.b) (site (c plugins)))
> (install (section (site (b data))) (files info.txt))
> EOF
$ cat >b/b.ml <<EOF
> let v = "b"
> let () = Printf.printf "run b\n%!"
> let () = C_register.registered := "b"::!C_register.registered
> let () = List.iter (Printf.printf "b: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %b\n%!" found
> EOF
$ cat >b/info.txt <<EOF
> Lorem
> EOF
$ cat >d/dune <<EOF
> (library
> (public_name d)
> (libraries c.register dune-site non-existent-library)
> (optional))
> (generate_sites_module (module sites) (sites d))
> (plugin (name c-plugins-d) (libraries d) (site (c plugins)) (optional))
> (install (section (site (d data))) (files info.txt))
> EOF
$ cat >d/d.ml <<EOF
> let v = "d"
> let () = Printf.printf "run d\n%!"
> let () = C_register.registered := "d"::!C_register.registered
> let () = List.iter (Printf.printf "d: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %d\n%!" found
> EOF
$ cat >d/info.txt <<EOF
> Lorem
> EOF
$ cat >c/dune <<EOF
> (executable
> (public_name c)
> (promote (until-clean))
> (modules c sites)
> (libraries a c.register dune-site dune-site.plugins))
> (library
> (public_name c.register)
> (name c_register)
> (modules c_register))
> (generate_sites_module (module sites) (sourceroot) (plugins (c plugins)))
> (rule
> (targets out.log)
> (deps (package c))
> (action (with-stdout-to out.log (run %{bin:c}))))
> EOF
$ cat >c/c_register.ml <<EOF
> let registered : string list ref = ref []
> EOF
$ cat >c/c.ml <<EOF
> let () = Printf.printf "run c: %s linked registered:%s.\n%!"
> A.v (String.concat "," !C_register.registered)
> let () = match Sites.sourceroot with
> | Some d -> Printf.printf "sourceroot is %S\n%!" d
> | None -> Printf.printf "no sourceroot\n%!"
> let () = List.iter (Printf.printf "c: %s\n%!") Sites.Sites.data
> let () = Printf.printf "b is available: %b\n%!" (Dune_site_plugins.V1.available "b")
> let () = Sites.Plugins.Plugins.load_all ()
> let () = Printf.printf "run c: registered:%s.\n%!" (String.concat "," !C_register.registered)
> EOF
$ cat > dune-project << EOF
> (lang dune 2.2)
> EOF
Test with an opam like installation
--------------------------------
$ dune build a/a.opam
#We print the generated file in order to update the following tests
$ cat a/a.opam
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "0.a"
depends: [
"dune" {>= "3.0"}
"odoc" {with-doc}
]
build: [
["dune" "subst"] {dev}
[
"dune"
"build"
"-p"
name
"-j"
jobs
"--promote-install-files=false"
"@install"
"@runtest" {with-test}
"@doc" {with-doc}
]
["dune" "install" "-p" name "--create-install-files" name]
]
$ dune build -p a --promote-install-files=false @install
$ test -e a/a.install
[1]
$ dune install -p a --create-install-files a --prefix "_destdir"
$ cat a/a.install
lib: [
"_destdir/_destdir/lib/a/META"
"_destdir/_destdir/lib/a/Sites.ml"
"_destdir/_destdir/lib/a/a.a"
"_destdir/_destdir/lib/a/a.cma"
"_build/install/default/lib/a/a.cmi"
"_build/install/default/lib/a/a.cmt"
"_build/install/default/lib/a/a.cmx"
"_build/install/default/lib/a/a.cmxa"
"_build/install/default/lib/a/a.ml"
"_build/install/default/lib/a/a__.cmi"
"_build/install/default/lib/a/a__.cmt"
"_build/install/default/lib/a/a__.cmx"
"_build/install/default/lib/a/a__.ml"
"_build/install/default/lib/a/a__Sites.cmi"
"_build/install/default/lib/a/a__Sites.cmt"
"_build/install/default/lib/a/a__Sites.cmx"
"_destdir/_destdir/lib/a/dune-package"
"_build/install/default/lib/a/opam"
]
libexec: [
"_destdir/_destdir/lib/a/a.cmxs"
]
Build everything
----------------
$ dune build
Test with a normal installation
--------------------------------
$ dune install --prefix _install
Once installed, we have the sites information:
$ grep share/a _install/lib/a/dune-package
$TESTCASE_ROOT/_install/share/a))
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/c
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run c: registered:b.
Test with a relocatable installation
--------------------------------
$ dune install --prefix _install_relocatable --relocatable
Once installed, we have the sites information:
$ _install_relocatable/bin/c
run a
a: $TESTCASE_ROOT/_install_relocatable/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install_relocatable/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install_relocatable/share/b/data
info.txt is found: true
run c: registered:b.
Test after moving a relocatable installation
--------------------------------
$ mv _install_relocatable _install_relocatable2
Once installed, we have the sites information:
$ _install_relocatable2/bin/c
run a
a: $TESTCASE_ROOT/_install_relocatable2/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install_relocatable2/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install_relocatable2/share/b/data
info.txt is found: true
run c: registered:b.
Test substitution when promoting
--------------------------------
It is wrong that info.txt is not found, but to make it work it is an important
development because b is not promoted
$ c/c.exe
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
info.txt is found: false
run c: registered:b.
Test within dune rules
--------------------------------
$ dune build c/out.log
$ cat _build/default/c/out.log
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run c: registered:b.
Test with dune exec
--------------------------------
$ dune exec -- c/c.exe
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run c: registered:b.
Test compiling an external plugin
---------------------------------
$ mkdir e
$ cat >e/dune-project <<EOF
> (lang dune 2.8)
> (using dune_site 0.1)
> (name e)
> (package (name e) (sites (share data)))
> EOF
$ cat >e/dune <<EOF
> (library
> (public_name e)
> (libraries c.register dune-site))
> (generate_sites_module (module sites) (sites e))
> (plugin (name c-plugins-e) (libraries e) (site (c plugins)))
> (install (section (site (e data))) (files info.txt))
> (rule (alias runtest) (deps (package a) (package b) (package c) (package d) (package e))
> (action (run %{bin:c})))
> EOF
$ cat >e/e.ml <<EOF
> let v = "e"
> let () = Printf.printf "run e\n%!"
> let () = C_register.registered := "e"::!C_register.registered
> let () = List.iter (Printf.printf "e: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %b\n%!" found
> EOF
$ cat >e/info.txt <<EOF
> Lorem
> EOF
$ OCAMLPATH=$(pwd)/_install/lib:$OCAMLPATH dune build --root=e
Entering directory 'e'
Leaving directory 'e'
$ OCAMLPATH=$(pwd)/_install/lib:$OCAMLPATH PATH=$(pwd)/_install/bin:$PATH dune exec --root=e -- c
Entering directory 'e'
Leaving directory 'e'
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/e/_build/install/default/share/e/data
info.txt is found: true
run c: registered:e,b.
$ OCAMLPATH=$(pwd)/_install/lib:$OCAMLPATH dune install --root=e --prefix $(pwd)/_install
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/c
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/_install/share/e/data
info.txt is found: true
run c: registered:e,b.
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build @runtest
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/_build/install/default/share/e/data
info.txt is found: true
run c: registered:e,b.
Test %{version:installed-pkg}
-----------------------------
$ for i in f; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 3.0)
> (using dune_site 0.1)
> (name $i)
> (version 0.$i)
> (package (name $i) (sites (share data) (lib plugins)) (allow_empty))
> EOF
> done
$ cat >f/dune <<EOF
> (rule
> (target test.target)
> (action
> (with-stdout-to %{target}
> (progn
> (echo "a = %{version:a}\n")
> (echo "e = %{version:e}\n")))))
> EOF
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build --root=f
Entering directory 'f'
Leaving directory 'f'
$ cat $(pwd)/f/_build/default/test.target
a = 0.a
e =
$ cat f/dune | sed 's/version:a/version:a.test/' > f/dune.tmp && mv f/dune.tmp f/dune
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build --root=f
Entering directory 'f'
File "dune", line 6, characters 15-32:
6 | (echo "a = %{version:a.test}\n")
^^^^^^^^^^^^^^^^^
Error: Library names are not allowed in this position. Only package names are
allowed
Leaving directory 'f'
[1]
$ rm f/dune
Test error location
---------------------------------
$ cat >>a/dune <<EOF
> (install
> (section (site (non-existent foo)))
> (files a.ml)
> )
> EOF
$ dune build @install
File "a/dune", line 6, characters 16-34:
6 | (section (site (non-existent foo)))
^^^^^^^^^^^^^^^^^^
Error: The package non-existent is not found
[1]
$ cat >a/dune <<EOF
> (library
> (public_name a)
> (libraries dune-site))
> (generate_sites_module (module sites) (sites non-existent))
> EOF
$ dune build
File "a/dune", line 4, characters 45-57:
4 | (generate_sites_module (module sites) (sites non-existent))
^^^^^^^^^^^^
Error: Unknown package
[1]

View file

@ -0,0 +1,466 @@
Test embedding of sites locations information
-----------------------------------
$ mkdir -p a b c
$ for i in a b d; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 2.9)
> (generate_opam_files true)
> (using dune_site 0.1)
> (name $i)
> (version 0.$i)
> (package (name $i) (sites (share data)))
> EOF
> done
$ for i in c; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 2.9)
> (generate_opam_files true)
> (using dune_site 0.1)
> (name $i)
> (package (name $i) (sites (share data) (lib plugins)))
> EOF
> done
$ cat >a/dune <<EOF
> (library
> (public_name a)
> (libraries dune-site))
> (generate_sites_module (module sites) (sites a))
> EOF
$ cat >a/a.ml <<EOF
> let v = "a"
> let () = Printf.printf "run a\n%!"
> let () = List.iter (Printf.printf "a: %s\n%!") Sites.Sites.data
> EOF
$ cat >b/dune <<EOF
> (library
> (public_name b.b.b)
> (name b)
> (libraries c.register dune-site))
> (generate_sites_module (module sites) (sites b))
> (plugin (name c-plugins-b) (libraries b.b.b) (site (c plugins)))
> (install (section (site (b data))) (files info.txt))
> EOF
$ cat >b/b.ml <<EOF
> let v = "b"
> let () = Printf.printf "run b\n%!"
> let () = C_register.registered := "b"::!C_register.registered
> let () = List.iter (Printf.printf "b: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %b\n%!" found
> EOF
$ cat >b/info.txt <<EOF
> Lorem
> EOF
$ cat >d/dune <<EOF
> (library
> (public_name d)
> (libraries c.register dune-site non-existent-library)
> (optional))
> (generate_sites_module (module sites) (sites d))
> (plugin (name c-plugins-d) (libraries d) (site (c plugins)) (optional))
> (install (section (site (d data))) (files info.txt))
> EOF
$ cat >d/d.ml <<EOF
> let v = "d"
> let () = Printf.printf "run d\n%!"
> let () = C_register.registered := "d"::!C_register.registered
> let () = List.iter (Printf.printf "d: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %d\n%!" found
> EOF
$ cat >d/info.txt <<EOF
> Lorem
> EOF
$ cat >c/dune <<EOF
> (executable
> (public_name c)
> (promote (until-clean))
> (modules c sites)
> (libraries a c.register dune-site dune-site.plugins))
> (library
> (public_name c.register)
> (name c_register)
> (modules c_register))
> (generate_sites_module (module sites) (sourceroot) (plugins (c plugins)))
> (rule
> (targets out.log)
> (deps (package c))
> (action (with-stdout-to out.log (run %{bin:c}))))
> EOF
$ cat >c/c_register.ml <<EOF
> let registered : string list ref = ref []
> EOF
$ cat >c/c.ml <<EOF
> let () = Printf.printf "run c: %s linked registered:%s.\n%!"
> A.v (String.concat "," !C_register.registered)
> let () = match Sites.sourceroot with
> | Some d -> Printf.printf "sourceroot is %S\n%!" d
> | None -> Printf.printf "no sourceroot\n%!"
> let () = List.iter (Printf.printf "c: %s\n%!") Sites.Sites.data
> let () = Printf.printf "b is available: %b\n%!" (Dune_site_plugins.V1.available "b")
> let () = Sites.Plugins.Plugins.load_all ()
> let () = Printf.printf "run c: registered:%s.\n%!" (String.concat "," !C_register.registered)
> EOF
$ cat > dune-project << EOF
> (lang dune 2.2)
> EOF
Test with an opam like installation
--------------------------------
$ dune build a/a.opam
$ cat a/a.opam
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "0.a"
depends: [
"dune" {>= "2.9"}
"odoc" {with-doc}
]
build: [
["dune" "subst"] {dev}
[
"dune"
"build"
"-p"
name
"-j"
jobs
"--promote-install-files=false"
"@install"
"@runtest" {with-test}
"@doc" {with-doc}
]
["dune" "install" "-p" name "--create-install-files" name]
]
$ dune build -p a --promote-install-files="false" @install
$ test -e a/a.install
[1]
$ dune install -p a --create-install-files a --prefix "_destdir"
$ cat a/a.install
lib: [
"_destdir/_destdir/lib/a/META"
"_destdir/_destdir/lib/a/Sites.ml"
"_destdir/_destdir/lib/a/a.a"
"_destdir/_destdir/lib/a/a.cma"
"_build/install/default/lib/a/a.cmi"
"_build/install/default/lib/a/a.cmt"
"_build/install/default/lib/a/a.cmx"
"_build/install/default/lib/a/a.cmxa"
"_build/install/default/lib/a/a.ml"
"_build/install/default/lib/a/a__.cmi"
"_build/install/default/lib/a/a__.cmt"
"_build/install/default/lib/a/a__.cmx"
"_build/install/default/lib/a/a__.ml"
"_build/install/default/lib/a/a__Sites.cmi"
"_build/install/default/lib/a/a__Sites.cmt"
"_build/install/default/lib/a/a__Sites.cmx"
"_destdir/_destdir/lib/a/dune-package"
"_build/install/default/lib/a/opam"
]
libexec: [
"_destdir/_destdir/lib/a/a.cmxs"
]
Build everything
----------------
$ dune build
Test with a normal installation
--------------------------------
$ dune install --prefix _install
Once installed, we have the sites information:
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/c
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run c: registered:b.
Test with a relocatable installation
--------------------------------
$ dune install --prefix _install_relocatable --relocatable
Once installed, we have the sites information:
$ _install_relocatable/bin/c
run a
a: $TESTCASE_ROOT/_install_relocatable/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install_relocatable/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install_relocatable/share/b/data
info.txt is found: true
run c: registered:b.
Test after moving a relocatable installation
--------------------------------
$ mv _install_relocatable _install_relocatable2
Once installed, we have the sites information:
$ _install_relocatable2/bin/c
run a
a: $TESTCASE_ROOT/_install_relocatable2/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install_relocatable2/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install_relocatable2/share/b/data
info.txt is found: true
run c: registered:b.
Test substitution when promoting
--------------------------------
It is wrong that info.txt is not found, but to make it work it is an important
development because b is not promoted
$ c/c.exe
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
info.txt is found: false
run c: registered:b.
Test within dune rules
--------------------------------
$ dune build c/out.log
$ cat _build/default/c/out.log
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run c: registered:b.
Test with dune exec
--------------------------------
$ dune exec -- c/c.exe
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run c: registered:b.
Test compiling an external plugin
---------------------------------
$ mkdir e
$ cat >e/dune-project <<EOF
> (lang dune 2.8)
> (using dune_site 0.1)
> (name e)
> (package (name e) (sites (share data)))
> EOF
$ cat >e/dune <<EOF
> (library
> (public_name e)
> (libraries c.register dune-site))
> (generate_sites_module (module sites) (sites e))
> (plugin (name c-plugins-e) (libraries e) (site (c plugins)))
> (install (section (site (e data))) (files info.txt))
> (rule (alias runtest) (deps (package a) (package b) (package c) (package d) (package e))
> (action (run %{bin:c})))
> EOF
$ cat >e/e.ml <<EOF
> let v = "e"
> let () = Printf.printf "run e\n%!"
> let () = C_register.registered := "e"::!C_register.registered
> let () = List.iter (Printf.printf "e: %s\n%!") Sites.Sites.data
> let () =
> let test d = Sys.file_exists (Filename.concat d "info.txt") in
> let found = List.exists test Sites.Sites.data in
> Printf.printf "info.txt is found: %b\n%!" found
> EOF
$ cat >e/info.txt <<EOF
> Lorem
> EOF
$ OCAMLPATH=$PWD/_install/lib:$OCAMLPATH dune build --root=e
Entering directory 'e'
Leaving directory 'e'
$ OCAMLPATH=$PWD/_install/lib:$OCAMLPATH PATH=$PWD/_install/bin:$PATH dune exec --root=e -- c
Entering directory 'e'
Leaving directory 'e'
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/e/_build/install/default/share/e/data
info.txt is found: true
run c: registered:e,b.
$ OCAMLPATH=$PWD/_install/lib:$OCAMLPATH dune install --root=e --prefix $PWD/_install
$ OCAMLPATH=_install/lib:$OCAMLPATH _install/bin/c
run a
a: $TESTCASE_ROOT/_install/share/a/data
run c: a linked registered:.
no sourceroot
c: $TESTCASE_ROOT/_install/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_install/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/_install/share/e/data
info.txt is found: true
run c: registered:e,b.
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build @runtest
run a
a: $TESTCASE_ROOT/_build/install/default/share/a/data
run c: a linked registered:.
sourceroot is "$TESTCASE_ROOT"
c: $TESTCASE_ROOT/_build/install/default/share/c/data
b is available: true
run b
b: $TESTCASE_ROOT/_build/install/default/share/b/data
info.txt is found: true
run e
e: $TESTCASE_ROOT/_build/install/default/share/e/data
info.txt is found: true
run c: registered:e,b.
Test %{version:installed-pkg}
-----------------------------
$ for i in f; do
> mkdir -p $i
> cat >$i/dune-project <<EOF
> (lang dune 2.9)
> (using dune_site 0.1)
> (name $i)
> (version 0.$i)
> (package (name $i) (sites (share data) (lib plugins)))
> EOF
> done
$ cat >f/dune <<EOF
> (rule
> (target test.target)
> (action
> (with-stdout-to %{target}
> (progn
> (echo "a = %{version:a}\n")
> (echo "e = %{version:e}\n")))))
> EOF
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build --root=f
Entering directory 'f'
Leaving directory 'f'
$ cat $PWD/f/_build/default/test.target
a = 0.a
e =
$ cat f/dune | sed 's/version:a/version:a.test/' > f/dune.tmp && mv f/dune.tmp f/dune
$ OCAMLPATH=_install/lib:$OCAMLPATH dune build --root=f
Entering directory 'f'
File "dune", line 6, characters 15-32:
6 | (echo "a = %{version:a.test}\n")
^^^^^^^^^^^^^^^^^
Error: Library names are not allowed in this position. Only package names are
allowed
Leaving directory 'f'
[1]
$ rm f/dune
Test error location
---------------------------------
$ cat >>a/dune <<EOF
> (install
> (section (site (non-existent foo)))
> (files a.ml)
> )
> EOF
$ dune build @install
File "a/dune", line 6, characters 16-34:
6 | (section (site (non-existent foo)))
^^^^^^^^^^^^^^^^^^
Error: The package non-existent is not found
[1]
$ cat >a/dune <<EOF
> (library
> (public_name a)
> (libraries dune-site))
> (generate_sites_module (module sites) (sites non-existent))
> EOF
$ dune build
File "a/dune", line 4, characters 45-57:
4 | (generate_sites_module (module sites) (sites non-existent))
^^^^^^^^^^^^
Error: Unknown package
[1]