]> git.ipfire.org Git - thirdparty/util-linux.git/blob - .travis-functions.sh
Merge branch 'fuzz' of https://github.com/evverx/util-linux
[thirdparty/util-linux.git] / .travis-functions.sh
1 #!/bin/bash
2
3 #
4 # .travis-functions.sh:
5 # - helper functions to be sourced from .travis.yml
6 # - designed to respect travis' environment but testing locally is possible
7 #
8 # Variables:
9 #
10 # TS_OPT_<name>_<something>=yes
11 # - forces tests/functions.sh:ts_has_option() to return "yes" for
12 # variable <something> in test <name>
13 #
14 # TESTS_OPTIONS=
15 # TESTS_PARALLEL=
16 # TESTS_COMMAND=
17 # - overwrites default from tests/Makemodule.am
18 #
19 # Do not use TS_* prefix for any travis or build-system stuff. This prefix is
20 # exclusively used by tests/ stuff.
21 #
22
23 if [ ! -f "configure.ac" ]; then
24 echo ".travis-functions.sh must be sourced from source dir" >&2
25 return 1 || exit 1
26 fi
27
28 ## some config settings
29 # travis docs say we get 1.5 CPUs
30 MAKE="make -j2"
31 DUMP_CONFIG_LOG="short"
32
33 # Coverity-related settings
34 COVERITY_SCAN_TOOL_BASE="/tmp/coverity-scan-analysis"
35 COVERITY_SCAN_PROJECT_NAME="karelzak/util-linux"
36
37 # workaround ugly warning on travis OSX,
38 # see https://github.com/direnv/direnv/issues/210
39 shell_session_update() { :; }
40
41 function xconfigure
42 {
43 local gcc_version clang_version cxx
44
45 which "$CC"
46 "$CC" --version
47
48 if [[ "$CC" =~ ^clang-([0-9]+)$ ]]; then
49 clang_version=${BASH_REMATCH[1]}
50 cxx=clang++-${clang_version}
51 elif [[ "$CC" =~ ^gcc-([0-9]+)$ ]]; then
52 gcc_version=${BASH_REMATCH[1]}
53 cxx=g++-${gcc_version}
54 elif [[ "$CC" == "clang" ]]; then
55 cxx=clang++
56 elif [[ "$CC" == "gcc" ]]; then
57 cxx=g++
58 fi
59
60 which "$cxx"
61 "$cxx" --version
62
63 CC=$CC CXX=$cxx ./configure "$@" $OSX_CONFOPTS
64 err=$?
65 if [ "$DUMP_CONFIG_LOG" = "short" ]; then
66 grep -B1 -A10000 "^## Output variables" config.log | grep -v "_FALSE="
67 elif [ "$DUMP_CONFIG_LOG" = "full" ]; then
68 cat config.log
69 fi
70 return $err
71 }
72
73 # TODO: integrate checkusage into our regular tests and remove this function
74 function make_checkusage
75 {
76 local tmp
77 # memory leaks are ignored here. See https://github.com/karelzak/util-linux/issues/1077
78 if ! tmp=$(ASAN_OPTIONS="$ASAN_OPTIONS:detect_leaks=0" $MAKE checkusage 2>&1) || test -n "$tmp"; then
79 echo "$tmp"
80 echo "make checkusage failed" >&2
81 return 1
82 fi
83 }
84
85 function check_nonroot
86 {
87 local make_opts="$MAKE_CHECK_OPTS --show-diff --parsable"
88 local conf_opts="\
89 --disable-use-tty-group \
90 --disable-makeinstall-chown \
91 --enable-all-programs"
92
93 if [ "$TRAVIS_OS_NAME" != "osx" ]; then
94 conf_opts="$conf_opts --enable-asan --enable-ubsan"
95 make_opts="$make_opts --memcheck-asan --memcheck-ubsan"
96 fi
97
98 if [ "$TRAVIS_OS_NAME" != "osx" -a "$TRAVIS_DIST" != "precise" ]; then
99 conf_opts="$conf_opts --enable-werror"
100 fi
101
102 if [[ "$CC" =~ "clang" ]]; then
103 conf_opts="$conf_opts --enable-fuzzing-engine"
104 fi
105
106 xconfigure $conf_opts || return
107 $MAKE || return
108
109 osx_prepare_check
110
111 # TESTS_* overwrites default from tests/Makemodule.am
112 $MAKE check TESTS_OPTIONS="$make_opts" || return
113
114 make_checkusage || return
115
116 $MAKE install DESTDIR=/tmp/dest || return
117 }
118
119 function check_root
120 {
121 local make_opts="$MAKE_CHECK_OPTS --show-diff"
122 local conf_opts="--enable-all-programs"
123
124 if [ "$TRAVIS_OS_NAME" != "osx" ]; then
125 conf_opts="$conf_opts --enable-asan --enable-ubsan"
126 make_opts="$make_opts --memcheck-asan --memcheck-ubsan"
127 fi
128
129 if [ "$TRAVIS_OS_NAME" != "osx" -a "$TRAVIS_DIST" != "precise" ]; then
130 conf_opts="$conf_opts --enable-werror"
131 fi
132
133 if [[ "$CC" =~ "clang" ]]; then
134 conf_opts="$conf_opts --enable-fuzzing-engine"
135 fi
136
137 xconfigure $conf_opts || return
138 $MAKE || return
139
140 # compile tests only
141 $MAKE check-programs || return
142
143 # Modify environment for OSX
144 osx_prepare_check
145
146 # TESTS_* overwrites default from tests/Makemodule.am
147 sudo -E $MAKE check TESTS_PARALLEL="" TESTS_OPTIONS="$make_opts" || return
148
149 # root on osx has not enough permission for make install ;)
150 [ "$TRAVIS_OS_NAME" = "osx" ] && return
151
152 # keep PATH to make sure sudo would find $CC
153 sudo env "PATH=$PATH" $MAKE install || return
154 }
155
156 function run_coverity
157 {
158 local results_dir="cov-int"
159 local tool_dir=$(find $COVERITY_SCAN_TOOL_BASE -type d -name 'cov-analysis*')
160 local results_archive="analysis-results.tgz"
161 local sha=$(git rev-parse --short HEAD)
162 local author_email=$(git log -1 --pretty="%aE")
163 local response status_code
164
165 xconfigure --enable-all-programs || return
166 echo -e "\033[33;1mRunning Coverity Scan Analysis Tool...\033[0m"
167 COVERITY_UNSUPPORTED=1 $tool_dir/bin/cov-build --dir $results_dir sh -c "$MAKE check-programs all" || return
168 $tool_dir/bin/cov-import-scm --dir $results_dir --scm git --log $results_dir/scm_log.txt || return
169
170 echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m"
171 tar czf $results_archive $results_dir || return
172
173 echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m"
174 response=$(curl \
175 --silent --write-out "\n%{http_code}\n" \
176 --form project=$COVERITY_SCAN_PROJECT_NAME \
177 --form token=$COVERITY_SCAN_TOKEN \
178 --form email=$author_email \
179 --form file=@$results_archive \
180 --form version=$sha \
181 --form description="Travis CI build" \
182 https://scan.coverity.com/builds)
183 printf "\033[33;1mThe response is\033[0m\n%s\n" "$response"
184 status_code=$(echo "$response" | sed -n '$p')
185 if [ "$status_code" != "200" ]; then
186 echo -e "\033[33;1mCoverity Scan upload failed: $(echo "$response" | sed '$d').\033[0m"
187 return 1
188 fi
189
190 echo -e "\n\033[33;1mCoverity Scan Analysis completed successfully.\033[0m"
191 }
192
193 function check_dist
194 {
195 xconfigure \
196 || return
197 $MAKE distcheck || return
198 }
199
200 function travis_install_script
201 {
202 local ubuntu_release
203 local additional_packages=()
204 local clang_version gcc_version
205
206 if [ "$TRAVIS_OS_NAME" = "osx" ]; then
207 osx_install_script
208 return
209 fi
210
211 ubuntu_release=$(lsb_release -cs)
212
213 # install required packages
214 sudo bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ $ubuntu_release main restricted universe multiverse' >>/etc/apt/sources.list"
215
216 if [[ "$CC" =~ ^clang-([0-9]+)$ ]]; then
217 clang_version=${BASH_REMATCH[1]}
218 # the following snippet was borrowed from https://apt.llvm.org/llvm.sh
219 wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
220 sudo add-apt-repository -y "deb http://apt.llvm.org/$ubuntu_release/ llvm-toolchain-$ubuntu_release-$clang_version main"
221 additional_packages+=(clang-$clang_version llvm-$clang_version)
222 elif [[ "$CC" =~ ^gcc-([0-9]+)$ ]]; then
223 gcc_version=${BASH_REMATCH[1]}
224 sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
225 additional_packages+=(gcc-$gcc_version)
226 fi
227
228 sudo apt-get -qq update --fix-missing
229 sudo apt-get build-dep -y util-linux
230 sudo apt-get install -qq >/dev/null \
231 bc \
232 btrfs-tools \
233 dnsutils \
234 libcap-ng-dev \
235 libncursesw5-dev \
236 libpam-dev \
237 libudev-dev \
238 gtk-doc-tools \
239 mdadm \
240 ntp \
241 socat \
242 "${additional_packages[@]}" \
243 || return
244
245 # install only if available (e.g. Ubuntu Trusty)
246 sudo apt-get install -qq >/dev/null \
247 libsystemd-daemon-dev \
248 libsystemd-journal-dev \
249 || true
250
251 if [ "$TRAVIS_BUILD_STAGE_NAME" = "Coverity" ]; then
252 coverity_install_script
253 return
254 fi
255 }
256
257 function coverity_install_script
258 {
259 local platform=$(uname)
260 local tool_url="https://scan.coverity.com/download/${platform}"
261 local tool_archive="/tmp/cov-analysis-${platform}.tgz"
262
263 echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m"
264 wget -nv -O $tool_archive $tool_url --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN" || return
265
266 echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m"
267 mkdir -p $COVERITY_SCAN_TOOL_BASE
268 pushd $COVERITY_SCAN_TOOL_BASE
269 tar xzf $tool_archive || return
270 popd
271 }
272
273 function osx_install_script
274 {
275 brew update >/dev/null
276
277 brew install gettext ncurses socat xz
278 brew link --force gettext
279 brew link --force ncurses
280
281 OSX_CONFOPTS="
282 --disable-ipcrm \
283 --disable-ipcs \
284 --disable-libmount \
285 "
286
287 # workaround: glibtoolize could not find sed
288 export SED="sed"
289 }
290
291 function osx_prepare_check
292 {
293 [ "$TRAVIS_OS_NAME" = "osx" ] || return 0
294
295 # these ones only need to be gnu for our test-suite
296 brew install coreutils findutils gnu-tar gnu-sed
297
298 # symlink minimally needed gnu commands into PATH
299 mkdir ~/bin
300 for cmd in readlink seq timeout truncate find xargs tar sed; do
301 ln -s /usr/local/bin/g$cmd $HOME/bin/$cmd
302 done
303 hash -r
304
305 export TS_OPT_col_multibyte_known_fail=yes
306 export TS_OPT_colcrt_regressions_known_fail=yes
307 export TS_OPT_column_invalid_multibyte_known_fail=yes
308 }
309
310 function travis_before_script
311 {
312 set -o xtrace
313
314 ./autogen.sh
315 ret=$?
316
317 set +o xtrace
318 return $ret
319 }
320
321 function travis_script
322 {
323 local ret
324
325 # run_coverity should be run before set -o xtrace so as not to expose COVERITY_SCAN_TOKEN
326 if [ "$TRAVIS_BUILD_STAGE_NAME" = "Coverity" ]; then
327 run_coverity
328 return
329 fi
330
331 set -o xtrace
332
333 case "$MAKE_CHECK" in
334 nonroot)
335 check_nonroot
336 ;;
337 root)
338 check_root
339 ;;
340 dist)
341 check_dist
342 ;;
343 *)
344 echo "error, check environment (travis.yml)" >&2
345 false
346 ;;
347 esac
348
349 # We exit here with case-switch return value!
350 ret=$?
351 set +o xtrace
352 return $ret
353 }
354
355 function travis_after_script
356 {
357 local diff_dir
358 local tmp
359
360 # find diff dir from check as well as from distcheck
361 diff_dir=$(find . -type d -name "diff" | grep "tests/diff" | head -n 1)
362 if [ -d "$diff_dir" ]; then
363 tmp=$(find "$diff_dir" -type f | sort)
364 echo -en "dump test diffs:\n${tmp}\n"
365 echo "$tmp" | xargs cat
366 fi
367 }