mamexec revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
20293N/A:
20293N/A#
20293N/A# Glenn Fowler
20293N/A# AT&T Bell Laboratories
20293N/A#
20293N/A# make abstract machine executor with state
20293N/A#
20293N/A# @(#)mamexec (gsf@research.att.com) 07/17/94
20293N/A#
20293N/A# mamexec [ -dfins ] [ target ... ] < mam-file
20293N/A#
20293N/A# NOTE: variables defined in this script may conflict with
20293N/A# mam-file variables
20293N/A#
20293N/A
20293N/A_command_=mamexec
20293N/A_debug_=:
20293N/A_diff_=.
20293N/A_error_='exit 1'
20293N/A_exec_=eval
20293N/A_force_=
20293N/A_list_=
20293N/A_same_=.
20293N/A_set_=
20293N/A_silent_=
20293N/A_state_list_=MAMlist
20293N/A_state_time_=MAMtime
20293N/A_tmp_=/tmp/mam.$$.mam
20293N/A
20293N/Atrap 'rm -f $_tmp_' 0
20293N/Atrap 'exit 2' 1 2
20293N/Awhile :
20293N/Ado case $# in
20293N/A 0) break ;;
20293N/A esac
20293N/A case $1 in
20293N/A --) shift
20293N/A break
20293N/A ;;
20293N/A -*) case $1 in
20293N/A -*[abceghjklmopqrtuvwxyz_A-Z0-9]*) # [!...] not portable
20293N/A echo "Usage: $_command_ [ -dfins ] [ target ... ] < mam-file" >&2; exit 2
20293N/A ;;
20293N/A *) case $1 in
20293N/A *d*) _debug_="eval echo $_command_: debug: >&2" ;;
20293N/A esac
20293N/A case $1 in
20293N/A *f*) _force_=1 ;;
20293N/A esac
20293N/A case $1 in
20293N/A *i*) _error_=: ;;
20293N/A esac
20293N/A case $1 in
20293N/A *n*) _exec_=echo ;;
20293N/A esac
20293N/A case $1 in
20293N/A *s*) _silent_=1 ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/A ;;
20293N/A *) break
20293N/A ;;
20293N/A esac
20293N/A shift
20293N/Adone
20293N/A_select_=
20293N/Awhile :
20293N/Ado case $# in
20293N/A 0) break ;;
20293N/A esac
20293N/A case $1 in
20293N/A *=*) eval $1
20293N/A ;;
20293N/A *) case $_select_ in
20293N/A "") _select_=$1 ;;
20293N/A *) _select_="$_select_|$1" ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/A shift
20293N/Adone
20293N/Acase $_select_ in
20293N/A"") _select_="*" ;;
20293N/Aesac
20293N/A(set -e; false || true) && _set_=e || echo $_command_: command errors ignored because of shell botch >&2
20293N/Acase $_silent_ in
20293N/A"") _set_=x$_set_
20293N/A ;;
20293N/A*) case $_exec_ in
20293N/A "echo") _exec_=: ;;
20293N/A esac
20293N/A ;;
20293N/Aesac
20293N/Acase $_exec_ in
20293N/A"eval") _begin_="("
20293N/A _end_=") </dev/null"
20293N/A case $_set_ in
20293N/A ?*) _set_="set -$_set_;" ;;
20293N/A esac
20293N/A ;;
20293N/A*) _set_=
20293N/A ;;
20293N/Aesac
20293N/A
20293N/Aif test -f $_state_list_ -a -f $_state_time_
20293N/Athen mamstate $_state_list_ < $_state_list_ | sort > $_tmp_
20293N/A for _i_ in `comm -12 $_state_time_ $_tmp_ | sed 's/ .*//'`
20293N/A do case $_same_ in
20293N/A .) _same_=$_i_ ;;
20293N/A *) _same_="$_same_|$_i_" ;;
20293N/A esac
20293N/A done
20293N/Afi
20293N/A
20293N/A_index_=_
20293N/A_match_=
20293N/Acase `(echo ok | (read -r a; echo $a) 2>/dev/null)` in
20293N/Aok) _read_='read -r'
20293N/A ;;
20293N/A*) # read strips \ -- thanks a lot
20293N/A # tmp file avoids char at a time read
20293N/A _read_=read
20293N/A sed 's/\\/\\\\/g' > $_tmp_
20293N/A exec < $_tmp_
20293N/A rm -f $_tmp_
20293N/A ;;
20293N/Aesac
20293N/A_old_=1
20293N/A_ifs_=$IFS
20293N/Awhile IFS=' '; $_read_ _op_ _arg_ _val_
20293N/Ado IFS=$_ifs_
20293N/A case $_op_ in
20293N/A "note") continue
20293N/A ;;
20293N/A "info") case $_arg_ in
20293N/A "mam") _old_= ;;
20293N/A esac
20293N/A continue
20293N/A ;;
20293N/A "setv") eval _data_='$'$_arg_
20293N/A case $_index_:$_data_ in
20293N/A __*:*|*:)
20293N/A case $_exec_ in
20293N/A "eval") ;;
20293N/A *) echo "$_arg_=$_val_" ;;
20293N/A esac
20293N/A eval $_arg_="$_val_" "</dev/null"
20293N/A ;;
20293N/A esac
20293N/A case $_arg_:$mam_cc_L in
20293N/A "CC:") (
20293N/A set -
20293N/A mkdir /tmp/mam$$
20293N/A cd /tmp/mam$$
20293N/A echo 'main(){return 0;}' > main.c
20293N/A code=1
20293N/A if $CC -c main.c 2>/dev/null
20293N/A then if $CC -L. main.o -lc 2>/dev/null
20293N/A then $CC -L. main.o -lc > libc.a 2>/dev/null || code=0
20293N/A fi
20293N/A fi
20293N/A cd /tmp
20293N/A rm -rf /tmp/mam$$
20293N/A exit $code
20293N/A ) </dev/null && mam_cc_L=' '
20293N/A ;;
20293N/A esac
20293N/A continue
20293N/A ;;
20293N/A "make") eval _name_$_index_=$_name_
20293N/A eval _prev_$_index_=$_prev_
20293N/A eval _cmds_$_index_='"$_cmds_"'
20293N/A eval _attr_$_index_=$_attr_
20293N/A eval _name_=$_arg_
20293N/A _prev_=$_index_
20293N/A case " $_val_ " in
20293N/A *" metarule "*) _attr_=m$_attr_ ;;
20293N/A esac
20293N/A _cmds_=
20293N/A eval " case \"$_name_\" in
20293N/A $_select_)
20293N/A case \"$_select_\" in
20293N/A \"*\") _select_=$_name_ ;;
20293N/A esac
20293N/A _match_=1
20293N/A _attr_=x$_attr_
20293N/A ;;
20293N/A esac"
20293N/A case $_force_ in
20293N/A "") eval " case \"$_name_\" in
20293N/A $_diff_)_attr_=u$_attr_ ;;
20293N/A $_same_);;
20293N/A *) _attr_=u$_attr_ ;;
20293N/A esac"
20293N/A ;;
20293N/A *) _attr_=u$_attr_
20293N/A ;;
20293N/A esac
20293N/A case $_attr_ in
20293N/A *u*) case $_diff_ in
20293N/A .) _diff_=$_name_ ;;
20293N/A *) _diff_="$_diff_|$_name_" ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/A _index_=_$_index_
20293N/A eval _name_$_index_=$_name_
20293N/A eval _prev_$_index_=$_prev_
20293N/A eval _cmds_$_index_=$_cmds_
20293N/A eval _attr_$_index_=$_attr_
20293N/A eval _list_='"'"$_list_"'
20293N/A'$_name_'"'
20293N/A continue
20293N/A ;;
20293N/A "prev") case $_force_ in
20293N/A "") eval " case \"$_arg_\" in
20293N/A $_diff_)_attr_=u$_attr_ ;;
20293N/A $_same_) ;;
20293N/A *) _attr_=u$_attr_ ;;
20293N/A esac"
20293N/A ;;
20293N/A *) _attr_=u$_attr_
20293N/A ;;
20293N/A esac
20293N/A continue
20293N/A ;;
20293N/A esac
20293N/A case $_index_ in
20293N/A _) echo $_op_: missing make op >&2; continue ;;
20293N/A esac
20293N/A case $_op_ in
20293N/A "attr") case $_val_ in
20293N/A "meta"|"suff") _attr_=m$_attr_ ;;
20293N/A esac
20293N/A ;;
20293N/A "exec"|"....")
20293N/A case $_old_ in
20293N/A "") _arg_=$_val_
20293N/A ;;
20293N/A *) case $_val_ in
20293N/A ?*) _arg_="$_arg_ $_val_" ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/A case $_cmds_ in
20293N/A "") _cmds_=$_arg_
20293N/A ;;
20293N/A *) _cmds_="$_cmds_
20293N/A$_arg_"
20293N/A ;;
20293N/A esac
20293N/A ;;
20293N/A "done") eval _arg_=$_arg_
20293N/A _prop_=
20293N/A case $_arg_ in
20293N/A $_name_)case $_attr_ in
20293N/A *m*) ;;
20293N/A *x*u*|*u*x*)
20293N/A case $_cmds_ in
20293N/A "") case $_attr_ in
20293N/A *u*) _prop_=u ;;
20293N/A esac
20293N/A ;;
20293N/A *) $_exec_ "$_begin_$_set_$_cmds_$_end_" ||
20293N/A {
20841N/A _code_=$?
20293N/A case $_set_ in
20293N/A *-*e*) ;;
20293N/A *) case $_cmds_ in
20293N/A *if*then*fi*|"||") _code_=0 ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/A case $_code_ in
20841N/A 0) ;;
20293N/A *) echo "*** exit code $_code_ making $_name_" >&2
20293N/A $_error_
20293N/A ;;
20293N/A esac
20293N/A }
20293N/A _prop_=u
20293N/A ;;
20293N/A esac
20841N/A ;;
20293N/A esac
20293N/A _index_=$_prev_
20293N/A eval _name_='$'_name_$_index_
20293N/A eval _prev_='$'_prev_$_index_
20293N/A eval _cmds_='$'_cmds_$_index_
20293N/A eval _attr_=$_prop_'$'_attr_$_index_
20293N/A ;;
20293N/A *) echo $_val_: $_op_ $_name_ expected >&2
20841N/A ;;
20293N/A esac
20293N/A ;;
20293N/A esac
20293N/Adone
20293N/AIFS=$_ifs_
20293N/Acase $_match_ in
20293N/A"") echo "$_command_: don't know how to make $_select_" >&2; $_error_ ;;
20293N/Aesac
20841N/Acase $_exec_ in
20293N/A"eval") echo "$_list_" > $_state_list_
20293N/A mamstate $_state_list_ < $_state_list_ | sort > $_state_time_
20293N/A ;;
20293N/Aesac
20293N/A