From 3d21b136955bae5202ee7a7443b6745e9c5c5eea Mon Sep 17 00:00:00 2001 From: David Levine Date: Tue, 10 Apr 2012 20:47:16 -0500 Subject: [PATCH] Added docs/contrib/build_nmh script. --- INSTALL | 36 +++--- docs/contrib/build_nmh | 326 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 340 insertions(+), 22 deletions(-) create mode 100755 docs/contrib/build_nmh diff --git a/INSTALL b/INSTALL index e946242..251ba7b 100644 --- a/INSTALL +++ b/INSTALL @@ -2,9 +2,18 @@ # INSTALL -- installation instructions # --------------- -Installing nmh --------------- +-------------------------------- +Installing nmh, guided by script +-------------------------------- +For routine installation on popular platforms, the shell script in +docs/contrib/build_nmh can be used to guide you through configuration. +It will then build and optionally (with -i) install in the configured +location. + + +------------------------ +Installing nmh, manually +------------------------ Please read all of the following instructions before you begin building nmh. @@ -91,9 +100,8 @@ need an ANSI C compiler such as gcc. traffic. See the discussion of the --with-smtpserver configure option below. - If you compile with POP support, but don't want to use it exclusively, - you can use the `-host' and `-user' options to `inc' and `msgchk' - rather than hardcoding pophost in `mts.conf'. + If you don't want to hardcode pophost in `mts.conf', you can use + the `-host' and `-user' options to `inc' and `msgchk'. Check the `mh-tailor' man page for a list of all the available options for this file. @@ -194,12 +202,6 @@ Options for configure --enable-debug Enable debugging support. ---enable-pop - Enable client-side support for pop. - ---enable-apop - Enable client-side support for apop (Authenticated POP). - --with-editor=EDITOR (DEFAULT is vi) specify the full path of the default editor to use. If this option is not given, then the configuration process will search @@ -208,16 +210,6 @@ Options for configure nmh command `prompter'. If you specify `prompter', then you don't need to give the full pathname. ---with-hesiod=PREFIX - Specify the location of Hesiod. - ---with-krb4=PREFIX - Specify the location of Kerberos V4 for KPOP support. After - running configure, you will need to change the POPSERVICE #define in - config.h if you want to use KPOP exclusively (rather than being able - to switch between KPOP and normal POP3). See the comments inside - config.h for details. - --with-locking=LOCKTYPE (DEFAULT is dot) Specify the locking mechanism when attempting to "inc" or "msgchk" a local mail spool. Valid options are "dot", diff --git a/docs/contrib/build_nmh b/docs/contrib/build_nmh new file mode 100755 index 0000000..cc83974 --- /dev/null +++ b/docs/contrib/build_nmh @@ -0,0 +1,326 @@ +#! /bin/sh +# +# 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. +# * Unless the -y option is provided, this script then interactively +# walks you through confirmation of common configuration settings. +# +# 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 +# common nmh configuration settings. The -v option will cause display +# of brief progress indicators. Be sure to add the bin directory of +# the install location to your $PATH, if not already there. +# Subsequently, invoke this script with the -y option, to use the +# relevant configuration settings from the installed nmh without +# confirmation. +# +# Option summary: +# First time use: +# -i to install nmh +# -v to display progress +# Subsequent uses, assuming installed nmh bin directory is on $PATH: +# -y to accept all configuration options without confirmation +# Output control: +# -l , default 'build_nmh.log' +# Advanced/developer use: +# -c to run 'make distcheck' instead of 'make check' +# -d to build nmh with debug enabled +# -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 +# autoconf and automake, with -s (see docs/README.developers for versions) +# rpm-build, with -r + + +#### +#### OS-specific setup. +#### +which=which +ldd=ldd +locking= + +os=${OSTYPE:-`uname -s`} +#### It'd be nice to have configure decide what locking style to use. +#### In the meantime, select it manually. To determine what style +#### locking your system uses by default, try something like this, +#### assuming that strace is installed: +#### $ echo test | strace -o /tmp/mail.strace mail -s test $LOGNAME +#### Then look in /tmp/mail.strace for fcntl, flock, and lockf system +#### calls and opens of dot files in the mail spool. +#### These might help but are old: +#### https://bugzilla.mozilla.org/show_bug.cgi?id=239013#c9 +#### http://www.jwz.org/doc/movemail.html +case "$os" in + aix) locking=fcntl ;; + freebsd*) locking=flock ;; + linux* ) locking=fcntl ;; +esac + + +#### +#### Interpret command arguments. +#### +check=check +debug=0 +install=0 +logfile=build_nmh.log +build_rpm=0 +superclean=0 +verbose=0 +yes=0 +usage="usage: $0 + [-c to run 'make distcheck' instead of 'make check'] + [-d to build nmh with debug enabled] + [-i to install nmh] + [-l , default '$logfile'] + [-r to build rpm] + [-s to use 'make superclean': requires recent autoconf and automake] + [-v to display progress] + [-y to accept all configuration options without confirmation]" + +while getopts 'cdil:rsvy?' arg; do + case $arg in + c ) check=distcheck ;; + d ) debug=1 ;; + i ) install=1 ;; + l ) logfile=$OPTARG ;; + r ) build_rpm=1 ;; + s ) superclean=1 ;; + v ) verbose=1 ;; + y ) yes=1 ;; + '?') echo "$usage"; exit 0 ;; + esac +done +shift `expr $OPTIND - 1` + +#### No command line arguments are supported. +if [ $# -gt 0 ]; then + echo "usage: $0" + exit 1 +fi + +#### Check to see that we're in a nmh source directory. +if ! grep 'the authors of nmh' COPYRIGHT >/dev/null; then + echo "$0: not in nmh source directory" + exit 1 +fi + +#### +#### Set up configure options. Handle options that can have embedded +#### spaces (currently just smtpservers) specially. +#### + +#### dotlocking, the usual default, requires chgrp and chmod of inc. +installpriv= +if [ $install -ge 1 -a `id -u` -ne 0 ]; then + if [ "x$locking" = x -o "$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 + + +#### Here are the config options that we will try to detect, then +#### confirm, and finally set. +config_prefix=/usr/local/nmh +config_locking="$locking" +config_mts=smtp +config_smtpservers=localhost +config_sasl=n +config_tls=n +config_editor=vi +config_pager=more +config_debug=n + +if mhparam >/dev/null 2>&1; then + # Determine config options from installed nmh. + mhparam=`which mhparam` + mhbin=`dirname "$mhparam"` + + 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: *//'` + if [ "$mts" -a "$mts" != smtp ]; then + config_mts="$mts" + fi + fi + + mtsconfservers=`grep '^servers:' $mtsconf` + if [ "$mtsconfservers" ]; then + 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 + 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 + #### Confirm each config setting with user. + printf 'Install prefix [%s]: ' $config_prefix + read prefix + [ "$prefix" ] && config_prefix="$prefix" + + printf 'Locking type (dot|fcntl|flock|lockf) [%s]: ' $config_locking + read locking + [ "$locking" ] && config_locking="$locking" + + printf 'MTS (smtp|sendmail) [%s]: ' $config_mts + read mts + [ "$mts" ] && config_mts="$mts" + + if [ ! "$mts" -o "$mts" = smtp ]; then + printf 'SMTP server(s), space separated [%s]: ' $config_smtpservers + read response + servers=`echo $response | sed -e 's/ /\\\ /g'` + [ "$servers" ] && config_smtpservers="$servers" + fi + + printf 'Cyrus SASL support [%s]: ' $config_sasl + read response + if [ "$response" = y -o "$response" = Y ]; then + config_sasl=y + elif [ "$response" = n -o "$response" = N ]; then + config_sasl=n + fi + + printf 'TLS support [%s]: ' $config_tls + read response + if [ "$response" = y -o "$response" = Y ]; then + config_tls=y + elif [ "$response" = n -o "$response" = N ]; 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 ] && \ + 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_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" + + +#### +#### Clean up, and set up with autoconfig if necessary. +#### +if [ -f Makefile ]; then + [ $verbose -ge 1 ] && echo cleaning . . . + if [ $superclean -ge 1 ]; then + make superclean >/dev/null + else + make distclean >/dev/null + fi +fi + +/bin/rm -f $logfile +if [ -f configure -a -f Makefile.in ]; then + : +else + [ $verbose -ge 1 ] && echo autoconfiguring . . . + ./autogen.sh >>$logfile 2>&1 +fi + + +#### +#### Build. +#### +[ $verbose -ge 1 ] && echo configuring . . . +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 + status=$? + + if [ $status -eq 0 ]; then + [ $verbose -ge 1 ] && echo testing . . . + checkoutput=`make $check SETGID_MAIL= 2>>$logfile` + status=$? + + tests_summary=`echo "$checkoutput" | grep tests` + if [ "$tests_summary" ]; then + echo '===================' >>$logfile + echo $tests_summary >>$logfile + echo '===================' >>$logfile + [ "$check" = distcheck ] && \ + echo "$checkoutput" | tail -n 4 >>$logfile + fi + + if [ $status -eq 0 ]; then + if [ $install -ge 1 ]; then + [ $verbose -ge 1 ] && echo installing . . . + ($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 + status=$? + fi + fi + fi +fi + +grep -E 'Error|warn' $logfile +[ $status -ne 0 ] && echo build failed! +[ $status -eq 0 -a $verbose -ge 1 ] && echo build completed successfully + +exit $status -- 1.7.10.4