#!/bin/sh # # Copyright (C) 2010, Cisco Systems Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Garrett Cooper, January 2010 # # Temporary directory setup. # # $TMPDIR - base temporary directory; see mktemp(1) for more details. setup_env() { testscript_dir=$(readlink -f "${0%/*}") abspath=$(readlink -f "$testscript_dir/../../scripts/abspath.sh") unset vars for i in tmp_builddir tmp_destdir tmp_prefix tmp_srcdir; do eval "if $i=\$(mktemp -d) ; then vars=\"\$vars \$${i}\"; else echo ${0##*/}: failed to create temporary directory for $i; false; fi" done trap cleanup EXIT cat < $tmp_builddir destdir -> $tmp_destdir prefix -> $tmp_prefix srcdir -> $tmp_srcdir ======================================== EOF } # Clean up the generated directories. # # $CLEAN_TEMPFILES - !1 -> don't clean. # - 1 -> clean. cleanup() { if [ "x${CLEAN_TEMPFILES:-0}" = x1 -a "x${TEST_PASSED:-0}" = x1 ] ; then cd / trap '' EXIT rm -Rf $vars fi } # Pull from CVS. cvs_pull() { export CVSROOT=${CVSROOT:-:pserver:anonymous@ltp.cvs.sf.net:/cvsroot/ltp} if ( [ -f ~/.cvspass ] || touch ~/.cvspass ) ; then echo "$CVSROOT" | grep -qv '^:pserver:' || cvs -d$CVSROOT login cvs -z3 export -f -r HEAD ltp && srcdir="$PWD/ltp" fi } # Pull from git. git_pull() { GIT_REPO=${GIT_REPO:-ltp-dev} git archive master \ --remote=git://ltp.git.sourceforge.net/gitroot/ltp/$GIT_REPO . | tar -xf - srcdir="$PWD" } # # Pull a fresh copy of the repository for building. # # 1 - pull method (currently only cvs is supported, but git may be supported # in the future). # 2 - source directory. # # $LTP_PATCH - -p0 based patch to apply after the pull is complete for # precommit testing. THE PATH TO THE PATCH MUST BE ABSOLUTE! # pull_scm() { cd "$2" && eval "${1}_pull" if [ "x$LTP_PATCH" != x ] ; then patch -p0 < "$LTP_PATCH" fi safe_rm="$srcdir/scripts/safe_rm.sh" } # Verify that clean is sane so peoples' rootfs' / host systems don't get # cleaned out by accident [sorry Mitani-san :(...]. # # 1 - source directory # 2 - build directory (where to deposit the files produced by configure). # 3 - the DESTDIR. clean_is_sane() { set +e; for i in distclean ac-maintainer-clean; do output=$(make ${2:+-C "$2"} \ ${1:+-f "$1/Makefile" "top_srcdir=$1"} \ ${2:+"top_builddir=$2"} \ ${MAKEFLAGS} \ DESTDIR="$4" \ RM="$safe_rm" $i) if echo "$output" | egrep 'ERROR : not removing .+ to avoid removing root directory'; then return $? fi done } # Configure a source tree for building. # # 1 - source directory # 2 - build directory (where to deposit the files produced by configure). # 3 - the argument to pass to --prefix. configure() { if [ "x$2" != x ] ; then test -d "$2" || mkdir -p "$2" fi make ${1:+-C "$1"} \ ${MAKEFLAGS} \ autotools if [ -d "${2:-}" ] ; then cd "$2" fi "${1:-.}/configure" ${3:+--prefix=$("$abspath" "$3")} } # Build a source tree. # # 1 - source directory # 2 - build directory # # $MAKEFLAGS - flags to pass directly to gmake(1). # build() { make ${2:+-C "$2"} \ ${1:+-f "$1/Makefile" "top_srcdir=$1"} \ ${2:+"top_builddir=$2"} \ ${MAKEFLAGS} \ all } # Install the binaries and scripts from a build tree. # # 1 - source directory # 2 - build directory # 3 - DESTDIR # # $MAKEFLAGS - flags to pass directly to gmake(1). # install_ltp() { make ${2:+-C "$2"} \ ${1:+-f "$1/Makefile" "top_srcdir=$1"} \ ${2:+"top_builddir=$2"} \ ${3:+"DESTDIR=$3"} \ ${MAKEFLAGS} \ install } # Run a test on the installed tree. # # 1 - install directory for tree, e.g. $(DESTDIR)/$(prefix) test_ltp() { installdir=$(readlink -f "${1:-.}") test_ltp="$installdir/test_ltp.sh" # XXX (garrcoop): I haven't tracked down the root cause for the # issue, but some versions of sed combined with some terminal # configurations cause sed to block waiting for EOF on certain # platforms when executing runltp. Thus, we should effectively close # /dev/stdin before executing runltp via execltp. cat < "$test_ltp" #!/bin/sh export AR="$AR" export ARFLAGS="$ARFLAGS" export CC="$CC" export CFLAGS="$CFLAGS" export CXX="$CXX" export CXXFLAGS="$CXXFLAGS" export LD="$LD" export LDFLAGS="$LDFLAGS" export NM="$NM" # Optional variables required for some of the testcases. for i in AR ARFLAGS CC CFLAGS CXX CXXFLAGS LD LDFLAGS NM; do eval "[ \"x\\\$\$i\" = x ] && unset \$i" done export LTPROOT="$LTPROOT" export PATH="\$PATH:$installdir/bin:$PATH" execltp -l "$installdir" -vv < /dev/null EOF pre_cmd= if [ "x$(id -ru)" != "x0" ] ; then # Make sure that environment is translated properly with sudo. if type sudo > /dev/null && sudo -- sh -c 'exit 0' ; then pre_cmd='sudo --' elif type su > /dev/null && groups | grep wheel ; then pre_cmd='su -c' fi if [ "x$pre_cmd" != x ] ; then echo "chown -Rf $(id -ru) \"$installdir\"" >> "$test_ltp" fi fi echo "${0##*/}: will execute test_ltp via ${pre_cmd:+$pre_cmd }$test_ltp" chmod +x "$test_ltp" # XXX (garrcoop): uncommenting the following would work around a # craptacular `bug' with libpam where it outputs the Password: prompt # to /dev/stdout instead of /dev/tty, but it also dumps all output from # runltp, etc to the console instead of a log -- therefore if you do # cat all output to a log, just tail -f it and enter in your password # when necessary. #${pre_cmd} "${test_ltp}" > /dev/tty 2>&1 && TEST_PASSED=1 ${pre_cmd} "${test_ltp}" && TEST_PASSED=1 } if [ "x$I_HAVE_READ_THE_README_WARNING" != x1 ] ; then echo 'WARNING: Read '${0%/*}'/README before executing this script ('${0##*/}')!' >&2 false fi set -x