2 # Copyright (C) Sebastian Pipping <sebastian@pipping.org>
3 # Licensed under the MIT license
9 echo "source__${version}"
15 if ${with_libbsd}; then
20 if ${with_mingw}; then
25 if ${with_unsigned_char}; then
26 char_part=__unsigned_char
30 if ${xml_attr_info_enabled}; then
31 xml_attr_part=__attr_info
34 echo "build__${version}__unicode_${unicode_enabled}__xml_context_${xml_context}${libbsd_part}${mingw_part}${char_part}${xml_attr_part}"
39 echo "coverage__${version}"
47 && cmake_args+=( -DEXPAT_CHAR_TYPE=wchar_t )
49 ${xml_attr_info_enabled} \
50 && cmake_args+=( -DEXPAT_ATTR_INFO=ON )
52 if [[ ${xml_context} -eq 0 ]]; then
53 cmake_args+=( -DEXPAT_CONTEXT_BYTES=OFF )
55 cmake_args+=( -DEXPAT_CONTEXT_BYTES=${xml_context} )
58 ${with_libbsd} && cmake_args+=( -DEXPAT_WITH_LIBBSD=ON )
59 ${with_mingw} && cmake_args+=( -DCMAKE_TOOLCHAIN_FILE="${abs_source_dir}"/cmake/mingw-toolchain.cmake )
63 cmake "${cmake_args[@]}" "$@" . &>> cmake.log
70 [[ -d "${target_dir}" ]] && return 0
73 git archive --format=tar "${version}" | ( cd "${target_dir}" && tar x )
77 _copy_missing_mingw_libaries() {
78 # These extra files are copied because
79 # * coverage GCC flags make them needed
80 # * With WINEDLLPATH Wine looks for .dll.so in these folders, not .dll
82 local mingw_gcc_dll_dir="$(dirname "$(ls -1 /usr/lib*/gcc/i686-w64-mingw32/*/libgcc_s_sjlj-1.dll | head -n1)")"
83 for dll in libgcc_s_sjlj-1.dll libstdc++-6.dll; do
86 ln -s "${mingw_gcc_dll_dir}"/${dll} "${target}"/${dll}
90 local mingw_pthread_dll="$(ls -1 /usr/i686-w64-mingw32/lib*/libwinpthread-1.dll 2>/dev/null | head -n1)"
91 if [[ -n ${mingw_pthread_dll} ]]; then
92 local mingw_pthread_dll_dir="$(dirname "${mingw_pthread_dll}")"
93 for dll in libwinpthread-1.dll; do
94 source="${mingw_pthread_dll_dir}"/${dll}
97 ln -s "${source}" "${target}"/${dll}
102 for dll in libexpat.dll; do
105 ln -s "${abs_build_dir}"/${dll} "${target}"/${dll}
112 local source_dir="$1"
114 local abs_source_dir="${PWD}/${source_dir}"
115 local abs_build_dir="${PWD}/${build_dir}"
118 local BASE_FLAGS='-pipe -Wall -Wextra -pedantic -Wno-overlength-strings'
119 BASE_FLAGS+=' --coverage --no-inline'
121 ${with_unsigned_char} && BASE_FLAGS="${BASE_FLAGS} -funsigned-char"
123 local CFLAGS="-std=c99 ${BASE_FLAGS}"
124 local CXXFLAGS="-std=c++98 ${BASE_FLAGS}"
131 -DCMAKE_C_FLAGS="${CFLAGS}" \
132 -DCMAKE_CXX_FLAGS="${CXXFLAGS}"
138 lcov -c -d "${capture_dir}" -i -o "${coverage_info}-zero" &> run.log
141 if ${with_mingw}; then
142 for d in tests xmlwf ; do
144 _copy_missing_mingw_libaries "${d}"
149 make CTEST_OUTPUT_ON_FAILURE=1 test run-xmltest
151 lcov -c -d "${capture_dir}" -o "${coverage_info}-test" &>> run.log
153 -a "${coverage_info}-zero" \
154 -a "${coverage_info}-test" \
155 -o "${coverage_info}-all" \
158 # Make sure that files overlap in report despite different build folders
159 sed "/SF:/ s,${build_dir}/,${source_dir}/," "${coverage_info}-all" > "${coverage_info}"
163 if [[ ${res} -eq 0 ]]; then
172 _merge_coverage_info() {
173 local coverage_dir="$1"
175 local build_dirs=( "$@" )
177 mkdir -p "${coverage_dir}"
179 local lcov_merge_args=()
180 for build_dir in "${build_dirs[@]}"; do
181 lcov_merge_args+=( -a "${build_dir}/${coverage_info}" )
183 lcov_merge_args+=( -o "${coverage_dir}/${coverage_info}" )
186 lcov "${lcov_merge_args[@]}"
187 ) &> "${coverage_dir}/merge.log"
191 _render_html_report() {
192 local coverage_dir="$1"
193 genhtml -o "${coverage_dir}" "${coverage_dir}/${coverage_info}" &> "${coverage_dir}/render.log"
198 local coverage_dir="$1"
199 lcov -q -l "${coverage_dir}/${coverage_info}" | grep -v '^\['
204 version="$(git describe --tags)"
205 coverage_info=coverage.info
208 local source_dir="$(_get_source_dir)"
209 local coverage_dir="$(_get_coverage_dir)"
211 _copy_to "${source_dir}"
214 local build_dir="$(_get_build_dir)"
216 echo "[${build_dir}]"
217 _copy_to "${build_dir}"
219 # Make sure we don't need to download xmlts.zip over and over again
220 if [[ ${#build_dirs[*]} -gt 0 ]]; then
221 ln -s "$PWD/${build_dirs[0]}/tests/xmlts.zip" "${build_dir}"/tests/
224 _run "${source_dir}" "${build_dir}"
226 build_dirs+=( "${build_dir}" )
230 with_unsigned_char=false
232 for with_mingw in true false ; do
233 for unicode_enabled in true false ; do
234 if ${unicode_enabled} && ! ${with_mingw} ; then
238 for xml_attr_info_enabled in true false ; do
239 for xml_context in 0 1024 ; do
247 with_libbsd=true _build_case
248 with_unsigned_char=true _build_case
251 echo 'Merging coverage files...'
252 _merge_coverage_info "${coverage_dir}" "${build_dirs[@]}"
254 echo 'Rendering HTML report...'
255 _render_html_report "${coverage_dir}"
256 echo "--> ${coverage_dir}/index.html"
259 _show_summary "${coverage_dir}"