X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/575e7d2bc9e8bee61114431c4dc7fb6e9087b667..a0250745de00aacfe03f82bdcc7e5e86f0768dd7:/docs/contrib/build_nmh diff --git a/docs/contrib/build_nmh b/docs/contrib/build_nmh index 10ad7df6..60913b68 100755 --- a/docs/contrib/build_nmh +++ b/docs/contrib/build_nmh @@ -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/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 @@ -29,24 +33,22 @@ # -l , 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 - -usage="usage: $0 +# 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. + +logfile=build_nmh.log +usage="usage: [-b , 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 , default '$logfile'] [-r to build rpm] @@ -54,12 +56,6 @@ usage="usage: $0 [-v to display progress] [-y to accept all configuration options without confirmation]" -#### Exit with error message. -die() { - echo "$0: $*" 1>&2 - exit 1 -} - #### 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() { @@ -72,10 +68,106 @@ finddir() { esac } +#### Make sure user sees error output even on early termination. +cleanup() { + if [ "$tmpfile" ]; then + #### Disable output redirection (and flush) so that we can grep. + #### If $tmpfile is null, don't need to do this because the + #### outputs weren't redirected, modulo a small race condition + #### between setting tmpfile and redirecting the outputs. + exec 1>&3 3>&- 2>&4 4>&- + + if [ "$logfile" != - ]; then + exec 3>&1 >"$logfile" 2>&1 + fi + + if [ -f "$tmpfile" ]; then + cat "$tmpfile" + grep -E 'Error|warn' "$tmpfile" + rm "$tmpfile" + fi + fi + + #### Put info message on stdout, and in log if not stdout. + if [ $status -ne 0 -o $verbose -ge 1 -o "$directory" ]; then + [ $status -eq 0 ] && result=succeeded || result=failed + if [ "$logfile" = - ]; then + echo "build $result" + else + message="build $result, build log is in ${directory:+$directory/}$logfile" + echo "$message" >&3 + fi + fi + + #### Heirloom shell does not like "trap - signal". + trap '' EXIT + exit $status +} + +#### Exit with error message. +die() { + status=1 # It should already be, but just in case the code below changes. + echo "$0: $*" 1>&2 + cleanup +} + +#### Download sources from repo. With git and on master, the +#### directory will be nmh, but with snapshot, it will be +#### nmh-master. +download_sources() { + [ $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 --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 + else + [ -e nmh-"$branch" ] && die "nmh-$branch exists, will not overrwrite" + + #### Use snapshot. + tarball="nmh-$branch.tar.gz" + repo="http://$gitrepo/cgit/nmh.git/snapshot" + snapshot="$repo/$tarball" + if [ "`finddir wget`" ]; then + [ "$verbose" -eq 0 ] && wget_opts='--quiet' + wget --output-document - $wget_opts "$snapshot" 2>&3 | gzip -d | tar xf - + elif [ "`finddir curl`" ]; then + [ "$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 + directory=nmh-"$branch" + cd "$directory" || die "failed to download and extract $directory" + else + die "failed to download nmh-$branch sources" + fi + fi +} + +directory= +download=0 gitrepo=git.savannah.nongnu.org invocation="$0 $*" +status=1 tmpfile=/tmp/build_nmh-$$.log -trap 'rm -f "$tmpfile"' EXIT + +#### Redirect all output to tmp file. Then on EXIT, copy it to either +#### logfile or stdout. Also, grep it for errors and warnings. Set +#### tmpfile just prior to this, see cleanup(). +exec 3>&1 4>&2 >"$tmpfile" 2>&1 + #### #### Interpret command arguments. @@ -84,12 +176,15 @@ branch=master check=check debug=0 install=0 -logfile=build_nmh.log build_rpm=0 superclean=0 verbose=0 yes=0 +#### With dash, heirloom shell, and posh, need to catch INT and QUIT +#### in order for cleanup to be call: just EXIT isn't sufficient. +trap cleanup EXIT INT QUIT + while getopts 'cb:dil:rsvy?' arg; do case $arg in b ) branch="$OPTARG" ;; @@ -101,16 +196,11 @@ while getopts 'cb:dil:rsvy?' arg; do s ) superclean=1 ;; v ) verbose=1 ;; y ) yes=1 ;; - '?') echo "$usage"; exit 0 ;; + '?') echo "$0: $usage"; logfile=-; status=0; exit ;; esac done 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 - echo "$invocation" #### No non-option command line arguments are supported. @@ -120,42 +210,7 @@ echo "$invocation" if grep 'the authors of nmh' COPYRIGHT >/dev/null 2>&1; then : else - #### Download sources from repo. - 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 - else - die 'failed to clone git repo' - fi - else - [ -e nmh-"$branch" ] && die "nmh-$branch exists, will not overrwrite" - - #### Use snapshot. - tarball="nmh-$branch.tar.gz" - repo="http://$gitrepo/cgit/nmh.git/snapshot" - snapshot="$repo/$tarball" - if [ "`finddir wget`" ]; then - [ "$verbose" -eq 0 ] && wget_opts='--quiet' - wget --output-document - $wget_opts "$snapshot" | tar xzf - - elif [ "`finddir curl`" ]; then - [ "$verbose" -eq 0 ] && curl_opts=--silent - curl --location $curl_opts "$snapshot" | tar xzf - - 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" - else - die "failed to download nmh-$branch sources" - fi - fi + download=1 fi #### @@ -169,9 +224,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 +268,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. [ $debug -ge 1 ] && config_debug=y if [ $yes -eq 0 ]; then @@ -250,19 +301,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 +321,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 +333,16 @@ 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`" +[ $download -eq 1 ] && download_sources #### #### 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 +351,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 +362,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 - &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 +382,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 +403,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,40 +424,21 @@ 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 -fi - -#### -#### Report results. -#### - -#### Disable output redirection (and flush) so that we can grep. -exec 1>&3 3>&- - -if [ "$logfile" != - ]; then - rm -f "$logfile" - exec 3>&1 >"$logfile" 2>&1 -fi - -cat "$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 + echo "see nmh MACHINES file for build dependences" fi -exit $status +#### Will call cleanup, which will exit with $status. +exit