]> diplodocus.org Git - nmh/blobdiff - docs/contrib/build_nmh
docs/contrib/ml: add a runtime check for known bash-ism
[nmh] / docs / contrib / build_nmh
index 44b2f31ded0d839e82341b203179885e49b406e1..ba421bf32e4165e532ed5871c3f41f2575d60992 100755 (executable)
@@ -3,8 +3,7 @@
 # Configures and builds nmh.
 # * This script must be invoked from an nmh source directory.
 # * This script retrieves configuration from the first existing nmh
-#   installation on your $PATH, if any, as well as any $EDITOR/$VISUAL
-#   and $PAGER environment variable settings.
+#   installation on your $PATH, if any.
 # * Unless the -y option is provided, this script then interactively
 #   walks you through confirmation of common configuration settings.
 #
 #   rpm-build, with -r
 
 
-####
-#### OS-specific setup.
-####
-which=which
-ldd=ldd
-
 ####
 #### Interpret command arguments.
 ####
@@ -106,60 +99,74 @@ fi
 #### Here are the config options that we will try to detect, then
 #### confirm, and finally set.
 config_prefix=/usr/local/nmh
+config_locking=
 config_mts=smtp
 config_smtpservers=localhost
 config_sasl=n
 config_tls=n
-config_editor=vi
-for i in more less most cat; do
-  if which $i >/dev/null 2>&1; then
-    config_pager=$i
-    break
-  fi
-done
 config_debug=n
 
+
+#### Find location of a program.  Bourne shell just puts the name in
+#### $0 if it's found from the PATH, so search that if necessary.
+finddir() {
+  case $1 in
+    */*) dirname "$1" ;;
+    *  ) IFS=:
+         for d in $PATH; do
+           [ -f "${d:=.}/$1"  -a  -x "$d/$1" ]  &&  printf %s "$d"  &&  break
+         done ;;
+  esac
+}
+
+#### Figure out whether or not to use -n with tail.
+case `printf 'OK\n' | tail -n 1 2>&1` in
+  OK) tail='tail -n ' ;;
+  *)  tail='tail -' ;;
+esac
+
 if install-mh -check >/dev/null 2>&1; then
   # Determine config options from installed nmh.
-  mhparam=`which mhparam`
-  mhbin=`dirname "$mhparam"`
+  mhbin=`finddir install-mh`
 
   config_prefix=`cd $mhbin/.. && pwd`
 
   mtsconf=`dirname "$mhbin"`/etc/mts.conf
   if [ -f "$mtsconf" ]; then
-    mts_entry=`grep '^mts:' $mtsconf`
-    if [ "mts_entry" ]; then
-      mts=`echo $mts_entry | sed -e 's/^mts: *//'`
+    mts_entry=`grep '^mts:' "$mtsconf"`
+    if [ "$mts_entry" ]; then
+      mts=`echo "$mts_entry" | sed -e 's/^mts: *//'`
       if [ "$mts"  -a  "$mts" != smtp ]; then
         config_mts="$mts"
       fi
     fi
 
-    mtsconfservers=`grep '^servers:' $mtsconf`
+    mtsconfservers=`grep '^servers:' "$mtsconf"`
     if [ "$mtsconfservers" ]; then
-      servers=`echo $mtsconfservers | sed -e 's/^servers: *//' -e 's/ /\\\ /g'`
+      servers=`echo "$mtsconfservers" | \
+               sed -e 's/^servers: *//' -e 's/ /\\\ /g'`
       [ "$servers" ]  &&  config_smtpservers="$servers"
     fi
   fi
 
-  if $ldd $mhbin/inc | grep sasl >/dev/null; then
-    config_sasl=y
-  fi
-
-  if $ldd $mhbin/inc | grep ssl >/dev/null; then
-    config_tls=y
+  if test -x "$mhbin/mhparam"; then
+    if mhparam sasl >/dev/null; then
+      case `$mhbin/mhparam sasl` in
+        *sasl*) config_sasl=y ;;
+      esac
+
+      case `$mhbin/mhparam tls` in
+        *tls*) config_tls=y ;;
+      esac
+    else
+      tput smso
+      echo "$0: SASL and TLS detection not supported with current nmh"
+      [ $yes -eq 1 ]  &&  echo "will not configure either one in"
+      tput rmso
+    fi
   fi
 fi
 
-if [ "$EDITOR" ]; then
-  config_editor="$EDITOR"
-elif [ "$VISUAL" ]; then
-  config_editor="$VISUAL"
-fi
-
-[ "$PAGER" ]  &&  config_pager="$PAGER"
-
 [ $debug -ge 1 ]  &&  config_debug=y
 
 if [ $yes -eq 0 ]; then
@@ -168,13 +175,15 @@ if [ $yes -eq 0 ]; then
   read prefix
   [ "$prefix" ]  &&  config_prefix="$prefix"
 
-  printf 'MTS (smtp|sendmail) [%s]: ' $config_mts
+  printf 'Locking type (dot|fcntl|flock|lockf) [determined by configure]: '
+  read locking
+  [ "$locking" ]  &&  config_locking="$locking"
+
+  printf 'MTS (smtp|sendmail/smtp|sendmail/pipe) [%s]: ' $config_mts
   read mts
   [ "$mts" ]  &&  config_mts="$mts"
 
-  if [ "$mts"  -o  "$mts" = smtp ]; then
-    :
-  else
+  if [ "$config_mts" = smtp ]; then
     printf 'SMTP server(s), space separated [%s]: ' $config_smtpservers
     read response
     servers=`echo $response | sed -e 's/ /\\\ /g'`
@@ -197,20 +206,14 @@ if [ $yes -eq 0 ]; then
     config_tls=n
   fi
 
-  printf 'Default editor [%s]: ' $config_editor
-  read editor
-  [ "$editor" ]  &&  config_editor=$editor
-
-  printf 'Pager [%s]: ' $config_pager
-  read pager
-  [ "$pager" ]  &&  config_pager=$pager
-
   #### Don't confirm debug here:  obey the -d option to this script.
 fi
 
 smtpservers=
 config_opts="--prefix=$config_prefix"
 
+[ "$config_locking" ]  &&  \
+  config_opts="$config_opts --with-locking=$config_locking"
 [ "$config_mts"  -a  "$config_mts" != smtp ]  &&  \
   config_opts="$config_opts --with-mts=$config_mts"
 [ "$config_smtpservers"  -a  "$config_smtpservers" != localhost ]  &&  \
@@ -219,12 +222,19 @@ config_opts="--prefix=$config_prefix"
   config_opts="$config_opts --with-cyrus-sasl"
 [ "$config_tls" = y ]  &&  \
   config_opts="$config_opts --with-tls"
-[ "$config_editor" ]  &&  \
-  config_opts="$config_opts --with-editor=$config_editor"
-[ "$config_pager" ]  &&  \
-  config_opts="$config_opts --with-pager=$config_pager"
 [ $config_debug = y ]  &&  \
-  config_opts="$config_opts --enable-debug"
+  config_opts="$config_opts --enable-debug --enable-assert"
+
+
+#### dotlocking, the usual default, requires chgrp and chmod of inc.
+installpriv=
+if [ $install -ge 1  -a  `id -u` -ne 0 ]; then
+  if [ "$config_locking" = dot ]; then
+    echo "$0: "'install requires chgrp and chmod 2755'
+    echo 'so will sudo to install.  Terminate with Ctrl-C if unacceptable.'
+    installpriv=sudo
+  fi
+fi
 
 
 ####
@@ -239,12 +249,12 @@ if [ -f Makefile ]; then
   fi
 fi
 
-/bin/rm -f $logfile
+/bin/rm -f "$logfile"
 if [ -f configure  -a  -f Makefile.in ]; then
   :
 else
   [ $verbose -ge 1 ]  &&  echo autoconfiguring . . .
-  ./autogen.sh >>$logfile 2>&1
+  ./autogen.sh >>"$logfile" 2>&1
 fi
 
 
@@ -252,48 +262,68 @@ fi
 #### Build.
 ####
 [ $verbose -ge 1 ]  &&  echo configuring . . .
-echo ./configure $config_opts ${smtpservers:+"$smtpservers"} >>$logfile 2>&1
-./configure $config_opts ${smtpservers:+"$smtpservers"} >>$logfile 2>&1
+echo ./configure $config_opts ${smtpservers:+"$smtpservers"} >>"$logfile" 2>&1
+./configure $config_opts ${smtpservers:+"$smtpservers"} >>"$logfile" 2>&1
 status=$?
 
 if [ $status -eq 0 ]; then
   [ $verbose -ge 1 ]  &&  echo building . . .
-  make >>$logfile 2>&1
+  make >>"$logfile" 2>&1
   status=$?
 
   if [ $status -eq 0 ]; then
+    if [ "$TESTS_SHELL"x = x ]; then
+      #### Bonus:  use heirloom shell to test, if available, and if
+      #### TESTS_SHELL hadn't already been set.
+      heirloom_shell=/usr/lib/heirloom/5bin/sh
+      if [ -x "$heirloom_shell" ]; then
+        TESTS_SHELL="$heirloom_shell"; export TESTS_SHELL
+      fi
+   fi
+
     [ $verbose -ge 1 ]  &&  echo testing . . .
-    checkoutput=`make $check 2>>$logfile`
+    checkoutput=`make $check AM_COLOR_TESTS=always 2>>"$logfile"`
     status=$?
 
     tests_summary=`echo "$checkoutput" | grep tests`
+    #### If multiple tests not run, that line will be caught by the
+    #### "grep tests" above.
+    test_not_run=`echo "$checkoutput" | grep 'test was not run'`
+    fails=`echo "$checkoutput" | grep FAIL`
     if [ "$tests_summary" ]; then
-      echo '===================' >>$logfile
-      echo $tests_summary >>$logfile
-      echo '===================' >>$logfile
+      echo '===================' >>"$logfile"
+      [ "$test_not_run" ]  &&  echo "$test_not_run" >>"$logfile"
+      [ "$fails" ]  &&  echo "$fails" >>"$logfile"
+      echo "$tests_summary" >>"$logfile"
+      echo '===================' >>"$logfile"
       [ "$check" = distcheck ]  &&  \
-        echo "$checkoutput" | tail -n 4 >>$logfile
+        echo "$checkoutput" | ${tail}4 >>"$logfile"
     fi
 
     if [ $status -eq 0 ]; then
       if [ $install -ge 1 ]; then
         [ $verbose -ge 1 ]  &&  echo installing . . .
-        (make install) >/dev/null 2>>$logfile
+        ($installpriv make install) >/dev/null 2>>"$logfile"
         status=$?
       fi
 
       if [ $status -eq 0  -a  $build_rpm -ge 1 ]; then
         [ $verbose -ge 1 ]  &&  echo building rpm . . .
-        make rpm >/dev/null 2>>$logfile
+        make rpm >/dev/null 2>>"$logfile"
         status=$?
       fi
     fi
   fi
 fi
 
-grep 'Error' $logfile
-grep 'warn' $logfile
-[ $status -ne 0 ]  &&  echo build failed!
-[ $status -eq 0  -a  $verbose -ge 1 ]  &&  echo build completed successfully
+grep Error "$logfile"
+grep warn "$logfile"
+
+if [ $status -eq 0 ]; then
+  [ $verbose -ge 1 ]  &&  echo build completed successfully
+else
+  echo build failed!
+  echo build log is in "$logfile"
+fi
 
 exit $status