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