Work around some build issues on AIX.
authorDenis Ovsienko <denis@ovsienko.info>
Sat, 17 Jul 2021 00:48:17 +0000 (01:48 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Sat, 17 Jul 2021 01:00:21 +0000 (02:00 +0100)
tar does not support the "z" flag, make does not support the "-C" flag,
mktemp(1) does not exist, XL C has some specifics with version printing.
Accommodate these quirks and get build_matrix.sh to work on AIX 7.1:

M4='/opt/freeware/bin/m4' MATRIX_CC='xlc gcc' ./build_matrix.sh
[...]
Tested setup count: 4

gcc (GCC) 8.3.0
IBM XL C/C++ for AIX, V12.1
libpcap version 1.11.0-PRE-GIT
libpcap version aix0.9.8

CHANGES
Makefile.in
build_common.sh
build_matrix.sh

diff --git a/CHANGES b/CHANGES
index c30417e50fac1048a332fb8f5ddb100d6303d15d..393924c88974b26184f0b46c2e22345b9632b1e8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,8 @@ v1.5 ...
 
 - Handle some build errors better.
 
+- Work around some build issues on AIX.
+
 v1.4 Tue 15 Jun 08:30:11 BST 2021
 
 - Install into bindir, not sbindir.
index d7f7f7954333f092f69a2d0cc8faf8e9d7383ac9..1fd9fca3f56236a8f3bc86ab970fa190c9116bb1 100644 (file)
@@ -169,11 +169,12 @@ tags: $(TAGFILES)
 TAGS: $(TAGFILES)
        etags $(TAGFILES)
 
+# AIX tar does not support "z", so use a pipe for gzip.
 releasetar:
        @name=$(PROG)-`cat VERSION` ; \
           mkdir $$name && \
           tar cf - $(CSRC) $(HDR) $(EXTRA_DIST) | (cd $$name; tar xf -) && \
-          tar -c -z -f $$name.tar.gz $$name && \
+          tar cf - $$name | gzip >$$name.tar.gz && \
           rm -rf $$name
 
 depend: $(GENSRC)
index 817e30c642716a71c861647987202b6727d94a74..3d3c8276ea1eb17386720ac6da1c7e4182f132bb 100644 (file)
@@ -10,14 +10,33 @@ mktempdir() {
         # 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)
+        # A poor man's mktemp(1) because AIX does not have one.
+        mktempdir_prefix=${TMPDIR:-/tmp}/${mktempdir_prefix}
+        while true; do
+            mktempdir_suffix='.'
+            for xx in XX XX XX XX; do
+                # /bin/sh implements RANDOM in AIX.
+                # shellcheck disable=SC2039
+                xx=$(printf '%02x' $((RANDOM % 256)))
+                mktempdir_suffix="${mktempdir_suffix}${xx}"
+            done
+            if ! [ -e "${mktempdir_prefix}${mktempdir_suffix}" ]; then
+                mkdir -p "${mktempdir_prefix}${mktempdir_suffix}"
+                chmod go= "${mktempdir_prefix}${mktempdir_suffix}"
+                echo "${mktempdir_prefix}${mktempdir_suffix}"
+                break
+            fi
+        done
         ;;
     *)
         # At least Linux and OpenBSD implementations require explicit trailing
         # X'es in the template, so make it the same suffix as above.
-        mktempdir_prefix="${mktempdir_prefix}.XXXXXXXX"
+        mktemp -d -t "${mktempdir_prefix}.XXXXXXXX"
         ;;
     esac
-    mktemp -d -t "$mktempdir_prefix"
 }
 
 print_sysinfo() {
@@ -27,8 +46,20 @@ print_sysinfo() {
 
 print_cc_version() {
     # GCC and Clang recognize --version and print to stdout. Sun compilers
-    # recognize -V and print to stderr.
-    "$CC" --version 2>/dev/null || "$CC" -V || :
+    # recognize -V and print to stderr. XL C for AIX recognizes -qversion
+    # and prints to stdout, but on an unknown command-line flag displays its
+    # man page and waits.
+    case $(basename "$CC") in
+    gcc*|clang*)
+        "$CC" --version
+        ;;
+    xl*)
+        "$CC" -qversion
+        ;;
+    *)
+        "$CC" --version || "$CC" -V || :
+        ;;
+    esac
 }
 
 # Display text in magenta.
index a58bfde5d84b1dfd73ae6dc0126d925789601a43..b9ace17c7a4bb7401e1bc4fab61e3e9cb1c7185f 100755 (executable)
@@ -35,7 +35,7 @@ for CC in $MATRIX_CC; do
             echo_magenta 'Use system libpcap'
             rm -rf "${PREFIX:?}"/*
             if [ -d ../libpcap ]; then
-                make -C ../libpcap distclean || echo '(Ignoring the make error.)'
+                (cd ../libpcap; make distclean || echo '(Ignoring the make error.)')
             fi
         fi
         # Run one build with the setup environment variable: CC