]> diplodocus.org Git - nmh/blob - docs/contrib/build_nmh
Added docs/contrib/build_nmh script.
[nmh] / docs / contrib / build_nmh
1 #! /bin/sh
2 #
3 # Configures and builds nmh.
4 # * This script must be invoked from an nmh source directory.
5 # * This script retrieves configuration from the first existing nmh
6 # installation on your $PATH, if any, as well as any $EDITOR/$VISUAL
7 # and $PAGER environment variable settings.
8 # * Unless the -y option is provided, this script then interactively
9 # walks you through confirmation of common configuration settings.
10 #
11 # Typical usage:
12 # The first time you invoke this script, use the -i option to install
13 # nmh in the specified location. The script will walk you through the
14 # common nmh configuration settings. The -v option will cause display
15 # of brief progress indicators. Be sure to add the bin directory of
16 # the install location to your $PATH, if not already there.
17 # Subsequently, invoke this script with the -y option, to use the
18 # relevant configuration settings from the installed nmh without
19 # confirmation.
20 #
21 # Option summary:
22 # First time use:
23 # -i to install nmh
24 # -v to display progress
25 # Subsequent uses, assuming installed nmh bin directory is on $PATH:
26 # -y to accept all configuration options without confirmation
27 # Output control:
28 # -l <logfile name>, default 'build_nmh.log'
29 # Advanced/developer use:
30 # -c to run 'make distcheck' instead of 'make check'
31 # -d to build nmh with debug enabled
32 # -s to use 'make superclean': requires recent autoconf and automake,
33 # see docs/README.developers
34 # -r to build rpm
35 #
36 # On Fedora, at least these rpms must be installed:
37 # gdbm-devel
38 # ncurses-devel
39 # cyrus-sasl-devel, if using sasl
40 # openssl-devel, if using TLS
41 # autoconf and automake, with -s (see docs/README.developers for versions)
42 # rpm-build, with -r
43
44
45 ####
46 #### OS-specific setup.
47 ####
48 which=which
49 ldd=ldd
50 locking=
51
52 os=${OSTYPE:-`uname -s`}
53 #### It'd be nice to have configure decide what locking style to use.
54 #### In the meantime, select it manually. To determine what style
55 #### locking your system uses by default, try something like this,
56 #### assuming that strace is installed:
57 #### $ echo test | strace -o /tmp/mail.strace mail -s test $LOGNAME
58 #### Then look in /tmp/mail.strace for fcntl, flock, and lockf system
59 #### calls and opens of dot files in the mail spool.
60 #### These might help but are old:
61 #### https://bugzilla.mozilla.org/show_bug.cgi?id=239013#c9
62 #### http://www.jwz.org/doc/movemail.html
63 case "$os" in
64 aix) locking=fcntl ;;
65 freebsd*) locking=flock ;;
66 linux* ) locking=fcntl ;;
67 esac
68
69
70 ####
71 #### Interpret command arguments.
72 ####
73 check=check
74 debug=0
75 install=0
76 logfile=build_nmh.log
77 build_rpm=0
78 superclean=0
79 verbose=0
80 yes=0
81 usage="usage: $0
82 [-c to run 'make distcheck' instead of 'make check']
83 [-d to build nmh with debug enabled]
84 [-i to install nmh]
85 [-l <logfile name>, default '$logfile']
86 [-r to build rpm]
87 [-s to use 'make superclean': requires recent autoconf and automake]
88 [-v to display progress]
89 [-y to accept all configuration options without confirmation]"
90
91 while getopts 'cdil:rsvy?' arg; do
92 case $arg in
93 c ) check=distcheck ;;
94 d ) debug=1 ;;
95 i ) install=1 ;;
96 l ) logfile=$OPTARG ;;
97 r ) build_rpm=1 ;;
98 s ) superclean=1 ;;
99 v ) verbose=1 ;;
100 y ) yes=1 ;;
101 '?') echo "$usage"; exit 0 ;;
102 esac
103 done
104 shift `expr $OPTIND - 1`
105
106 #### No command line arguments are supported.
107 if [ $# -gt 0 ]; then
108 echo "usage: $0"
109 exit 1
110 fi
111
112 #### Check to see that we're in a nmh source directory.
113 if ! grep 'the authors of nmh' COPYRIGHT >/dev/null; then
114 echo "$0: not in nmh source directory"
115 exit 1
116 fi
117
118 ####
119 #### Set up configure options. Handle options that can have embedded
120 #### spaces (currently just smtpservers) specially.
121 ####
122
123 #### dotlocking, the usual default, requires chgrp and chmod of inc.
124 installpriv=
125 if [ $install -ge 1 -a `id -u` -ne 0 ]; then
126 if [ "x$locking" = x -o "$locking" = dot ]; then
127 echo "$0: "'install requires chgrp and chmod 2755'
128 echo 'so will sudo to install. Terminate with Ctrl-C if unacceptable.'
129 installpriv=sudo
130 fi
131 fi
132
133
134 #### Here are the config options that we will try to detect, then
135 #### confirm, and finally set.
136 config_prefix=/usr/local/nmh
137 config_locking="$locking"
138 config_mts=smtp
139 config_smtpservers=localhost
140 config_sasl=n
141 config_tls=n
142 config_editor=vi
143 config_pager=more
144 config_debug=n
145
146 if mhparam >/dev/null 2>&1; then
147 # Determine config options from installed nmh.
148 mhparam=`which mhparam`
149 mhbin=`dirname "$mhparam"`
150
151 config_prefix=`cd $mhbin/.. && pwd`
152
153 mtsconf=`dirname "$mhbin"`/etc/mts.conf
154 if [ -f "$mtsconf" ]; then
155 mts_entry=`grep '^mts:' $mtsconf`
156 if [ "mts_entry" ]; then
157 mts=`echo $mts_entry | sed -e 's/^mts: *//'`
158 if [ "$mts" -a "$mts" != smtp ]; then
159 config_mts="$mts"
160 fi
161 fi
162
163 mtsconfservers=`grep '^servers:' $mtsconf`
164 if [ "$mtsconfservers" ]; then
165 servers=`echo $mtsconfservers | sed -e 's/^servers: *//' -e 's/ /\\\ /g'`
166 [ "$servers" ] && config_smtpservers="$servers"
167 fi
168 fi
169
170 if $ldd $mhbin/inc | grep sasl >/dev/null; then
171 config_sasl=y
172 fi
173
174 if $ldd $mhbin/inc | grep ssl >/dev/null; then
175 config_tls=y
176 fi
177 fi
178
179 if [ "$EDITOR" ]; then
180 config_editor="$EDITOR"
181 elif [ "$VISUAL" ]; then
182 config_editor="$VISUAL"
183 fi
184
185 [ "$PAGER" ] && config_pager="$PAGER"
186
187 [ $debug -ge 1 ] && config_debug=y
188
189 if [ $yes -eq 0 ]; then
190 #### Confirm each config setting with user.
191 printf 'Install prefix [%s]: ' $config_prefix
192 read prefix
193 [ "$prefix" ] && config_prefix="$prefix"
194
195 printf 'Locking type (dot|fcntl|flock|lockf) [%s]: ' $config_locking
196 read locking
197 [ "$locking" ] && config_locking="$locking"
198
199 printf 'MTS (smtp|sendmail) [%s]: ' $config_mts
200 read mts
201 [ "$mts" ] && config_mts="$mts"
202
203 if [ ! "$mts" -o "$mts" = smtp ]; then
204 printf 'SMTP server(s), space separated [%s]: ' $config_smtpservers
205 read response
206 servers=`echo $response | sed -e 's/ /\\\ /g'`
207 [ "$servers" ] && config_smtpservers="$servers"
208 fi
209
210 printf 'Cyrus SASL support [%s]: ' $config_sasl
211 read response
212 if [ "$response" = y -o "$response" = Y ]; then
213 config_sasl=y
214 elif [ "$response" = n -o "$response" = N ]; then
215 config_sasl=n
216 fi
217
218 printf 'TLS support [%s]: ' $config_tls
219 read response
220 if [ "$response" = y -o "$response" = Y ]; then
221 config_tls=y
222 elif [ "$response" = n -o "$response" = N ]; then
223 config_tls=n
224 fi
225
226 printf 'Default editor [%s]: ' $config_editor
227 read editor
228 [ "$editor" ] && config_editor=$editor
229
230 printf 'Pager [%s]: ' $config_pager
231 read pager
232 [ "$pager" ] && config_pager=$pager
233
234 #### Don't confirm debug here: obey the -d option to this script.
235 fi
236
237 smtpservers=
238 config_opts="--prefix=$config_prefix"
239
240 [ "$config_locking" ] && \
241 config_opts="$config_opts --with-locking=$config_locking"
242 [ "$config_mts" -a "$config_mts" != smtp ] && \
243 config_opts="$config_opts --with-mts=$config_mts"
244 [ "$config_smtpservers" -a "$config_smtpservers" != localhost ] && \
245 smtpservers="--with-smtpservers=$config_smtpservers"
246 [ "$config_sasl" = y ] && \
247 config_opts="$config_opts --with-cyrus-sasl"
248 [ "$config_tls" = y ] && \
249 config_opts="$config_opts --with-tls"
250 [ "$config_editor" ] && \
251 config_opts="$config_opts --with-editor=$config_editor"
252 [ "$config_pager" ] && \
253 config_opts="$config_opts --with-pager=$config_pager"
254 [ $config_debug = y ] && \
255 config_opts="$config_opts --enable-debug"
256
257
258 ####
259 #### Clean up, and set up with autoconfig if necessary.
260 ####
261 if [ -f Makefile ]; then
262 [ $verbose -ge 1 ] && echo cleaning . . .
263 if [ $superclean -ge 1 ]; then
264 make superclean >/dev/null
265 else
266 make distclean >/dev/null
267 fi
268 fi
269
270 /bin/rm -f $logfile
271 if [ -f configure -a -f Makefile.in ]; then
272 :
273 else
274 [ $verbose -ge 1 ] && echo autoconfiguring . . .
275 ./autogen.sh >>$logfile 2>&1
276 fi
277
278
279 ####
280 #### Build.
281 ####
282 [ $verbose -ge 1 ] && echo configuring . . .
283 echo ./configure $config_opts ${smtpservers:+"$smtpservers"} >>$logfile 2>&1
284 ./configure $config_opts ${smtpservers:+"$smtpservers"} >>$logfile 2>&1
285 status=$?
286
287 if [ $status -eq 0 ]; then
288 [ $verbose -ge 1 ] && echo building . . .
289 make >>$logfile 2>&1
290 status=$?
291
292 if [ $status -eq 0 ]; then
293 [ $verbose -ge 1 ] && echo testing . . .
294 checkoutput=`make $check SETGID_MAIL= 2>>$logfile`
295 status=$?
296
297 tests_summary=`echo "$checkoutput" | grep tests`
298 if [ "$tests_summary" ]; then
299 echo '===================' >>$logfile
300 echo $tests_summary >>$logfile
301 echo '===================' >>$logfile
302 [ "$check" = distcheck ] && \
303 echo "$checkoutput" | tail -n 4 >>$logfile
304 fi
305
306 if [ $status -eq 0 ]; then
307 if [ $install -ge 1 ]; then
308 [ $verbose -ge 1 ] && echo installing . . .
309 ($installpriv make install) >/dev/null 2>>$logfile
310 status=$?
311 fi
312
313 if [ $status -eq 0 -a $build_rpm -ge 1 ]; then
314 [ $verbose -ge 1 ] && echo building rpm . . .
315 make rpm >/dev/null 2>>$logfile
316 status=$?
317 fi
318 fi
319 fi
320 fi
321
322 grep -E 'Error|warn' $logfile
323 [ $status -ne 0 ] && echo build failed!
324 [ $status -eq 0 -a $verbose -ge 1 ] && echo build completed successfully
325
326 exit $status