2 # Copyright (C) 2016 Sebastian Pipping <sebastian@pipping.org>
3 # Licensed under MIT license
13 echo -e -n "${open}" >&2
15 echo -e "${close}" >&2
23 echo -e -n "${open}" >&2
24 echo -n "WARNING: $*" >&2
25 echo -e "${close}" >&2
35 populate_environment() {
38 case "${QA_COMPILER}" in
51 : ${BASE_COMPILE_FLAGS:="-pipe -Wall -Wextra -pedantic -Wno-overlength-strings -Wno-long-long"}
52 : ${BASE_LINK_FLAGS:=}
54 if [[ ${QA_COMPILER} = clang ]]; then
55 case "${QA_SANITIZER}" in
57 # http://clang.llvm.org/docs/AddressSanitizer.html
58 BASE_COMPILE_FLAGS+=" -g -fsanitize=address -fno-omit-frame-pointer -fno-common"
59 BASE_LINK_FLAGS+=" -g -fsanitize=address"
62 # http://clang.llvm.org/docs/MemorySanitizer.html
63 BASE_COMPILE_FLAGS+=" -fsanitize=memory -fno-omit-frame-pointer -g -O2 -fsanitize-memory-track-origins -fsanitize-blacklist=$PWD/memory-sanitizer-blacklist.txt"
66 # http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
67 BASE_COMPILE_FLAGS+=" -fsanitize=undefined"
68 BASE_LINK_FLAGS+=" -fsanitize=undefined"
69 export UBSAN_OPTIONS="print_stacktrace=1:halt_on_error=1:abort_on_error=1"
75 if [[ ${QA_COMPILER} = gcc ]]; then
76 case "${QA_PROCESSOR}" in
77 egypt) BASE_COMPILE_FLAGS+=" -fdump-rtl-expand" ;;
78 gcov) BASE_COMPILE_FLAGS+=" --coverage -O0" ;;
83 CFLAGS="-std=c99 ${BASE_COMPILE_FLAGS} ${CFLAGS:-}"
84 CXXFLAGS="-std=c++98 ${BASE_COMPILE_FLAGS} ${CXXFLAGS:-}"
85 LDFLAGS="${BASE_LINK_FLAGS} ${LDFLAGS:-}"
91 -DCMAKE_C_COMPILER="${CC}"
92 -DCMAKE_C_FLAGS="${CFLAGS}"
94 -DCMAKE_CXX_COMPILER="${CXX}"
95 -DCMAKE_CXX_FLAGS="${CXXFLAGS}"
97 -DCMAKE_LINKER="${LD}"
98 -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}"
99 -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}"
101 -DEXPAT_WARNINGS_AS_ERRORS=ON
103 RUN cmake "${cmake_args[@]}" "$@" .
113 RUN "${MAKE}" "${make_args[@]}" clean all
118 case "${QA_PROCESSOR}" in
122 if [[ ${CC} =~ mingw ]]; then
123 # NOTE: Filenames are hardcoded for Travis Ubuntu trusty, as of now
124 for i in tests xmlwf ; do
126 /usr/i686-w64-mingw32/lib/libwinpthread-1.dll \
127 /usr/lib/gcc/i686-w64-mingw32/*/libgcc_s_sjlj-1.dll \
128 /usr/lib/gcc/i686-w64-mingw32/*/libstdc++-6.dll \
129 "$PWD"/libexpat.dll \
134 local make_env_args=(
135 CTEST_OUTPUT_ON_FAILURE=1
136 CTEST_PARALLEL_LEVEL=2
140 RUN "${MAKE}" "${make_env_args[@]}" test run-xmltest
145 if [[ ${QA_COMPILER} != gcc ]]; then
149 case "${QA_PROCESSOR}" in
151 local DOT_FORMAT="${DOT_FORMAT:-svg}"
152 local o="callgraph.${DOT_FORMAT}"
153 ANNOUNCE "egypt ...... | dot ...... > ${o}"
154 find -name '*.expand' \
158 | dot -T${DOT_FORMAT} -Grankdir=LR \
162 for gcov_dir in lib xmlwf ; do
164 cd "${gcov_dir}" || exit 1
165 for gcda_file in $(find . -name '*.gcda' | sort) ; do
166 RUN gcov -s .libs/ ${gcda_file}
171 RUN find -name '*.gcov' | sort
191 QA_COMPILER=${QA_COMPILER} # auto-detected from \$CC and \$CXX
192 QA_PROCESSOR=${QA_PROCESSOR} # GCC only
193 QA_SANITIZER=${QA_SANITIZER} # Clang only
206 "${CC}" --version | sed 's,^, ,'
211 classify_compiler() {
213 for i in "${CC:-}" "${CXX:-}"; do
214 [[ "$i" =~ clang ]] && { echo clang ; return ; }
221 case "${QA_COMPILER:=$(classify_compiler)}" in
227 if [[ ${QA_COMPILER} != gcc && -n ${QA_PROCESSOR:-} ]]; then
228 WARNING "QA_COMPILER=${QA_COMPILER} is not 'gcc' -- ignoring QA_PROCESSOR=${QA_PROCESSOR}"
231 case "${QA_PROCESSOR:=gcov}" in
237 if [[ ${QA_COMPILER} != clang && -n ${QA_SANITIZER:-} ]]; then
238 WARNING "QA_COMPILER=${QA_COMPILER} is not 'clang' -- ignoring QA_SANITIZER=${QA_SANITIZER}" >&2
241 case "${QA_SANITIZER:=address}" in
242 address|memory|undefined) ;;
253 Environment variables
254 QA_COMPILER=(clang|gcc) # default: auto-detected
255 QA_PROCESSOR=(egypt|gcov) # default: gcov
256 QA_SANITIZER=(address|memory|undefined) # default: address
263 if [[ ${1:-} = --help ]]; then