# * 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]
#### Exit with error message.
die() {
+ status=1
+ exec 1>&3 3>&- 2>&4 4>&-
+ cat "$tmpfile" 1>&2
echo "$0: $*" 1>&2
exit 1
}
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.
#### 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"
:
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
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
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
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
[ "$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=
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.
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
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,
####
#### 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
status=$?
if [ $status -eq 0 ]; then
- [ $verbose -ge 1 ] && echo building . . .
+ [ $verbose -ge 1 ] && echo building . . . >&3
make
status=$?
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`
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
####
####
#### 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