summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Ovsienko <denis@ovsienko.info>2021-07-30 09:44:04 +0100
committerDenis Ovsienko <denis@ovsienko.info>2021-07-30 10:33:35 +0100
commit9b40c0b7675a2f361dc8cfdb01abeba1cb32092c (patch)
tree4b6f0a74adf4ee6c26b64664d90edef24cff6a86
parent00353f9e1ae70b45e68d9025ed58949c9653f677 (diff)
downloadtcpdump-9b40c0b7675a2f361dc8cfdb01abeba1cb32092c.tar.gz
CI: Port recent improvements from tcpslice. [skip appveyor]
Introduce TCPDUMP_TAINTED, improve OS and compiler identification, print matrix progress to stderr.
-rwxr-xr-xbuild.sh7
-rw-r--r--build_common.sh103
-rwxr-xr-xbuild_matrix.sh20
3 files changed, 94 insertions, 36 deletions
diff --git a/build.sh b/build.sh
index 87701dd0..7d8e2406 100755
--- a/build.sh
+++ b/build.sh
@@ -9,6 +9,7 @@
: "${CMAKE:=no}"
: "${CRYPTO:=no}"
: "${SMB:=no}"
+: "${TCPDUMP_TAINTED:=no}"
. ./build_common.sh
# Install directory prefix
@@ -53,11 +54,7 @@ run_after_echo make -s clean
# these cases, please remember to raise the bar here so if the warnings appear
# again, it will trigger an error.
# shellcheck disable=SC2006
-case `uname -s` in
- *)
- CFLAGS=`cc_werr_cflags`
- ;;
-esac
+[ "$TCPDUMP_TAINTED" != yes ] && CFLAGS=`cc_werr_cflags`
run_after_echo make -s ${CFLAGS:+CFLAGS="$CFLAGS"}
run_after_echo make install
print_so_deps "$TCPDUMP_BIN"
diff --git a/build_common.sh b/build_common.sh
index 8ace59e4..a803957a 100644
--- a/build_common.sh
+++ b/build_common.sh
@@ -30,26 +30,19 @@ mktempdir_diy() {
mktempdir() {
mktempdir_prefix=${1:-tmp}
# shellcheck disable=SC2006
- case `uname -s` in
- Darwin|FreeBSD|NetBSD)
+ case `os_id` 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-5.10|SunOS-5.11)
+ # Although the suffix is optional, specify it for consistent results.
+ mktemp -d -t "${mktempdir_prefix}.XXXXXXXX"
;;
- SunOS)
- # shellcheck disable=SC2006
- case `uname -r` in
- 5.10|5.11)
- mktemp -d -t "${mktempdir_prefix}.XXXXXXXX"
- ;;
- *)
- mktempdir_diy "$mktempdir_prefix"
- ;;
- esac
+ SunOS-*|AIX-*)
+ mktempdir_diy "$mktempdir_prefix"
;;
*)
# At least Linux and OpenBSD implementations require explicit trailing
@@ -61,13 +54,16 @@ mktempdir() {
print_sysinfo() {
uname -a
+ printf 'OS identification: '
+ os_id
date
}
# Try to make the current C compiler print its version information (usually
# multi-line) to stdout.
# shellcheck disable=SC2006
-print_cc_version() {
+cc_version_nocache() {
+ : "${CC:?}"
case `basename "$CC"` in
gcc*|egcc*|clang*)
# GCC and Clang recognize --version, print to stdout and exit with 0.
@@ -86,16 +82,16 @@ print_cc_version() {
"$CC" -V 2>&1 || :
;;
cc)
- case `uname -s` in
- SunOS)
+ case `os_id` in
+ SunOS-*)
# Most likely Sun C.
"$CC" -V 2>&1 || :
;;
- Darwin)
+ Darwin-*)
# Most likely Clang.
"$CC" --version
;;
- Linux|FreeBSD|NetBSD|OpenBSD)
+ Linux-*|FreeBSD-*|NetBSD-*|OpenBSD-*)
# Most likely Clang or GCC.
"$CC" --version
;;
@@ -107,11 +103,23 @@ print_cc_version() {
esac
}
+# shellcheck disable=SC2006
+cc_version() {
+ echo "${cc_version_cached:=`cc_version_nocache`}"
+}
+
+print_cc_version() {
+ cc_version
+ printf 'Compiler identification: '
+ cc_id
+}
+
# 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_nocache() {
+ cc_id_firstline=`cc_version | head -1`
+ : "${cc_id_firstline:?}"
cc_id_guessed=`echo "$cc_id_firstline" | sed 's/^.*clang version \([0-9\.]*\).*$/clang-\1/'`
if [ "$cc_id_firstline" != "$cc_id_guessed" ]; then
@@ -138,6 +146,17 @@ cc_id() {
fi
}
+# shellcheck disable=SC2006
+cc_id() {
+ echo "${cc_id_cached:=`cc_id_nocache`}"
+}
+
+# Call this function each time CC has changed.
+discard_cc_cache() {
+ cc_version_cached=
+ cc_id_cached=
+}
+
# For the current C compiler try to print CFLAGS value that tells to treat
# warnings as errors.
# shellcheck disable=SC2006
@@ -157,6 +176,42 @@ cc_werr_cflags() {
esac
}
+# Tell whether "gcc" is a symlink to Clang (this is the case on macOS).
+# shellcheck disable=SC2006
+gcc_is_clang_in_disguise() {
+ case `cc_id`/`basename "${CC:?}"` in
+ clang-*/gcc)
+ return 0
+ ;;
+ esac
+ return 1
+}
+
+# shellcheck disable=SC2006
+os_id() {
+ # OS does not change between builds or in the middle of a build, so it is
+ # fine to cache uname output.
+ : "${os_id_sysname:=`uname -s`}"
+ printf '%s-' "$os_id_sysname"
+ : "${os_id_release:=`uname -r`}"
+ case "$os_id_sysname" in
+ AIX)
+ : "${os_id_version:=`uname -v`}"
+ echo "${os_id_version}.${os_id_release}"
+ ;;
+ Darwin|NetBSD|OpenBSD|SunOS)
+ echo "$os_id_release"
+ ;;
+ FreeBSD|Linux)
+ # Meaningful version is usually the substring before the first dash.
+ echo "$os_id_release" | sed 's/^\([0-9\.]*\).*$/\1/'
+ ;;
+ *)
+ echo 'UNKNOWN'
+ ;;
+ esac
+}
+
increment() {
# No arithmetic expansion in Solaris /bin/sh before 11.
echo "${1:?} + 1" | bc
@@ -177,8 +232,8 @@ run_after_echo() {
print_so_deps() {
# shellcheck disable=SC2006
- case `uname -s` in
- Darwin)
+ case `os_id` in
+ Darwin-*)
run_after_echo otool -L "${1:?}"
;;
*)
@@ -202,7 +257,7 @@ handle_matrix_debug() {
purge_directory() {
# shellcheck disable=SC2006
- if [ "`uname -s`" = SunOS ] && [ "`uname -r`" = 5.11 ]; then
+ if [ "`os_id`" = SunOS-5.11 ]; then
# In Solaris 11 /bin/sh the pathname expansion of "*" always includes
# "." and "..", so the straightforward rm would always fail.
(
diff --git a/build_matrix.sh b/build_matrix.sh
index 8d13fcff..c5f699a0 100755
--- a/build_matrix.sh
+++ b/build_matrix.sh
@@ -13,6 +13,12 @@
: "${MATRIX_CMAKE:=no yes}"
: "${MATRIX_CRYPTO:=no yes}"
: "${MATRIX_SMB:=no yes}"
+# Set this variable to "yes" before calling this script to disregard all
+# warnings in a particular environment (CI or a local working copy). Set it
+# to "yes" in this script or in build.sh when a matrix subset is known to be
+# not warning-free because of the OS, the compiler or whatever other factor
+# that the scripts can detect both in and out of CI.
+: "${TCPDUMP_TAINTED:=no}"
. ./build_common.sh
print_sysinfo
@@ -24,6 +30,7 @@ if [ -z "$PREFIX" ]; then
export PREFIX
fi
COUNT=0
+export TCPDUMP_TAINTED
build_tcpdump() {
for CMAKE in $MATRIX_CMAKE; do
@@ -34,7 +41,7 @@ build_tcpdump() {
export SMB
# shellcheck disable=SC2006
COUNT=`increment $COUNT`
- echo_magenta "===== SETUP $COUNT: BUILD_LIBPCAP=$BUILD_LIBPCAP REMOTE=${REMOTE:-?} CC=$CC CMAKE=$CMAKE CRYPTO=$CRYPTO SMB=$SMB ====="
+ echo_magenta "===== SETUP $COUNT: BUILD_LIBPCAP=$BUILD_LIBPCAP REMOTE=${REMOTE:-?} CC=$CC CMAKE=$CMAKE CRYPTO=$CRYPTO SMB=$SMB =====" >&2
# Run one build with setup environment variables:
# BUILD_LIBPCAP, REMOTE, CC, CMAKE, CRYPTO and SMB
run_after_echo ./build.sh
@@ -56,9 +63,8 @@ build_tcpdump() {
touch .devel configure
for CC in $MATRIX_CC; do
export CC
- # Exclude gcc on macOS (it is just an alias for clang).
- # shellcheck disable=SC2006
- if [ "$CC" = gcc ] && [ "`uname -s`" = Darwin ]; then
+ discard_cc_cache
+ if gcc_is_clang_in_disguise; then
echo '(skipped)'
continue
fi
@@ -68,7 +74,7 @@ for CC in $MATRIX_CC; do
for REMOTE in $MATRIX_REMOTE; do
export REMOTE
# Build libpcap with Autoconf.
- echo_magenta "Build libpcap (CMAKE=no REMOTE=$REMOTE)"
+ echo_magenta "Build libpcap (CMAKE=no REMOTE=$REMOTE)" >&2
(cd ../libpcap && CMAKE=no ./build.sh)
# Set PKG_CONFIG_PATH for configure when building libpcap
if [ "$CMAKE" != no ]; then
@@ -78,7 +84,7 @@ for CC in $MATRIX_CC; do
build_tcpdump
done
else
- echo_magenta 'Use system libpcap'
+ echo_magenta 'Use system libpcap' >&2
purge_directory "$PREFIX"
(cd ../libpcap; make distclean || echo '(Ignoring the make error.)')
build_tcpdump
@@ -87,5 +93,5 @@ for CC in $MATRIX_CC; do
done
run_after_echo rm -rf "$PREFIX"
-echo_magenta "Tested setup count: $COUNT"
+echo_magenta "Tested setup count: $COUNT" >&2
# vi: set tabstop=4 softtabstop=0 expandtab shiftwidth=4 smarttab autoindent :