mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-10 21:47:06 +00:00
287 lines
9.6 KiB
Bash
Executable File
287 lines
9.6 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Automated build and test for Valgrind. Compares Valgrind from 24 hours
|
|
# ago with the current one. See the README.txt on how to run it.
|
|
#----------------------------------------------------------------------------
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Helper functions
|
|
#----------------------------------------------------------------------------
|
|
|
|
# Returns the revision number for the source files at date $1 in Subversion
|
|
# repo $2. Note: the "--depth" command line argument is supported from
|
|
# Subversion version 1.5 on.
|
|
get_svn_revision() {
|
|
(
|
|
cd $DIR
|
|
rm -rf infodir
|
|
if ! svn co -r "{$1}" --depth empty "$2" infodir > /dev/null 2>&1; then
|
|
# Subversion 1.4 or before.
|
|
rm -rf infodir
|
|
svn co -r "{$1}" --non-recursive "$2" infodir > /dev/null
|
|
fi
|
|
svn info infodir | sed -n 's/^Revision: //p'
|
|
rm -rf infodir
|
|
)
|
|
}
|
|
|
|
runcmd () {
|
|
logfile=$1
|
|
str=$2
|
|
shift 2
|
|
|
|
# Header in short logfile.
|
|
# We use "printf" to avoid printing a newline; "echo -n" isn't POSIX and
|
|
# so isn't supported on all systems.
|
|
printf " $str ... " >> $logfile.short
|
|
|
|
# Header and command in verbose logfile
|
|
printf " $str ... " >> $logfile.verbose
|
|
echo "$*" >> $logfile.verbose
|
|
|
|
# Run the command
|
|
("${ABT_EVAL}" "$*") >> $logfile.verbose 2>&1
|
|
res=$?
|
|
|
|
# Write result to the short logfile
|
|
if [ $res = 0 ]
|
|
then
|
|
echo "done" >> $logfile.short
|
|
else
|
|
echo "failed" >> $logfile.short
|
|
fi
|
|
|
|
return $res
|
|
}
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Startup
|
|
#----------------------------------------------------------------------------
|
|
|
|
valgrind_svn_repo="svn://svn.valgrind.org/valgrind/trunk"
|
|
vex_svn_repo="svn://svn.valgrind.org/vex/trunk"
|
|
|
|
# Must have exactly two arguments
|
|
if [ $# -ne 2 ] ; then
|
|
echo "usage: $0 /path/to/valgrind/nightly <tag>"
|
|
exit 1
|
|
fi
|
|
|
|
# Get args from command line
|
|
DIR=$1
|
|
TAG=$2
|
|
|
|
# Get times and date
|
|
START=`date "+%F %H:%M:%S %Z"`
|
|
|
|
# This is one of the formats SVN accepts. Yes, the 'T' appears in the final
|
|
# string, it's supposed to be like that.
|
|
svn_date_format="+%Y-%m-%dT%H:%M:%S"
|
|
|
|
# The time-and-date from 24 hours ago is tricky; Linux and Darwin have
|
|
# different ways of getting it, so we try things until something works.
|
|
svn_old_date=
|
|
if [ "z" = "z${svn_old_date}" ] ; then
|
|
# Linux method.
|
|
svn_old_date=`date --date=yesterday $svn_date_format 2> /dev/null`
|
|
fi
|
|
if [ "z" = "z${svn_old_date}" ] ; then
|
|
# Darwin method.
|
|
svn_old_date=`date -v-24H $svn_date_format 2> /dev/null`
|
|
fi
|
|
if [ "z" = "z${svn_old_date}" ] ; then
|
|
echo "Sorry, can't work out the time and date for 24 hours ago, aborting"
|
|
exit 1;
|
|
fi
|
|
|
|
# The time-and-date for now is easy.
|
|
svn_new_date=`date $svn_date_format`
|
|
|
|
cd $DIR
|
|
|
|
# Clean up output files produced by a previous run.
|
|
rm -rf diffs diffs.txt diff.short final new.short new.verbose old.short old.verbose
|
|
rm -rf sendmail.log unchanged.log valgrind-old valgrind-new
|
|
|
|
# Setup any relevant environment variables from conf/<tag>.conf.
|
|
. conf/$TAG.conf
|
|
if [ "${ABT_JOBS}" = "" ]; then
|
|
ABT_JOBS=1
|
|
fi
|
|
if [ "${ABT_EVAL}" = "" ]; then
|
|
ABT_EVAL="eval"
|
|
fi
|
|
if [ "${ABT_RUN_REGTEST}" = "" ]; then
|
|
ABT_RUN_REGTEST="make regtest"
|
|
fi
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Check out, build, test
|
|
#----------------------------------------------------------------------------
|
|
|
|
vg_old_rev="`get_svn_revision ${svn_old_date} ${valgrind_svn_repo}`"
|
|
vg_new_rev="`get_svn_revision ${svn_new_date} ${valgrind_svn_repo}`"
|
|
vex_old_rev="`get_svn_revision ${svn_old_date} ${vex_svn_repo}`"
|
|
vex_new_rev="`get_svn_revision ${svn_new_date} ${vex_svn_repo}`"
|
|
if [ "${vg_old_rev}" = "${vg_new_rev}" -a "${vex_old_rev}" = "${vex_new_rev}" ]
|
|
then
|
|
echo "Both {$svn_old_date} and {$svn_new_date} correspond to Valgrind r${vg_new_rev} / VEX r${vex_new_rev}"\
|
|
"-- skipping nightly build." >unchanged.log
|
|
exit 0
|
|
fi
|
|
|
|
# Do everything twice -- once for the 24 hours old Valgrind, and once
|
|
# for the current one.
|
|
for logfile in old new ; do
|
|
|
|
# Remove old short and verbose log files, and start the new ones
|
|
for ext in short verbose ; do
|
|
echo > $logfile.$ext
|
|
done
|
|
|
|
# Choose the current Valgrind, or one from 24 hours ago
|
|
if [ $logfile = "old" ] ; then
|
|
svn_date=$svn_old_date
|
|
else
|
|
svn_date=$svn_new_date
|
|
fi
|
|
|
|
# Get dates for the old and new versions
|
|
|
|
# Check out, build, run tests
|
|
runcmd $logfile \
|
|
"Checking out valgrind source tree" \
|
|
"svn co ${valgrind_svn_repo} -r {$svn_date} valgrind-$logfile\
|
|
&& svn update -r {$svn_date} valgrind-$logfile/VEX" && \
|
|
\
|
|
runcmd $logfile \
|
|
"Configuring valgrind " \
|
|
"cd valgrind-$logfile && ./autogen.sh && ./configure --prefix=`pwd`/valgrind-$logfile/Inst ${ABT_CONFIGURE_OPTIONS}" && \
|
|
\
|
|
runcmd $logfile \
|
|
"Building valgrind " \
|
|
"cd valgrind-$logfile && make -j ${ABT_JOBS} && make -j ${ABT_JOBS} check && make install" && \
|
|
\
|
|
runcmd $logfile \
|
|
"Running regression tests " \
|
|
"cd valgrind-$logfile && ${ABT_RUN_REGTEST}"
|
|
|
|
# Grab some indicative text for the short log file -- if the regtests
|
|
# succeeded, show their results. If we didn't make it that far, show the
|
|
# last 20 lines.
|
|
egrep -q '^== [0-9]+ tests' $logfile.verbose && (
|
|
echo >> $logfile.short
|
|
echo "Regression test results follow" >> $logfile.short
|
|
echo >> $logfile.short
|
|
awk '/^== [0-9]+ tests/, /^$/ { print }' $logfile.verbose >> $logfile.short
|
|
) || (
|
|
echo >> $logfile.short
|
|
echo "Last 20 lines of verbose log follow" >> $logfile.short \
|
|
echo >> $logfile.short
|
|
tail -20 $logfile.verbose >> $logfile.short
|
|
)
|
|
done
|
|
|
|
#----------------------------------------------------------------------------
|
|
# Prepare results and send
|
|
#----------------------------------------------------------------------------
|
|
|
|
# Get times and date
|
|
END=`date "+%F %H:%M:%S %Z"`
|
|
|
|
# Gather some information about this run and its environment
|
|
valgrind_revision="`svn info valgrind-new | grep Revision | sed 's/Revision[ ]*:[ ]*//'`"
|
|
vex_revision="`svn info valgrind-new/VEX | grep Revision | sed 's/Revision[ ]*:[ ]*//'`"
|
|
gcc_version="`gcc --version 2> /dev/null | head -1`"
|
|
as_version="`as --version 2> /dev/null | head -1`"
|
|
libc_so="`ls -1 /lib/libc.so.* | tail -1`"
|
|
libc="unknown"
|
|
if [ "x$libc_so" != "x" ]; then
|
|
if [ -e "$libc_so" -a -r "$libc_so" ]; then
|
|
libc="`/lib/libc.so.* | head -1`"
|
|
fi
|
|
fi
|
|
libc=`echo $libc | sed "s/, by Roland.*//"`
|
|
uname_stuff="`uname -mrs`"
|
|
if [ -e "/etc/issue.net" -a -r "/etc/issue.net" ]; then
|
|
vendor_stuff="`cat /etc/issue.net | head -1`"
|
|
else
|
|
vendor_stuff="unknown"
|
|
fi
|
|
|
|
echo "valgrind revision: $valgrind_revision" > final
|
|
echo "VEX revision: $vex_revision" >> final
|
|
echo "C compiler: $gcc_version" >> final
|
|
echo "Assembler: $as_version" >> final
|
|
echo "C library: $libc" >> final
|
|
echo "uname -mrs: $uname_stuff" >> final
|
|
echo "Vendor version: $vendor_stuff" >> final
|
|
|
|
# 'final' shows the difference between the old and new results
|
|
echo >> final
|
|
echo "Nightly build on" $TAG "(" $ABT_DETAILS ")" >> final
|
|
echo "Started at" $START >> final
|
|
echo "Ended at" $END >> final
|
|
|
|
# If the results differ from 24 hours ago, print extra stuff.
|
|
diff -C1 old.short new.short > diff.short
|
|
changed=$?
|
|
|
|
if [ $changed != 0 ] ; then
|
|
echo "Results differ from 24 hours ago" >> final
|
|
changed_str=""
|
|
else
|
|
echo "Results unchanged from 24 hours ago" >> final
|
|
changed_str="(unchanged) "
|
|
fi
|
|
|
|
# Always show the current results.
|
|
cat new.short >> final
|
|
|
|
if [ $changed != 0 ] ; then
|
|
echo "=================================================" >> final
|
|
echo "== Results from 24 hours ago ==" >> final
|
|
echo "=================================================" >> final
|
|
cat old.short >> final
|
|
|
|
echo >> final
|
|
echo "=================================================" >> final
|
|
echo "== Difference between 24 hours ago and now ==" >> final
|
|
echo "=================================================" >> final
|
|
echo >> final
|
|
cat diff.short >> final
|
|
echo >> final
|
|
fi
|
|
|
|
# Gather up the diffs (at most the first 100 lines for each one) into a
|
|
# single file.
|
|
MAX_LINES=100
|
|
diff_files=`find . -name '*.diff*' | sort`
|
|
if [ z"$diff_files" = z ] ; then
|
|
echo "Congratulations, all tests passed!" >> diffs
|
|
else
|
|
for i in $diff_files ; do
|
|
echo "=================================================" >> diffs
|
|
echo $i >> diffs
|
|
echo "=================================================" >> diffs
|
|
if [ `wc -l < $i` -le $MAX_LINES ] ; then
|
|
cat $i >> diffs
|
|
else
|
|
head -n $MAX_LINES $i >> diffs
|
|
echo "<truncated beyond $MAX_LINES lines>" >> diffs
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Rename diffs into diffs.txt such that it can be viewed easily with an
|
|
# e-mail client.
|
|
mv diffs diffs.txt
|
|
|
|
# Use the conf/<tag>.sendmail script to email the results.
|
|
conf/$TAG.sendmail \
|
|
"$changed_str$START nightly build ($TAG, $ABT_DETAILS)" \
|
|
final \
|
|
diffs.txt > sendmail.log 2>&1
|