Tests for dynamic dependencies computed from the `%{read:...}` family of macros

  $ cat > dune-project <<EOF
  > (lang dune 3.1)
  > EOF

Define 2 rules and a file containing their paths

  $ cat > deps.d <<EOF
  > (depA depB)
  > EOF

  $ cat > dune <<EOF
  > (rule
  >  (target depA)
  >  (action
  >   (system "echo depA > %{target}")))
  > 
  > (rule
  >  (target depB)
  >  (action
  >   (system "echo depB > %{target}")))
  > EOF

Now we define a rule that reads `deps.d` to figure out what to build.

  $ cat >> dune <<EOF
  > (rule
  >  (target output)
  >  (deps (include deps.d))
  >  (action
  >   (system "echo %{deps} > %{target}")))
  > EOF

Building `./output` should now produce a file with contents "depA depB"

  $ dune build ./output

  $ cat _build/default/output
  depA depB

Doesn't work in dune pre 3.0

  $ cat > dune-project <<EOF
  > (lang dune 3.0)
  > EOF

  $ dune build ./output
  File "dune", line 12, characters 7-23:
  12 |  (deps (include deps.d))
              ^^^^^^^^^^^^^^^^
  Error: 'include' is only available since version 3.1 of the dune language.
  Please update your dune-project file to have (lang dune 3.1).
  [1]

Works with aliases and other dependency specifications

  $ cat > dune-project <<EOF
  > (lang dune 3.1)
  > EOF

  $ cat > deps.d <<EOF
  > ((alias depA) (universe) depB another_dep)
  > EOF

  $ cat > dune <<EOF
  > (rule
  >  (alias depA)
  >  (action
  >   (system "echo building depA")))
  > 
  > (rule
  >  (target depB)
  >  (action
  >   (progn
  >     (run echo building depB)
  >     (system "echo depB > %{target}"))))
  > (rule
  >  (target another_dep)
  >  (action
  >   (system "echo building a_dep > %{target}")))
  > 
  > (rule
  >  (alias output)
  >  (deps (include deps.d))
  >  (action
  >   (no-infer (echo "dependencies %{deps}"))))
  > EOF

  $ dune build @output
  building depA
  building depB
  dependencies depB another_dep

Multiple `(include)` nesting

  $ cat >> dune <<EOF
  > (rule
  >  (target meta-deps.d)
  >  (action
  >   (system "echo '((include ./deps.d))' > %{target}")))
  > 
  > (rule
  >  (alias nested)
  >  (deps (include meta-deps.d))
  >  (action (no-infer (echo "metadeps: %{deps}"))))
  > EOF

  $ dune build @nested
  metadeps: depB another_dep
