diff options
Diffstat (limited to 'subx/build')
-rwxr-xr-x | subx/build | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/subx/build b/subx/build deleted file mode 100755 index 67479b92..00000000 --- a/subx/build +++ /dev/null @@ -1,141 +0,0 @@ -#!/bin/sh -# returns 0 on successful build or nothing to build -# non-zero exit status only on error during building -set -e # stop immediately on error - -# [0-9]*.cc -> subx.cc -> subx_bin -# (layers) | | -# tangle $CXX - -# can also be called with a layer to only build until -# $ ./build --until 050 -UNTIL_LAYER=${2:-zzz} - -# we use two mechanisms to speed up rebuilds: -# - older_than: run a command if the output is older than any of the inputs -# - update: if a command is quick to run, always run it but update the result only on any change -# -# avoid combining both mechanisms to generate a single file -# otherwise you'll see spurious messages about files being updated -# risk: a file may unnecessarily update without changes, causing unnecessary work downstream - -test "$CXX" || export CXX=c++ -test "$CC" || export CC=cc -test "$CFLAGS" || export CFLAGS="-g -O3 -std=c++98" # CI has an ancient version; don't expect recent dialects -export CFLAGS="$CFLAGS -Wall -Wextra -fno-strict-aliasing" - -# return 1 if $1 is older than _any_ of the remaining args -older_than() { - local target=$1 - shift - if [ ! -e $target ] - then -#? echo "$target doesn't exist" - echo "updating $target" >&2 - return 0 # success - fi - local f - for f in $* - do - if [ $f -nt $target ] - then - echo "updating $target" >&2 - return 0 # success - fi - done - return 1 # failure -} - -# redirect to $1, unless it's already identical -update() { - if [ ! -e $1 ] - then - cat > $1 - else - cat > $1.tmp - diff -q $1 $1.tmp >/dev/null && rm $1.tmp || mv $1.tmp $1 - fi -} - -update_cp() { - if [ ! -e $2/$1 ] - then - cp $1 $2 - elif [ $1 -nt $2/$1 ] - then - cp $1 $2 - fi -} - -noisy_cd() { - cd $1 - echo "-- `pwd`" >&2 -} - -older_than ../enumerate/enumerate ../enumerate/enumerate.cc && { - $CXX $CFLAGS ../enumerate/enumerate.cc -o ../enumerate/enumerate -} - -older_than ../tangle/tangle ../tangle/*.cc && { - noisy_cd ../tangle - { - grep -h "^struct .* {" [0-9]*.cc |sed 's/\(struct *[^ ]*\).*/\1;/' - grep -h "^typedef " [0-9]*.cc - } |update type_list - grep -h "^[^ #].*) {" [0-9]*.cc |sed 's/ {.*/;/' |update function_list - ls [0-9]*.cc |grep -v "\.test\.cc$" |sed 's/.*/#include "&"/' |update file_list - ls [0-9]*.test.cc |sed 's/.*/#include "&"/' |update test_file_list - grep -h "^[[:space:]]*void test_" [0-9]*.cc |sed 's/^\s*void \(.*\)() {$/\1,/' |update test_list - grep -h "^\s*void test_" [0-9]*.cc |sed 's/^\s*void \(.*\)() {.*/"\1",/' |update test_name_list - $CXX $CFLAGS boot.cc -o tangle - ./tangle test - noisy_cd ../subx # no effect; just to show us returning to the parent directory -} - -LAYERS=$(../enumerate/enumerate --until $UNTIL_LAYER |grep '.cc$') -older_than subx.cc $LAYERS ../enumerate/enumerate ../tangle/tangle && { - # no update here; rely on 'update' calls downstream - ../tangle/tangle $LAYERS > subx.cc -} - -grep -h "^[^[:space:]#].*) {$" subx.cc |grep -v ":.*(" |sed 's/ {.*/;/' |update function_list -grep -h "^\s*void test_" subx.cc |sed 's/^\s*void \(.*\)() {.*/\1,/' |update test_list -grep -h "^\s*void test_" subx.cc |sed 's/^\s*void \(.*\)() {.*/"\1",/' |update test_name_list - -older_than subx_bin subx.cc *_list && { - $CXX $CFLAGS subx.cc -o subx_bin -} - -if [ $# -eq 0 ] -then - - # Assumption: SubX programs don't need to be retranslated every time we - # rebuild the C++ bootstrap. - - # simple example programs - for n in `seq 1 12` - do - older_than examples/ex$n examples/ex$n.subx && { - ./subx_bin translate examples/ex$n.subx -o examples/ex$n - } - done - - # simple apps that use the standard library - for app in factorial crenshaw2-1 crenshaw2-1b handle - do - older_than apps/$app apps/$app.subx [0-9]*.subx && { - ./subx_bin translate [0-9]*.subx apps/$app.subx -o apps/$app - } - done - - # self-hosting translator - for phase in hex survey pack assort dquotes tests - do - older_than apps/$phase apps/$phase.subx apps/subx-common.subx [0-9]*.subx && { - ./subx_bin translate [0-9]*.subx apps/subx-common.subx apps/$phase.subx -o apps/$phase - } - done - -fi - -exit 0 |