mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 23:04:20 +01:00
16bf6a601b
git-svn-id: file:///svn/toku/tokudb@27961 c7de825b-a66e-492c-adef-691d508d4ae1
377 lines
12 KiB
Bash
Executable file
377 lines
12 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# build.check.bash --revision=10500
|
|
# build.check.bash --tokudb=tokudb.1489 --revision=10500
|
|
# build.check.bash --branch=mysql.branches/1.1.3 --revision=10500
|
|
# build.check.bash --windows=1 --revision=10500
|
|
|
|
function usage() {
|
|
echo "build tokudb and run regressions"
|
|
echo "--windows=$dowindows (if yes/1 must be first option)"
|
|
echo "--branch=$branch"
|
|
echo "--tokudb=$tokudb"
|
|
echo "--revision=$revision"
|
|
echo "--bdb=$bdb"
|
|
echo "--valgrind=$dovalgrind"
|
|
echo "--commit=$docommit"
|
|
echo "--j=$makejobs"
|
|
echo "--deleteafter=$deleteafter"
|
|
echo "--doclean=$doclean"
|
|
}
|
|
|
|
function retry() {
|
|
local cmd
|
|
local retries
|
|
local exitcode
|
|
cmd=$*
|
|
let retries=0
|
|
while [ $retries -le 10 ] ; do
|
|
echo `date` $cmd
|
|
bash -c "$cmd"
|
|
exitcode=$?
|
|
echo `date` $cmd $exitcode $retries
|
|
let retries=retries+1
|
|
if [ $exitcode -eq 0 ] ; then break; fi
|
|
sleep 10
|
|
done
|
|
test $exitcode = 0
|
|
}
|
|
|
|
# delete some characters that cygwin and osx have trouble with
|
|
function sanitize() {
|
|
tr -d '[/:\\\\()]'
|
|
}
|
|
|
|
function mydate() {
|
|
date +"%Y%m%d %H:%M:%S"
|
|
}
|
|
|
|
function get_ncpus() {
|
|
grep bogomips /proc/cpuinfo | wc -l
|
|
}
|
|
|
|
function get_latest_svn_revision() {
|
|
local revision=0
|
|
local svntarget=$svnserver/$*
|
|
local latest=`retry svn info $svntarget`
|
|
if [[ $latest =~ "Last Changed Rev: ([0-9]+)" ]] ; then
|
|
revision=${BASH_REMATCH[1]}
|
|
fi
|
|
echo $revision
|
|
}
|
|
|
|
function make_tokudb_name() {
|
|
local tokudb_dir=$1
|
|
local tokudb=$2
|
|
if [ $tokudb_dir = "toku" ] ; then
|
|
echo $tokudb
|
|
else
|
|
echo `echo $tokudb_dir-$tokudb | tr / -`
|
|
fi
|
|
}
|
|
|
|
# run a command and trace its result
|
|
function runcmd() {
|
|
local fail=$1; shift
|
|
local makedir=$1; shift
|
|
local cmd=$*
|
|
|
|
echo `mydate` $makedir $cmd
|
|
pushd $makedir
|
|
$cmd
|
|
exitcode=$?
|
|
local dir=$makedir
|
|
if [[ $dir =~ "$HOME/svn.build/(.*)" ]] ; then
|
|
dir=${BASH_REMATCH[1]}
|
|
fi
|
|
if [ $fail -eq 0 ] ; then
|
|
if [ $exitcode -eq 0 ] ; then
|
|
result="PASS `mydate` $dir $cmd"
|
|
else
|
|
result="FAIL `mydate` $dir $cmd"
|
|
let nfail=nfail+1
|
|
fi
|
|
else
|
|
if [ $exitcode -eq 0 ] ; then
|
|
result="XPASS `mydate` $dir $cmd"
|
|
let nfail=nfail+1
|
|
else
|
|
result="XFAIL `mydate` $dir $cmd"
|
|
fi
|
|
fi
|
|
echo $result
|
|
echo $result >>$commit_msg
|
|
echo $result >>/tmp/tokubuild.trace
|
|
popd
|
|
}
|
|
|
|
# build a version of tokudb with a specific BDB target
|
|
function build() {
|
|
|
|
# setup build environment
|
|
export BDB=$1
|
|
if [[ $BDB =~ "(.*)\.(.*)" ]] ;then
|
|
export BDBMAJOR=${BASH_REMATCH[1]}
|
|
export BDBMINOR=${BASH_REMATCH[2]}
|
|
else
|
|
return 1
|
|
fi
|
|
if [ $dowindows -eq 0 ] ; then
|
|
export BDBDIR=/usr/local/BerkeleyDB.$BDB
|
|
else
|
|
export BDBDIR=c:/cygwin/usr/local/BerkeleyDB.$BDB
|
|
fi
|
|
if [ ! -d $BDBDIR ] ; then return 2; fi
|
|
|
|
tokudb_name=`make_tokudb_name $branch $tokudb`
|
|
export TOKUDB_NAME=$tokudb_name
|
|
export TOKUDB_REVISION=$revision
|
|
|
|
productname=$tokudb_name-$revision
|
|
checkout=$branch/$tokudb
|
|
|
|
latestrev=`get_latest_svn_revision $checkout`
|
|
if [ $latestrev -eq 0 ] ; then return 3; fi
|
|
|
|
commit_msg=`mktemp`
|
|
|
|
svnbase=~/svn.build
|
|
if [ ! -d $svnbase ] ; then mkdir $svnbase ; fi
|
|
|
|
# checkout the build dir
|
|
buildbase=$svnbase/tokudb.build
|
|
if [ ! -d $buildbase ] ; then
|
|
cd $svnbase
|
|
svn checkout -q $svnserver/tokudb.build
|
|
cd $buildbase
|
|
else
|
|
cd $buildbase
|
|
svn update -q
|
|
svn update -q $date # Could be a sparse directory
|
|
fi
|
|
|
|
# make the build directory, possibly on multiple machines simultaneously, there can be only one
|
|
builddir=$buildbase/$date
|
|
pushd $buildbase
|
|
while [ ! -d $date ] ; do
|
|
mkdir -p $date
|
|
svn add $date
|
|
svn commit $date -m ""
|
|
if [ $? -eq 0 ] ; then break ; fi
|
|
rm -rf $date
|
|
svn remove $date
|
|
svn update -q
|
|
svn update -q $date # Could be a sparse directory
|
|
done
|
|
popd
|
|
|
|
tracefile=$builddir/build+$productname-$BDB+$nodename+$system+$release+$arch
|
|
|
|
# get some config info
|
|
uname -a >>$tracefile 2>&1
|
|
cc -v >>$tracefile 2>&1
|
|
if [ -f /proc/version ] ; then
|
|
cat /proc/version >>$tracefile
|
|
fi
|
|
env >>$tracefile 2>&1
|
|
|
|
# checkout the source dir
|
|
productbuilddir=$svnbase/$productname
|
|
# cleanup
|
|
rm -rf $productbuilddir
|
|
mkdir -p $productbuilddir
|
|
|
|
let nfail=0
|
|
|
|
# checkout into $productbuilddir
|
|
runcmd 0 $productbuilddir retry svn checkout -q -r $revision $svnserver/$checkout . >>$tracefile 2>&1
|
|
|
|
# portability
|
|
runcmd 0 $productbuilddir/$oschoice make -k -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/$oschoice/tests make -k -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/$oschoice/tests make -k -j$makejobs check -s SUMMARIZE=1 >>$tracefile 2>&1
|
|
|
|
# newbrt
|
|
runcmd 0 $productbuilddir/newbrt make -k -j$makejobs checko2 >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/newbrt make -k -s -j$makejobs >>$tracefile 2>&1
|
|
if [ $dovalgrind -ne 0 ] ; then
|
|
runcmd 0 $productbuilddir/newbrt make -j$makejobs -k check -s SUMMARIZE=1 >>$tracefile 2>&1
|
|
else
|
|
runcmd 0 $productbuilddir/newbrt make -j$makejobs -k check -s SUMMARIZE=1 VGRIND="" >>$tracefile 2>&1
|
|
fi
|
|
|
|
# lock tree
|
|
runcmd 0 $productbuilddir/src/range_tree make -k -s -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src/lock_tree make -k -s -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src/range_tree/tests make -k -s -j$makejobs check SUMMARIZE=1 >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src/lock_tree/tests make -k -s -j$makejobs check SUMMARIZE=1 >>$tracefile 2>&1
|
|
|
|
# src
|
|
runcmd 0 $productbuilddir/src make -k -s -j$makejobs local >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/src make -k -j$makejobs check_globals >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src make -k -s -j$makejobs install >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src/tests make -k -s -j$makejobs >>$tracefile 2>&1
|
|
|
|
# utils
|
|
runcmd 0 $productbuilddir/utils make -k -s -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/utils make -k -s -j$makejobs check SUMMARIZE=1 >>$tracefile 2>&1
|
|
|
|
# src/tests
|
|
runcmd 0 $productbuilddir/src/tests make -j$makejobs -k -s check.bdb VGRIND="" BDB_SUPPRESSIONS="" SUMMARIZE=1 >>$tracefile 2>&1
|
|
if [ $dovalgrind -ne 0 ] ; then
|
|
runcmd 0 $productbuilddir/src/tests make -j$makejobs -k -s check.tdb SUMMARIZE=1 >>$tracefile 2>&1
|
|
else
|
|
runcmd 0 $productbuilddir/src/tests make -j$makejobs -k -s check.tdb VGRIND="" SUMMARIZE=1 >>$tracefile 2>&1
|
|
fi
|
|
|
|
# benchmark tests
|
|
runcmd 0 $productbuilddir/db-benchmark-test make -k -j$makejobs >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/db-benchmark-test make -j$makejobs -k check >>$tracefile 2>&1
|
|
|
|
# cxx
|
|
runcmd $dowindows $productbuilddir/cxx make -k -s >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/cxx make -k -s install >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/cxx/tests make -k -s check SUMMARIZE=1 >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/db-benchmark-test-cxx make -k -s >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/db-benchmark-test-cxx make -k -s check >>$tracefile 2>&1
|
|
|
|
# Makefile for release/examples is NOT ported to windows. Expect it to fail.
|
|
runcmd $dowindows $productbuilddir/release make -k setup >>$tracefile 2>&1
|
|
runcmd $dowindows $productbuilddir/release/examples make -k check >>$tracefile 2>&1
|
|
|
|
# man
|
|
if [ $dowindows -eq 0 ] ; then
|
|
runcmd 0 $productbuilddir/man/texi make -k -s -j$makejobs >>$tracefile 2>&1
|
|
else
|
|
# Don't use XFAIL because on cygwin man/texi just hangs
|
|
runcmd 0 $productbuilddir/man/texi echo SKIPPED make -k -s -j$makejobs >>$tracefile 2>&1
|
|
fi
|
|
|
|
# debug build
|
|
runcmd 0 $productbuilddir make -s clean >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir make -s -j$makejobs DEBUG=1 >>$tracefile 2>&1
|
|
|
|
# run the brtloader tests with a debug build
|
|
runcmd 0 $productbuilddir/newbrt/tests make check_brtloader -k -j$makejobs DEBUG=1 -s SUMMARIZE=1 >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/src/tests make loader-tests -k -j$makejobs DEBUG=1 -s SUMMARIZE=1 >>$tracefile 2>&1
|
|
|
|
if [ $dowindows -eq 0 ] ; then
|
|
# cilk debug build
|
|
runcmd 0 $productbuilddir make -s clean >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir/newbrt make -s DEBUG=1 BRTLOADER=cilk >>$tracefile 2>&1
|
|
|
|
# run the loader tests with cilkscreen
|
|
runcmd 0 $productbuilddir/newbrt/tests make cilkscreen_brtloader DEBUG=1 BRTLOADER=cilk -s SUMMARIZE=1 >>$tracefile 2>&1
|
|
fi
|
|
|
|
if [ $docoverage -eq 1 ] ; then
|
|
# run coverage
|
|
runcmd 0 $productbuilddir make -s clean >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir make build-coverage >>$tracefile 2>&1
|
|
runcmd 0 $productbuilddir make check-coverage >>$tracefile 2>&1
|
|
|
|
# summarize the coverage data
|
|
coveragefile=$builddir/coverage+$productname-$BDB+$nodename+$system+$release+$arch
|
|
rawcoverage=`mktemp`
|
|
for d in newbrt src src/range_tree src/lock_tree; do
|
|
(cd $productbuilddir/$d; python ~/bin/gcovsumdir.py -b *.gcno >>$rawcoverage)
|
|
if [ -d $productbuilddir/$d/tests ] ; then
|
|
(cd $productbuilddir/$d/tests; python ~/bin/gcovsumdir.py -b *.gcno >>$rawcoverage)
|
|
fi
|
|
done
|
|
python ~/bin/gcovsumsum.py <$rawcoverage >$coveragefile
|
|
rm $rawcoverage
|
|
fi
|
|
|
|
# put the trace into svn
|
|
if [ $docommit -ne 0 ] ; then
|
|
testresult="PASS"
|
|
if [ $nfail -ne 0 ] ; then testresult="FAIL"; fi
|
|
|
|
local cf=`mktemp`
|
|
echo "$testresult tokudb-build $productname-$BDB $system $release $arch $nodename" >$cf
|
|
echo >>$cf; echo >>$cf
|
|
cat $commit_msg >>$cf
|
|
|
|
svn add $tracefile $coveragefile
|
|
retry svn commit -F "$cf" $tracefile $coveragefile
|
|
rm $cf
|
|
else
|
|
cat $commit_msg
|
|
fi
|
|
rm $commit_msg
|
|
|
|
if [ $deleteafter -eq 1 ] ; then
|
|
rm -rfv $productbuilddir > /dev/null #windows rm sometimes hangs on giant dirs without -v
|
|
fi
|
|
}
|
|
|
|
# set defaults
|
|
exitcode=0
|
|
svnserver=https://svn.tokutek.com/tokudb
|
|
nodename=`uname -n`
|
|
system=`uname -s | sanitize`
|
|
release=`uname -r | sanitize`
|
|
arch=`uname -m | sanitize`
|
|
date=`date +%Y%m%d`
|
|
branch="."
|
|
tokudb="tokudb"
|
|
bdb="4.6"
|
|
makejobs=`get_ncpus`
|
|
revision=0
|
|
dovalgrind=1
|
|
docommit=1
|
|
docoverage=0
|
|
dowindows=0
|
|
oschoice=linux
|
|
deleteafter=0
|
|
j=-1
|
|
|
|
arg=$1;
|
|
shopt -s compat31 #Necessary in some flavors of linux and windows
|
|
if [ "$arg" = "--windows=yes" -o "$arg" = "--windows=1" ] ; then
|
|
shift
|
|
dowindows=1
|
|
export CC=icc
|
|
export CXX=icc
|
|
export CYGWIN=CYGWIN
|
|
oschoice=windows
|
|
fi
|
|
|
|
# setup default compiler
|
|
if [ "$CC" = "" ] ; then export CC=gcc; fi
|
|
if [ "$CXX" = "" ] ; then export CXX=g++; fi
|
|
|
|
# import the environment
|
|
while [ $# -gt 0 ] ; do
|
|
arg=$1; shift
|
|
if [ "$arg" = "--valgrind=no" -o "$arg" = "--valgrind=0" ] ; then
|
|
dovalgrind=0
|
|
elif [ "$arg" = "--commit=no" -o "$arg" = "--commit=0" ] ; then
|
|
docommit=0
|
|
elif [ "$arg" = "--windows=no" -o "$arg" = "--windows=0" ] ; then
|
|
dowindows=0
|
|
elif [ "$arg" = "--windows=yes" -o "$arg" = "--windows=1" ] ; then
|
|
usage; exit 1
|
|
elif [ $arg = "--gcc44" ] ; then
|
|
export CC=gcc44
|
|
export CXX=g++44
|
|
elif [[ $arg =~ ^--(.*)=(.*) ]] ; then
|
|
eval ${BASH_REMATCH[1]}=${BASH_REMATCH[2]}
|
|
else
|
|
usage; exit 1
|
|
fi
|
|
done
|
|
|
|
if [ $j -ne "-1" ] ; then makejobs=$j; fi
|
|
if [ $makejobs -eq 0 ] ; then usage; exit 1; fi
|
|
|
|
if [ $branch = "." ] ; then branch="toku"; fi
|
|
if [ $revision -eq 0 ] ; then revision=`get_latest_svn_revision`; fi
|
|
|
|
# setup GCCVERSION
|
|
export GCCVERSION=`$CC --version|head -1|cut -f3 -d" "`
|
|
|
|
build $bdb
|
|
|
|
exit $exitcode
|