]> diplodocus.org Git - nmh/blobdiff - docs/contrib/build_nmh
Add -O0 instead of -O2 to CFLAGS with build_nmh -d option.
[nmh] / docs / contrib / build_nmh
index 10ad7df62bd9325ff0a80fd9cc677036c5eeca9a..b69dc08a98c14e9f28a20b7b242a919a69e6fb15 100755 (executable)
@@ -8,6 +8,10 @@
 # * Unless the -y option is provided, this script then interactively
 #   walks you through confirmation of common configuration settings.
 #
+# This file can be downloaded and immediately run using, e.g.,
+#   wget http://git.savannah.gnu.org/cgit/nmh.git/plain/docs/contrib/build_nmh
+#   sh build_nmh
+#
 # Typical usage:
 # The first time you invoke this script, use the -i option to install
 # nmh in the specified location.  The script will walk you through the
 #     -l <logfile name>, default 'build_nmh.log', - for stdout/stderr
 #   Advanced/developer use:
 #     -c to run 'make distcheck' instead of 'make check'
-#     -d to build nmh with debug enabled
+#     -d to build nmh with asserts enabled and optimization disabled
 #     -s to use 'make superclean': requires recent autoconf and automake,
 #        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]
   [-c to run 'make distcheck' instead of 'make check']
-  [-d to build nmh with debug enabled]
+  [-d to build nmh with asserts enabled and optimization disabled]
   [-i to install nmh]
   [-l <logfile name>, default '$logfile']
   [-r to build rpm]
@@ -56,6 +57,9 @@ usage="usage: $0
 
 #### Exit with error message.
 die() {
+  status=1
+  exec 1>&3 3>&- 2>&4 4>&-
+  cat "$tmpfile" 1>&2
   echo "$0: $*" 1>&2
   exit 1
 }
@@ -72,10 +76,22 @@ finddir() {
   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
-trap 'rm -f "$tmpfile"' EXIT
+
 
 ####
 #### Interpret command arguments.
@@ -109,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.
-exec 3>&1 >"$tmpfile" 2>&1
+exec 3>&1 4>&2 >"$tmpfile" 2>&1
 
 echo "$invocation"
 
@@ -121,15 +137,17 @@ if grep 'the authors of nmh' COPYRIGHT >/dev/null 2>&1; then
   :
 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"
-    if "$gitdir"/git clone $git_opts "git://$gitrepo/nmh.git"; then
-      cd nmh  ||  die "failed to clone nmh"
-      git log --max-count=1 --pretty-format:%H
+    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'
     fi
@@ -142,16 +160,17 @@ else
     snapshot="$repo/$tarball"
     if [ "`finddir wget`" ]; then
       [ "$verbose" -eq 0 ] && wget_opts='--quiet'
-      wget --output-document - $wget_opts "$snapshot" | tar xzf -
+      wget --output-document - $wget_opts "$snapshot" 2>&3 | gzip -d | tar xf -
     elif [ "`finddir curl`" ]; then
-      [ "$verbose" -eq 0 ] && curl_opts=--silent
-      curl --location $curl_opts "$snapshot" | tar xzf -
+      [ "$verbose" -eq 0 ] && curl_opts='--silent --show-error'
+      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
-      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
@@ -169,9 +188,8 @@ config_prefix=/usr/local/nmh
 config_locking=
 config_mts=smtp
 config_smtpservers=localhost
-config_sasl=n
-config_tls=n
-config_oauth=n
+config_sasl='determined by configure'
+config_tls='determined by configure'
 config_debug=n
 
 
@@ -214,19 +232,16 @@ if install-mh -check >/dev/null 2>&1; then
       case `$mhbin/mhparam tls` in
         *tls*) config_tls=y ;;
       esac
-
-      case `$mhbin/mhparam oauth` in
-        *oauth*) config_oauth=y ;;
-      esac
     else
       tput smso
-      echo "$0: SASL, TLS, and OAuth2 detection not supported with current nmh"
-      [ $yes -eq 1 ]  &&  echo "will not configure them in"
+      echo "$0: SASL and TLS detection not supported with current nmh"
+      [ $yes -eq 1 ]  &&  echo "configure will determine whether to enable"
       tput rmso
     fi
   fi
 fi
 
+#### Don't confirm debug interactively below; obey the -d option to this script.
 [ $debug -ge 1 ]  &&  config_debug=y
 
 if [ $yes -eq 0 ]; then
@@ -250,19 +265,13 @@ if [ $yes -eq 0 ]; then
     [ "$servers" ]  &&  config_smtpservers="$servers"
   fi
 
-  printf 'Cyrus SASL support [%s]: ' $config_sasl >&3
+  printf 'Cyrus SASL support [%s]: ' "$config_sasl" >&3
   read response
   [ "$response" = y  -o  "$response" = Y ]  &&  config_sasl=y
 
-  printf 'TLS support [%s]: ' $config_tls >&3
+  printf 'TLS support [%s]: ' "$config_tls" >&3
   read response
   [ "$response" = y  -o  "$response" = Y ]  &&  config_tls=y
-
-  printf 'OAuth2 support [%s]: ' $config_oauth >&3
-  read response
-  [ "$response" = y  -o  "$response" = Y ]  &&  config_oauth=y
-
-  #### Don't confirm debug here:  obey the -d option to this script.
 fi
 
 smtpservers=
@@ -276,7 +285,6 @@ config_opts="--prefix=$config_prefix"
   smtpservers="--with-smtpservers=$config_smtpservers"
 [ "$config_sasl" = y ]  &&  config_opts="$config_opts --with-cyrus-sasl"
 [ "$config_tls" = y ]  &&  config_opts="$config_opts --with-tls"
-[ "$config_oauth" = y ]  &&  config_opts="$config_opts --with-oauth"
 [ $config_debug = y ]  &&  config_opts="$config_opts --enable-assert"
 
 #### dotlocking, the usual default, requires chgrp and chmod of inc.
@@ -289,14 +297,14 @@ if [ $install -ge 1  -a  "$LOGNAME" != root ]; then
   fi
 fi
 
-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.
 ####
 if [ -f Makefile ]; then
-  [ $verbose -ge 1 ]  &&  echo cleaning . . .
+  [ $verbose -ge 1 ]  &&  echo cleaning . . . >&3
   if [ $superclean -ge 1 ]; then
     make superclean >/dev/null
   else
@@ -305,7 +313,7 @@ if [ -f Makefile ]; then
 fi
 
 if [ ! -f configure  -o  ! -f Makefile.in ]; then
-  [ $verbose -ge 1 ]  &&  echo autoconfiguring . . .
+  [ $verbose -ge 1 ]  &&  echo autoconfiguring . . . >&3
   ./autogen.sh
   [ $? -ne 0 ]  &&
     die "autogen failed, see MACHINES file for autoconf,
@@ -316,13 +324,18 @@ fi
 ####
 #### Build.
 ####
-[ $verbose -ge 1 ]  &&  echo configuring . . .
+[ $verbose -ge 1 ]  &&  echo configuring . . . >&3
 if [ -z "$CFLAGS" ]; then
   #### Only use these flags with gcc.
   if cc -dM -E - </dev/null 2>&1 | grep __GNUC__ >/dev/null; then
     #### configure will supply -g -O2 with gcc, but only if CFLAGS
     #### isn't defined.
-    CFLAGS='-g -O2 -ansi -pedantic'
+    CFLAGS='-g -ansi -pedantic'
+    if [ "$config_debug" = n ]; then
+      CFLAGS="$CFLAGS -O2"
+    else
+      CFLAGS="$CFLAGS -O0"
+    fi
   fi
 fi
 
@@ -331,7 +344,7 @@ printf '\n./configure %s\n' "$config_opts${smtpservers:+ $smtpservers}"
 status=$?
 
 if [ $status -eq 0 ]; then
-  [ $verbose -ge 1 ]  &&  echo building . . .
+  [ $verbose -ge 1 ]  &&  echo building . . . >&3
   make
   status=$?
 
@@ -352,8 +365,9 @@ if [ $status -eq 0 ]; then
         export DISTCHECK_CONFIGURE_FLAGS
     fi
 
-    [ $verbose -ge 1 ]  &&  echo testing . . .
-    checkoutput=`make $check AM_COLOR_TESTS=always`
+    [ $verbose -ge 1 ]  &&  echo testing . . . >&3
+    [ "${TERM:-dumb}" = dumb ]  &&  color=no  ||  color=always
+    checkoutput=`make $check AM_COLOR_TESTS=$color`
     status=$?
 
     tests_summary=`echo "$checkoutput" | grep tests`
@@ -372,18 +386,20 @@ if [ $status -eq 0 ]; then
 
     if [ $status -eq 0 ]; then
       if [ $install -ge 1 ]; then
-        [ $verbose -ge 1 ]  &&  echo installing . . .
+        [ $verbose -ge 1 ]  &&  echo installing . . . >&3
         ($installpriv make install) >/dev/null
         status=$?
       fi
 
       if [ $status -eq 0  -a  $build_rpm -ge 1 ]; then
-        [ $verbose -ge 1 ]  &&  echo building rpm . . .
+        [ $verbose -ge 1 ]  &&  echo building rpm . . . >&3
         make rpm >/dev/null
         status=$?
       fi
     fi
   fi
+else
+  echo "see nmh MACHINES file for build dependences"
 fi
 
 ####
@@ -391,21 +407,22 @@ fi
 ####
 
 #### 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
 
-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
-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