#!/bin/sh -e # The only purpose of the above shebang is to orient shellcheck right. # To make CI scripts maintenance simpler, copies of this file in the # libpcap, tcpdump and tcpslice git repositories should be identical. # Please mind that Solaris /bin/sh before 11 does not support the $() # command substitution syntax, hence the SC2006 directives. # A poor man's mktemp(1) for OSes that don't have one (e.g. AIX 7, Solaris 9). mktempdir_diy() { while true; do # /bin/sh implements $RANDOM in AIX 7, but not in Solaris before 11, # thus use dd and od instead. # shellcheck disable=SC2006 mktempdir_diy_suffix=`dd if=/dev/urandom bs=1 count=4 2>/dev/null | od -t x -A n | head -1 | tr -d '\t '` [ -z "$mktempdir_diy_suffix" ] && return 1 mktempdir_diy_path="${TMPDIR:-/tmp}/${1:?}.${mktempdir_diy_suffix}" # "test -e" would be more appropriate, but it is not available in # Solaris /bin/sh before 11. if [ ! -d "$mktempdir_diy_path" ]; then mkdir "$mktempdir_diy_path" chmod go= "$mktempdir_diy_path" echo "$mktempdir_diy_path" break fi # Try again (AIX /dev/urandom returns zeroes quite often). done } mktempdir() { mktempdir_prefix=${1:-tmp} # shellcheck disable=SC2006 case `uname -s` in Darwin|FreeBSD|NetBSD) # In these operating systems mktemp(1) always appends an implicit # ".XXXXXXXX" suffix to the requested template when creating a # temporary directory. mktemp -d -t "$mktempdir_prefix" ;; AIX) mktempdir_diy "$mktempdir_prefix" ;; SunOS) # shellcheck disable=SC2006 case `uname -r` in 5.10|5.11) mktemp -d -t "${mktempdir_prefix}.XXXXXXXX" ;; *) mktempdir_diy "$mktempdir_prefix" ;; esac ;; *) # At least Linux and OpenBSD implementations require explicit trailing # X'es in the template, so make it the same suffix as above. mktemp -d -t "${mktempdir_prefix}.XXXXXXXX" ;; esac } print_sysinfo() { uname -a date } # Try to make the current C compiler print its version information (usually # multi-line) to stdout. # shellcheck disable=SC2006 print_cc_version() { case `basename "$CC"` in gcc*|egcc*|clang*) # GCC and Clang recognize --version, print to stdout and exit with 0. "$CC" --version ;; xl*) # XL C 12.1 and 13.1 recognize "-qversion", print to stdout and exit # with 0. XL C 12.1 on an unknown command-line flag displays its man # page and waits. # XL C 16.1 recognizes "-qversion" and "--version", prints to stdout # and exits with 0. Community Edition also prints a banner to stderr. "$CC" -qversion 2>/dev/null ;; sun*) # Sun compilers recognize -V, print to stderr and exit with an error. "$CC" -V 2>&1 || : ;; cc) case `uname -s` in SunOS) # Most likely Sun C. "$CC" -V 2>&1 || : ;; Darwin) # Most likely Clang. "$CC" --version ;; Linux|FreeBSD|NetBSD|OpenBSD) # Most likely Clang or GCC. "$CC" --version ;; esac ;; *) "$CC" --version || "$CC" -V || : ;; esac } # For the current C compiler try to print a short and uniform identification # string (such as "gcc-9.3.0") that is convenient to use in a case statement. # shellcheck disable=SC2006 cc_id() { cc_id_firstline=`print_cc_version | head -1` cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.*clang version \([0-9\.]*\).*$/clang-\1/'` if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then echo "$cc_id_guessed" return fi cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^IBM XL C.*, V\([0-9\.]*\).*$/xlc-\1/'` if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then echo "$cc_id_guessed" return fi cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* Sun C \([0-9\.]*\) .*$/suncc-\1/'` if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then echo "$cc_id_guessed" return fi cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.* (.*) \([0-9\.]*\)$/gcc-\1/'` if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then echo "$cc_id_guessed" return fi } # For the current C compiler try to print CFLAGS value that tells to treat # warnings as errors. # shellcheck disable=SC2006 cc_werr_cflags() { case `cc_id` in gcc-*|clang-*) echo '-Werror' ;; xlc-*) # XL C 12.1 and 13.1 recognize "-qhalt=w". XL C 16.1 recognizes that # and "-Werror". echo '-qhalt=w' ;; suncc-*) echo '-errwarn=%all' ;; esac } increment() { # No arithmetic expansion in Solaris /bin/sh before 11. echo "${1:?} + 1" | bc } # Display text in magenta. echo_magenta() { # ANSI magenta, the imploded text, ANSI reset, newline. printf '\033[35;1m%s\033[0m\n' "$*" } # Run a command after displaying it. run_after_echo() { : "${1:?}" # Require at least one argument. printf '$ %s\n' "$*" "$@" } print_so_deps() { # shellcheck disable=SC2006 case `uname -s` in Darwin) run_after_echo otool -L "${1:?}" ;; *) run_after_echo ldd "${1:?}" ;; esac } # Beware that setting MATRIX_DEBUG for tcpdump or tcpslice will produce A LOT # of additional output there and in any nested libpcap builds. Multiplied by # the matrix size, the full output log size might exceed limits of some CI # systems (as it had previously happened with Travis CI). Use with caution on # a reduced matrix. handle_matrix_debug() { [ "$MATRIX_DEBUG" != yes ] && return echo '$ cat Makefile [...]' sed '/^# DO NOT DELETE THIS LINE -- mkdep uses it.$/q'