diff options
Diffstat (limited to 'build_common.sh')
-rw-r--r-- | build_common.sh | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/build_common.sh b/build_common.sh new file mode 100644 index 00000000..0209806e --- /dev/null +++ b/build_common.sh @@ -0,0 +1,149 @@ +#!/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 +} + +print_cc_version() { + # shellcheck disable=SC2006 + case `basename "$CC"` in + gcc*|clang*) + # GCC and Clang recognize --version, print to stdout and exit with 0. + "$CC" --version + ;; + xl*) + # XL C for AIX recognizes -qversion, prints to stdout and exits with 0, + # but on an unknown command-line flag displays its man page and waits. + "$CC" -qversion + ;; + sun*) + # Sun compilers recognize -V, print to stderr and exit with an error. + "$CC" -V 2>&1 || : + ;; + *) + "$CC" --version || "$CC" -V || : + ;; + 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() { + 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' <Makefile + run_after_echo cat config.h + [ "$CMAKE" = yes ] || run_after_echo cat config.log +} + +purge_directory() { + # shellcheck disable=SC2006 + if [ "`uname -s`" = SunOS ] && [ "`uname -r`" = 5.11 ]; then + # In Solaris 11 /bin/sh the pathname expansion of "*" always includes + # "." and "..", so the straightforward rm would always fail. + ( + cd "${1:?}" + for pd_each in *; do + if [ "$pd_each" != . ] && [ "$pd_each" != .. ]; then + rm -rf "$pd_each" + fi + done + ) + else + rm -rf "${1:?}"/* + fi +} + +# vi: set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab autoindent : |