242 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
#
 | 
						|
# return values of this script are:
 | 
						|
#   0  success
 | 
						|
# 128  a test failed
 | 
						|
#  >0  the number of timed-out tests
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
if [ -f /proc/cpuinfo ]
 | 
						|
then
 | 
						|
  MAKE_JOBS=$(( ($(cat /proc/cpuinfo | grep -E '^processor[[:space:]]*:' | tail -n -1 | cut -d':' -f2) + 1) * 2 + 1 ))
 | 
						|
else
 | 
						|
  MAKE_JOBS=8
 | 
						|
fi
 | 
						|
 | 
						|
ret=0
 | 
						|
TEST_CFLAGS=""
 | 
						|
 | 
						|
_help()
 | 
						|
{
 | 
						|
  echo "Usage options for $(basename $0) [--with-cc=arg [other options]]"
 | 
						|
  echo
 | 
						|
  echo "Executing this script without any parameter will only run the default configuration"
 | 
						|
  echo "that has automatically been determined for the architecture you're running."
 | 
						|
  echo
 | 
						|
  echo "    --with-cc=*             The compiler(s) to use for the tests"
 | 
						|
  echo "        This is an option that will be iterated."
 | 
						|
  echo
 | 
						|
  echo "    --test-vs-mtest=*       Run test vs. mtest for '*' operations."
 | 
						|
  echo "        Only the first of each options will be taken into account."
 | 
						|
  echo
 | 
						|
  echo "To be able to specify options a compiler has to be given."
 | 
						|
  echo "All options will be tested with all MP_xBIT configurations."
 | 
						|
  echo
 | 
						|
  echo "    --with-{m64,m32,mx32}   The architecture(s) to build and test for,"
 | 
						|
  echo "                            e.g. --with-mx32."
 | 
						|
  echo "        This is an option that will be iterated, multiple selections are possible."
 | 
						|
  echo "        The mx32 architecture is not supported by clang and will not be executed."
 | 
						|
  echo
 | 
						|
  echo "    --cflags=*              Give an option to the compiler,"
 | 
						|
  echo "                            e.g. --cflags=-g"
 | 
						|
  echo "        This is an option that will always be passed as parameter to CC."
 | 
						|
  echo
 | 
						|
  echo "    --make-option=*         Give an option to make,"
 | 
						|
  echo "                            e.g. --make-option=\"-f makefile.shared\""
 | 
						|
  echo "        This is an option that will always be passed as parameter to make."
 | 
						|
  echo
 | 
						|
  echo "    --with-low-mp           Also build&run tests with -DMP_{8,16,32}BIT."
 | 
						|
  echo
 | 
						|
  echo "    --mtest-real-rand       Use real random data when running mtest."
 | 
						|
  echo
 | 
						|
  echo "Godmode:"
 | 
						|
  echo
 | 
						|
  echo "    --all                   Choose all architectures and gcc and clang as compilers"
 | 
						|
  echo
 | 
						|
  echo "    --help                  This message"
 | 
						|
  exit 0
 | 
						|
}
 | 
						|
 | 
						|
_die()
 | 
						|
{
 | 
						|
  echo "error $2 while $1"
 | 
						|
  if [ "$2" != "124" ]
 | 
						|
  then
 | 
						|
    exit 128
 | 
						|
  else
 | 
						|
    echo "assuming timeout while running test - continue"
 | 
						|
    ret=$(( $ret + 1 ))
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
_make()
 | 
						|
{
 | 
						|
  echo -ne " Compile $1 $2"
 | 
						|
  suffix=$(echo ${1}${2}  | tr ' ' '_')
 | 
						|
  CC="$1" CFLAGS="$2 $TEST_CFLAGS" make -j$MAKE_JOBS $3 $MAKE_OPTIONS > /dev/null 2>gcc_errors_${suffix}.log
 | 
						|
  errcnt=$(wc -l < gcc_errors_${suffix}.log)
 | 
						|
  if [[ ${errcnt} -gt 1 ]]; then
 | 
						|
    echo " failed"
 | 
						|
    cat gcc_errors_${suffix}.log
 | 
						|
    exit 128
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
_runtest()
 | 
						|
{
 | 
						|
  make clean > /dev/null
 | 
						|
  _make "$1" "$2" "test_standalone"
 | 
						|
  local _timeout=""
 | 
						|
  which timeout >/dev/null && _timeout="timeout --foreground 90"
 | 
						|
  echo -e "\rRun test $1 $2"
 | 
						|
  $_timeout ./test > test_${suffix}.log || _die "running tests" $?
 | 
						|
}
 | 
						|
 | 
						|
_banner()
 | 
						|
{
 | 
						|
  echo "uname="$(uname -a)
 | 
						|
  [[ "$#" != "0" ]] && (echo $1=$($1 -dumpversion)) || true
 | 
						|
}
 | 
						|
 | 
						|
_exit()
 | 
						|
{
 | 
						|
  if [ "$ret" == "0" ]
 | 
						|
  then
 | 
						|
    echo "Tests successful"
 | 
						|
  else
 | 
						|
    echo "$ret tests timed out"
 | 
						|
  fi
 | 
						|
 | 
						|
  exit $ret
 | 
						|
}
 | 
						|
 | 
						|
ARCHFLAGS=""
 | 
						|
COMPILERS=""
 | 
						|
CFLAGS=""
 | 
						|
WITH_LOW_MP=""
 | 
						|
TEST_VS_MTEST=""
 | 
						|
MTEST_RAND=""
 | 
						|
 | 
						|
while [ $# -gt 0 ];
 | 
						|
do
 | 
						|
  case $1 in
 | 
						|
    "--with-m64" | "--with-m32" | "--with-mx32")
 | 
						|
      ARCHFLAGS="$ARCHFLAGS ${1:6}"
 | 
						|
    ;;
 | 
						|
    --with-cc=*)
 | 
						|
      COMPILERS="$COMPILERS ${1#*=}"
 | 
						|
    ;;
 | 
						|
    --cflags=*)
 | 
						|
      CFLAGS="$CFLAGS ${1#*=}"
 | 
						|
    ;;
 | 
						|
    --make-option=*)
 | 
						|
      MAKE_OPTIONS="$MAKE_OPTIONS ${1#*=}"
 | 
						|
    ;;
 | 
						|
    --with-low-mp)
 | 
						|
      WITH_LOW_MP="1"
 | 
						|
    ;;
 | 
						|
    --test-vs-mtest=*)
 | 
						|
      TEST_VS_MTEST="${1#*=}"
 | 
						|
      if ! [ "$TEST_VS_MTEST" -eq "$TEST_VS_MTEST" ] 2> /dev/null
 | 
						|
      then
 | 
						|
         echo "--test-vs-mtest Parameter has to be int"
 | 
						|
         exit -1
 | 
						|
      fi
 | 
						|
    ;;
 | 
						|
    --mtest-real-rand)
 | 
						|
      MTEST_RAND="-DLTM_MTEST_REAL_RAND"
 | 
						|
    ;;
 | 
						|
    --all)
 | 
						|
      COMPILERS="gcc clang"
 | 
						|
      ARCHFLAGS="-m64 -m32 -mx32"
 | 
						|
    ;;
 | 
						|
    --help | -h)
 | 
						|
      _help
 | 
						|
    ;;
 | 
						|
    *)
 | 
						|
      echo "Ignoring option ${1}"
 | 
						|
    ;;
 | 
						|
  esac
 | 
						|
  shift
 | 
						|
done
 | 
						|
 | 
						|
# default to gcc if no compiler is defined but some other options
 | 
						|
if [[ "$COMPILERS" == "" ]] && [[ "$ARCHFLAGS$MAKE_OPTIONS$CFLAGS" != "" ]]
 | 
						|
then
 | 
						|
   COMPILERS="gcc"
 | 
						|
# default to gcc and run only default config if no option is given
 | 
						|
elif [[ "$COMPILERS" == "" ]]
 | 
						|
then
 | 
						|
  _banner gcc
 | 
						|
  _runtest "gcc" ""
 | 
						|
  _exit
 | 
						|
fi
 | 
						|
 | 
						|
archflags=( $ARCHFLAGS )
 | 
						|
compilers=( $COMPILERS )
 | 
						|
 | 
						|
# choosing a compiler without specifying an architecture will use the default architecture
 | 
						|
if [ "${#archflags[@]}" == "0" ]
 | 
						|
then
 | 
						|
  archflags[0]=" "
 | 
						|
fi
 | 
						|
 | 
						|
_banner
 | 
						|
 | 
						|
if [[ "$TEST_VS_MTEST" != "" ]]
 | 
						|
then
 | 
						|
   make clean > /dev/null
 | 
						|
   _make "${compilers[0]} ${archflags[0]}" "$CFLAGS" "test"
 | 
						|
   echo
 | 
						|
   _make "gcc" "$MTEST_RAND" "mtest"
 | 
						|
   echo
 | 
						|
   echo "Run test vs. mtest for $TEST_VS_MTEST iterations"
 | 
						|
   for i in `seq 1 10` ; do sleep 500 && echo alive; done &
 | 
						|
   alive_pid=$!
 | 
						|
   _timeout=""
 | 
						|
   which timeout >/dev/null && _timeout="timeout --foreground 900"
 | 
						|
   $_TIMEOUT ./mtest/mtest $TEST_VS_MTEST | ./test > test.log
 | 
						|
   disown $alive_pid
 | 
						|
   kill $alive_pid 2>/dev/null
 | 
						|
   head -n 5 test.log
 | 
						|
   tail -n 2 test.log
 | 
						|
   exit 0
 | 
						|
fi
 | 
						|
 | 
						|
for i in "${compilers[@]}"
 | 
						|
do
 | 
						|
  if [ -z "$(which $i)" ]
 | 
						|
  then
 | 
						|
    echo "Skipped compiler $i, file not found"
 | 
						|
    continue
 | 
						|
  fi
 | 
						|
  compiler_version=$(echo "$i="$($i -dumpversion))
 | 
						|
  if [ "$compiler_version" == "clang=4.2.1" ]
 | 
						|
  then
 | 
						|
    # one of my versions of clang complains about some stuff in stdio.h and stdarg.h ...
 | 
						|
    TEST_CFLAGS="-Wno-typedef-redefinition"
 | 
						|
  else
 | 
						|
    TEST_CFLAGS=""
 | 
						|
  fi
 | 
						|
  echo $compiler_version
 | 
						|
 | 
						|
  for a in "${archflags[@]}"
 | 
						|
  do
 | 
						|
    if [[ $(expr "$i" : "clang") -ne 0 && "$a" == "-mx32" ]]
 | 
						|
    then
 | 
						|
      echo "clang -mx32 tests skipped"
 | 
						|
      continue
 | 
						|
    fi
 | 
						|
 | 
						|
    _runtest "$i $a" "$CFLAGS"
 | 
						|
    [ "$WITH_LOW_MP" != "1" ] && continue
 | 
						|
    _runtest "$i $a" "-DMP_8BIT $CFLAGS"
 | 
						|
    _runtest "$i $a" "-DMP_16BIT $CFLAGS"
 | 
						|
    _runtest "$i $a" "-DMP_32BIT $CFLAGS"
 | 
						|
  done
 | 
						|
done
 | 
						|
 | 
						|
_exit
 |