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