diff --git a/spectec/src/middlend/.gitattributes b/spectec/src/middlend/.gitattributes new file mode 100644 index 0000000000..d671224e72 --- /dev/null +++ b/spectec/src/middlend/.gitattributes @@ -0,0 +1 @@ +dune.inc merge=binary \ No newline at end of file diff --git a/spectec/test-middlend/dune b/spectec/test-middlend/dune index 1ee624fe16..ef434e94ef 100644 --- a/spectec/test-middlend/dune +++ b/spectec/test-middlend/dune @@ -14,38 +14,22 @@ (rule (alias runtest) (action (diff test.spectec.exp test.spectec.act))) ; A more complicated setup that tests the various middle end passes against the full specification. +; +; It stores each pass's output in a separate directory. ; -; It runs spectec on the 3.0 specification files and dumps the IL of each pass -; into a separate file (`specification.XX-passname.act`). -; It then compares it against the expected output files (`specification.XX-passname.exp`). -; `dune promote` can be used to update the expected files. +; This requires a dynamic dune rule to enumerate the files. Whe this changes, then running ; -; It is often helpful to diff the the output from one pass against its previous pass, -; hence the numbers in the filenames. +; rm specification.exp/* +; dune runtest test-middlend --auto-promote --diff-command "diff -Nur" ; -; Adding a new pass is somewhat tedious: -; - Add the filename in `targets` below -; - Add a `diff`-rule at the bottom -; - Remove all expected files (`rm *.exp`) -; - Run `dune runtest --diff-command "diff -Nur"` -; (Without this flag `diff` will stumble over the missing files, see https://github.com/ocaml/dune/issues/8075) -; - Run `dune promote` -; -; Same when reordering passes: the filenames have to be updated. +; should update that dynamically included dune file. (rule (targets - specification.00-elab.act - specification.01-typefamily-removal.act - specification.02-remove-indexed-types.act - specification.03-totalize.act - specification.04-else.act - specification.05-sideconditions.act - specification.06-sub.act - specification.07-alias-demut.act + specification.act ) (action - (system "../src/exe-spectec/main.exe ../../../../specification/wasm-3.0/*.spectec -l --print-all-il-to specification.%s.act --print-no-pos --all-passes --check") + (system "mkdir -p specification.act; ../src/exe-spectec/main.exe ../../../../specification/wasm-3.0/*.spectec -l --print-all-il-to specification.act/%s.il --print-no-pos --all-passes --check") ) (deps (file ../src/exe-spectec/main.exe) @@ -53,12 +37,19 @@ ) ) +(include dune.inc) + +(rule (alias dune.inc) (action (diff dune.inc dune.inc.gen))) +(alias (name runtest) (deps (alias dune.inc))) -(rule (alias runtest) (action (diff specification.00-elab.exp specification.00-elab.act))) -(rule (alias runtest) (action (diff specification.01-typefamily-removal.exp specification.01-typefamily-removal.act))) -(rule (alias runtest) (action (diff specification.02-remove-indexed-types.exp specification.02-remove-indexed-types.act))) -(rule (alias runtest) (action (diff specification.03-totalize.exp specification.03-totalize.act))) -(rule (alias runtest) (action (diff specification.04-else.exp specification.04-else.act))) -(rule (alias runtest) (action (diff specification.05-sideconditions.exp specification.05-sideconditions.act))) -(rule (alias runtest) (action (diff specification.06-sub.exp specification.06-sub.act))) -(rule (alias runtest) (action (diff specification.07-alias-demut.exp specification.07-alias-demut.act))) \ No newline at end of file +; The generated rules depend on dune.inc. This way, these actions are not run when dune.inc is out +; of date. +(rule + (deps (file specification.act)) + (action (with-stdout-to dune.inc.gen (system + "ls specification.act | + while read f; do + echo \"(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/$f specification.act/$f))))\"; + done" + ))) +) diff --git a/spectec/test-middlend/dune.inc b/spectec/test-middlend/dune.inc new file mode 100644 index 0000000000..0a7ecb830e --- /dev/null +++ b/spectec/test-middlend/dune.inc @@ -0,0 +1,8 @@ +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/00-elab.il specification.act/00-elab.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/01-typefamily-removal.il specification.act/01-typefamily-removal.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/02-remove-indexed-types.il specification.act/02-remove-indexed-types.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/03-totalize.il specification.act/03-totalize.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/04-else.il specification.act/04-else.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/05-sideconditions.il specification.act/05-sideconditions.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/06-sub.il specification.act/06-sub.il)))) +(rule (alias runtest) (deps (alias dune.inc) (file specification.act) (glob_files_rec specification.exp/*)) (action (no-infer (diff specification.exp/07-alias-demut.il specification.act/07-alias-demut.il)))) diff --git a/spectec/test-middlend/specification.00-elab.exp b/spectec/test-middlend/specification.exp/00-elab.il similarity index 100% rename from spectec/test-middlend/specification.00-elab.exp rename to spectec/test-middlend/specification.exp/00-elab.il diff --git a/spectec/test-middlend/specification.01-typefamily-removal.exp b/spectec/test-middlend/specification.exp/01-typefamily-removal.il similarity index 100% rename from spectec/test-middlend/specification.01-typefamily-removal.exp rename to spectec/test-middlend/specification.exp/01-typefamily-removal.il diff --git a/spectec/test-middlend/specification.02-remove-indexed-types.exp b/spectec/test-middlend/specification.exp/02-remove-indexed-types.il similarity index 100% rename from spectec/test-middlend/specification.02-remove-indexed-types.exp rename to spectec/test-middlend/specification.exp/02-remove-indexed-types.il diff --git a/spectec/test-middlend/specification.03-totalize.exp b/spectec/test-middlend/specification.exp/03-totalize.il similarity index 100% rename from spectec/test-middlend/specification.03-totalize.exp rename to spectec/test-middlend/specification.exp/03-totalize.il diff --git a/spectec/test-middlend/specification.04-else.exp b/spectec/test-middlend/specification.exp/04-else.il similarity index 100% rename from spectec/test-middlend/specification.04-else.exp rename to spectec/test-middlend/specification.exp/04-else.il diff --git a/spectec/test-middlend/specification.05-sideconditions.exp b/spectec/test-middlend/specification.exp/05-sideconditions.il similarity index 100% rename from spectec/test-middlend/specification.05-sideconditions.exp rename to spectec/test-middlend/specification.exp/05-sideconditions.il diff --git a/spectec/test-middlend/specification.06-sub.exp b/spectec/test-middlend/specification.exp/06-sub.il similarity index 100% rename from spectec/test-middlend/specification.06-sub.exp rename to spectec/test-middlend/specification.exp/06-sub.il diff --git a/spectec/test-middlend/specification.07-alias-demut.exp b/spectec/test-middlend/specification.exp/07-alias-demut.il similarity index 100% rename from spectec/test-middlend/specification.07-alias-demut.exp rename to spectec/test-middlend/specification.exp/07-alias-demut.il