]> diplodocus.org Git - nmh/commitdiff
More enhancements to build_nmh.
authorDavid Levine <levinedl@acm.org>
Mon, 24 Oct 2016 16:58:04 +0000 (12:58 -0400)
committerDavid Levine <levinedl@acm.org>
Mon, 24 Oct 2016 16:58:13 +0000 (12:58 -0400)
1) Display failure messages that were hidden.
2) Display location of log file at end, if not in current directory,
   the build failed, or verbose was enabled.
3) Replaced use of showbuildenv with less invasive platform info.
4) Don't colorize tests summary if TERM is unset or dumb.

docs/contrib/build_nmh

index fc871f8..90e733a 100755 (executable)
 #        see docs/README.developers
 #     -r to build rpm
 #
 #        see docs/README.developers
 #     -r to build rpm
 #
-# On Fedora, at least these rpms must be installed:
-#   gdbm-devel
-#   ncurses-devel
-#   cyrus-sasl-devel, if using sasl
-#   openssl-devel, if using TLS
-#   libcurl-devel, if using oauth
-#   autoconf and automake, with -s (see docs/README.developers for versions)
-#   rpm-build, with -r
+# To disable colorization of the test summary, either unset the TERM
+# environment variable or set it to dumb, e.g., TERM=dumb build_nmh.
+#
+# See the nmh MACHINES file for build prerequisites.  In addition, the rpmbuild
+# is required to be available if the -r option is used.
 
 usage="usage: $0
   [-b <branch>, only if downloading]
 
 usage="usage: $0
   [-b <branch>, only if downloading]
@@ -60,6 +57,9 @@ usage="usage: $0
 
 #### Exit with error message.
 die() {
 
 #### Exit with error message.
 die() {
+  status=1
+  exec 1>&3 3>&- 2>&4 4>&-
+  cat "$tmpfile" 1>&2
   echo "$0: $*" 1>&2
   exit 1
 }
   echo "$0: $*" 1>&2
   exit 1
 }
@@ -76,10 +76,22 @@ finddir() {
   esac
 }
 
   esac
 }
 
+#### Make sure user sees error output even on early termination.  Assumes
+#### that called programs exit with non-zero status when terminated.
+cleanup() {
+  if [ $status -eq 0 ]; then
+    rm -f "$tmpfile"
+  else
+    [ $logfile = - ] && cat "$tmpfile" 1>&3 || mv "$tmpfile" "$logfile"
+  fi
+}
+trap cleanup EXIT
+
+directory=
 gitrepo=git.savannah.nongnu.org
 invocation="$0 $*"
 tmpfile=/tmp/build_nmh-$$.log
 gitrepo=git.savannah.nongnu.org
 invocation="$0 $*"
 tmpfile=/tmp/build_nmh-$$.log
-trap 'rm -f "$tmpfile"' EXIT
+
 
 ####
 #### Interpret command arguments.
 
 ####
 #### Interpret command arguments.
@@ -113,7 +125,7 @@ shift `expr $OPTIND - 1`
 #### Redirect all output to tmp file.  Then at end of script, copy
 #### it to either logfile or stdout.  Also, grep it for errors and
 #### warnings.
 #### Redirect all output to tmp file.  Then at end of script, copy
 #### it to either logfile or stdout.  Also, grep it for errors and
 #### warnings.
-exec 3>&1 >"$tmpfile" 2>&1
+exec 3>&1 4>&2 >"$tmpfile" 2>&1
 
 echo "$invocation"
 
 
 echo "$invocation"
 
@@ -125,14 +137,16 @@ if grep 'the authors of nmh' COPYRIGHT >/dev/null 2>&1; then
   :
 else
   #### Download sources from repo.
   :
 else
   #### Download sources from repo.
+  [ $verbose -ge 1 ]  &&  echo downloading . . . >&3
   gitdir=`finddir git`
   if [ "$gitdir" ]; then
     #### Use git repo.
     [ "$verbose" -eq 0 ]  &&  git_opts=--quiet
     [ "$branch" == master ]  ||
       git_opts="${git_opts:+$git_opts }--branch $branch"
   gitdir=`finddir git`
   if [ "$gitdir" ]; then
     #### Use git repo.
     [ "$verbose" -eq 0 ]  &&  git_opts=--quiet
     [ "$branch" == master ]  ||
       git_opts="${git_opts:+$git_opts }--branch $branch"
-    if "$gitdir"/git clone --depth 1 $git_opts "git://$gitrepo/nmh.git"; then
-      cd nmh  ||  die "failed to clone nmh"
+    if "$gitdir"/git clone --depth 1 $git_opts "git://$gitrepo/nmh.git" >&3; then
+      directory=nmh
+      cd "$directory"  ||  die "failed to clone $directory"
       printf "commit %s\n" `git log --max-count=1 --pretty=format:%H`
     else
       die 'failed to clone git repo'
       printf "commit %s\n" `git log --max-count=1 --pretty=format:%H`
     else
       die 'failed to clone git repo'
@@ -146,16 +160,17 @@ else
     snapshot="$repo/$tarball"
     if [ "`finddir wget`" ]; then
       [ "$verbose" -eq 0 ] && wget_opts='--quiet'
     snapshot="$repo/$tarball"
     if [ "`finddir wget`" ]; then
       [ "$verbose" -eq 0 ] && wget_opts='--quiet'
-      wget --output-document - $wget_opts "$snapshot" | gzip -d | tar xf -
+      wget --output-document - $wget_opts "$snapshot" 2>&3 | gzip -d | tar xf -
     elif [ "`finddir curl`" ]; then
       [ "$verbose" -eq 0 ] && curl_opts='--silent --show-error'
     elif [ "`finddir curl`" ]; then
       [ "$verbose" -eq 0 ] && curl_opts='--silent --show-error'
-      curl --location $curl_opts "$snapshot" | gzip -d | tar xf -
+      curl --location $curl_opts "$snapshot" 2>&3 | gzip -d | tar xf -
     else
       die 'unable to find program to download nmh sources'
     fi
 
     if [ -d nmh-"$branch" ]; then
     else
       die 'unable to find program to download nmh sources'
     fi
 
     if [ -d nmh-"$branch" ]; then
-      cd nmh-"$branch"  ||  die "failed to download and extract nmh-$branch"
+      directory=nmh-"$branch"
+      cd "$directory"  ||  die "failed to download and extract $directory"
     else
       die "failed to download nmh-$branch sources"
     fi
     else
       die "failed to download nmh-$branch sources"
     fi
@@ -293,8 +308,8 @@ if [ $install -ge 1  -a  "$LOGNAME" != root ]; then
   fi
 fi
 
   fi
 fi
 
-[ -x tools/showbuildenv ]  &&  tools/showbuildenv | grep -Ev 'PID=|SHLVL'
-
+printf '\n%s %s %s %s\n\n' "`uname -m`" "`uname -s`" "`uname -r`" "`uname -v`"
+[ -f /etc/os-release ]  &&  printf '%s\n\n' "`cat /etc/os-release`"
 
 ####
 #### Set up with autoconfig if necessary.
 
 ####
 #### Set up with autoconfig if necessary.
@@ -357,7 +372,8 @@ if [ $status -eq 0 ]; then
     fi
 
     [ $verbose -ge 1 ]  &&  echo testing . . . >&3
     fi
 
     [ $verbose -ge 1 ]  &&  echo testing . . . >&3
-    checkoutput=`make $check AM_COLOR_TESTS=always`
+    [ "${TERM:-dumb}" = dumb ]  &&  color=no  ||  color=always
+    checkoutput=`make $check AM_COLOR_TESTS=$color`
     status=$?
 
     tests_summary=`echo "$checkoutput" | grep tests`
     status=$?
 
     tests_summary=`echo "$checkoutput" | grep tests`
@@ -388,6 +404,8 @@ if [ $status -eq 0 ]; then
       fi
     fi
   fi
       fi
     fi
   fi
+else
+  echo "see nmh MACHINES file for build dependences"
 fi
 
 ####
 fi
 
 ####
@@ -395,21 +413,22 @@ fi
 ####
 
 #### Disable output redirection (and flush) so that we can grep.
 ####
 
 #### Disable output redirection (and flush) so that we can grep.
-exec 1>&3 3>&-
+exec 1>&3 3>&- 2>&4 4>&-
 
 if [ "$logfile" != - ]; then
   rm -f "$logfile"
   exec 3>&1 >"$logfile" 2>&1
 fi
 
 
 if [ "$logfile" != - ]; then
   rm -f "$logfile"
   exec 3>&1 >"$logfile" 2>&1
 fi
 
-cat "$tmpfile"
-grep -E 'Error|warn' "$tmpfile"
+[ -f "$tmpfile" ]  &&  cat "$tmpfile"
+[ -f "$tmpfile" ]  &&  grep -E 'Error|warn' "$tmpfile"
 
 
-if [ $status -eq 0 ]; then
-  [ $verbose -ge 1 ]  &&  echo build completed successfully >&3
-else
-  echo build failed!
-  [ "$logfile" = - ]  ||  echo "build failed, build log is in $logfile" >&3
+#### Put message on stdout, and in log if different.
+if [ $status -ne 0  -o  $verbose -ge 1  -o  "$directory" ]; then
+  [ $status -eq 0 ]  &&  indication=succeeded  ||  indication=failed
+  message="build $indication, build log is in ${directory:+$directory/}$logfile"
+  echo "$message"
+  [ "$logfile" = - ]  ||  echo "$message" >&3
 fi
 
 exit $status
 fi
 
 exit $status