]> The Tcpdump Group git mirrors - tcpdump/blob - build_common.sh
ntp: always make sure the entire extension field is in the capture.
[tcpdump] / build_common.sh
1 #!/bin/sh -e
2
3 # The only purpose of the above shebang is to orient shellcheck right.
4 # To make CI scripts maintenance simpler, copies of this file in the
5 # libpcap, tcpdump and tcpslice git repositories should be identical.
6 # Please mind that Solaris /bin/sh before 11 does not support the $()
7 # command substitution syntax, hence the "-e SC2006" flag in Makefile.
8
9 # A poor man's mktemp(1) for OSes that don't have one (e.g. AIX 7, Solaris 9).
10 mktempdir_diy() {
11 while true; do
12 # /bin/sh implements $RANDOM in AIX 7, but not in Solaris before 11,
13 # thus use dd and od instead.
14 mktempdir_diy_suffix=`dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -t x -A n | head -1 | tr -d '\t '`
15 [ -z "$mktempdir_diy_suffix" ] && return 1
16 mktempdir_diy_path="${TMPDIR:-/tmp}/${1:?}.${mktempdir_diy_suffix}"
17 # "test -e" would be more appropriate, but it is not available in
18 # Solaris /bin/sh before 11.
19 if [ ! -d "$mktempdir_diy_path" ]; then
20 mkdir "$mktempdir_diy_path"
21 chmod go= "$mktempdir_diy_path"
22 echo "$mktempdir_diy_path"
23 break
24 fi
25 # Try again (very unlikely, just in case).
26 done
27 }
28
29 mktempdir() {
30 mktempdir_prefix=${1:-tmp}
31 case `os_id` in
32 Darwin-*|FreeBSD-*|NetBSD-*)
33 # In these operating systems mktemp(1) always appends an implicit
34 # ".XXXXXXXX" suffix to the requested template when creating a
35 # temporary directory.
36 mktemp -d -t "$mktempdir_prefix"
37 ;;
38 SunOS-5.10|SunOS-5.11)
39 # Although the suffix is optional, specify it for consistent results.
40 mktemp -d -t "${mktempdir_prefix}.XXXXXXXX"
41 ;;
42 SunOS-*|AIX-*)
43 mktempdir_diy "$mktempdir_prefix"
44 ;;
45 *)
46 # At least Haiku, Linux and OpenBSD implementations require explicit
47 # trailing X'es in the template, so make it the same suffix as above.
48 # XXX - is MSYS2 GNU-based, so that it would be like Linux?
49 mktemp -d -t "${mktempdir_prefix}.XXXXXXXX"
50 ;;
51 esac
52 }
53
54 print_sysinfo() {
55 uname -a
56 printf 'OS identification: '
57 os_id
58 date
59 }
60
61 # Try to make the current C compiler print its version information (usually
62 # multi-line) to stdout.
63 cc_version_nocache() {
64 : "${CC:?}"
65 case `basename "$CC"` in
66 gcc*|egcc*|clang*)
67 # GCC and Clang recognize --version, print to stdout and exit with 0.
68 "$CC" --version
69 ;;
70 xl*)
71 # XL C 12.1 and 13.1 recognize "-qversion", print to stdout and exit
72 # with 0. XL C 12.1 on an unknown command-line flag displays its man
73 # page and waits.
74 # XL C 16.1 recognizes "-qversion" and "--version", prints to stdout
75 # and exits with 0. Community Edition also prints a banner to stderr.
76 "$CC" -qversion 2>/dev/null
77 ;;
78 sun*)
79 # Sun compilers recognize -V, print to stderr and exit with an error.
80 "$CC" -V 2>&1 || :
81 ;;
82 cc)
83 case `os_id` in
84 SunOS-*)
85 # Most likely Sun C.
86 "$CC" -V 2>&1 || :
87 ;;
88 Darwin-*)
89 # Most likely Clang.
90 "$CC" --version
91 ;;
92 Linux-*|FreeBSD-*|NetBSD-*|OpenBSD-*)
93 # Most likely Clang or GCC.
94 "$CC" --version
95 ;;
96 esac
97 ;;
98 cl)
99 # Visual Studio's compiler doesn't have a "print the compiler
100 # version" option, but we can get version information by
101 # running it with no options, sending its standard error to
102 # the standard output, and throwing out the usage message;
103 # as we have MSYS2, we can just "head" it out.
104 #
105 # XXX - does it exit with an error?
106 "$CC" 2>&1 | head -2
107 ;;
108 *)
109 "$CC" --version || "$CC" -V || :
110 ;;
111 esac
112 }
113
114 cc_version() {
115 echo "${cc_version_cached:=`cc_version_nocache`}"
116 }
117
118 print_cc_version() {
119 cc_version
120 printf 'Compiler identification: '
121 cc_id
122 }
123
124 # For the current C compiler try to print a short and uniform identification
125 # string (such as "gcc-9.3.0") that is convenient to use in a case statement.
126 cc_id_nocache() {
127 cc_id_firstline=`cc_version | head -1`
128 : "${cc_id_firstline:?}"
129
130 cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.*clang version \([0-9\.]*\).*$/clang-\1/'`
131 if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
132 echo "$cc_id_guessed"
133 return
134 fi
135
136 cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^IBM XL C.*, V\([0-9\.]*\).*$/xlc-\1/'`
137 if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
138 echo "$cc_id_guessed"
139 return
140 fi
141
142 cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* Sun C \([0-9\.]*\) .*$/suncc-\1/'`
143 if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
144 echo "$cc_id_guessed"
145 return
146 fi
147
148 cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^Microsoft (R) C\/C++ Optimizing Compiler Version \([0-9\.]*\) .*$/msvc-\1/'`
149 if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
150 echo "$cc_id_guessed"
151 return
152 fi
153
154 # OpenBSD default GCC:
155 # "gcc (GCC) 4.2.1 20070719"
156 # RedHat GCC:
157 # "gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)"
158 # "gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)"
159 # other GCC packages:
160 # "sparc-sun-solaris2.9-gcc (GCC) 4.2.0 (gccfss)"
161 # "gcc (GCC) 5.5.0"
162 # "gcc (nb4 20200810) 7.5.0"
163 # "gcc (OpenIndiana 7.5.0-il-0) 7.5.0"
164 # "gcc (Debian 8.3.0-6) 8.3.0"
165 # "gcc (Raspbian 8.3.0-6+rpi1) 8.3.0"
166 # "egcc (GCC) 8.4.0"
167 # "gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
168 # "gcc (FreeBSD Ports Collection) 10.3.0"
169 cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* (.*) \([0-9\.]*\).*$/gcc-\1/'`
170 if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
171 echo "$cc_id_guessed"
172 return
173 fi
174 }
175
176 cc_id() {
177 echo "${cc_id_cached:=`cc_id_nocache`}"
178 }
179
180 # Call this function each time CC has changed.
181 discard_cc_cache() {
182 cc_version_cached=
183 cc_id_cached=
184 }
185
186 # For the current C compiler try to print CFLAGS value that tells to treat
187 # warnings as errors.
188 cc_werr_cflags() {
189 case `cc_id` in
190 gcc-*|clang-*)
191 echo '-Werror'
192 ;;
193 xlc-*)
194 # XL C 12.1 and 13.1 recognize "-qhalt=w". XL C 16.1 recognizes that
195 # and "-Werror".
196 echo '-qhalt=w'
197 ;;
198 suncc-*)
199 echo '-errwarn=%all'
200 ;;
201 msvc-*)
202 # XXX - what?
203 echo ''
204 ;;
205 esac
206 }
207
208 # Tell whether "gcc" is a symlink to Clang (this is the case on macOS).
209 gcc_is_clang_in_disguise() {
210 case `cc_id`/`basename "${CC:?}"` in
211 clang-*/gcc)
212 return 0
213 ;;
214 esac
215 return 1
216 }
217
218 os_id() {
219 # OS does not change between builds or in the middle of a build, so it is
220 # fine to cache uname output.
221 : "${os_id_sysname:=`uname -s`}"
222 printf '%s-' "$os_id_sysname"
223 : "${os_id_release:=`uname -r`}"
224 case "$os_id_sysname" in
225 AIX)
226 : "${os_id_version:=`uname -v`}"
227 echo "${os_id_version}.${os_id_release}"
228 ;;
229 Darwin|GNU|OpenBSD|SunOS)
230 echo "$os_id_release"
231 ;;
232 FreeBSD|NetBSD|Linux)
233 # Meaningful version is usually the substring before the first dash.
234 # Or the first underscore.
235 echo "$os_id_release" | sed 's/^\([0-9\.]*\).*$/\1/'
236 ;;
237 Haiku)
238 # Meaningful version is the substring before the plus sign.
239 # "hrev56578" stands for "R1/beta4".
240 # "hrev55181" stands for "R1/beta3".
241 # "hrev54154" stands for "R1/beta2".
242 : "${os_id_version:=`uname -v`}"
243 echo "$os_id_version" | sed 's/^\(hrev.*\)+.*$/\1/'
244 ;;
245 MSYS*)
246 # uname -s produces "MSYS_NT-{NT version?}-{build?}
247 # uname -r produces MSYS2 version?
248 echo "$os_id_version", MSYS "$os_id_release"
249 ;;
250 *)
251 echo 'UNKNOWN'
252 ;;
253 esac
254 }
255
256 increment() {
257 # No arithmetic expansion in Solaris /bin/sh before 11.
258 # shellcheck disable=SC2003
259 expr "${1:?}" + 1
260 }
261
262 # Display text in magenta.
263 echo_magenta() {
264 # ANSI magenta, the imploded text, ANSI reset, newline.
265 printf '\033[35;1m%s\033[0m\n' "$*"
266 }
267
268 # Run a command after displaying it.
269 run_after_echo() {
270 : "${1:?}" # Require at least one argument.
271 printf '$ %s\n' "$*"
272 "$@"
273 }
274
275 print_so_deps() {
276 case `os_id` in
277 Darwin-*)
278 run_after_echo otool -L "${1:?}"
279 ;;
280 Haiku-*)
281 run_after_echo objdump -p "${1:?}"
282 ;;
283 MSYS*)
284 run_after_echo dumpbin /dependents "${1:?}"
285 ;;
286 *)
287 run_after_echo ldd "${1:?}"
288 ;;
289 esac
290 }
291
292 # Beware that setting MATRIX_DEBUG for tcpdump or tcpslice will produce A LOT
293 # of additional output there and in any nested libpcap builds. Multiplied by
294 # the matrix size, the full output log size might exceed limits of some CI
295 # systems (as it had previously happened with Travis CI). Use with caution on
296 # a reduced matrix.
297 handle_matrix_debug() {
298 [ "$MATRIX_DEBUG" != yes ] && return
299 echo '$ cat Makefile [...]'
300 sed '/^# DO NOT DELETE THIS LINE -- mkdep uses it.$/q' <Makefile
301 run_after_echo cat config.h
302 [ "$CMAKE" = yes ] || run_after_echo cat config.log
303 }
304
305 purge_directory() {
306 if [ "`os_id`" = SunOS-5.11 ]; then
307 # In Solaris 11 /bin/sh the pathname expansion of "*" always includes
308 # "." and "..", so the straightforward rm would always fail.
309 (
310 cd "${1:?}"
311 for pd_each in *; do
312 if [ "$pd_each" != . ] && [ "$pd_each" != .. ]; then
313 rm -rf "$pd_each"
314 fi
315 done
316 )
317 else
318 rm -rf "${1:?}"/*
319 fi
320 }
321
322 # vi: set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab autoindent :