]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/autobuild.sh
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / autobuild.sh
1 #!/usr/bin/env bash
2
3 set -e
4
5 # If the configuration of tests is not provided, no tests will be carried out.
6 if [[ ! -f $1 ]]; then
7 echo "ERROR: SPDK test configuration not specified"
8 exit 1
9 fi
10
11 rootdir=$(readlink -f $(dirname $0))
12
13 source "$1"
14 source "$rootdir/test/common/autotest_common.sh"
15
16 out=$output_dir
17 scanbuild="scan-build -o $output_dir/scan-build-tmp --exclude $rootdir/dpdk/ --status-bugs"
18 config_params=$(get_config_params)
19
20 trap '[[ -d $SPDK_WORKSPACE ]] && rm -rf "$SPDK_WORKSPACE"' 0
21
22 SPDK_WORKSPACE=$(mktemp -dt "spdk_$(date +%s).XXXXXX")
23 export SPDK_WORKSPACE
24
25 umask 022
26 cd $rootdir
27
28 # Print some test system info out for the log
29 date -u
30 git describe --tags
31 ./configure $config_params
32 echo "** START ** Info for Hostname: $HOSTNAME"
33 uname -a
34 $MAKE cc_version
35 $MAKE cxx_version
36 echo "** END ** Info for Hostname: $HOSTNAME"
37
38 function ocf_precompile() {
39 # We compile OCF sources ourselves
40 # They don't need to be checked with scanbuild and code coverage is not applicable
41 # So we precompile OCF now for further use as standalone static library
42 ./configure $(echo $config_params | sed 's/--enable-coverage//g')
43 $MAKE $MAKEFLAGS include/spdk/config.h
44 CC=gcc CCAR=ar $MAKE $MAKEFLAGS -C lib/env_ocf exportlib O=$rootdir/build/ocf.a
45 # Set config to use precompiled library
46 config_params="$config_params --with-ocf=/$rootdir/build/ocf.a"
47 # need to reconfigure to avoid clearing ocf related files on future make clean.
48 ./configure $config_params
49 }
50
51 function make_fail_cleanup() {
52 if [ -d $out/scan-build-tmp ]; then
53 scanoutput=$(ls -1 $out/scan-build-tmp/)
54 mv $out/scan-build-tmp/$scanoutput $out/scan-build
55 rm -rf $out/scan-build-tmp
56 chmod -R a+rX $out/scan-build
57 fi
58 false
59 }
60
61 function scanbuild_make() {
62 pass=true
63 $scanbuild $MAKE $MAKEFLAGS > $out/build_output.txt && rm -rf $out/scan-build-tmp || make_fail_cleanup
64 xtrace_disable
65
66 rm -f $out/*files.txt
67 for ent in $(find app examples lib module test -type f | grep -vF ".h"); do
68 if [[ $ent == lib/env_ocf* ]]; then continue; fi
69 if file -bi $ent | grep -q 'text/x-c'; then
70 echo $ent | sed 's/\.cp\{0,2\}$//g' >> $out/all_c_files.txt
71 fi
72 done
73 xtrace_restore
74
75 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
76 cat $rootdir/test/common/skipped_build_files.txt >> $out/built_c_files.txt
77
78 sort -o $out/all_c_files.txt $out/all_c_files.txt
79 sort -o $out/built_c_files.txt $out/built_c_files.txt
80 # from comm manual:
81 # -2 suppress column 2 (lines unique to FILE2)
82 # -3 suppress column 3 (lines that appear in both files)
83 # comm may exit 1 if no lines were printed (undocumented, unreliable)
84 comm -2 -3 $out/all_c_files.txt $out/built_c_files.txt > $out/unbuilt_c_files.txt || true
85
86 if [ $(wc -l < $out/unbuilt_c_files.txt) -ge 1 ]; then
87 echo "missing files"
88 cat $out/unbuilt_c_files.txt
89 pass=false
90 fi
91
92 $pass
93 }
94
95 function porcelain_check() {
96 if [ $(git status --porcelain --ignore-submodules | wc -l) -ne 0 ]; then
97 echo "Generated files missing from .gitignore:"
98 git status --porcelain --ignore-submodules
99 exit 1
100 fi
101 }
102
103 # Check that header file dependencies are working correctly by
104 # capturing a binary's stat data before and after touching a
105 # header file and re-making.
106 function header_dependency_check() {
107 STAT1=$(stat $SPDK_BIN_DIR/spdk_tgt)
108 sleep 1
109 touch lib/nvme/nvme_internal.h
110 $MAKE $MAKEFLAGS
111 STAT2=$(stat $SPDK_BIN_DIR/spdk_tgt)
112
113 if [ "$STAT1" == "$STAT2" ]; then
114 echo "Header dependency check failed"
115 false
116 fi
117 }
118
119 function test_make_uninstall() {
120 # Create empty file to check if it is not deleted by target uninstall
121 touch "$SPDK_WORKSPACE/usr/lib/sample_xyz.a"
122 $MAKE $MAKEFLAGS uninstall DESTDIR="$SPDK_WORKSPACE" prefix=/usr
123 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
124 ls -lR "$SPDK_WORKSPACE"
125 echo "Make uninstall failed"
126 exit 1
127 fi
128 }
129
130 function build_doc() {
131 $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS &> "$out"/doxygen.log
132 if [ -s "$out"/doxygen.log ]; then
133 cat "$out"/doxygen.log
134 echo "Doxygen errors found!"
135 exit 1
136 fi
137 if hash pdflatex 2> /dev/null; then
138 $MAKE -C "$rootdir"/doc/output/latex --no-print-directory $MAKEFLAGS &>> "$out"/doxygen.log
139 fi
140 mkdir -p "$out"/doc
141 mv "$rootdir"/doc/output/html "$out"/doc
142 if [ -f "$rootdir"/doc/output/latex/refman.pdf ]; then
143 mv "$rootdir"/doc/output/latex/refman.pdf "$out"/doc/spdk.pdf
144 fi
145 $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS clean &>> "$out"/doxygen.log
146 if [ -s "$out"/doxygen.log ]; then
147 rm "$out"/doxygen.log
148 fi
149 rm -rf "$rootdir"/doc/output
150 }
151
152 function autobuild_test_suite() {
153 run_test "autobuild_check_format" ./scripts/check_format.sh
154 run_test "autobuild_external_code" sudo -E $rootdir/test/external_code/test_make.sh $rootdir
155 if [ "$SPDK_TEST_OCF" -eq 1 ]; then
156 run_test "autobuild_ocf_precompile" ocf_precompile
157 fi
158 run_test "autobuild_check_so_deps" $rootdir/test/make/check_so_deps.sh $1
159 ./configure $config_params --without-shared
160 run_test "scanbuild_make" scanbuild_make
161 run_test "autobuild_generated_files_check" porcelain_check
162 run_test "autobuild_header_dependency_check" header_dependency_check
163 run_test "autobuild_make_install" $MAKE $MAKEFLAGS install DESTDIR="$SPDK_WORKSPACE" prefix=/usr
164 run_test "autobuild_make_uninstall" test_make_uninstall
165 run_test "autobuild_build_doc" build_doc
166 }
167
168 if [ $SPDK_RUN_VALGRIND -eq 1 ]; then
169 run_test "valgrind" echo "using valgrind"
170 fi
171
172 if [ $SPDK_RUN_ASAN -eq 1 ]; then
173 run_test "asan" echo "using asan"
174 fi
175
176 if [ $SPDK_RUN_UBSAN -eq 1 ]; then
177 run_test "ubsan" echo "using ubsan"
178 fi
179
180 if [ "$SPDK_TEST_AUTOBUILD" -eq 1 ]; then
181 run_test "autobuild" autobuild_test_suite $1
182 else
183 if [ "$SPDK_TEST_OCF" -eq 1 ]; then
184 run_test "autobuild_ocf_precompile" ocf_precompile
185 fi
186 # if we aren't testing the unittests, build with shared objects.
187 ./configure $config_params --with-shared
188 run_test "make" $MAKE $MAKEFLAGS
189 fi