• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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