equal/hKis/scripts/build-and-test-all-configurations.sh
2022-10-25 18:36:19 +08:00

338 lines
6.8 KiB
Bash
Executable File

#!/bin/sh
cd "`dirname $0`/.."
binary="`basename $0`"
usage () {
cat <<EOF
usage: $binary [ <option> ]
where '<option>' is one of the following
-h print this command line option summary
-n only print and fake building and testing
-1 single configuration option mode (default)
-2 double configuration options mode
-3 triple configuration options mode
-f force '--coverage' with 'clang'
EOF
exit 0
}
# All './configure' options except '-p' (pedantic).
all="--default --extreme -m32 --ultimate -c -g -l -s --coverage --profile --compact --no-options --quiet --metrics --stats --no-proofs -fPIC --no-metrics --no-stats"
tmp=/tmp/m32-support-$$
cat <<EOF > $tmp.c
#include <stdio.h>
int main (void) {
printf ("%zu\n", sizeof (void*));
return 0;
}
EOF
m32=yes
if gcc -m32 -o $tmp $tmp.c 1>/dev/null 2>/dev/null
then
res="`$tmp 2>/dev/null`"
[ "$res" = 4 ] || m32=no
else
m32=no
fi
if [ $m32 = no ]
then
echo "compilation with '-m32' disabled (install 'g++-multilib' first)"
all="`echo $all|sed -e 's, -m32,,'`"
fi
rm -f $tmp*
# Default mode is to test single configurations ('-1').
mode=1
fake=no
if [ -t 1 ]
then
BOLD="\033[1m"
GREEN="\033[1;32m"
NORMAL="\033[0m"
RED="\033[1;31m"
else
BOLD=""
GREEN=""
NORMAL=""
RED=""
fi
die () {
echo "${BOLD}$binary: ${RED}error:${NORMAL} $*"
exit 1
}
force=no
coverage=yes
while [ $# -gt 0 ]
do
case "$1" in
-h) usage;;
-n) fake=yes;;
-1) mode=1;;
-2) mode=2;;
-3) mode=3;;
-n) force=yes;;
*) die "invalid option '$1' (try '-h')";;
esac
shift
done
failed () {
echo
echo "${BOLD}$binary: ${RED}failed:${NORMAL} $*"
exit 1
}
count=0
run () {
configure="`echo ./configure $*|sed -e 's, --default,,'`"
printf "%-49s" "$configure"
if [ $fake = no ]
then
$configure 1>/dev/null 2>/dev/null
status=$?
else
status=0
fi
if [ $status = 0 ]
then
printf " && make"
if [ $fake = no ]
then
make 1>/dev/null 2>/dev/null
status=$?
else
status=0
fi
if [ $status = 0 ]
then
printf " test"
if [ $fake = no ]
then
make test 1>/dev/null 2>/dev/null
status=$?
else
status=0
fi
if [ $status = 0 ]
then
printf " && make clean"
if [ $fake = no ]
then
make clean 1>/dev/null 2>/dev/null
status=$?
else
status=0
fi
if [ $status = 0 ]
then
echo
count=`expr $count + 1`
else
failed "$configure && make test && make clean"
fi
else
failed "$configure && make test"
fi
else
failed "$configure && make"
fi
else
failed "$configure"
fi
}
#----------------------------------------------------#
case $mode in
1) modestr=single;;
2) modestr="single and double";;
3) modestr="single, double and triple";;
esac
echo
echo "testing $modestr combinations"
if [ "$CC" = "" ]
then
echo "using default compiler ('gcc')"
else
echo "using '$CC' compiler (from environment variable 'CC')"
case "$CC" in
clang*)
if [ $force = yes ]
then
echo "forced to use '--coverage' for 'clang' (due to '-f')"
coverage=yes
else
echo "not using '--coverage' for 'clang' (use '-f' to force)"
coverage=no
fi
;;
esac
fi
if [ $coverage = no ]
then
all=`echo "$all" | sed -e 's,--coverage ,,'`
fi
#----------------------------------------------------#
# single options both pedantic and not pedantic
echo
echo "---- [ single configurations ]" \
"---------------------------------------------"
echo
for pedantic in yes no
do
for first in $all
do
[ $first = --no-metrics ] && continue
options="$first"
[ $pedantic = yes ] && options="-p $options"
run $options
done
done
#----------------------------------------------------#
redundant () {
case $1$2 in
-c-g) return 0;;
--default--no-metrics) return 0;;
--default--no-stats) return 0;;
--extreme--ultimate) return 0;;
--extreme--compact) return 0;;
--extreme-l) return 0;;
--extreme--no-options) return 0;;
--extreme--quiet) return 0;;
--extreme--no-metrics) return 0;;
--extreme--no-stats) return 0;;
-g-l) return 0;;
-g--metrics) return 0;;
-g--stats) return 0;;
-g-s) return 0;;
--metrics--no-metrics) return 0;;
--metrics--no-stats) return 0;;
--metrics--stats) return 0;;
--no-metrics--no-stats) return 0;;
--stats--no-stats) return 0;;
--ultimate--compact) return 0;;
--ultimate-l) return 0;;
--ultimate--no-options) return 0;;
--ultimate--quiet) return 0;;
--ultimate--no-metrics) return 0;;
--ultimate--no-stats) return 0;;
--ultimate--no-proofs) return 0;;
-l--metrics) return 0;;
-l--stats) return 0;;
-l--quiet) return 0;;
esac
return 1
}
#----------------------------------------------------#
if [ $mode -gt 1 ]
then
# double options both pedantic and not pedantic
echo
echo "---- [ double configurations ]" \
"---------------------------------------------"
echo
for pedantic in yes no
do
for first in $all
do
[ x$first = x--default ] && continue;
[ x$first = x--no-metrics ] && continue;
metrics=no
[ x$first = x-g -o x$first = x-l ] && metrics=yes
for second in `echo -- $all|fmt -0|sed "1,/$first/d"`
do
if redundant $first $second; then continue; fi
[ x$second = x--no-metrics -a $metrics = no ] && continue
options="$first $second"
[ $pedantic = yes ] && options="-p $options"
run $options
done
done
done
fi
#----------------------------------------------------#
if [ $mode -gt 2 ]
then
# triple options both pedantic and not pedantic
echo
echo "---- [ triple configurations ]" \
"---------------------------------------------"
echo
for pedantic in yes no
do
for first in $all
do
[ x$first = x--default ] && continue;
[ x$first = x-g -o x$first = x-l ] && metrics=yes
for second in `echo -- $all|fmt -0|sed "1,/$first/d"`
do
if redundant $first $second; then continue; fi
metrics=no
[ x$first = x-g -o x$first = x-l ] && metrics=yes
[ x$second = x--no-metrics -a $metrics = no ] && continue
[ x$second = x-g -o x$second = x-l ] && metrics=yes
for third in `echo -- $all|fmt -0|sed "1,/$second/d"`
do
if redundant $first $third; then continue; fi
if redundant $second $third; then continue; fi
[ x$third = x--no-metrics -a $metrics = no ] && continue
options="$first $second $third"
[ $pedantic = yes ] && options="-p $options"
run $options
done
done
done
done
fi
#----------------------------------------------------#
echo
echo "---- [ summary ]" \
"-----------------------------------------------------------"
echo
echo "All $count $modestr combinations" \
"${GREEN}successfully${NORMAL} tested."
case $modestr in
single)
echo
echo "Consider to run double ('-2') or even triple mode ('-3') too."
;;
double)
echo
echo "Consider to run triple mode ('-3') too."
;;
esac