1*2d543d20SAndroid Build Coastguard Worker#!/bin/sh 2*2d543d20SAndroid Build Coastguard Worker# Run clang's static analyzer (scan-build) and record its output in output-scan-build/ 3*2d543d20SAndroid Build Coastguard Worker 4*2d543d20SAndroid Build Coastguard Worker# Allow overriding binary names, like clang-12 5*2d543d20SAndroid Build Coastguard Workerexport CC=${CC:-clang} 6*2d543d20SAndroid Build Coastguard WorkerSCAN_BUILD=${SCAN_BUILD:-scan-build} 7*2d543d20SAndroid Build Coastguard Worker 8*2d543d20SAndroid Build Coastguard Worker# Ensure the current directory is where this script is 9*2d543d20SAndroid Build Coastguard Workercd "$(dirname -- "$0")" || exit $? 10*2d543d20SAndroid Build Coastguard Worker 11*2d543d20SAndroid Build Coastguard WorkerOUTPUTDIR="$(pwd)/output-scan-build" 12*2d543d20SAndroid Build Coastguard Worker 13*2d543d20SAndroid Build Coastguard Worker# Display the commands which are run, and make sure they succeed 14*2d543d20SAndroid Build Coastguard Workerset -x -e 15*2d543d20SAndroid Build Coastguard Worker 16*2d543d20SAndroid Build Coastguard Worker# Use a temporary directory as an installation directory, if $DESTDIR is not set 17*2d543d20SAndroid Build Coastguard Workerif [ -z "$DESTDIR" ] ; then 18*2d543d20SAndroid Build Coastguard Worker DESTDIR="$(mktemp --tmpdir -d scan-build-destdir-XXXXXXXXXX)" 19*2d543d20SAndroid Build Coastguard Workerfi 20*2d543d20SAndroid Build Coastguard Worker 21*2d543d20SAndroid Build Coastguard Worker# Make sure to use the newly-installed libraries when running tests 22*2d543d20SAndroid Build Coastguard Workerexport LD_LIBRARY_PATH="$DESTDIR/usr/lib:$DESTDIR/lib" 23*2d543d20SAndroid Build Coastguard Workerexport PATH="$DESTDIR/usr/sbin:$DESTDIR/usr/bin:$DESTDIR/sbin:$DESTDIR/bin:$PATH" 24*2d543d20SAndroid Build Coastguard Workerexport PYTHONPATH="$DESTDIR$(${PYTHON:-python3} -c "import sysconfig; print(sysconfig.get_path('purelib', vars={'platbase': '/usr', 'base': '/usr'}))")" 25*2d543d20SAndroid Build Coastguard Workerexport RUBYLIB="$DESTDIR/$(${RUBY:-ruby} -e 'puts RbConfig::CONFIG["vendorlibdir"]'):$DESTDIR/$(${RUBY:-ruby} -e 'puts RbConfig::CONFIG["vendorarchdir"]')" 26*2d543d20SAndroid Build Coastguard Worker 27*2d543d20SAndroid Build Coastguard Workerif [ -f /etc/debian_version ] && [ -z "${IS_CIRCLE_CI:-}" ] ; then 28*2d543d20SAndroid Build Coastguard Worker export DEB_PYTHON_INSTALL_LAYOUT='deb' 29*2d543d20SAndroid Build Coastguard Workerfi 30*2d543d20SAndroid Build Coastguard Worker 31*2d543d20SAndroid Build Coastguard Worker# Build and analyze 32*2d543d20SAndroid Build Coastguard Workermake -C .. clean distclean -j"$(nproc)" 33*2d543d20SAndroid Build Coastguard Worker$SCAN_BUILD -analyze-headers -o "$OUTPUTDIR" make -C .. \ 34*2d543d20SAndroid Build Coastguard Worker DESTDIR="$DESTDIR" \ 35*2d543d20SAndroid Build Coastguard Worker CFLAGS="-O2 -Wall -Wextra -D_FORTIFY_SOURCE=3 -D__CHECKER__ -I$DESTDIR/usr/include" \ 36*2d543d20SAndroid Build Coastguard Worker -j"$(nproc)" \ 37*2d543d20SAndroid Build Coastguard Worker install install-pywrap install-rubywrap all \ 38*2d543d20SAndroid Build Coastguard Worker || { echo "++ Build failed!"; exit 1; } 39*2d543d20SAndroid Build Coastguard Worker 40*2d543d20SAndroid Build Coastguard Workerecho "++ Build succeeded" 41*2d543d20SAndroid Build Coastguard Worker 42*2d543d20SAndroid Build Coastguard Worker# Reduce the verbosity in order to keep the message from scan-build saying 43*2d543d20SAndroid Build Coastguard Worker# "scan-build: Run 'scan-view /.../output-scan-build/2018-...' to examine bug reports. 44*2d543d20SAndroid Build Coastguard Workerset +x 45*2d543d20SAndroid Build Coastguard Worker 46*2d543d20SAndroid Build Coastguard Worker# Remove the destination directory without using "rm -rf" 47*2d543d20SAndroid Build Coastguard Workerchmod u+w "$DESTDIR/usr/bin/newrole" 48*2d543d20SAndroid Build Coastguard Workerrm -r "$DESTDIR" 49