diff options
Diffstat (limited to '')
-rwxr-xr-x | src/spdk/autobuild.sh | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/spdk/autobuild.sh b/src/spdk/autobuild.sh new file mode 100755 index 000000000..5d700e7c7 --- /dev/null +++ b/src/spdk/autobuild.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +set -e + +# If the configuration of tests is not provided, no tests will be carried out. +if [[ ! -f $1 ]]; then + echo "ERROR: SPDK test configuration not specified" + exit 1 +fi + +rootdir=$(readlink -f $(dirname $0)) + +source "$1" +source "$rootdir/test/common/autotest_common.sh" + +out=$output_dir +scanbuild="scan-build -o $output_dir/scan-build-tmp --exclude $rootdir/dpdk/ --status-bugs" +config_params=$(get_config_params) + +trap '[[ -d $SPDK_WORKSPACE ]] && rm -rf "$SPDK_WORKSPACE"' 0 + +SPDK_WORKSPACE=$(mktemp -dt "spdk_$(date +%s).XXXXXX") +export SPDK_WORKSPACE + +umask 022 +cd $rootdir + +# Print some test system info out for the log +date -u +git describe --tags +./configure $config_params +echo "** START ** Info for Hostname: $HOSTNAME" +uname -a +$MAKE cc_version +$MAKE cxx_version +echo "** END ** Info for Hostname: $HOSTNAME" + +function ocf_precompile() { + # We compile OCF sources ourselves + # They don't need to be checked with scanbuild and code coverage is not applicable + # So we precompile OCF now for further use as standalone static library + ./configure $(echo $config_params | sed 's/--enable-coverage//g') + $MAKE $MAKEFLAGS include/spdk/config.h + CC=gcc CCAR=ar $MAKE $MAKEFLAGS -C lib/env_ocf exportlib O=$rootdir/build/ocf.a + # Set config to use precompiled library + config_params="$config_params --with-ocf=/$rootdir/build/ocf.a" + # need to reconfigure to avoid clearing ocf related files on future make clean. + ./configure $config_params +} + +function make_fail_cleanup() { + if [ -d $out/scan-build-tmp ]; then + scanoutput=$(ls -1 $out/scan-build-tmp/) + mv $out/scan-build-tmp/$scanoutput $out/scan-build + rm -rf $out/scan-build-tmp + chmod -R a+rX $out/scan-build + fi + false +} + +function scanbuild_make() { + pass=true + $scanbuild $MAKE $MAKEFLAGS > $out/build_output.txt && rm -rf $out/scan-build-tmp || make_fail_cleanup + xtrace_disable + + rm -f $out/*files.txt + for ent in $(find app examples lib module test -type f | grep -vF ".h"); do + if [[ $ent == lib/env_ocf* ]]; then continue; fi + if file -bi $ent | grep -q 'text/x-c'; then + echo $ent | sed 's/\.cp\{0,2\}$//g' >> $out/all_c_files.txt + fi + done + xtrace_restore + + grep -E "CC|CXX" $out/build_output.txt | sed 's/\s\s\(CC\|CXX\)\s//g' | sed 's/\.o//g' > $out/built_c_files.txt + cat $rootdir/test/common/skipped_build_files.txt >> $out/built_c_files.txt + + sort -o $out/all_c_files.txt $out/all_c_files.txt + sort -o $out/built_c_files.txt $out/built_c_files.txt + # from comm manual: + # -2 suppress column 2 (lines unique to FILE2) + # -3 suppress column 3 (lines that appear in both files) + # comm may exit 1 if no lines were printed (undocumented, unreliable) + comm -2 -3 $out/all_c_files.txt $out/built_c_files.txt > $out/unbuilt_c_files.txt || true + + if [ $(wc -l < $out/unbuilt_c_files.txt) -ge 1 ]; then + echo "missing files" + cat $out/unbuilt_c_files.txt + pass=false + fi + + $pass +} + +function porcelain_check() { + if [ $(git status --porcelain --ignore-submodules | wc -l) -ne 0 ]; then + echo "Generated files missing from .gitignore:" + git status --porcelain --ignore-submodules + exit 1 + fi +} + +# Check that header file dependencies are working correctly by +# capturing a binary's stat data before and after touching a +# header file and re-making. +function header_dependency_check() { + STAT1=$(stat $SPDK_BIN_DIR/spdk_tgt) + sleep 1 + touch lib/nvme/nvme_internal.h + $MAKE $MAKEFLAGS + STAT2=$(stat $SPDK_BIN_DIR/spdk_tgt) + + if [ "$STAT1" == "$STAT2" ]; then + echo "Header dependency check failed" + false + fi +} + +function test_make_uninstall() { + # Create empty file to check if it is not deleted by target uninstall + touch "$SPDK_WORKSPACE/usr/lib/sample_xyz.a" + $MAKE $MAKEFLAGS uninstall DESTDIR="$SPDK_WORKSPACE" prefix=/usr + if [[ $(find "$SPDK_WORKSPACE/usr" -maxdepth 1 -mindepth 1 | wc -l) -ne 2 ]] || [[ $(find "$SPDK_WORKSPACE/usr/lib/" -maxdepth 1 -mindepth 1 | wc -l) -ne 1 ]]; then + ls -lR "$SPDK_WORKSPACE" + echo "Make uninstall failed" + exit 1 + fi +} + +function build_doc() { + $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS &> "$out"/doxygen.log + if [ -s "$out"/doxygen.log ]; then + cat "$out"/doxygen.log + echo "Doxygen errors found!" + exit 1 + fi + if hash pdflatex 2> /dev/null; then + $MAKE -C "$rootdir"/doc/output/latex --no-print-directory $MAKEFLAGS &>> "$out"/doxygen.log + fi + mkdir -p "$out"/doc + mv "$rootdir"/doc/output/html "$out"/doc + if [ -f "$rootdir"/doc/output/latex/refman.pdf ]; then + mv "$rootdir"/doc/output/latex/refman.pdf "$out"/doc/spdk.pdf + fi + $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS clean &>> "$out"/doxygen.log + if [ -s "$out"/doxygen.log ]; then + rm "$out"/doxygen.log + fi + rm -rf "$rootdir"/doc/output +} + +function autobuild_test_suite() { + run_test "autobuild_check_format" ./scripts/check_format.sh + run_test "autobuild_external_code" sudo -E $rootdir/test/external_code/test_make.sh $rootdir + if [ "$SPDK_TEST_OCF" -eq 1 ]; then + run_test "autobuild_ocf_precompile" ocf_precompile + fi + run_test "autobuild_check_so_deps" $rootdir/test/make/check_so_deps.sh $1 + ./configure $config_params --without-shared + run_test "scanbuild_make" scanbuild_make + run_test "autobuild_generated_files_check" porcelain_check + run_test "autobuild_header_dependency_check" header_dependency_check + run_test "autobuild_make_install" $MAKE $MAKEFLAGS install DESTDIR="$SPDK_WORKSPACE" prefix=/usr + run_test "autobuild_make_uninstall" test_make_uninstall + run_test "autobuild_build_doc" build_doc +} + +if [ $SPDK_RUN_VALGRIND -eq 1 ]; then + run_test "valgrind" echo "using valgrind" +fi + +if [ $SPDK_RUN_ASAN -eq 1 ]; then + run_test "asan" echo "using asan" +fi + +if [ $SPDK_RUN_UBSAN -eq 1 ]; then + run_test "ubsan" echo "using ubsan" +fi + +if [ "$SPDK_TEST_AUTOBUILD" -eq 1 ]; then + run_test "autobuild" autobuild_test_suite $1 +else + if [ "$SPDK_TEST_OCF" -eq 1 ]; then + run_test "autobuild_ocf_precompile" ocf_precompile + fi + # if we aren't testing the unittests, build with shared objects. + ./configure $config_params --with-shared + run_test "make" $MAKE $MAKEFLAGS +fi |