| #!/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 |
| |