#!/bin/sh # Build and test all included SubX programs on Linux: # translate them into ELF binaries # compare the generated binaries with what's already in git # run/test the ELF binaries in emulated mode # run/test the ELF binaries in native mode # # Example usage: # test_apps # test_apps record # don't compare with what's in git set -e cd `dirname $0` ./build echo "== translating using the bootstrap C++ translator" # example programs echo ex1 ./bootstrap_bin translate init.linux apps/ex1.subx -o apps/ex1 test "$1" = 'record' || git diff --exit-code apps/ex1 { ./bootstrap_bin run apps/ex1 || ret=$? test $ret -eq 42 # life, the universe and everything } { apps/ex1 || ret=$? test $ret -eq 42 # life, the universe and everything } echo ex2 ./bootstrap_bin translate init.linux apps/ex2.subx -o apps/ex2 test "$1" = 'record' || git diff --exit-code apps/ex2 { ./bootstrap_bin run apps/ex2 || ret=$? test $ret -eq 7 # 3 + 4 } { apps/ex2 || ret=$? test $ret -eq 7 # 3 + 4 } echo ex3 ./bootstrap_bin translate init.linux apps/ex3.subx -o apps/ex3 test "$1" = 'record' || git diff --exit-code apps/ex3 { ./bootstrap_bin run apps/ex3 || ret=$? test $ret -eq 55 # 1 + 2 + ... + 10 } { apps/ex3 || ret=$? test $ret -eq 55 # 1 + 2 + ... + 10 } echo ex4 ./bootstrap_bin translate init.linux apps/ex4.subx -o apps/ex4 test "$1" = 'record' || git diff --exit-code apps/ex4 { echo a | ./bootstrap_bin run apps/ex4 >ex4.out || true test `cat ex4.out` = 'a' } { echo a | apps/ex4 >ex4.out || true test `cat ex4.out` = 'a' } echo ex5 ./bootstrap_bin translate init.linux apps/ex5.subx -o apps/ex5 test "$1" = 'record' || git diff --exit-code apps/ex5 { echo a | ./bootstrap_bin run apps/ex5 >ex5.out || true test `cat ex5.out` = 'a' } { echo a | apps/ex5 >ex5.out || true test `cat ex5.out` = 'a' } echo ex6 ./bootstrap_bin translate init.linux apps/ex6.subx -o apps/ex6 test "$1" = 'record' || git diff --exit-code apps/ex6 { ./bootstrap_bin run apps/ex6 >ex6.out || true test "`cat ex6.out`" = 'Hello, world!' } { apps/ex6 >ex6.out || true test "`cat ex6.out`" = 'Hello, world!' } echo ex7 ./bootstrap_bin translate init.linux apps/ex7.subx -o apps/ex7 test "$1" = 'record' || git diff --exit-code apps/ex7 { ./bootstrap_bin run apps/ex7 || ret=$? test $ret -eq 97 # 'a' } { apps/ex7 || ret=$? test $ret -eq 97 # 'a' } echo ex8 ./bootstrap_bin translate init.linux apps/ex8.subx -o apps/ex8 test "$1" = 'record' || git diff --exit-code apps/ex8 { ./bootstrap_bin run apps/ex8 abcd || ret=$? test $ret -eq 4 # length('abcd') } { apps/ex8 abcd || ret=$? test $ret -eq 4 # length('abcd') } echo ex9 ./bootstrap_bin translate init.linux apps/ex9.subx -o apps/ex9 test "$1" = 'record' || git diff --exit-code apps/ex9 { ./bootstrap_bin run apps/ex9 z x || ret=$? test $ret -eq 2 # 'z' - 'x' } { apps/ex9 z x || ret=$? test $ret -eq 2 # 'z' - 'x' } echo ex10 ./bootstrap_bin translate init.linux apps/ex10.subx -o apps/ex10 test "$1" = 'record' || git diff --exit-code apps/ex10 { ./bootstrap_bin run apps/ex10 abc abc || ret=$? test $ret -eq 1 # equal ./bootstrap_bin run apps/ex10 abc abcd # 0; not equal } { apps/ex10 abc abc || ret=$? test $ret -eq 1 # equal apps/ex10 abc abcd # 0; not equal } echo ex11 ./bootstrap_bin translate init.linux apps/ex11.subx -o apps/ex11 test "$1" = 'record' || git diff --exit-code apps/ex11 { ./bootstrap_bin run apps/ex11 echo } { apps/ex11 echo } echo ex12 ./bootstrap_bin translate init.linux apps/ex12.subx -o apps/ex12 test "$1" = 'record' || git diff --exit-code apps/ex12 test $EMULATED && ./bootstrap_bin run apps/ex12 # final byte of mmap'd address is well-nigh guaranteed to be 0 test $NATIVE && apps/ex12 echo ex13 ./bootstrap_bin translate init.linux apps/ex13.subx -o apps/ex13 test "$1" = 'record' || git diff --exit-code apps/ex13 { ./bootstrap_bin run apps/ex13 || ret=$? test $ret -eq 1 # 3 == 3 } { apps/ex13 || ret=$? test $ret -eq 1 # 3 == 3 } # Larger apps that use the standard library. echo factorial ./bootstrap_bin translate init.linux [01]*.subx apps/factorial.subx -o apps/factorial test "$1" = 'record' || git diff --exit-code apps/factorial { ./bootstrap_bin run apps/factorial || ret=$? test $ret -eq 120 # factorial(5) ./bootstrap_bin run apps/factorial test echo } { apps/factorial || ret=$? test $ret -eq 120 # factorial(5) apps/factorial test echo } echo crenshaw2-1 ./bootstrap_bin translate init.linux [01]*.subx apps/crenshaw2-1.subx -o apps/crenshaw2-1 test "$1" = 'record' || git diff --exit-code apps/crenshaw2-1 { ./bootstrap_bin run apps/crenshaw2-1 test echo } { apps/crenshaw2-1 test echo } echo crenshaw2-1b ./bootstrap_bin translate init.linux [01]*.subx apps/crenshaw2-1b.subx -o apps/crenshaw2-1b test "$1" = 'record' || git diff --exit-code apps/crenshaw2-1b { ./bootstrap_bin run apps/crenshaw2-1b test echo } { apps/crenshaw2-1b test echo } echo random ./bootstrap_bin translate init.linux [01]*.subx apps/random.subx -o apps/random test "$1" = 'record' || git diff --exit-code apps/random # don't run # Phases of the self-hosted SubX translator. for phase in hex survey_elf pack assort dquotes tests do echo $phase ./bootstrap_bin translate init.linux [01]*.subx apps/subx-params.subx apps/$phase.subx -o apps/$phase test "$1" = 'record' || git diff --exit-code apps/$phase { ./bootstrap_bin run apps/$phase test echo } { apps/$phase test echo } done # One phase variant for translating SubX to baremetal. (Other phases are reused.) for phase in survey_baremetal do echo $phase ./bootstrap_bin translate init.linux [01]*.subx apps/subx-params.subx apps/$phase.subx -o apps/$phase test "$1" = 'record' || git diff --exit-code apps/$phase { ./bootstrap_bin run apps/$phase test echo } { apps/$phase test echo } done # Higher-level syntax. # Certain phases of translation run native beyond this point. We're starting # to go beyond functionality of the C++ bootstrap_bin. echo sigils ./bootstrap_bin translate init.linux [012]*.subx apps/subx-params.subx apps/sigils.subx -o apps/sigils test "$1" = 'record' || git diff --exit-code apps/sigils { ./bootstrap_bin run apps/sigils test echo } { apps/sigils test echo } echo calls cat init.linux [012]*.subx apps/subx-params.subx apps/calls.subx | apps/sigils > a.sigils ./bootstrap_bin translate a.sigils -o apps/calls test "$1" = 'record' || git diff --exit-code apps/calls { ./bootstrap_bin run apps/calls test echo } { apps/calls test echo } echo braces cat init.linux [012]*.subx apps/subx-params.subx apps/braces.subx | apps/calls | apps/sigils > a.sigils ./bootstrap_bin translate a.sigils -o apps/braces test "$1" = 'record' || git diff --exit-code apps/braces { ./bootstrap_bin run apps/braces test echo } { apps/braces test echo } echo mu cat init.linux [0-2]*.subx apps/mu.subx | apps/braces | apps/calls | apps/sigils > a.sigils ./bootstrap_bin translate a.sigils -o apps/mu test "$1" = 'record' || git diff --exit-code apps/mu { ./bootstrap_bin run apps/mu test echo } { apps/mu test echo } echo "== translating using the self-hosted translator" # example programs for n in `seq 1 12` do echo ex$n ./translate_subx init.linux apps/ex$n.subx diff apps/ex$n a.elf done # Larger apps that use the standard library. for app in factorial crenshaw2-1 crenshaw2-1b do echo $app ./translate_subx init.linux [01]*.subx apps/$app.subx diff apps/$app a.elf done # Phases of the self-hosted SubX translator. for app in hex survey_elf pack assort dquotes tests do echo $app ./translate_subx init.linux [01]*.subx apps/subx-params.subx apps/$app.subx diff apps/$app a.elf done # One phase variant for translating SubX to baremetal. (Other phases are reused.) for app in survey_baremetal do echo $app ./translate_subx init.linux [01]*.subx apps/subx-params.subx apps/$app.subx diff apps/$app a.elf done for app in sigils calls braces do echo $app ./translate_subx init.linux [012]*.subx apps/subx-params.subx apps/$app.subx diff apps/$app a.elf done # Mu translator echo mu ./translate_subx init.linux [0-2]*.subx apps/mu.subx diff apps/mu a.elf # Mu programs echo ex1.mu ./translate_mu apps/ex1.mu { ./bootstrap_bin run a.elf || ret=$? test $ret -eq 42 # life, the universe and everything } { ./a.elf || ret=$? test $ret -eq 42 # life, the universe and everything } echo ex2.mu ./translate_mu apps/ex2.mu { ./bootstrap_bin run a.elf || ret=$? test $ret -eq 7 } { ./a.elf || ret=$? test $ret -eq 7 } echo ex3.mu ./translate_mu apps/ex3.mu { ./bootstrap_bin run a.elf || ret=$? test $ret -eq 55 } { ./a.elf || ret=$? test $ret -eq 55 } echo ex3.2.mu ./translate_mu apps/ex3.2.mu { ./bootstrap_bin run a.elf || ret=$? test $ret -eq 55 } { ./a.elf || ret=$? test $ret -eq 55 } echo factorial.mu ./translate_mu apps/factorial.mu { ./bootstrap_bin run a.elf || ret=$? test $ret -eq 120 ./bootstrap_bin run a.elf test echo } { ./a.elf || ret=$? test $ret -eq 120 ./a.elf test echo } exit 0