]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/autobuild.sh
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / autobuild.sh
index 4e932d67f70d38c8a4254347e3db98372a100a2e..5d700e7c704e47d01c68e584805baa0923edb842 100755 (executable)
@@ -8,153 +8,133 @@ if [[ ! -f $1 ]]; then
        exit 1
 fi
 
-source "$1"
-
 rootdir=$(readlink -f $(dirname $0))
+
+source "$1"
 source "$rootdir/test/common/autotest_common.sh"
 
-out=$PWD
+out=$output_dir
+scanbuild="scan-build -o $output_dir/scan-build-tmp --exclude $rootdir/dpdk/ --status-bugs"
+config_params=$(get_config_params)
 
-umask 022
+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"
 
-if [ "$SPDK_TEST_OCF" -eq 1 ]; then
+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/bdev/ocf/env exportlib O=$rootdir/build/ocf.a
+       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"
-fi
-
-./configure $config_params
-
-# Print some test system info out for the log
-echo "** START ** Info for Hostname: $HOSTNAME"
-uname -a
-$MAKE cc_version
-$MAKE cxx_version
-echo "** END ** Info for Hostname: $HOSTNAME"
-
-timing_enter autobuild
-
-timing_enter check_format
-if [ $SPDK_RUN_CHECK_FORMAT -eq 1 ]; then
-       ./scripts/check_format.sh
-fi
-timing_exit check_format
-
-scanbuild=''
-make_timing_label='make'
-if [ $SPDK_RUN_SCANBUILD -eq 1 ] && hash scan-build; then
-       scanbuild="scan-build -o $out/scan-build-tmp --status-bugs"
-       make_timing_label='scanbuild_make'
-       report_test_completion "scanbuild"
-
-fi
-
-if [ $SPDK_RUN_VALGRIND -eq 1 ]; then
-       report_test_completion "valgrind"
-fi
-
-if [ $SPDK_RUN_ASAN -eq 1 ]; then
-       report_test_completion "asan"
-fi
-
-if [ $SPDK_RUN_UBSAN -eq 1 ]; then
-       report_test_completion "ubsan"
-fi
-
-echo $scanbuild
+       # need to reconfigure to avoid clearing ocf related files on future make clean.
+       ./configure $config_params
+}
 
-timing_enter "$make_timing_label"
-
-$MAKE $MAKEFLAGS clean
-if [ $SPDK_BUILD_SHARED_OBJECT -eq 1 ]; then
-       ./configure $config_params --with-shared
-       $MAKE $MAKEFLAGS
-       $MAKE $MAKEFLAGS clean
-       report_test_completion "shared_object_build"
-fi
-
-fail=0
-./configure $config_params
-time $scanbuild $MAKE $MAKEFLAGS || fail=1
-if [ $fail -eq 1 ]; then
+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
-       exit 1
-else
-       rm -rf $out/scan-build-tmp
-fi
-timing_exit "$make_timing_label"
+       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
 
-# Check for generated files that are not listed in .gitignore
-timing_enter generated_files_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
-timing_exit generated_files_check
+       $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.
-timing_enter dependency_check
-STAT1=`stat examples/nvme/identify/identify`
-sleep 1
-touch lib/nvme/nvme_internal.h
-$MAKE $MAKEFLAGS
-STAT2=`stat examples/nvme/identify/identify`
-
-if [ "$STAT1" == "$STAT2" ]; then
-       echo "Header dependency check failed"
-       exit 1
-fi
-timing_exit dependency_check
-
-# Test 'make install'
-timing_enter make_install
-rm -rf /tmp/spdk
-mkdir /tmp/spdk
-$MAKE $MAKEFLAGS install DESTDIR=/tmp/spdk prefix=/usr
-timing_exit make_install
-
-# Test 'make uninstall'
-timing_enter make_uninstall
-# Create empty file to check if it is not deleted by target uninstall
-touch /tmp/spdk/usr/lib/sample_xyz.a
-$MAKE $MAKEFLAGS uninstall DESTDIR=/tmp/spdk prefix=/usr
-if [[ $(ls -A /tmp/spdk/usr | wc -l) -ne 2 ]] || [[ $(ls -A /tmp/spdk/usr/lib/ | wc -l) -ne 1 ]]; then
-       ls -lR /tmp/spdk
-       rm -rf /tmp/spdk
-       echo "Make uninstall failed"
-       exit 1
-else
-       rm -rf /tmp/spdk
-fi
-timing_exit make_uninstall
+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
+}
 
-timing_enter doxygen
-if [ $SPDK_BUILD_DOC -eq 1 ] && hash doxygen; then
+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
+       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
@@ -167,7 +147,43 @@ if [ $SPDK_BUILD_DOC -eq 1 ] && hash doxygen; 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
-timing_exit doxygen
 
-timing_exit autobuild
+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