4 # .travis-functions.sh:
5 # - helper functions to be sourced from .travis.yml
6 # - designed to respect travis' environment but testing locally is possible
10 # TS_OPT_<name>_<something>=yes
11 # - forces tests/functions.sh:ts_has_option() to return "yes" for
12 # variable <something> in test <name>
17 # - overwrites default from tests/Makemodule.am
19 # Do not use TS_* prefix for any travis or build-system stuff. This prefix is
20 # exclusively used by tests/ stuff.
23 if [ ! -f "configure.ac" ]; then
24 echo ".travis-functions.sh must be sourced from source dir" >&2
28 ## some config settings
29 # travis docs say we get 1.5 CPUs
31 DUMP_CONFIG_LOG
="short"
33 # Coverity-related settings
34 COVERITY_SCAN_TOOL_BASE
="/tmp/coverity-scan-analysis"
35 COVERITY_SCAN_PROJECT_NAME
="karelzak/util-linux"
37 # workaround ugly warning on travis OSX,
38 # see https://github.com/direnv/direnv/issues/210
39 shell_session_update
() { :; }
43 local gcc_version clang_version cxx
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
56 elif [[ "$CC" == "gcc" ]]; then
63 CC
=$CC CXX
=$cxx .
/configure
"$@" $OSX_CONFOPTS
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
73 # TODO: integrate checkusage into our regular tests and remove this function
74 function make_checkusage
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
80 echo "make checkusage failed" >&2
85 function check_nonroot
87 local make_opts
="$MAKE_CHECK_OPTS --show-diff --parsable"
89 --disable-use-tty-group \
90 --disable-makeinstall-chown \
91 --enable-all-programs"
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"
98 if [ "$TRAVIS_OS_NAME" != "osx" -a "$TRAVIS_DIST" != "precise" ]; then
99 conf_opts
="$conf_opts --enable-werror"
102 if [[ "$CC" =~
"clang" ]]; then
103 conf_opts
="$conf_opts --enable-fuzzing-engine"
106 xconfigure
$conf_opts ||
return
111 # TESTS_* overwrites default from tests/Makemodule.am
112 $MAKE check TESTS_OPTIONS
="$make_opts" ||
return
114 make_checkusage ||
return
116 $MAKE install DESTDIR
=/tmp
/dest ||
return
121 local make_opts
="$MAKE_CHECK_OPTS --show-diff"
122 local conf_opts
="--enable-all-programs"
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"
129 if [ "$TRAVIS_OS_NAME" != "osx" -a "$TRAVIS_DIST" != "precise" ]; then
130 conf_opts
="$conf_opts --enable-werror"
133 if [[ "$CC" =~
"clang" ]]; then
134 conf_opts
="$conf_opts --enable-fuzzing-engine"
137 xconfigure
$conf_opts ||
return
141 $MAKE check-programs ||
return
143 # Modify environment for OSX
146 # TESTS_* overwrites default from tests/Makemodule.am
147 sudo
-E $MAKE check TESTS_PARALLEL
="" TESTS_OPTIONS
="$make_opts" ||
return
149 # root on osx has not enough permission for make install ;)
150 [ "$TRAVIS_OS_NAME" = "osx" ] && return
152 # keep PATH to make sure sudo would find $CC
153 sudo env
"PATH=$PATH" $MAKE install ||
return
156 function run_coverity
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
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
170 echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m"
171 tar czf
$results_archive $results_dir ||
return
173 echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m"
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"
190 echo -e "\n\033[33;1mCoverity Scan Analysis completed successfully.\033[0m"
197 $MAKE distcheck ||
return
200 function travis_install_script
203 local additional_packages
=()
204 local clang_version gcc_version
206 if [ "$TRAVIS_OS_NAME" = "osx" ]; then
211 ubuntu_release
=$
(lsb_release
-cs)
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"
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)
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 \
242 "${additional_packages[@]}" \
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 \
251 if [ "$TRAVIS_BUILD_STAGE_NAME" = "Coverity" ]; then
252 coverity_install_script
257 function coverity_install_script
259 local platform
=$
(uname
)
260 local tool_url
="https://scan.coverity.com/download/${platform}"
261 local tool_archive
="/tmp/cov-analysis-${platform}.tgz"
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
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
273 function osx_install_script
275 brew update
>/dev
/null
277 brew
install gettext ncurses socat xz
278 brew link
--force gettext
279 brew link
--force ncurses
287 # workaround: glibtoolize could not find sed
291 function osx_prepare_check
293 [ "$TRAVIS_OS_NAME" = "osx" ] ||
return 0
295 # these ones only need to be gnu for our test-suite
296 brew
install coreutils findutils gnu-tar gnu-sed
298 # symlink minimally needed gnu commands into PATH
300 for cmd
in readlink
seq timeout truncate
find xargs tar sed; do
301 ln -s /usr
/local
/bin
/g
$cmd $HOME/bin
/$cmd
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
310 function travis_before_script
321 function travis_script
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
333 case "$MAKE_CHECK" in
344 echo "error, check environment (travis.yml)" >&2
349 # We exit here with case-switch return value!
355 function travis_after_script
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