1#!/bin/bash 2 3set -e 4 5TEST_CMD="python3 -m pytest --maxfail=99 test/" 6 7# Make sure binaries can be accessed when invoked by root. 8umask 0022 9 10# There are tests that run as root but without CAP_DAC_OVERRIDE. To allow these 11# to launch built binaries, the directory tree must be accessible to the root 12# user. Since the source directory isn't necessarily accessible to root, we 13# build and run tests in a temporary directory that we can set up to be world 14# readable/executable. 15SOURCE_DIR="$(readlink -f .)" 16TEST_DIR="$(mktemp -dt libfuse-build-XXXXXX)" 17chmod 0755 "${TEST_DIR}" 18cd "${TEST_DIR}" 19echo "Running in ${TEST_DIR}" 20 21cp -v "${SOURCE_DIR}/test/lsan_suppress.txt" . 22export LSAN_OPTIONS="suppressions=$(pwd)/lsan_suppress.txt" 23export ASAN_OPTIONS="detect_leaks=1" 24export CC 25 26# Standard build 27for CC in gcc gcc-9 gcc-10 clang; do 28 echo "=== Building with ${CC} ===" 29 mkdir build-${CC}; cd build-${CC} 30 if [ "${CC}" == "clang" ]; then 31 export CXX="clang++" 32 export TEST_WITH_VALGRIND=false 33 else 34 export TEST_WITH_VALGRIND=true 35 fi 36 if [ ${CC} == 'gcc-7' ]; then 37 build_opts='-D b_lundef=false' 38 else 39 build_opts='' 40 fi 41 if [ ${CC} == 'gcc-10' ]; then 42 build_opts='-Dc_args=-flto=auto' 43 else 44 build_opts='' 45 fi 46 meson setup -D werror=true ${build_opts} "${SOURCE_DIR}" || (cat meson-logs/meson-log.txt; false) 47 ninja 48 49 sudo chown root:root util/fusermount3 50 sudo chmod 4755 util/fusermount3 51 ${TEST_CMD} 52 cd .. 53done 54(cd build-$CC; sudo ninja install) 55 56sanitized_build() 57{ 58 san=$1 59 additonal_option=$2 60 61 echo "=== Building with clang and ${san} sanitizer ===" 62 [ -n ${additonal_option} ] || echo "Additional option: ${additonal_option}" 63 64 mkdir build-${san}; pushd build-${san} 65 66 # b_lundef=false is required to work around clang 67 # bug, cf. https://groups.google.com/forum/#!topic/mesonbuild/tgEdAXIIdC4 68 meson setup -D b_sanitize=${san} -D b_lundef=false -D werror=true\ 69 ${additonal_option} "${SOURCE_DIR}" \ 70 || (cat meson-logs/meson-log.txt; false) 71 ninja 72 73 # Test as root and regular user 74 sudo ${TEST_CMD} 75 sudo chown root:root util/fusermount3 76 sudo chmod 4755 util/fusermount3 77 # Cleanup temporary files (since they are now owned by root) 78 sudo rm -rf test/.pytest_cache/ test/__pycache__ 79 80 ${TEST_CMD} 81 82 popd 83 rm -fr build-${san} 84} 85 86# Sanitized build 87CC=clang 88CXX=clang++ 89TEST_WITH_VALGRIND=false 90for san in undefined address; do 91 sanitized_build ${san} 92done 93 94# Sanitized build without libc versioned symbols 95CC=clang 96CXX=clang++ 97for san in undefined address; do 98 sanitized_build ${san} "-Ddisable-libc-symbol-version=true" 99done 100 101# Documentation. 102(cd "${SOURCE_DIR}"; doxygen doc/Doxyfile) 103 104# Clean up. 105rm -rf "${TEST_DIR}" 106