blob: 070993a55b2898da218887825c307f3b1c3035b7 [file] [log] [blame]
#! /bin/bash
# Copyright (C) 2016 Sebastian Pipping <sebastian@pipping.org>
# Licensed under MIT license
set -o nounset
: ${GCC_CC:=gcc}
: ${GCC_CXX:=g++}
: ${CLANG_CC:=clang}
: ${CLANG_CXX:=clang++}
: ${CC:="${CLANG_CC}"}
: ${CXX:="${CLANG_CXX}"}
: ${MAKE:=make}
: ${BASE_FLAGS:="-pipe -Wall -Wextra -pedantic -Wno-overlength-strings"}
main() {
local mode="${1:-}"
local RUNENV
local BASE_FLAGS="${BASE_FLAGS}"
case "${mode}" in
address)
# http://clang.llvm.org/docs/AddressSanitizer.html
local CC="${GCC_CC}"
local CXX="${GCC_CXX}"
BASE_FLAGS+=" -g -fsanitize=address -fno-omit-frame-pointer"
;;
coverage)
local CC="${GCC_CC}"
local CXX="${GCC_CXX}"
BASE_FLAGS+=" --coverage --no-inline"
;;
memory)
# http://clang.llvm.org/docs/MemorySanitizer.html
BASE_FLAGS+=" -fsanitize=memory -fno-omit-frame-pointer -g -O2"
;;
undefined)
# http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
BASE_FLAGS+=" -fsanitize=undefined"
export UBSAN_OPTIONS=print_stacktrace=1
;;
*)
echo "Usage:" 1>&2
echo " ${0##*/} (address|coverage|memory|undefined)" 1>&2
exit 1
;;
esac
CFLAGS="-std=c89 ${BASE_FLAGS}"
CXXFLAGS="-std=c++98 ${BASE_FLAGS}"
(
PS4='# '
set -e
set -x
CC="${CC}" CFLAGS="${CFLAGS}" \
CXX="${CXX}" CXXFLAGS="${CXXFLAGS}" \
./configure
"${MAKE}" clean all
"${MAKE}" check run-xmltest
) || exit 1
if [[ "${mode}" = coverage ]]; then
find -name '*.gcda' | sort | xargs gcov
fi
}
main "$@"