blob: 79062c570b39e2e56fc4f0b2859fb5795c0e5eb2 [file] [log] [blame]
#!/bin/bash
export CFLAGS="$CFLAGS"
export MAKEFLAGS="$MAKEFLAGS --no-print-directory"
export BROWSER="firefox"
help_all() {
echo
echo "Usage: check <command>"
echo
echo "Commands:"
echo
echo " ansi Check using ansi compiler option"
echo " sysv Check using sys-v semaphores"
echo " nosection Check without gcc __attribute__(section)"
echo " noepoll Check using poll (not epoll)"
echo " nogettime Check without gettime()"
echo " bsd Check with a bsd-like config"
echo " mac Check with a mac/darwin-like config"
echo " dist do make distcheck"
echo " rpm Run rpmlint"
echo " mock Test doing a mock build"
echo " coverity Run coverity"
echo " clang Run clang-analyze"
echo " abi Check abi compatibility"
echo " api_sanity api sanity test"
echo
echo " help This help"
echo
exit 1
}
if [ $# -lt 1 ]
then
help_all
fi
command=$1
shift
args="$@"
if [ -n "$(git rev-parse)" ] ; then
perror "Must be inside a git repository to work"
exit 1
fi
up=$(git rev-parse --show-cdup)
if [ "x$up" == "x" ] ; then
up="."
fi
cd $up
set -e
if [ ! -e build-aux/install-sh ]
then
./autogen.sh
fi
if [ ! -e Makefile ]
then
./configure --quiet
fi
check() {
options="$1 --enable-debug --enable-slow-tests --enable-fatal-warnings --quiet"
echo "./configure $options"
echo "ENV CFLAGS=\"$CFLAGS\""
echo "ENV MAKEFLAGS=\"$MAKEFLAGS\""
( ./configure $options )
make check
if [ $? -ne 0 ]
then
echo "======================"
echo failed: $1
echo "======================"
if [ -f tests/test-suite.log ]
then
cat tests/test-suite.log
fi
exit 1
fi
}
check_ansi() {
echo "checking ansi"
echo "==============="
check "--enable-ansi"
}
check_nosection() {
echo "checking nosection"
echo "======================="
# no __attribute__((section))
# NOTE: alternatively CPPFLAGS=-DQB_KILL_ATTRIBUTE_SECTION, but
# that won't shortcut many initial/configure decisions
check "ac_cv_link_attribute_section=no"
}
check_sysv() {
# use sys-v semaphores
echo "checking sysv"
echo "======================="
ORIG_CFLAGS=$CFLAGS
export CFLAGS="$CFLAGS -DDISABLE_POSIX_THREAD_PROCESS_SHARED"
check
export CFLAGS=$ORIG_CFLAGS
}
check_nogettime() {
# no clock_gettime
echo "checking nogettime"
echo "======================="
check "ac_cv_func_clock_gettime=no"
}
check_noepoll() {
# no epoll
echo "checking noepoll"
echo "======================="
check "ac_cv_func_epoll_create1=no ac_cv_func_epoll_create=no"
}
check_bsd() {
# bsd-like
echo "checking bsd"
echo "======================="
ORIG_CFLAGS=$CFLAGS
check "ac_cv_func_sem_timedwait=no ac_cv_func_clock_gettime=no ac_cv_func_epoll_create1=no ac_cv_func_epoll_create=no"
export CFLAGS=$ORIG_CFLAGS
}
check_mac() {
# mac-like
echo "checking mac"
echo "======================="
ORIG_CFLAGS=$CFLAGS
export CFLAGS="$CFLAGS -DDISABLE_POSIX_THREAD_PROCESS_SHARED"
check "ac_cv_func_clock_gettime=no ac_cv_func_epoll_create1=no ac_cv_func_epoll_create=no ac_cv_link_attribute_section=no"
export CFLAGS=$ORIG_CFLAGS
}
check_dist() {
# normal configure with distcheck
echo "checking dist"
echo "======================"
set +e
./configure --quiet
make distcheck
set -e
}
check_rpm() {
echo "checking rpm building"
echo "======================"
set +e
make maintainer-clean
./autogen.sh
./configure --quiet
make rpm
echo
sudo rpm -Uvf --force libqb-*.rpm
echo rpmlint libqb
rpmlint libqb
echo rpmlint libqb-debuginfo
rpmlint libqb-debuginfo
echo rpmlint libqb-devel
rpmlint libqb-devel
set -e
}
check_mock() {
echo "checking mock building"
echo "======================"
set +e
make maintainer-clean
rm -f *.rpm
./autogen.sh
./configure --quiet
make srpm
mock --no-clean --rebuild *.src.rpm
}
check_coverity() {
echo "checking coverity"
echo "======================"
make clean
cov-build --dir=cov make
cov-analyze --dir cov \
--concurrency \
--all \
--aggressiveness-level high \
--security \
--wait-for-license
cov-format-errors --dir cov
}
check_clang() {
if [ ! -f /usr/libexec/clang-analyzer/scan-build/ccc-analyzer ]
then
echo try installing clang-analyze
exit 1
fi
echo "checking clang"
echo "===================="
make clean
./configure \
CC=/usr/libexec/clang-analyzer/scan-build/ccc-analyzer \
CXX=/usr/libexec/clang-analyzer/scan-build/c++-analyzer
make check
}
check_abi() {
ver1=$1
ver2=$2
if [ -z "$ver1" ] ; then
echo need two versions.
exit 1
fi
if [ -z "$ver2" ] ; then
echo need two versions.
exit 1
fi
TMPL=build-aux/abi-check-templ.xml
checker=abi-compliance-checker
mkdir -p abi_dumps/libqb
for v in $ver1 $ver2
do
p=$(pwd)_inst_$v
sed -e "s|@PREFIX@|$p|" -e "s|@VERSION@|$v|" $TMPL > abi_dumps/libqb/$v.xml
done
for v in $ver1 $ver2
do
p=$(pwd)_inst_$v
t=v$v
echo "== Version $v =="
if [ ! -f abi_dumps/libqb/libqb_$v.abi.tar.gz ]
then
git checkout $t
./autogen.sh
./configure
make
make install DESTDIR=$p
$checker -l libqb -dump_abi abi_dumps/libqb/$v.xml
fi
done
# Don't exit if there were incompatible ABI changes.
set +e
$checker -l libqb \
-d1 abi_dumps/libqb/libqb_$ver1.abi.tar.gz \
-d2 abi_dumps/libqb/libqb_$ver2.abi.tar.gz
set -e
$BROWSER file://`pwd`/compat_reports/libqb/$ver1\_to_$ver2/compat_report.html
git checkout master
}
check_api_sanity() {
make
export CFLAGS="-Wall -ggdb2"
api-sanity-checker -l libqb -d build-aux/api-auto-test.xml -gen -build -run
$BROWSER file://`pwd`/test_results/libqb/master/test_results.html
$BROWSER file://`pwd`/test_results/libqb/master/test_results.html
}
check_all() {
check_ansi
check_nosection
check_sysv
check_noepoll
check_nogettime
check_bsd
check_dist
check_rpm
}
case $command in
help)
help_all $args
;;
ansi)
check_ansi
;;
nosection)
check_nosection
;;
sysv)
check_sysv
;;
noepoll)
check_noepoll
;;
nogettime)
check_nogettime
;;
bsd)
check_bsd
;;
mac)
check_mac
;;
rpm)
check_rpm
;;
mock)
check_mock
;;
dist)
check_dist
;;
coverity)
check_coverity
;;
clang)
check_clang
;;
abi)
check_abi $args
;;
api_sanity)
check_api_sanity
;;
all)
check_all
;;
*)
help_all
;;
esac
cd -
exit 0