]> git.ipfire.org Git - thirdparty/util-linux.git/blob - .travis-functions.sh
travis: install llvm-* to get llvm-symbolizer
[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 # workaround ugly warning on travis OSX,
34 # see https://github.com/direnv/direnv/issues/210
35 shell_session_update() { :; }
36
37 function xconfigure
38 {
39 which "$CC"
40 "$CC" --version
41
42 ./configure "$@" $OSX_CONFOPTS
43 err=$?
44 if [ "$DUMP_CONFIG_LOG" = "short" ]; then
45 grep -B1 -A10000 "^## Output variables" config.log | grep -v "_FALSE="
46 elif [ "$DUMP_CONFIG_LOG" = "full" ]; then
47 cat config.log
48 fi
49 return $err
50 }
51
52 # TODO: integrate checkusage into our regular tests and remove this function
53 function make_checkusage
54 {
55 local tmp
56 # memory leaks are ignored here. See https://github.com/karelzak/util-linux/issues/1077
57 if ! tmp=$(ASAN_OPTIONS="$ASAN_OPTIONS:detect_leaks=0" $MAKE checkusage 2>&1) || test -n "$tmp"; then
58 echo "$tmp"
59 echo "make checkusage failed" >&2
60 return 1
61 fi
62 }
63
64 function check_nonroot
65 {
66 local make_opts="$MAKE_CHECK_OPTS --show-diff --parsable"
67 local conf_opts="\
68 --disable-use-tty-group \
69 --disable-makeinstall-chown \
70 --enable-all-programs"
71
72 if [ "$TRAVIS_OS_NAME" != "osx" ]; then
73 conf_opts="$conf_opts --enable-asan --enable-ubsan"
74 make_opts="$make_opts --memcheck-asan --memcheck-ubsan"
75 fi
76
77 xconfigure $conf_opts || return
78 $MAKE || return
79
80 osx_prepare_check
81
82 # TESTS_* overwrites default from tests/Makemodule.am
83 $MAKE check TESTS_OPTIONS="$make_opts" || return
84
85 make_checkusage || return
86
87 $MAKE install DESTDIR=/tmp/dest || return
88 }
89
90 function check_root
91 {
92 local make_opts="$MAKE_CHECK_OPTS --show-diff"
93 local conf_opts="--enable-all-programs"
94
95 if [ "$TRAVIS_OS_NAME" != "osx" ]; then
96 conf_opts="$conf_opts --enable-asan --enable-ubsan"
97 make_opts="$make_opts --memcheck-asan --memcheck-ubsan"
98 fi
99
100 xconfigure $conf_opts || return
101 $MAKE || return
102
103 # compile tests only
104 $MAKE check-programs || return
105
106 # Modify environment for OSX
107 osx_prepare_check
108
109 # TESTS_* overwrites default from tests/Makemodule.am
110 sudo -E $MAKE check TESTS_PARALLEL="" TESTS_OPTIONS="$make_opts" || return
111
112 # root on osx has not enough permission for make install ;)
113 [ "$TRAVIS_OS_NAME" = "osx" ] && return
114
115 # keep PATH to make sure sudo would find $CC
116 sudo env "PATH=$PATH" $MAKE install || return
117 }
118
119 function check_dist
120 {
121 xconfigure \
122 || return
123 $MAKE distcheck || return
124 }
125
126 function travis_install_script
127 {
128 local ubuntu_release=$(lsb_release -cs)
129 local additional_packages=()
130 local clang_version gcc_version
131
132 if [ "$TRAVIS_OS_NAME" = "osx" ]; then
133 osx_install_script
134 return
135 fi
136
137 # install required packages
138 sudo bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ $ubuntu_release main restricted universe multiverse' >>/etc/apt/sources.list"
139
140 if [[ "$CC" =~ ^clang-([0-9]+)$ ]]; then
141 clang_version=${BASH_REMATCH[1]}
142 # the following snippet was borrowed from https://apt.llvm.org/llvm.sh
143 wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
144 sudo add-apt-repository -y "deb http://apt.llvm.org/$ubuntu_release/ llvm-toolchain-$ubuntu_release-$clang_version main"
145 additional_packages+=(clang-$clang_version llvm-$clang_version)
146 elif [[ "$CC" =~ ^gcc-([0-9]+)$ ]]; then
147 gcc_version=${BASH_REMATCH[1]}
148 sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
149 additional_packages+=(gcc-$gcc_version)
150 fi
151
152 sudo apt-get -qq update --fix-missing
153 sudo apt-get build-dep -y util-linux
154 sudo apt-get install -qq >/dev/null \
155 bc \
156 btrfs-tools \
157 dnsutils \
158 libcap-ng-dev \
159 libncursesw5-dev \
160 libpam-dev \
161 libudev-dev \
162 gtk-doc-tools \
163 mdadm \
164 ntp \
165 socat \
166 "${additional_packages[@]}" \
167 || return
168
169 # install only if available (e.g. Ubuntu Trusty)
170 sudo apt-get install -qq >/dev/null \
171 libsystemd-daemon-dev \
172 libsystemd-journal-dev \
173 || true
174 }
175
176 function osx_install_script
177 {
178 brew update >/dev/null
179
180 brew install gettext ncurses socat xz
181 brew link --force gettext
182 brew link --force ncurses
183
184 OSX_CONFOPTS="
185 --disable-ipcrm \
186 --disable-ipcs \
187 "
188
189 # workaround: glibtoolize could not find sed
190 export SED="sed"
191 }
192
193 function osx_prepare_check
194 {
195 [ "$TRAVIS_OS_NAME" = "osx" ] || return 0
196
197 # these ones only need to be gnu for our test-suite
198 brew install coreutils findutils gnu-tar gnu-sed
199
200 # symlink minimally needed gnu commands into PATH
201 mkdir ~/bin
202 for cmd in readlink seq timeout truncate find xargs tar sed; do
203 ln -s /usr/local/bin/g$cmd $HOME/bin/$cmd
204 done
205 hash -r
206
207 export TS_OPT_col_multibyte_known_fail=yes
208 export TS_OPT_colcrt_regressions_known_fail=yes
209 export TS_OPT_column_invalid_multibyte_known_fail=yes
210 }
211
212 function travis_before_script
213 {
214 set -o xtrace
215
216 ./autogen.sh
217 ret=$?
218
219 set +o xtrace
220 return $ret
221 }
222
223 function travis_script
224 {
225 local ret
226 set -o xtrace
227
228 case "$MAKE_CHECK" in
229 nonroot)
230 check_nonroot
231 ;;
232 root)
233 check_root
234 ;;
235 dist)
236 check_dist
237 ;;
238 *)
239 echo "error, check environment (travis.yml)" >&2
240 false
241 ;;
242 esac
243
244 # We exit here with case-switch return value!
245 ret=$?
246 set +o xtrace
247 return $ret
248 }
249
250 function travis_after_script
251 {
252 local diff_dir
253 local tmp
254
255 # find diff dir from check as well as from distcheck
256 diff_dir=$(find . -type d -name "diff" | grep "tests/diff" | head -n 1)
257 if [ -d "$diff_dir" ]; then
258 tmp=$(find "$diff_dir" -type f | sort)
259 echo -en "dump test diffs:\n${tmp}\n"
260 echo "$tmp" | xargs cat
261 fi
262 }