Patch from Ralf Corsepius <corsepiu@faw.uni-ulm.de>:

1. Rtems contains some perl scripts that use hard-coded paths to
      /usr/bin/perl or /usr/local/bin/perl I have already fixed these
      problems by adding some checks to configure.in.   While doing this,
      I also cleaned up some more autoconf related problems for generating
      shell scripts.  This patch might seem a bit scary to you, but I am
      quite confident it won't break something (I've been testing it for
      almost a week now, however it might introduce typos for a limited
      number configurations I don't have access to - But it shouldn't be
      a problem for you to test them :-).

   I expect to get this finished tonight, hence you will very likely
   have the patch when you get up tomorrow.

   Changes:

   * Check for PERL and disable all PERL scripts if perl wasn't found.
   * Generate all KSHELL-scripts with autoconf instead of make-script
   * Automatic dependency handling for autoconf generated KSHELL or PERL
     scripts (make/rtems.cfg)

   Notes:
   * this patch contains new files and deletes some other files.
   * The patch is relative to rtems-4.0.0-beta4 with my previous
     rtems-rc-981014-1.diff patch applied.

   Testing:
      I tested it with sh-rtems and posix under linux. Now all targets
      which are touched by this patch and which are not used while building
      for sh-rtems and posix still need to be tested. AFAIS, only the
      sparc/erc32 BSP should be affected by this criterion. And if you
      like to, you should also consider testing it on a Cygwin32 and a
      Solaris host for one arbitrary BSP.
This commit is contained in:
Joel Sherrill
1998-10-14 20:19:30 +00:00
parent 946b3cb0cf
commit 11cfb6f7f6
40 changed files with 2921 additions and 216 deletions

View File

@@ -22,11 +22,3 @@ unlock-directory
Useful to keep people from accidentally overwriting
"released" trees if they get confused about which
module they have loaded.
rtems-glom
glom together all the rtems libraries in order to simplify
the link line used by applications.
Produces rtems.rel.
Not used by the RTEMS src tree at all.
Strictly optional.

View File

@@ -0,0 +1,142 @@
#!@KSH@ -p
#
# Either bash or ksh will be ok for this; requires (( )) arithmetic
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# install files if they have changed by running 'cmp', then 'install'
# as necessary.
#
# Optionally, can append a suffix before last existing suffix (if any)
#
# NOTE
# We avoid using typical install(1M) programs since they have
# large variability across systems and we also need to support ou
# -V option.
# So we just copy and chmod by hand.
#
# $Id$
#
progname=`basename $0`
#progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -vmV ] file [ file ... ] dest-directory-or-file
-v -- verbose
-V suffix -- suffix to append to targets (before any . suffix)
eg: -V _g would change 'foo' to 'foo_g' and
'libfoo.a' to 'libfoo_g.a'
-m mode -- mode for new file(s)"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
suffix=""
mode=""
while getopts vm:V: OPT
do
case "$OPT" in
v)
verbose="yes";;
V)
eval suffix=$OPTARG;;
m)
mode="$OPTARG";;
*)
fatal
esac
done
shiftcount=`expr $OPTIND - 1`
shift $shiftcount
args=$*
#
# Separate source file(s) from dest directory or file
#
files=""
dest=""
for d in $args
do
files="$files $dest"
dest=$d
done
if [ ! "$files" ] || [ ! "$dest" ]
then
fatal "missing files or invalid destination"
fi
#
# Process the arguments
#
targets=""
for f in $files
do
# leaf=`basename $f`
leaf=${f##*/} # fast basename hack for ksh, bash
target=$dest
if [ -d $dest ]
then
# if we were given a suffix, then add it as appropriate
if [ "$suffix" ]
then
case $f in
*.*)
# leaf=`echo $leaf |
# /bin/sed "s/\([~\.]*\)\.\(.*\)$/\1$suffix.\2/"`
# ksh,bash hack for above sed script
leaf=${leaf%%.*}$suffix.${leaf#*.}
[ "$verbose" = "yes" ] &&
echo "$progname: $f will be installed as $leaf"
;;
*)
leaf=$leaf$suffix;;
esac
fi
target=$target/$leaf
fi
[ ! -r $f ] && fatal "can not read $f"
if cmp -s $f $target
then
[ "$verbose" = "yes" ] && echo "'$f' not newer than '$target'"
else
[ "$verbose" = "yes" ] && echo "rm -f $target"
rm -f $target
echo "cp -p $f $target"
cp -p $f $target || exit 1
targets="$targets $target" # keep list for chmod below
fi
done
if [ "$mode" -a "$targets" ]
then
[ "$verbose" = "yes" ] && echo "chmod $mode $targets"
chmod $mode $targets
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,43 @@
#!@KSH@
#
# $Id$
#
# Make a directory write protected
# Used to write protect the install point after a build
# to prevent inadvertant overwriting.
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
lock_directory() {
l_dir=$1/. # get any symlink out of the way using '.'
if [ -d $l_dir ]
then
find $l_dir -type d -perm -0200 -print | $XARGS chmod -w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
lock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,73 @@
#!@KSH@ -p
#
# $Id$
#
# Delete all files from the current directory that can be recreated
# via RCS 'co' commonds
# Used by 'make clobber'
#
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -v ]"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
while getopts v OPT
do
case "$OPT" in
v)
verbose="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
[ "$args" ] && fatal
[ -d RCS/. ] || exit 0
# there is probably a better way to do this
rcs_files=`echo RCS/*,v | sed -e 's?RCS/??g' -e's/,v//g'`
kills=""
for f in $rcs_files
do
# build list of all files in RCS/*,v that are *not* locked
if [ -f $f ] && [ ! -w $f ] && [ -f RCS/$f,v ]
then
locked=`rlog -L -R $f`
[ "$locked" = "" ] && kills="$kills $f"
fi
done
if [ "$kills" ]
then
[ "$verbose" ] && echo rm -f $kills
rm -f $kills
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -14,21 +14,23 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/build-tools
PGMS=install-if-change rcs-clean lock-directory unlock-directory \
search-id.sh
BUILD_PGMS=install-if-change rcs-clean lock-directory unlock-directory
PGMS = $(BUILD_PGMS) search-id.sh
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
# Install the program
$(DESTDIR)/%: %
$(make-script)
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -22,11 +22,3 @@ unlock-directory
Useful to keep people from accidentally overwriting
"released" trees if they get confused about which
module they have loaded.
rtems-glom
glom together all the rtems libraries in order to simplify
the link line used by applications.
Produces rtems.rel.
Not used by the RTEMS src tree at all.
Strictly optional.

View File

@@ -0,0 +1,142 @@
#!@KSH@ -p
#
# Either bash or ksh will be ok for this; requires (( )) arithmetic
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# install files if they have changed by running 'cmp', then 'install'
# as necessary.
#
# Optionally, can append a suffix before last existing suffix (if any)
#
# NOTE
# We avoid using typical install(1M) programs since they have
# large variability across systems and we also need to support ou
# -V option.
# So we just copy and chmod by hand.
#
# $Id$
#
progname=`basename $0`
#progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -vmV ] file [ file ... ] dest-directory-or-file
-v -- verbose
-V suffix -- suffix to append to targets (before any . suffix)
eg: -V _g would change 'foo' to 'foo_g' and
'libfoo.a' to 'libfoo_g.a'
-m mode -- mode for new file(s)"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
suffix=""
mode=""
while getopts vm:V: OPT
do
case "$OPT" in
v)
verbose="yes";;
V)
eval suffix=$OPTARG;;
m)
mode="$OPTARG";;
*)
fatal
esac
done
shiftcount=`expr $OPTIND - 1`
shift $shiftcount
args=$*
#
# Separate source file(s) from dest directory or file
#
files=""
dest=""
for d in $args
do
files="$files $dest"
dest=$d
done
if [ ! "$files" ] || [ ! "$dest" ]
then
fatal "missing files or invalid destination"
fi
#
# Process the arguments
#
targets=""
for f in $files
do
# leaf=`basename $f`
leaf=${f##*/} # fast basename hack for ksh, bash
target=$dest
if [ -d $dest ]
then
# if we were given a suffix, then add it as appropriate
if [ "$suffix" ]
then
case $f in
*.*)
# leaf=`echo $leaf |
# /bin/sed "s/\([~\.]*\)\.\(.*\)$/\1$suffix.\2/"`
# ksh,bash hack for above sed script
leaf=${leaf%%.*}$suffix.${leaf#*.}
[ "$verbose" = "yes" ] &&
echo "$progname: $f will be installed as $leaf"
;;
*)
leaf=$leaf$suffix;;
esac
fi
target=$target/$leaf
fi
[ ! -r $f ] && fatal "can not read $f"
if cmp -s $f $target
then
[ "$verbose" = "yes" ] && echo "'$f' not newer than '$target'"
else
[ "$verbose" = "yes" ] && echo "rm -f $target"
rm -f $target
echo "cp -p $f $target"
cp -p $f $target || exit 1
targets="$targets $target" # keep list for chmod below
fi
done
if [ "$mode" -a "$targets" ]
then
[ "$verbose" = "yes" ] && echo "chmod $mode $targets"
chmod $mode $targets
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,43 @@
#!@KSH@
#
# $Id$
#
# Make a directory write protected
# Used to write protect the install point after a build
# to prevent inadvertant overwriting.
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
lock_directory() {
l_dir=$1/. # get any symlink out of the way using '.'
if [ -d $l_dir ]
then
find $l_dir -type d -perm -0200 -print | $XARGS chmod -w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
lock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,73 @@
#!@KSH@ -p
#
# $Id$
#
# Delete all files from the current directory that can be recreated
# via RCS 'co' commonds
# Used by 'make clobber'
#
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -v ]"
fatal() {
if [ "$1" ]
then
echo $* >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# process the options
#
verbose=""
while getopts v OPT
do
case "$OPT" in
v)
verbose="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
[ "$args" ] && fatal
[ -d RCS/. ] || exit 0
# there is probably a better way to do this
rcs_files=`echo RCS/*,v | sed -e 's?RCS/??g' -e's/,v//g'`
kills=""
for f in $rcs_files
do
# build list of all files in RCS/*,v that are *not* locked
if [ -f $f ] && [ ! -w $f ] && [ -f RCS/$f,v ]
then
locked=`rlog -L -R $f`
[ "$locked" = "" ] && kills="$kills $f"
fi
done
if [ "$kills" ]
then
[ "$verbose" ] && echo rm -f $kills
rm -f $kills
fi
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,41 @@
#!@KSH@
#
# $Id$
#
# Unlock a directory processed by lock_directory
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
unlock_directory() {
ul_dir=$1/. # get any symlink out of the way using '.'
if [ -d $ul_dir ]
then
find $ul_dir -type d ! -perm -0222 -print | $XARGS -t chmod +w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
unlock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,41 @@
#!@KSH@
#
# $Id$
#
# Unlock a directory processed by lock_directory
#
# is a particular command available on this machine?
#
cmd_avail()
{
set -- `type $1 2>&1`
if [ "$2" = "not" -a "$3" = "found" ] || [ "$3" = "not" -a "$4" = "found" ]
then
return 1
else
return 0
fi
}
unlock_directory() {
ul_dir=$1/. # get any symlink out of the way using '.'
if [ -d $ul_dir ]
then
find $ul_dir -type d ! -perm -0222 -print | $XARGS -t chmod +w
fi
}
# Use gnu xargs if available; faster, more reliable in general
XARGS=xargs
cmd_avail gxargs && XARGS=gxargs
for dir
do
unlock_directory $dir
done
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -14,20 +14,23 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/bin
PGMS=size_rtems
BUILD_PGMS=size_rtems
PGMS=$(BUILD_PGMS)
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
# Install the program
$(DESTDIR)/%: %
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $@
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -10,17 +10,23 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/tests
PGMS=runtest
BUILD_PGMS = runtest
PGMS = $(BUILD_PGMS)
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
install: $(INSTALLED)
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
# Install the program
$(DESTDIR)/%: %
$(make-script)
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -0,0 +1,307 @@
#!@KSH@ -p
#
# $Id$
#
# Run rtems tests on the hppa simulator
# This program generates a simulator script to run each test
# Typically the test is then run, although it can be generated
# and left as a file using -s
#
# progname=`basename $0`
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -opts ] test [ test ... ]
-o options -- specify options to be passed to simulator
-v -- verbose
-s -- generate script file (as 'test'.ss) and exit
-l logdir -- specify log directory (default is 'logdir')
Specify test as 'test' or 'test.exe'.
All multiprocessing tests *must* be specified simply as 'mp01', etc.
"
# export everything
set -a
# log an error to stderr
prerr()
{
echo "$*" >&2
}
fatal() {
[ "$1" ] && prerr $*
prerr "$USAGE"
exit 1
}
warn() {
[ "$1" ] && prerr $*
}
# print args, 1 per line
ml_echo()
{
for l
do
echo "$l"
done
}
# run at normal and signalled exit
test_exit()
{
exit_code=$1
rm -f ${statfile}* ${scriptfile}* ${logfile}.tmp*
[ "$sim_pid" ] && kill -9 $sim_pid
exit $exit_code
}
#
# process the options
#
# defaults for getopt vars
#
# max_run_time is defaulted to 5 minutes
#
verbose=""
extra_options=""
script_and_exit=""
stdio_setup="yes"
run_to_completion="yes"
logdir=log
update_on_tick="no"
max_run_time=$((5 * 60))
using_print_buffer="yes"
while getopts vhr12o:c:sl:t OPT
do
case "$OPT" in
v)
verbose="yes";;
s)
script_and_exit="yes"
run_to_completion="no"
stdio_setup="no";;
l)
logdir="$OPTARG";;
o)
extra_options="$OPTARG";;
*)
fatal;;
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
#
# Run the tests
#
tests="$args"
if [ ! "$tests" ]
then
set -- `echo *.exe`
tests="$*"
fi
[ -d $logdir ] ||
mkdir $logdir || fatal "could not create log directory ($logdir)"
cpus=1
# where the tmp files go
statfile=/tmp/stats$$
scriptfile=/tmp/script$$
trap "test_exit" 1 2 3 13 14 15
for tfile in $tests
do
tname=`basename $tfile .exe`
TEST_TYPE="single"
case $tname in
monitor)
if [ $run_to_completion = "yes" ]
then
warn "Skipping $tname; it is interactive"
continue
fi
;;
*-node2*)
fatal "MP tests not supported"
warn "Skipping $tname; 'runtest' runs both nodes when for *-node1"
continue;;
*-node1*)
fatal "MP tests not supported"
warn "Running both nodes associated with $tname"
tname=`echo $tname | sed 's/-node.*//'`
TEST_TYPE="mp"
;;
stackchk*|spfatal*|malloctest*|termio*)
warn "Skipping $tname; it locks up or takes a VERY long time to run"
continue
;;
esac
# Change the title bar to indicate which test we are running
# The simulator screen doesn't provide any indication
logfile=$logdir/$tname
infofile=$logfile.info
rm -f ${statfile}* ${scriptfile}* ${logfile}.tmp*
date=`date`
echo "Starting $tname at $date"
# Generate a script file to get the work done.
# The script file must do the following:
#
# load the program (programs if MP test)
# arrange for capture of output
# run the program
# produce statistics
{
case $TEST_TYPE in
"mp")
fatal "MP tests not supported"
;;
# All other tests (single-processor)
*)
echo "load $tfile"
echo "go 0x02000000"
echo "perf"
echo "quit"
;;
esac
} > ${scriptfile}
if [ "$script_and_exit" = "yes" ]
then
mv ${scriptfile} $tname.ss
warn "script left in $tname.ss"
test_exit 0
fi
# Spin off the simulator in the background
sparc-rtems-sis $extra_options -c ${scriptfile} >${logfile}.tmp &
sim_pid=$!
# Make sure it won't run forever...
{
time_run=0
while [ $time_run -lt $max_run_time ]
do
# sleep 10s at a time waiting for job to finish or timer to expire
# if job has exited, then we exit, too.
sleep 10
if kill -0 $sim_pid 2>/dev/null
then
time_run=$((time_run + 10))
else
exit 0
fi
done
kill -2 $sim_pid 2>/dev/null
{ sleep 5; kill -9 $sim_pid 2>/dev/null; } &
} &
wait $sim_pid
status=$?
if [ $status -ne 0 ]
then
ran_too_long="yes"
else
ran_too_long="no"
fi
sim_pid=""
# fix up the printf output from the test
case $TEST_TYPE in
mp)
fatal "MP not supported"
;;
*)
output_it=1
sed -e '1,12d' \
-e 's/
//' -e '/^$/d' < ${logfile}.tmp |
while read line
do
if [ $output_it -eq 1 ] ; then
if [ "$line" = "sis> perf" ] ; then
output_it=0
else
echo "$line"
fi
fi
done > ${logfile}_1
;;
esac
# Create the info files
for cpu in $cpus
do
{
echo "$date"
echo "Test run on: `uname -n` ( `uname -a` )"
output_it=0
sed -e 's/
//' < ${logfile}.tmp |
while read line
do
if [ $output_it -eq 1 ] ; then
if [ "$line" = "sis> quit" ] ; then
output_it=0
else
echo "$line"
fi
else
if [ "$line" = "sis> perf" ] ; then
output_it=1
fi
fi
done
if [ "$ran_too_long" = "yes" ]
then
echo "Test did NOT finish normally; killed after $max_run_time seconds"
fi
echo
date;
} > ${infofile}_$cpu
done
rm -f ${logfile}.tmp*
if [ "$cpus" = "1" ]
then
mv ${infofile}_1 ${infofile}
mv ${logfile}_1 ${logfile}
fi
done
test_exit 0
# Local Variables: ***
# mode:ksh ***

View File

@@ -10,22 +10,28 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/tests
# We use the generic difftest
PGMS=runtest looptest semdump shmdump
BUILD_PGMS=runtest looptest
ifneq (@PERL@,)
BUILD_PGMS+=semdump shmdump
endif
INSTALLED=$(PGMS:%=$(DESTDIR)/%)
PGMS = $(BUILD_PGMS)
CLEAN_ADDITIONS += $(BUILD_PGMS)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
all: $(DESTDIR) $(PGMS) install
install: $(INSTALLED)
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
# Install the program, replacing #!KSHELL with $(KSH)
# and first line #!SHELL with $(SHELL)
$(DESTDIR)/%: %
-$(RM) $@.old
-$(MV) $@ $@.old >/dev/null 2>&1
$(SED) -e '1,1s?^#!KSHELL?#!$(KSH)?' -e '1,1s?^#!SHELL?#!$(SHELL)?' < $< > $@
$(CHMOD) 0555 $@
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
install: $(DESTDIR) $(INSTALLED_PGMS)

View File

@@ -0,0 +1,93 @@
#!@KSH@ -p
#
# $Id$
#
# progname=`basename $0`
progname=${0##*/} # fast basename hack for ksh, bash
# must be uppercase hex; dc is feeble minded
clicks_per_tick="1"
# default is 0x3
hexbump=1
iterations=10
USAGE=\
"usage: $progname [ -opts ] file [ file ... ]
-o options -- specify options to be passed to runtest
-c clicks -- specify (hex) value for clicks / tick (default $clicks_per_tick)
-n iterations -- num times to loop thru specified tests (default $iterations)
-b hexbump -- increment clicks-per-ticks this much each loop (default $hexbump)
-v -- verbose"
# log an error to stderr
prerr()
{
echo "$*" >&2
}
fatal() {
[ "$1" ] && prerr $*
prerr "$USAGE"
exit 1
}
warn() {
[ "$1" ] && prerr $*
}
#
# process the options
#
# defaults for getopt vars
#
verbose=""
extra_options=""
while getopts vo:c:n:b: OPT
do
case "$OPT" in
v)
verbose="yes";;
o)
extra_options="$OPTARG";;
c)
clicks_per_ticks="$OPTARG";;
n)
iterations="$OPTARG";;
b)
hexbump="$OPTARG";;
*)
fatal;;
esac
done
((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
#
# Run the tests
# After each run, rename 'log' to log.$clicks_per_tick
#
tests="$args"
while [ $iterations -gt 0 ]
do
./runtest $extra_options -c $clicks_per_tick $tests
rm -rf log.$clicks_per_tick.OLD
[ -d log.$clicks_per_tick ] && mv log.$clicks_per_tick log.$clicks_per_tick.OLD
mv log log.$clicks_per_tick
((iterations = $iterations - 1))
clicks_per_tick=`echo 16 o 16 i $clicks_per_tick $hexbump + p q | dc`
done
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,255 @@
#!@KSH@ -p
#
# Run rtems tests on a POSIX-ish UNIX
#
# $Id$
#
trap "test_exit 1" 1 2 3 13 14 15
trap "test_exit 1" 1 2 3 13 14 15
# progname=`basename $0`
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"usage: $progname [ -opts ] test [ test ... ]
-c clicks -- specify (hex) value for clicks / tick
-v -- verbose
-l logdir -- specify log directory (default is 'logdir')
Specify test as 'test' or 'test.exe'.
All multiprocessing tests *must* be specified simply as 'mp01', etc.
"
# export everything
set -a
# log an error to stderr
prerr()
{
echo "$*" >&2
}
fatal() {
[ "$1" ] && prerr $*
prerr "$USAGE"
exit 1
}
warn() {
[ "$1" ] && prerr $*
}
# print args, 1 per line
ml_echo()
{
for l
do
echo "$l"
done
}
killem()
{
kill -9 $pid $pid1 $pid2 2> /dev/null
}
killem()
{
kill -9 $pid $pid1 $pid2 2> /dev/null
}
test_exit()
{
exit_code=$1
killem
killem
rm -f ${logfile}.tmp*
exit $exit_code
}
#
# process the options
#
# defaults for getopt vars
#
verbose=""
extra_options=""
clicks_per_tick=""
logdir=log
# how long can we run; rtems tests might run 300 seconds
max_run_time=400
run_to_completion="yes"
while getopts vo:c:l: OPT
do
case "$OPT" in
v)
verbose="yes";;
l)
logdir="$OPTARG";;
o)
extra_options="$OPTARG";;
c)
clicks_per_tick="$OPTARG";;
*)
fatal;;
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
#
# Run the tests
#
tests="$args"
if [ ! "$tests" ]
then
set -- `echo *.exe`
tests="$*"
fi
[ -d $logdir ] || mkdir $logdir || fatal "could not create log directory ($logdir)"
for tfile in $tests
do
tname=`echo $tfile | sed -e 's/\.exe$//'`
tname=`basename $tname`
TEST_TYPE="single"
case $tname in
monitor)
if [ $run_to_completion = "yes" ]
then
warn "Skipping $tname; it is interactive"
continue
fi
;;
*-node2*)
warn "Skipping $tname; 'runtest' runs both nodes when for *-node1"
continue;;
*-node1*)
tname=`echo $tname | sed 's/-node.*//'`
warn "Running both nodes associated with $tname"
TEST_TYPE="mp"
;;
stackchk*|spfatal*|malloctest*|termio*)
warn "Skipping $tname; it locks up or takes a VERY long time to run"
continue
;;
esac
if [ $TEST_TYPE = "mp" ]
then
logfile1=$logdir/${tname}_1
infofile1=$logfile1.info
logfile2=$logdir/${tname}_2
infofile2=$logfile2.info
rm -f ${logfile1}
rm -f ${logfile2}
date=`date`
echo "Starting $tname at $date"
./${tname}-node1.exe > $logfile1 2>&1 &
pid1=$!
./${tname}-node2.exe > $logfile2 2>&1 &
pid2=$!
# Wait for both cpu's to complete, ensuring they don't run forever...
time_run=0
while [ $time_run -lt $max_run_time ]
do
# sleep 5s at a time waiting for jobs to finish or timer to expire
# if job has exited, then we exit, too.
sleep 5
kill -0 $pid1 2> /dev/null
running1=$?
kill -0 $pid2 2> /dev/null
running2=$?
if [ $running1 -eq 0 ] && [ $running2 -eq 0 ] # both still running
then
time_run=$((time_run + 5))
if [ $time_run -ge $max_run_time ]
then
echo "$tname ran too long; killing it"
ran_too_long="yes"
fi
else
ran_too_long="no"
# if one is still running, have to kill them
if [ $running1 -ne $running2 ]
then
sleep 10 # give other node a chance to gracefully die
fi
break
fi
done
# make sure they are gone
kill -9 $pid1 2> /dev/null
kill -9 $pid2 2> /dev/null
fi
if [ $TEST_TYPE = "single" ]
then
logfile=$logdir/$tname
infofile=$logfile.info
rm -f ${logfile}
date=`date`
echo "Starting $tname.exe at $date"
./$tname.exe > $logfile 2>&1 &
pid=$!
# Make sure it won't run forever...
time_run=0
while [ $time_run -lt $max_run_time ]
do
# sleep 5s at a time waiting for job to finish or timer to expire
# if job has exited, then we exit, too.
sleep 5
kill -0 $pid 2> /dev/null
running=$?
if [ $running -eq 0 ]
then
time_run=$((time_run + 5))
if [ $time_run -ge $max_run_time ]
then
kill -9 $pid 2> /dev/null
ran_too_long="yes"
fi
else
ran_too_long="no"
break
fi
done
fi
pid=""
done
test_exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,59 @@
#!@PERL@
#
# $Id$
#
eval "exec @PERL@ -S $0 $*"
if $running_under_some_shell;
# dump semaphore array values tony@divnc.com
require 'sys/sem.ph';
require 'getopts.pl';
&Getopts("vhi:k:"); # verbose, help, id, key
if ($opt_h || ($opt_i && $opt_k))
{
print STDERR <<NO_MORE_HELP;
semdump
Dump info about specified semaphore.
Usage: $0 [-v] { -i semid | -k semkey }
-v -- possibly more verbose
-i semid -- semaphore id
-k semkey -- semaphore key
-h -- help
anything else == this help message
NO_MORE_HELP
exit 1;
}
$verbose = $opt_v;
$id = $opt_i;
$key = $opt_k;
if ($key)
{
$key = oct($key) if $key =~ /^0/;
die "Could not convert key to id; $!" unless $id = semget($key, 1, 0);
}
# I don't know to find out how many sem's are attached to the id
# so just keep reading them until we get an error.
printf("KEY: 0x%X (%d) ", $key, $key) if $key;
print "ID: $id\n";
semlist:
for ($semnum=0; $semnum < 10; $semnum++)
{
$val = semctl($id, $semnum, &GETVAL, 0);
$val || ($val = -1);
last semlist if ($val == -1);
printf " %d: %d\n", $semnum, $val;
}

View File

@@ -0,0 +1,134 @@
#!@PERL@
#
# $Id$
#
eval "exec @PERL@ -S $0 $*"
if $running_under_some_shell;
# dump shared memory segment tony@divnc.com
require 'sys/shm.ph';
require 'getopts.pl';
&Getopts("vhi:k:f:l:b:w"); # verbose, help, id, key, first, length, word, base
if ($opt_h || ($opt_i && $opt_k))
{
print STDERR <<NO_MORE_HELP;
shmdump
Dump contents of specifed shared memory segment.
Usage: $0 [options]
-h -- help
-v -- possibly more verbose
-i shmid -- shm id
-k shmkey -- shm key
-f first -- start of partial dump
-l length -- length of partial dump
-w -- dump as 4byte words instead of bytes
-b base -- use 'base' as base address for output
anything else == this help message
NO_MORE_HELP
exit 1;
}
$verbose = $opt_v;
$id = $opt_i;
$key = $opt_k;
$offset = $opt_f;
$print_length = $opt_l;
$base = $opt_b;
$word_dump = $opt_w;
if ($key)
{
# ensure key is an integer
$key = oct($key) if $key =~ /^0/;
die "Could not convert key to id; $!" unless $id = shmget($key, 1, 0);
}
# ensure integerhood in case of leading '0x'
$base = oct($base) if $base =~ /^0/;
$offset = oct($offset) if $offset =~ /^0/;
$print_length = oct($print_length) if $print_length =~ /^0/;
if ( ! shmctl($id, &IPC_STAT, $shmid_ds))
{
die "shmctl(2) for id $id failed -- (I was trying to get size): $!";
}
# Pick the length out.
# It is at byte offset 0x30 on hpux9 and probably hpux10
# Also get the key if we don't have it already. Don't need it tho...
$length = unpack("I", substr($shmid_ds, 0x30, 4));
$key = unpack("I", substr($shmid_ds, 0x14, 4)) if ! $key;
# poke around looking for length and key
# print "I guess: length: $length, key: $key\n";
# print "****$shmid_ds****\n"; die "";
# make sure offset and print length make sense
$print_length = $length if ! $print_length;
if (($offset + $print_length) > $length)
{
die "offset ($offset) and length ($print_length) go beyond end of segment ($length bytes)";
}
printf("KEY: 0x%X (%d) ", $key, $key) if ($key);
printf "ID: $id\n";
printf " %d bytes (0x%X), %d words, logical base is 0x%X\n",
$length, $length, $length / 4, $base;
if ($offset || ($print_length != $length))
{
printf " printing %X (%d) bytes starting at offset 0x%X (%d)\n",
$print_length, $print_length, $offset, $offset;
}
printf "\n";
if ( ! shmread($id, $shm_data, $offset, $print_length))
{
die "could not attach and read from shmid $id: $!";
}
# the dump code below derived from "Real Perl Programs" example "xdump"
# from Camel book
$base += $offset;
$offset = 0;
for ($len = $print_length; $len >= 16; )
{
$data = substr($shm_data, $offset, 16);
@array = unpack('N4', $data);
$data =~ tr/\0-\37\177-\377/./;
printf "%8.8lX %8.8lX %8.8lX %8.8lX %8.8lX |%s|\n",
$base, @array, $data;
$offset += 16;
$base += 16;
$len -= 16;
}
# Now finish up the end a byte at a time
if ($len)
{
$data = substr($shm_data, $offset, $len);
@array = unpack('C*', $data);
for (@array)
{
$_ = sprintf('%2.2X', $_);
}
push(@array, ' ') while $len++ < 16;
$data =~ tr/\0-\37\177-\377/./;
$data =~ s/[^ -~]/./g;
printf "%8.8lX ", $base;
printf "%s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s |%-16s|\n",
@array, $data;
}

View File

@@ -1,9 +1,6 @@
#
# $Id$
#
# NOTE: of course we can't use any of these tools
# in this Makefile. Most notably: install-if-change
#
@SET_MAKE@
srcdir = @srcdir@
@@ -13,26 +10,34 @@ PROJECT_ROOT = @PROJECT_ROOT@
include $(RTEMS_ROOT)/make/custom/$(RTEMS_BSP).cfg
include $(RTEMS_ROOT)/make/leaf.cfg
include $(RTEMS_ROOT)/make/rtems.cfg
DESTDIR=$(PROJECT_RELEASE)/update-tools
PGMS=update word-replace
BUILD_PGMS = update
ifneq (@PERL@,)
BUILD_PGMS += word-replace
endif
PGMS = $(BUILD_PGMS)
CLEAN_ADDITIONS += $(BUILD_PGMS)
MISC_SUPPORT=310_to_320_list
INSTALL_LIST= $(PGMS) $(MISC_SUPPORT)
INSTALLED_PGMS=$(PGMS:%=$(DESTDIR)/%)
INSTALLED_DATA=$(MISC_SUPPORT:%=$(DESTDIR)/%)
INSTALLED=$(INSTALL_LIST:%=$(DESTDIR)/%)
all: $(DESTDIR)
all: $(PGMS)
$(DESTDIR):
@INSTALL@ $(INSTDIRFLAGS) $@
install: $(INSTALLED)
$(INSTALLED_PGMS): $(PGMS)
@INSTALL@ $(INSTBINFLAGS) $^ $(DESTDIR)
$(INSTALLED_DATA): $(MISC_SUPPORT)
@INSTALL@ $(INSTDATAFLAGS) $^ $(DESTDIR)
install: $(DESTDIR) $(INSTALLED_PGMS) $(INSTALLED_DATA)
# Install the program
# FIXME: This isn't correct
$(DESTDIR)/%: %
$(make-script)
@INSTALL@ $(INSTBINFLAGS) $(PERL_PGMS) ${DESTDIR}
@INSTALL@ $(INSTDATAFLAGS) $(MISC_SUPPORT) ${DESTDIR}

216
c/update-tools/update.in Normal file
View File

@@ -0,0 +1,216 @@
#!@KSH@ -p
#
# $Id$
#
# Either bash or ksh will be ok for this; requires 'test -ot'
# (-p above just says to not parse $ENV file; makes it faster for
# those of us who set $ENV)
#
# Update RTEMS applications for the API changes from 3.1.0 to 3.2.0
#
# NOTE
#
# This is potentially a very dangerous program.
# progname=`basename $0`
progname=${0##*/} # fast basename hack for ksh, bash
USAGE=\
"
usage: $progname [ -vs ] [ -b base_directory ] [-p file] [-f] [files...]
-v -- verbose
-p -- file with replacement instructions
-s -- skip prompt for backup verification
-f -- do files at end of line
base_directory is the root directory of the source code to update. It
defaults to the current directory.
This program updates C, H, and .inl files.
"
fatal() {
if [ "$1" ]
then
echo >&2
echo $* >&2
echo >&2
fi
echo "$USAGE" 1>&2
exit 1
}
#
# KLUDGE to figure out at runtime how to echo a line without a
# newline.
#
count=`echo "\\c" | wc -c`
if [ ${count} -ne 0 ] ; then
EARG="-n"
EOL=""
else
EARG=""
EOL="\\c"
fi
#
# Function to make sure they do a backup
#
WARNING=\
"
*******************************************************************************
*******************************************************************************
*******************************************************************************
**** ****
**** WARNING!!! WARNING!!! WARNING!!! ****
**** ****
**** ALL SOURCE CODE SHOULD BE BACKED UP BEFORE RUNNING THIS PROGRAM!! ****
**** ****
**** WARNING!!! WARNING!!! WARNING!!! ****
**** ****
*******************************************************************************
*******************************************************************************
*******************************************************************************
"
verify_backup()
{
echo "$WARNING"
continue="yes"
while [ $continue = "yes" ]
do
echo ${EARG} "Do you wish to update the source tree at this time [y|n]? " ${EOL}
read answer
case $answer in
[yY]*)
continue="no"
;;
[nN]*)
echo
echo "Exitting at user request"
echo
exit 0
;;
esac
done
}
#
# Default tools to use...
#
# NOTE: The GNU versions of both of these are faster.
#
find_prog=find
xargs_prog=xargs
#
# process the options
#
verbose=""
suffix=""
mode=""
base_directory=.
do_files="no"
do_prompt="yes"
replacement_file="${RTEMS_ROOT}/update-tools/310_to_320_list"
while getopts sfp:b:v OPT
do
case "$OPT" in
v)
verbose="yes";;
s)
do_prompt="no";;
b)
base_directory=${OPTARG};;
p)
replacement_file=${OPTARG};;
f)
do_files="yes";;
*)
fatal
esac
done
let $((shiftcount = $OPTIND - 1))
shift $shiftcount
args=$*
#
# Make sure they have done a backup
#
if [ ${do_prompt} = "yes" ]
then
verify_backup
fi
#
# Validate the base directory
#
if [ ! -d $base_directory ]
then
fatal "${base_directory} does not exist"
fi
#
# Validate the replacement file
#
if [ ! -r $replacement_file ]
then
fatal "${replacement_file} does not exist or is not readable"
fi
#
# Verify enough of the RTEMS environment variables are set
#
if [ ! -d "${RTEMS_ROOT}" ]
then
fatal "RTEMS_ROOT environment variable is not initialized"
fi
#
# Update the files
#
generate_list()
{
if [ ${do_files} = "yes" ]
then
for i in $args
do
echo $i
done
else
${find_prog} ${base_directory} \( -name "*.[ch]" -o -name "*.inl" \) -print
fi
}
generate_list | ${xargs_prog} |
while read line
do
${RTEMS_ROOT}/update-tools/word-replace -p ${replacement_file} ${line}
if [ $? -ne 0 ]
then
exit 1
fi
for file in ${line}
do
mv ${file}.fixed ${file}
done
done
exit 0
# Local Variables: ***
# mode:ksh ***
# End: ***

View File

@@ -0,0 +1,89 @@
#!@PERL@
#
# $Id$
#
eval "exec @PERL@ -S $0 $*"
if $running_under_some_shell;
require 'getopts.pl';
&Getopts("p:vh"); # help, pattern file, verbose,
if ($opt_h || ! $opt_p) {
print STDERR <<NO_MORE_HELP;
word-replace
Replace *words* with patterns. Pattern file specifies which patterns
to replace on each line. All patterns are wrapped with perl \\b regexp
specifiers.
Usage: $0 [-v] -p pattern-file files to replace
-v -- possibly more verbose
-p file -- pattern file
-h -- help
anything else == this help message
Pattern file looks like this:
# Example:
# ignores all lines with beginning with # or not exactly 2 fields
_Dorky_Name rtems_dorky_name # comments, and blank lines are cool
_Dorky_Name2 rtems_dorky_name2 # comments, and blank lines are cool
NO_MORE_HELP
exit 0;
}
$verbose = $opt_v;
$pattern_file = $opt_p;
# make standard outputs unbuffered (so the '.'s come out ok)
$oldfh = select(STDERR); $| = 1; select($oldfh);
$oldfh = select(STDOUT); $| = 1; select($oldfh);
# pull in the patterns
open(PATTERNS, "<$pattern_file") ||
die "could not open $pattern_file: $!, crapped out at";
foreach (<PATTERNS>)
{
chop;
s/#.*//;
next if /^$/;
($orig, $new, $junk, @rest) = split;
next if ( ! $orig || ! $new || $junk); # <2 or >2 patterns
die "pattern appears 2x: '$orig' in '$pattern_file'--" if defined($patterns{$orig});
$patterns{$orig} = $new;
}
close PATTERNS;
# walk thru each line in each file
foreach $file (@ARGV)
{
print "$file\t";
open (INFILE, "<$file") ||
die "could not open input file $file: $!";
$outfile = $file . ".fixed";;
open (OUTFILE, ">$outfile") ||
die "could not open output file $outfile: $!";
while (<INFILE>)
{
study; # maybe make s/// faster
foreach $key (keys %patterns)
{
if ( s/\b$key\b/$patterns{$key}/ge )
{
print ".";
}
}
print OUTFILE $_;
}
print "\n";
close INFILE;
close OUTFILE;
}