colalign(): use bidi_info_needed(), bidi_info_create()
[s-mailx.git] / mk-conf.sh
blob51fc6270d403495f0cb42f73a81283efee8de7db
1 #!/bin/sh -
2 #@ Please see `INSTALL' and `conf.rc' instead.
4 LC_ALL=C
5 export LC_ALL
7 # Predefined CONFIG= urations take precedence over anything else
8 if [ -n "${CONFIG}" ]; then
9 case ${CONFIG} in
10 MINIMAL)
11 WANT_SOCKETS=0
12 WANT_IDNA=0
13 WANT_READLINE=0 WANT_EDITLINE=0 WANT_NCL=0
14 WANT_IMAP_SEARCH=0
15 WANT_REGEX=0
16 WANT_SPAM=0
17 WANT_DOCSTRINGS=0
18 WANT_QUOTE_FOLD=0
19 WANT_COLOUR=0
21 MEDIUM)
22 WANT_SOCKETS=0
23 WANT_IDNA=0
24 WANT_READLINE=0 WANT_EDITLINE=0
25 WANT_IMAP_SEARCH=0
26 WANT_SPAM=0
27 WANT_QUOTE_FOLD=0
28 WANT_COLOUR=0
30 NETSEND)
31 WANT_IMAP=0
32 WANT_POP3=0
33 WANT_READLINE=0 WANT_EDITLINE=0
34 WANT_IMAP_SEARCH=0
35 WANT_SPAM=0
36 WANT_QUOTE_FOLD=0
37 WANT_COLOUR=0
39 MAXIMAL)
40 WANT_GSSAPI=1
43 echo >&2 "Unknown CONFIG= setting: ${CONFIG}"
44 echo >&2 'Possible values: MINIMAL, MEDIUM, NETSEND'
45 exit 1
46 esac
49 # Inter-relationships
50 option_update() {
51 if nwantfeat SOCKETS; then
52 WANT_IPV6=0 WANT_SSL=0
53 WANT_IMAP=0 WANT_GSSAPI=0 WANT_POP3=0 WANT_SMTP=0
55 if nwantfeat IMAP && nwantfeat POP3 && nwantfeat SMTP; then
56 WANT_SOCKETS=0 WANT_IPV6=0 WANT_SSL=0
58 if nwantfeat IMAP && nwantfeat SMTP; then
59 WANT_GSSAPI=0
61 # If we don't need MD5 except for producing boundary and message-id strings,
62 # leave it off, plain old srand(3) should be enough for that purpose.
63 if nwantfeat SOCKETS; then
64 WANT_MD5=0
66 if wantfeat DEBUG; then
67 WANT_NOALLOCA=1
71 # Check out compiler ($CC) and -flags ($CFLAGS)
72 compiler_flags() {
73 # $CC is overwritten when empty or a default "cc", even without WANT_AUTOCC
74 optim= dbgoptim= _CFLAGS=
75 if [ -z "${CC}" ] || [ "${CC}" = cc ]; then
76 if { CC="`command -v clang`"; }; then
78 elif { CC="`command -v gcc`"; }; then
80 elif { CC="`command -v c89`"; }; then
81 [ "`uname -s`" = UnixWare ] && _CFLAGS=-v optim=-O dbgoptim=
82 elif { CC="`command -v c99`"; }; then
84 else
85 echo >&2 'ERROR'
86 echo >&2 ' I cannot find a compiler!'
87 echo >&2 ' Neither of clang(1), gcc(1), c89(1) and c99(1).'
88 echo >&2 ' Please set the CC environment variable, maybe CFLAGS also.'
89 exit 1
92 export CC
94 ccver=`${CC} --version 2>/dev/null`
95 stackprot=no
96 if { i=${ccver}; echo "${i}"; } | ${grep} -q -i -e gcc -e clang; then
97 #if echo "${i}" | ${grep} -q -i -e gcc -e 'clang version 1'; then
98 optim=-O2 dbgoptim=-O
99 stackprot=yes
100 _CFLAGS="${_CFLAGS} -std=c89 -Wall -Wextra -pedantic"
101 _CFLAGS="${_CFLAGS} -fno-unwind-tables -fno-asynchronous-unwind-tables"
102 _CFLAGS="${_CFLAGS} -fstrict-aliasing"
103 _CFLAGS="${_CFLAGS} -Wbad-function-cast -Wcast-align -Wcast-qual"
104 _CFLAGS="${_CFLAGS} -Winit-self -Wmissing-prototypes"
105 _CFLAGS="${_CFLAGS} -Wshadow -Wunused -Wwrite-strings"
106 _CFLAGS="${_CFLAGS} -Wno-long-long" # ISO C89 has no 'long long'...
107 if { i=${ccver}; echo "${i}"; } | ${grep} -q -e 'clang version 1'; then
108 _CFLAGS="${_CFLAGS} -Wstrict-overflow=5"
109 else
110 _CFLAGS="${_CFLAGS} -fstrict-overflow -Wstrict-overflow=5"
111 if wantfeat AMALGAMATION && nwantfeat DEBUG; then
112 _CFLAGS="${_CFLAGS} -Wno-unused-function"
114 if { i=${ccver}; echo "${i}"; } | ${grep} -q -i -e clang; then
115 _CFLAGS="${_CFLAGS} -Wno-unused-result" # TODO handle the right way
118 if wantfeat AMALGAMATION; then
119 _CFLAGS="${_CFLAGS} -pipe"
121 # elif { i=${ccver}; echo "${i}"; } | ${grep} -q -i -e clang; then
122 # optim=-O3 dbgoptim=-O
123 # stackprot=yes
124 # _CFLAGS='-std=c89 -Weverything -Wno-long-long'
125 # if wantfeat AMALGAMATION; then
126 # _CFLAGS="${_CFLAGS} -pipe"
127 # fi
128 elif [ -z "${optim}" ]; then
129 optim=-O1 dbgoptim=-O
132 if nwantfeat DEBUG; then
133 _CFLAGS="${optim} -DNDEBUG ${_CFLAGS}"
134 else
135 _CFLAGS="${dbgoptim} -g ${_CFLAGS}";
136 if [ "${stackprot}" = yes ]; then
137 _CFLAGS="${_CFLAGS} -ftrapv -fstack-protector-all "
138 _CFLAGS="${_CFLAGS} -Wstack-protector -D_FORTIFY_SOURCE=2"
141 _CFLAGS="${_CFLAGS} ${ADDCFLAGS}"
142 # XXX -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack: need detection
143 _LDFLAGS="${_LDFLAGS} ${ADDLDFLAGS}" # XXX -Wl,--sort-common,[-O1]
144 export _CFLAGS _LDFLAGS
146 # $CFLAGS and $LDFLAGS are only overwritten if explicitly wanted
147 if wantfeat AUTOCC; then
148 CFLAGS=$_CFLAGS
149 LDFLAGS=$_LDFLAGS
150 export CFLAGS LDFLAGS
154 ## -- >8 -- 8< -- ##
156 ## Notes:
157 ## - Heirloom sh(1) (and same origin) have problems with ': >' redirection,
158 ## so use "printf '' >" instead
159 ## - Heirloom sh(1) and maybe more execute loops with redirection in a subshell
160 ## (but don't export eval's from within), therefore we need to (re)include
161 ## variable assignments at toplevel instead (via reading temporary files)
163 ## First of all, create new configuration and check wether it changed ##
165 conf=./conf.rc
166 lst=./config.lst
167 h=./config.h
168 mk=./mk.mk
170 newlst=./config.lst-new
171 newmk=./config.mk-new
172 newh=./config.h-new
173 tmp0=___tmp
174 tmp=./${tmp0}1$$
176 # We need some standard utilities
177 unset -f command
178 check_tool() {
179 n=$1 i=$2 opt=${3:-0}
180 if type "${i}" >/dev/null 2>&1; then
181 eval ${n}=${i}
182 return 1
184 if [ ${opt} -eq 0 ]; then
185 echo >&2 "ERROR: no trace of the utility \`${n}'"
186 exit 1
188 return 0
191 # Check those tools right now that we need before including ${conf}
192 check_tool rm "${rm:-`command -v rm`}"
193 check_tool sed "${sed:-`command -v sed`}"
195 # Only incorporate what wasn't overwritten from command line / CONFIG
196 trap "${rm} -f ${tmp}; exit" 1 2 15
197 trap "${rm} -f ${tmp}" 0
198 ${rm} -f ${tmp}
200 < ${conf} ${sed} -e '/^[ \t]*#/d' -e '/^$/d' -e 's/[ \t]*$//' |
201 while read line; do
202 i=`echo ${line} | ${sed} -e 's/=.*$//'`
203 eval j=\$${i} jx=\${${i}+x}
204 if [ -n "${j}" ] || [ "${jx}" = x ]; then
205 line="${i}=\"${j}\""
207 echo ${line}
208 done > ${tmp}
209 . ./${tmp}
211 check_tool awk "${awk:-`command -v awk`}"
212 check_tool cat "${cat:-`command -v cat`}"
213 check_tool chmod "${chmod:-`command -v chmod`}"
214 check_tool cp "${cp:-`command -v cp`}"
215 check_tool cmp "${cmp:-`command -v cmp`}"
216 check_tool grep "${grep:-`command -v grep`}"
217 check_tool mkdir "${mkdir:-`command -v mkdir`}"
218 check_tool mv "${mv:-`command -v mv`}"
219 # rm(1), sed(1) above
220 check_tool tee "${tee:-`command -v tee`}"
222 check_tool make "${MAKE:-`command -v make`}"
223 check_tool strip "${STRIP:-`command -v strip`}" 1
224 HAVE_STRIP=${?}
226 wantfeat() {
227 eval i=\$WANT_${1}
228 [ "${i}" = "1" ]
230 nwantfeat() {
231 eval i=\$WANT_${1}
232 [ "${i}" != "1" ]
235 option_update
237 # (No function since some shells loose non-exported variables in traps)
238 trap "${rm} -f ${tmp} ${newlst} ${newmk} ${newh}; exit" 1 2 15
239 trap "${rm} -f ${tmp} ${newlst} ${newmk} ${newh}" 0
240 ${rm} -f ${newlst} ${newmk} ${newh}
242 # (Could: use FD redirection, add eval(1) and don't re-'. ./${newlst}')
243 while read line; do
244 i=`echo ${line} | ${sed} -e 's/=.*$//'`
245 eval j=\$${i}
246 if [ -z "${j}" ] || [ "${j}" = 0 ]; then
247 printf "/*#define ${i}*/\n" >> ${newh}
248 elif [ "${j}" = 1 ]; then
249 printf "#define ${i}\n" >> ${newh}
250 else
251 printf "#define ${i} \"${j}\"\n" >> ${newh}
253 printf "${i} = ${j}\n" >> ${newmk}
254 printf "${i}=\"${j}\"\n"
255 done < ${tmp} > ${newlst}
256 . ./${newlst}
258 printf "#define UAGENT \"${SID}${NAIL}\"\n" >> ${newh}
259 printf "UAGENT = ${SID}${NAIL}\n" >> ${newmk}
261 compiler_flags
263 printf "CC = ${CC}\n" >> ${newmk}
264 printf "_CFLAGS = ${_CFLAGS}\nCFLAGS = ${CFLAGS}\n" >> ${newmk}
265 printf "_LDFLAGS = ${_LDFLAGS}\nLDFLAGS = ${LDFLAGS}\n" >> ${newmk}
266 printf "AWK = ${awk}\nCMP = ${cmp}\nCHMOD = ${chmod}\nCP = ${cp}\n" >> ${newmk}
267 printf "GREP = ${grep}\nMKDIR = ${mkdir}\nRM = ${rm}\nSED = ${sed}\n" \
268 >> ${newmk}
269 printf "STRIP = ${strip}\nHAVE_STRIP = ${HAVE_STRIP}\n" >> ${newmk}
270 # (We include the cc(1)/ld(1) environment only for update detection..)
271 printf "CC=\"${CC}\"\n" >> ${newlst}
272 printf "_CFLAGS=\"${_CFLAGS}\"\nCFLAGS=\"${CFLAGS}\"\n" >> ${newlst}
273 printf "_LDFLAGS=\"${_LDFLAGS}\"\nLDFLAGS=\"${LDFLAGS}\"\n" >> ${newlst}
274 printf "AWK=${awk}\nCMP=${cmp}\nCHMOD=${chmod}\nCP=${cp}\n" >> ${newlst}
275 printf "GREP=${grep}\nMKDIR=${mkdir}\nRM=${rm}\nSED=${sed}\n" >> ${newlst}
276 printf "STRIP=${strip}\nHAVE_STRIP=${HAVE_STRIP}\n" >> ${newlst}
278 if [ -f ${lst} ] && ${cmp} ${newlst} ${lst} >/dev/null 2>&1; then
279 exit 0
281 [ -f ${lst} ] && echo 'configuration updated..' || echo 'shiny configuration..'
283 ${mv} -f ${newlst} ${lst}
284 ${mv} -f ${newh} ${h}
285 ${mv} -f ${newmk} ${mk}
287 ## Compile and link checking ##
289 tmp2=./${tmp0}2$$
290 tmp3=./${tmp0}3$$
291 log=./config.log
292 lib=./config.lib
293 inc=./config.inc
294 src=./config.c
295 makefile=./config.mk
297 # (No function since some shells loose non-exported variables in traps)
298 trap "${rm} -f ${lst} ${h} ${mk} ${lib} ${inc} ${src} ${makefile}; exit" 1 2 15
299 trap "${rm} -rf ${tmp0}.* ${tmp0}* ${makefile}" 0
301 exec 5>&2 > ${log} 2>&1
302 printf '' > ${lib}
303 printf '' > ${inc}
304 # ${src} is only created if WANT_AMALGAMATION
305 ${rm} -f ${src}
306 ${cat} > ${makefile} << \!
307 .SUFFIXES: .o .c .x .y
308 .c.o:
309 $(CC) $(XINCS) -c $<
310 .c.x:
311 $(CC) $(XINCS) -E $< >$@
313 $(CC) $(XINCS) -o $@ $< $(XLIBS)
314 .y: ;
317 msg() {
318 fmt=$1
320 shift
321 printf "*** ${fmt}\\n" "${@}"
322 printf "${fmt}" "${@}" >&5
325 _check_preface() {
326 variable=$1 topic=$2 define=$3
328 echo '**********'
329 msg "checking ${topic} ... "
330 echo "/* checked ${topic} */" >> ${h}
331 ${rm} -f ${tmp} ${tmp}.o
332 echo '*** test program is'
333 ${tee} ${tmp}.c
334 #echo '*** the preprocessor generates'
335 #${make} -f ${makefile} ${tmp}.x
336 #${cat} ${tmp}.x
337 echo '*** results are'
340 compile_check() {
341 variable=$1 topic=$2 define=$3
343 _check_preface "${variable}" "${topic}" "${define}"
345 if ${make} -f ${makefile} XINCS="${INCS}" ./${tmp}.o &&
346 [ -f ./${tmp}.o ]; then
347 msg "yes\\n"
348 echo "${define}" >> ${h}
349 eval have_${variable}=yes
350 return 0
351 else
352 echo "/* ${define} */" >> ${h}
353 msg "no\\n"
354 eval unset have_${variable}
355 return 1
359 _link_mayrun() {
360 run=$1 variable=$2 topic=$3 define=$4 libs=$5 incs=$6
362 _check_preface "${variable}" "${topic}" "${define}"
364 if ${make} -f ${makefile} XINCS="${INCS} ${incs}" \
365 XLIBS="${LIBS} ${libs}" ./${tmp} &&
366 [ -f ./${tmp} ] &&
367 { [ ${run} -eq 0 ] || ./${tmp}; }; then
368 echo "*** adding INCS<${incs}> LIBS<${libs}>"
369 msg "yes\\n"
370 echo "${define}" >> ${h}
371 LIBS="${LIBS} ${libs}"
372 echo "${libs}" >> ${lib}
373 INCS="${INCS} ${incs}"
374 echo "${incs}" >> ${inc}
375 eval have_${variable}=yes
376 return 0
377 else
378 msg "no\\n"
379 echo "/* ${define} */" >> ${h}
380 eval unset have_${variable}
381 return 1
385 link_check() {
386 _link_mayrun 0 "${1}" "${2}" "${3}" "${4}" "${5}"
389 run_check() {
390 _link_mayrun 1 "${1}" "${2}" "${3}" "${4}" "${5}"
393 # Build a basic set of INCS and LIBS according to user environment.
394 # On pkgsrc(7) systems automatically add /usr/pkg/*
395 if [ -n "${C_INCLUDE_PATH}" ]; then
396 i=${IFS}
397 IFS=:
398 set -- ${C_INCLUDE_PATH}
399 IFS=${i}
400 # for i; do -- new in POSIX Issue 7 + TC1
401 for i
403 [ "${i}" = '/usr/pkg/include' ] && continue
404 INCS="${INCS} -I${i}"
405 done
407 [ -d /usr/pkg/include ] && INCS="${INCS} -I/usr/pkg/include"
408 echo "${INCS}" >> ${inc}
410 if [ -n "${LD_LIBRARY_PATH}" ]; then
411 i=${IFS}
412 IFS=:
413 set -- ${LD_LIBRARY_PATH}
414 IFS=${i}
415 # for i; do -- new in POSIX Issue 7 + TC1
416 for i
418 [ "${i}" = '/usr/pkg/lib' ] && continue
419 LIBS="${LIBS} -L${i}"
420 done
422 [ -d /usr/pkg/lib ] && LIBS="${LIBS} -L/usr/pkg/lib"
423 echo "${LIBS}" >> ${lib}
427 # Better set _GNU_SOURCE (if we are on Linux only?); 'surprised it did without
428 echo '#define _GNU_SOURCE' >> ${h}
430 if link_check hello 'if a hello world program can be built' << \!
431 #include <stdio.h>
433 int main(int argc, char *argv[])
435 (void)argc;
436 (void)argv;
437 puts("hello world");
438 return 0;
441 then
443 else
444 echo >&5 'This oooops is most certainly not related to me.'
445 echo >&5 "Read the file ${log} and check your compiler environment."
446 ${rm} -f ${lst} ${h} ${mk}
447 exit 1
450 if link_check termios 'for termios.h and tc*() family' << \!
451 #include <termios.h>
452 int main(void)
454 struct termios tios;
455 tcgetattr(0, &tios);
456 tcsetattr(0, TCSADRAIN | TCSAFLUSH, &tios);
457 return 0;
460 then
462 else
463 echo >&5 'We require termios.h and the tc*() family of functions.'
464 echo >&5 "That much Unix we indulge ourselfs."
465 ${rm} -f ${lst} ${h} ${mk}
466 exit 1
469 link_check setenv 'for setenv()/unsetenv()' '#define HAVE_SETENV' << \!
470 #include <stdlib.h>
471 int main(void)
473 setenv("s-nail", "to be made nifty!", 1);
474 unsetenv("s-nail");
475 return 0;
479 link_check snprintf 'for snprintf()' '#define HAVE_SNPRINTF' << \!
480 #include <stdio.h>
481 int main(void)
483 char b[20];
484 snprintf(b, sizeof b, "%s", "string");
485 return 0;
489 link_check putc_unlocked 'for putc_unlocked()' '#define HAVE_PUTC_UNLOCKED' <<\!
490 #include <stdio.h>
491 int main(void)
493 putc_unlocked('@', stdout);
494 return 0;
498 link_check fchdir 'for fchdir()' '#define HAVE_FCHDIR' << \!
499 #include <unistd.h>
500 int main(void)
502 fchdir(0);
503 return 0;
507 link_check pipe2 'for pipe2()' '#define HAVE_PIPE2' << \!
508 #include <fcntl.h>
509 #include <unistd.h>
510 int main(void)
512 int fds[2];
513 pipe2(fds, O_CLOEXEC);
514 return 0;
518 link_check mmap 'for mmap()' '#define HAVE_MMAP' << \!
519 #include <sys/types.h>
520 #include <sys/mman.h>
521 int main(void)
523 mmap(0, 0, 0, 0, 0, 0);
524 return 0;
528 link_check mremap 'for mremap()' '#define HAVE_MREMAP' << \!
529 #include <sys/types.h>
530 #include <sys/mman.h>
531 int main(void)
533 mremap(0, 0, 0, MREMAP_MAYMOVE);
534 return 0;
538 link_check setlocale 'for setlocale()' '#define HAVE_SETLOCALE' << \!
539 #include <locale.h>
540 int main(void)
542 setlocale(LC_ALL, "");
543 return 0;
547 if [ "${have_setlocale}" = yes ]; then
548 link_check c90amend1 'for ISO/IEC 9899:1990/Amendment 1:1995' \
549 '#define HAVE_C90AMEND1' << \!
550 #include <limits.h>
551 #include <stdlib.h>
552 #include <wchar.h>
553 #include <wctype.h>
554 int main(void)
556 char mbb[MB_LEN_MAX + 1];
557 wchar_t wc;
558 iswprint(L'c');
559 towupper(L'c');
560 mbtowc(&wc, "x", 1);
561 mbrtowc(&wc, "x", 1, NULL);
562 (void)wctomb(mbb, wc);
563 return (mblen("\0", 1) == 0);
567 if [ "${have_c90amend1}" = yes ]; then
568 link_check wcwidth 'for wcwidth()' '#define HAVE_WCWIDTH' << \!
569 #include <wchar.h>
570 int main(void)
572 wcwidth(L'c');
573 return 0;
578 link_check nl_langinfo 'for nl_langinfo()' '#define HAVE_NL_LANGINFO' << \!
579 #include <langinfo.h>
580 #include <stdlib.h>
581 int main(void)
583 nl_langinfo(DAY_1);
584 return (nl_langinfo(CODESET) == NULL);
587 fi # have_setlocale
589 link_check mkstemp 'for mkstemp()' '#define HAVE_MKSTEMP' << \!
590 #include <stdlib.h>
591 int main(void)
593 mkstemp("x");
594 return 0;
598 # Note: run_check, thus we also get only the desired implementation...
599 run_check realpath 'for realpath()' '#define HAVE_REALPATH' << \!
600 #include <stdlib.h>
601 int main(void)
603 char *x = realpath(".", NULL), *y = realpath("/", NULL);
604 return (x != NULL && y != NULL) ? 0 : 1;
608 link_check wordexp 'for wordexp()' '#define HAVE_WORDEXP' << \!
609 #include <wordexp.h>
610 int main(void)
612 wordexp((char *)0, (wordexp_t *)0, 0);
613 return 0;
619 if wantfeat DEBUG; then
620 echo '#define HAVE_DEBUG' >> ${h}
623 if wantfeat AMALGAMATION; then
624 echo '#define HAVE_AMALGAMATION' >> ${h}
627 if nwantfeat NOALLOCA; then
628 # Due to NetBSD PR lib/47120 it seems best not to use non-cc-builtin
629 # versions of alloca(3) since modern compilers just can't be trusted
630 # not to overoptimize and silently break some code
631 link_check alloca 'for __builtin_alloca()' \
632 '#define HAVE_ALLOCA __builtin_alloca' << \!
633 int main(void)
635 void *vp = __builtin_alloca(1);
636 return (!! vp);
641 if nwantfeat NOGETOPT; then
642 link_check getopt 'for getopt()' '#define HAVE_GETOPT' << \!
643 #include <unistd.h>
644 int main(int argc, char **argv)
646 #if defined __GLIBC__ || defined __linux__
647 Argument and option reordering is not a desired feature.
648 #else
649 getopt(argc, argv, "oPt");
650 #endif
651 return (((long)optarg + optind) & 0x7F);
658 if wantfeat ICONV; then
659 ${cat} > ${tmp2}.c << \!
660 #include <iconv.h>
661 int main(void)
663 iconv_t id;
665 id = iconv_open("foo", "bar");
666 return 0;
669 < ${tmp2}.c link_check iconv 'for iconv functionality' \
670 '#define HAVE_ICONV' ||
671 < ${tmp2}.c link_check iconv \
672 'for iconv functionality in libiconv' \
673 '#define HAVE_ICONV' '-liconv'
674 else
675 echo '/* WANT_ICONV=0 */' >> ${h}
676 fi # wantfeat ICONV
678 if wantfeat SOCKETS; then
679 compile_check arpa_inet_h 'for <arpa/inet.h>' \
680 '#define HAVE_ARPA_INET_H' << \!
681 #include "config.h"
682 #include <sys/types.h>
683 #include <sys/socket.h>
684 #include <netdb.h>
685 #include <netinet/in.h>
686 #include <arpa/inet.h>
689 ${cat} > ${tmp2}.c << \!
690 #include "config.h"
691 #include <sys/types.h>
692 #include <sys/socket.h>
693 #include <netdb.h>
694 #include <netinet/in.h>
695 #ifdef HAVE_ARPA_INET_H
696 #include <arpa/inet.h>
697 #endif
699 int main(void)
701 struct sockaddr s;
702 socket(AF_INET, SOCK_STREAM, 0);
703 connect(0, &s, 0);
704 gethostbyname("foo");
705 return 0;
709 < ${tmp2}.c link_check sockets 'for sockets in libc' \
710 '#define HAVE_SOCKETS' ||
711 < ${tmp2}.c link_check sockets 'for sockets in libnsl' \
712 '#define HAVE_SOCKETS' '-lnsl' ||
713 < ${tmp2}.c link_check sockets \
714 'for sockets in libsocket and libnsl' \
715 '#define HAVE_SOCKETS' '-lsocket -lnsl' ||
716 WANT_SOCKETS=0
718 # XXX Shouldn't it be a hard error if there is no socket support, then?
719 option_update
720 else
721 echo '/* WANT_SOCKETS=0 */' >> ${h}
722 fi # wantfeat SOCKETS
724 wantfeat SOCKETS &&
725 link_check setsockopt 'for setsockopt()' '#define HAVE_SETSOCKOPT' << \!
726 #include <sys/socket.h>
727 #include <stdlib.h>
728 int main(void)
730 int sockfd = 3;
731 setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, NULL, 0);
732 return 0;
736 wantfeat SOCKETS && [ -n "${have_setsockopt}" ] &&
737 link_check so_sndtimeo 'for SO_SNDTIMEO' '#define HAVE_SO_SNDTIMEO' << \!
738 #include <sys/socket.h>
739 #include <stdlib.h>
740 int main(void)
742 struct timeval tv;
743 int sockfd = 3;
744 tv.tv_sec = 42;
745 tv.tv_usec = 21;
746 setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof tv);
747 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof tv);
748 return 0;
752 wantfeat SOCKETS && [ -n "${have_setsockopt}" ] &&
753 link_check so_linger 'for SO_LINGER' '#define HAVE_SO_LINGER' << \!
754 #include <sys/socket.h>
755 #include <stdlib.h>
756 int main(void)
758 struct linger li;
759 int sockfd = 3;
760 li.l_onoff = 1;
761 li.l_linger = 42;
762 setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &li, sizeof li);
763 return 0;
767 if wantfeat IPV6; then
768 link_check ipv6 'for IPv6 functionality' '#define HAVE_IPV6' << \!
769 #include "config.h"
770 #include <sys/types.h>
771 #include <sys/socket.h>
772 #include <netdb.h>
773 #include <netinet/in.h>
774 #ifdef HAVE_ARPA_INET_H
775 #include <arpa/inet.h>
776 #endif
778 int main(void)
780 struct addrinfo a, *ap;
781 getaddrinfo("foo", "0", &a, &ap);
782 return 0;
785 else
786 echo '/* WANT_IPV6=0 */' >> ${h}
787 fi # wantfeat IPV6
789 if wantfeat IMAP; then
790 echo '#define HAVE_IMAP' >> ${h}
791 else
792 echo '/* WANT_IMAP=0 */' >> ${h}
795 if wantfeat POP3; then
796 echo '#define HAVE_POP3' >> ${h}
797 else
798 echo '/* WANT_POP3=0 */' >> ${h}
801 if wantfeat SMTP; then
802 echo '#define HAVE_SMTP' >> ${h}
803 else
804 echo '/* WANT_SMTP=0 */' >> ${h}
807 if wantfeat SSL; then
808 link_check openssl 'for sufficiently recent OpenSSL' \
809 '#define HAVE_SSL
810 #define HAVE_OPENSSL' '-lssl -lcrypto' << \!
811 #include <openssl/ssl.h>
812 #include <openssl/err.h>
813 #include <openssl/x509v3.h>
814 #include <openssl/x509.h>
815 #include <openssl/rand.h>
817 #if defined OPENSSL_NO_SSL2 && defined OPENSSL_NO_SSL3 &&\
818 defined OPENSSL_NO_TLS1
819 # error We need one of (SSLv2 and) SSLv3 and TLS1.
820 #endif
822 int main(void)
824 SSLv23_client_method();
825 #ifndef OPENSSL_NO_SSL3
826 SSLv3_client_method();
827 #endif
828 #ifndef OPENSSL_NO_TLS1
829 TLSv1_client_method();
830 # ifdef TLS1_1_VERSION
831 TLSv1_1_client_method();
832 # endif
833 # ifdef TLS1_2_VERSION
834 TLSv1_2_client_method();
835 # endif
836 #endif
837 PEM_read_PrivateKey(0, 0, 0, 0);
838 return 0;
842 if [ "${have_openssl}" = 'yes' ]; then
843 compile_check stack_of 'for OpenSSL STACK_OF()' \
844 '#define HAVE_OPENSSL_STACK_OF' << \!
845 #include <openssl/ssl.h>
846 #include <openssl/err.h>
847 #include <openssl/x509v3.h>
848 #include <openssl/x509.h>
849 #include <openssl/rand.h>
851 int main(void)
853 STACK_OF(GENERAL_NAME) *gens = NULL;
854 printf("%p", gens); /* to make it used */
855 return 0;
859 link_check rand_egd 'for OpenSSL RAND_egd()' \
860 '#define HAVE_OPENSSL_RAND_EGD' '-lssl -lcrypto' << \!
861 #include <openssl/rand.h>
863 int main(void)
865 return RAND_egd("some.where") > 0;
869 if wantfeat MD5; then
870 run_check openssl_md5 'for MD5 digest in OpenSSL' \
871 '#define HAVE_OPENSSL_MD5' << \!
872 #include <string.h>
873 #include <openssl/md5.h>
875 int main(void)
877 char const dat[] = "abrakadabrafidibus";
878 char dig[16], hex[16 * 2];
879 MD5_CTX ctx;
880 size_t i, j;
882 memset(dig, 0, sizeof(dig));
883 memset(hex, 0, sizeof(hex));
884 MD5_Init(&ctx);
885 MD5_Update(&ctx, dat, sizeof(dat) - 1);
886 MD5_Final(dig, &ctx);
888 #define hexchar(n) ((n) > 9 ? (n) - 10 + 'a' : (n) + '0')
889 for (i = 0; i < sizeof(hex) / 2; i++) {
890 j = i << 1;
891 hex[j] = hexchar((dig[i] & 0xf0) >> 4);
892 hex[++j] = hexchar(dig[i] & 0x0f);
894 return !!memcmp("6d7d0a3d949da2e96f2aa010f65d8326", hex, sizeof(hex));
897 fi # wantfeat MD5
899 else
900 echo '/* WANT_SSL=0 */' >> ${h}
901 fi # wantfeat SSL
903 if wantfeat GSSAPI; then
904 ${cat} > ${tmp2}.c << \!
905 #include <gssapi/gssapi.h>
907 int main(void)
909 gss_import_name(0, 0, GSS_C_NT_HOSTBASED_SERVICE, 0);
910 gss_init_sec_context(0,0,0,0,0,0,0,0,0,0,0,0,0);
911 return 0;
914 ${sed} -e '1s/gssapi\///' < ${tmp2}.c > ${tmp3}.c
916 if command -v krb5-config >/dev/null 2>&1; then
917 i=`command -v krb5-config`
918 GSS_LIBS="`CFLAGS= ${i} --libs gssapi`"
919 GSS_INCS="`CFLAGS= ${i} --cflags`"
920 i='for GSS-API via krb5-config(1)'
921 else
922 GSS_LIBS='-lgssapi'
923 GSS_INCS=
924 i='for GSS-API in gssapi/gssapi.h, libgssapi'
926 < ${tmp2}.c link_check gss \
927 "${i}" '#define HAVE_GSSAPI' "${GSS_LIBS}" "${GSS_INCS}" ||\
928 < ${tmp3}.c link_check gss \
929 'for GSS-API in gssapi.h, libgssapi' \
930 '#define HAVE_GSSAPI
931 #define GSSAPI_REG_INCLUDE' \
932 '-lgssapi' ||\
933 < ${tmp2}.c link_check gss 'for GSS-API in libgssapi_krb5' \
934 '#define HAVE_GSSAPI' \
935 '-lgssapi_krb5' ||\
936 < ${tmp3}.c link_check gss \
937 'for GSS-API in libgssapi, OpenBSD-style (pre 5.3)' \
938 '#define HAVE_GSSAPI
939 #define GSS_REG_INCLUDE' \
940 '-lgssapi -lkrb5 -lcrypto' \
941 '-I/usr/include/kerberosV' ||\
942 < ${tmp2}.c link_check gss 'for GSS-API in libgss' \
943 '#define HAVE_GSSAPI' \
944 '-lgss' ||\
945 link_check gss 'for GSS-API in libgssapi_krb5, old-style' \
946 '#define HAVE_GSSAPI
947 #define GSSAPI_OLD_STYLE' \
948 '-lgssapi_krb5' << \!
949 #include <gssapi/gssapi.h>
950 #include <gssapi/gssapi_generic.h>
952 int main(void)
954 gss_import_name(0, 0, gss_nt_service_name, 0);
955 gss_init_sec_context(0,0,0,0,0,0,0,0,0,0,0,0,0);
956 return 0;
959 else
960 echo '/* WANT_GSSAPI=0 */' >> ${h}
961 fi # wantfeat GSSAPI
963 if wantfeat IDNA; then
964 link_check idna 'for GNU Libidn' '#define HAVE_IDNA' '-lidn' << \!
965 #include <idna.h>
966 #include <idn-free.h>
967 #include <stringprep.h>
968 int main(void)
970 char *utf8, *idna_ascii, *idna_utf8;
971 utf8 = stringprep_locale_to_utf8("does.this.work");
972 if (idna_to_ascii_8z(utf8, &idna_ascii, IDNA_USE_STD3_ASCII_RULES)
973 != IDNA_SUCCESS)
974 return 1;
975 idn_free(idna_ascii);
976 /* (Rather link check only here) */
977 idna_utf8 = stringprep_convert(idna_ascii, "UTF-8", "de_DE");
978 return 0;
981 else
982 echo '/* WANT_IDNA=0 */' >> ${h}
985 if wantfeat REGEX; then
986 link_check regex 'for regular expressions' '#define HAVE_REGEX' << \!
987 #include <regex.h>
988 #include <stdlib.h>
989 int main(void)
991 int status;
992 regex_t re;
993 if (regcomp(&re, ".*bsd", REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0)
994 return 1;
995 status = regexec(&re, "plan9", 0,NULL, 0);
996 regfree(&re);
997 return !(status == REG_NOMATCH);
1000 else
1001 echo '/* WANT_REGEX=0 */' >> ${h}
1004 if wantfeat READLINE; then
1005 __edrdlib() {
1006 link_check readline "for readline(3) (${1})" \
1007 '#define HAVE_READLINE' "${1}" << \!
1008 #include <stdio.h>
1009 #include <readline/history.h>
1010 #include <readline/readline.h>
1011 int main(void)
1013 char *rl;
1014 HISTORY_STATE *hs;
1015 HIST_ENTRY **he;
1016 int i;
1017 using_history();
1018 read_history("");
1019 stifle_history(242);
1020 rl = readline("Enter a line:");
1021 if (rl && *rl)
1022 add_history(rl);
1023 write_history("");
1024 rl_extend_line_buffer(10);
1025 rl_point = rl_end = 10;
1026 rl_pre_input_hook = (rl_hook_func_t*)NULL;
1027 rl_forced_update_display();
1028 clear_history();
1029 hs = history_get_history_state();
1030 i = hs->length;
1031 he = history_list();
1032 if (i > 0)
1033 rl = he[0]->line;
1034 rl_free_line_state();
1035 rl_cleanup_after_signal();
1036 rl_reset_after_signal();
1037 return 0;
1042 __edrdlib -lreadline ||
1043 __edrdlib '-lreadline -ltermcap'
1044 [ -n "${have_readline}" ] && WANT_TABEXPAND=1
1047 if wantfeat EDITLINE && [ -z "${have_readline}" ]; then
1048 __edlib() {
1049 link_check editline "for editline(3) (${1})" \
1050 '#define HAVE_EDITLINE' "${1}" << \!
1051 #include <histedit.h>
1052 static char * getprompt(void) { return (char*)"ok"; }
1053 int main(void)
1055 EditLine *el_el = el_init("TEST", stdin, stdout, stderr);
1056 HistEvent he;
1057 History *el_hcom = history_init();
1058 history(el_hcom, &he, H_SETSIZE, 242);
1059 el_set(el_el, EL_SIGNAL, 0);
1060 el_set(el_el, EL_TERMINAL, NULL);
1061 el_set(el_el, EL_HIST, &history, el_hcom);
1062 el_set(el_el, EL_EDITOR, "emacs");
1063 el_set(el_el, EL_PROMPT, &getprompt);
1064 el_source(el_el, NULL);
1065 history(el_hcom, &he, H_GETSIZE);
1066 history(el_hcom, &he, H_CLEAR);
1067 el_end(el_el);
1068 /* TODO add loader and addfn checks */
1069 history_end(el_hcom);
1070 return 0;
1075 __edlib -ledit ||
1076 __edlib '-ledit -ltermcap'
1077 [ -n "${have_editline}" ] && WANT_TABEXPAND=0
1080 if wantfeat NCL && [ -z "${have_editline}" ] && [ -z "${have_readline}" ] &&\
1081 [ -n "${have_c90amend1}" ]; then
1082 have_ncl=1
1083 echo '#define HAVE_NCL' >> ${h}
1084 else
1085 echo '/* WANT_{READLINE,EDITLINE,NCL}=0 */' >> ${h}
1088 # Generic have-a-command-line-editor switch for those who need it below
1089 if [ -n "${have_ncl}" ] || [ -n "${have_editline}" ] ||\
1090 [ -n "${have_readline}" ]; then
1091 have_cle=1
1094 if [ -n "${have_cle}" ] && wantfeat TABEXPAND; then
1095 echo '#define HAVE_TABEXPAND' >> ${h}
1096 else
1097 echo '/* WANT_TABEXPAND=0 */' >> ${h}
1100 if [ -n "${have_cle}" ] && wantfeat HISTORY; then
1101 echo '#define HAVE_HISTORY' >> ${h}
1102 else
1103 echo '/* WANT_HISTORY=0 */' >> ${h}
1106 if wantfeat SPAM; then
1107 echo '#define HAVE_SPAM' >> ${h}
1108 if command -v spamc >/dev/null 2>&1; then
1109 echo "#define SPAMC_PATH \"`command -v spamc`\"" >> ${h}
1111 else
1112 echo '/* WANT_SPAM=0 */' >> ${h}
1115 if wantfeat DOCSTRINGS; then
1116 echo '#define HAVE_DOCSTRINGS' >> ${h}
1117 else
1118 echo '/* WANT_DOCSTRINGS=0 */' >> ${h}
1121 if wantfeat QUOTE_FOLD &&\
1122 [ -n "${have_c90amend1}" ] && [ -n "${have_wcwidth}" ]; then
1123 echo '#define HAVE_QUOTE_FOLD' >> ${h}
1124 else
1125 echo '/* WANT_QUOTE_FOLD=0 */' >> ${h}
1128 if wantfeat COLOUR; then
1129 echo '#define HAVE_COLOUR' >> ${h}
1130 else
1131 echo '/* WANT_COLOUR=0 */' >> ${h}
1134 if wantfeat IMAP_SEARCH; then
1135 echo '#define HAVE_IMAP_SEARCH' >> ${h}
1136 else
1137 echo '/* WANT_IMAP_SEARCH=0 */' >> ${h}
1140 if wantfeat MD5; then
1141 echo '#define HAVE_MD5' >> ${h}
1142 else
1143 echo '/* WANT_MD5=0 */' >> ${h}
1146 ## Summarizing ##
1148 # Since we cat(1) the content of those to cc/"ld", convert them to single line
1149 squeeze_em() {
1150 < "${1}" > "${2}" ${awk} \
1151 'BEGIN {ORS = " "} /^[^#]/ {print} {next} END {ORS = ""; print "\n"}'
1153 ${rm} -f ${tmp}
1154 squeeze_em ${inc} ${tmp}
1155 ${mv} ${tmp} ${inc}
1156 squeeze_em ${lib} ${tmp}
1157 ${mv} ${tmp} ${lib}
1159 # config.h
1160 ${mv} ${h} ${tmp}
1161 printf '#ifndef _CONFIG_H\n# define _CONFIG_H\n' > ${h}
1162 ${cat} ${tmp} >> ${h}
1164 printf '\n/* The "feature string", for "simplicity" and lex.c */\n' >> ${h}
1165 printf '#ifdef _MAIN_SOURCE\n' >> ${h}
1166 printf '# ifdef HAVE_AMALGAMATION\nstatic\n# endif\n' >> ${h}
1167 printf 'char const features[] = "MIME"\n' >> ${h}
1168 printf '# ifdef HAVE_DOCSTRINGS\n ",DOCSTRINGS"\n# endif\n' >> ${h}
1169 printf '# ifdef HAVE_ICONV\n ",ICONV"\n# endif\n' >> ${h}
1170 printf '# ifdef HAVE_SETLOCALE\n ",LOCALES"\n# endif\n' >> ${h}
1171 printf '# ifdef HAVE_C90AMEND1\n ",MULTIBYTE CHARSETS"\n# endif\n' >> ${h}
1172 printf '# ifdef HAVE_NL_LANGINFO\n ",TERMINAL CHARSET"\n# endif\n' >> ${h}
1173 printf '# ifdef HAVE_SOCKETS\n ",NETWORK"\n# endif\n' >> ${h}
1174 printf '# ifdef HAVE_IPV6\n ",IPv6"\n# endif\n' >> ${h}
1175 printf '# ifdef HAVE_SSL\n ",S/MIME,SSL/TLS"\n# endif\n' >> ${h}
1176 printf '# ifdef HAVE_IMAP\n ",IMAP"\n# endif\n' >> ${h}
1177 printf '# ifdef HAVE_GSSAPI\n ",GSS-API"\n# endif\n' >> ${h}
1178 printf '# ifdef HAVE_POP3\n ",POP3"\n# endif\n' >> ${h}
1179 printf '# ifdef HAVE_SMTP\n ",SMTP"\n# endif\n' >> ${h}
1180 printf '# ifdef HAVE_SPAM\n ",SPAM"\n# endif\n' >> ${h}
1181 printf '# ifdef HAVE_IDNA\n ",IDNA"\n# endif\n' >> ${h}
1182 printf '# ifdef HAVE_IMAP_SEARCH\n ",IMAP-searches"\n# endif\n' >> ${h}
1183 printf '# ifdef HAVE_REGEX\n ",REGEX"\n# endif\n' >> ${h}
1184 printf '# ifdef HAVE_READLINE\n ",READLINE"\n# endif\n' >> ${h}
1185 printf '# ifdef HAVE_EDITLINE\n ",EDITLINE"\n# endif\n' >> ${h}
1186 printf '# ifdef HAVE_NCL\n ",NCL"\n# endif\n' >> ${h}
1187 printf '# ifdef HAVE_TABEXPAND\n ",TABEXPAND"\n# endif\n' >> ${h}
1188 printf '# ifdef HAVE_HISTORY\n ",HISTORY MANAGEMENT"\n# endif\n' >> ${h}
1189 printf '# ifdef HAVE_QUOTE_FOLD\n ",QUOTE-FOLD"\n# endif\n' >> ${h}
1190 printf '# ifdef HAVE_COLOUR\n ",COLOUR"\n# endif\n' >> ${h}
1191 printf '# ifdef HAVE_DEBUG\n ",DEBUG"\n# endif\n' >> ${h}
1192 printf ';\n#endif /* _MAIN_SOURCE */\n' >> ${h}
1194 printf '#endif /* _CONFIG_H */\n' >> ${h}
1195 ${rm} -f ${tmp}
1197 # Create the real mk.mk
1198 ${rm} -rf ${tmp0}.* ${tmp0}*
1199 printf 'OBJ_SRC = ' >> ${mk}
1200 if nwantfeat AMALGAMATION; then
1201 echo *.c >> ${mk}
1202 echo 'OBJ_DEP =' >> ${mk}
1203 else
1204 j=`echo "${src}" | sed 's/^.\///'`
1205 echo "${j}" >> ${mk}
1206 printf 'OBJ_DEP = main.c ' >> ${mk}
1207 printf '#define _MAIN_SOURCE\n' >> ${src}
1208 printf '#include "nail.h"\n#include "main.c"\n' >> ${src}
1209 for i in *.c; do
1210 if [ "${i}" = "${j}" ] || [ "${i}" = main.c ]; then
1211 continue
1213 printf "${i} " >> ${mk}
1214 printf "#include \"${i}\"\n" >> ${src}
1215 done
1216 echo >> ${mk}
1219 echo "LIBS = `${cat} ${lib}`" >> ${mk}
1220 echo "INCLUDES = `${cat} ${inc}`" >> ${mk}
1221 echo >> ${mk}
1222 ${cat} ./mk-mk.in >> ${mk}
1224 ## Finished! ##
1226 ${cat} > ${tmp2}.c << \!
1227 #include "config.h"
1228 #ifdef HAVE_NL_LANGINFO
1229 # include <langinfo.h>
1230 #endif
1232 :The following optional features are enabled:
1233 #ifdef HAVE_ICONV
1234 : + Character set conversion using iconv()
1235 #endif
1236 #ifdef HAVE_SETLOCALE
1237 : + Locale support: Printable characters depend on the environment
1238 # ifdef HAVE_C90AMEND1
1239 : + Multibyte character support
1240 # endif
1241 # ifdef HAVE_NL_LANGINFO
1242 : + Automatic detection of terminal character set
1243 # endif
1244 #endif
1245 #ifdef HAVE_SOCKETS
1246 : + Network support
1247 #endif
1248 #ifdef HAVE_IPV6
1249 : + Support for Internet Protocol v6 (IPv6)
1250 #endif
1251 #ifdef HAVE_SSL
1252 # ifdef HAVE_OPENSSL
1253 : + S/MIME and SSL/TLS using OpenSSL
1254 # endif
1255 #endif
1256 #ifdef HAVE_IMAP
1257 : + IMAP protocol
1258 #endif
1259 #ifdef HAVE_GSSAPI
1260 : + GSS-API authentication
1261 #endif
1262 #ifdef HAVE_POP3
1263 : + POP3 protocol
1264 #endif
1265 #ifdef HAVE_SMTP
1266 : + SMTP protocol
1267 #endif
1268 #ifdef HAVE_SPAM
1269 : + Interaction with spam filters
1270 #endif
1271 #ifdef HAVE_IDNA
1272 : + IDNA (internationalized domain names for applications) support
1273 #endif
1274 #ifdef HAVE_IMAP_SEARCH
1275 : + IMAP-style search expressions
1276 #endif
1277 #ifdef HAVE_REGEX
1278 : + Regular expression support (searches, conditional expressions etc.)
1279 #endif
1280 #if defined HAVE_READLINE || defined HAVE_EDITLINE || defined HAVE_NCL
1281 : + Command line editing
1282 # ifdef HAVE_TABEXPAND
1283 : + + Tabulator expansion
1284 # endif
1285 # ifdef HAVE_HISTORY
1286 : + + History management
1287 # endif
1288 #endif
1289 #ifdef HAVE_QUOTE_FOLD
1290 : + Extended *quote-fold*ing
1291 #endif
1292 #ifdef HAVE_COLOUR
1293 : + Coloured message display (simple)
1294 #endif
1296 :The following optional features are disabled:
1297 #ifndef HAVE_ICONV
1298 : - Character set conversion using iconv()
1299 #endif
1300 #ifndef HAVE_SETLOCALE
1301 : - Locale support: Only ASCII characters are recognized
1302 #endif
1303 # ifndef HAVE_C90AMEND1
1304 : - Multibyte character support
1305 # endif
1306 # ifndef HAVE_NL_LANGINFO
1307 : - Automatic detection of terminal character set
1308 # endif
1309 #ifndef HAVE_SOCKETS
1310 : - Network support
1311 #endif
1312 #ifndef HAVE_IPV6
1313 : - Support for Internet Protocol v6 (IPv6)
1314 #endif
1315 #if !defined HAVE_SSL
1316 : - SSL/TLS (network transport authentication and encryption)
1317 #endif
1318 #ifndef HAVE_IMAP
1319 : - IMAP protocol
1320 #endif
1321 #ifndef HAVE_GSSAPI
1322 : - GSS-API authentication
1323 #endif
1324 #ifndef HAVE_POP3
1325 : - POP3 protocol
1326 #endif
1327 #ifndef HAVE_SMTP
1328 : - SMTP protocol
1329 #endif
1330 #ifndef HAVE_SPAM
1331 : - Interaction with spam filters
1332 #endif
1333 #ifndef HAVE_IDNA
1334 : - IDNA (internationalized domain names for applications) support
1335 #endif
1336 #ifndef HAVE_IMAP_SEARCH
1337 : - IMAP-style search expressions
1338 #endif
1339 #ifndef HAVE_REGEX
1340 : - Regular expression support
1341 #endif
1342 #if !defined HAVE_READLINE && !defined HAVE_EDITLINE && !defined HAVE_NCL
1343 : - Command line editing and history
1344 #endif
1345 #ifndef HAVE_QUOTE_FOLD
1346 : - Extended *quote-fold*ing
1347 #endif
1348 #ifndef HAVE_COLOUR
1349 : - Coloured message display (simple)
1350 #endif
1352 :Remarks:
1353 #ifndef HAVE_SNPRINTF
1354 : . The function snprintf() could not be found. mailx will be compiled to use
1355 : sprintf() instead. This might overflow buffers if input values are larger
1356 : than expected. Use the resulting binary with care or update your system
1357 : environment and start the configuration process again.
1358 #endif
1359 #ifndef HAVE_FCHDIR
1360 : . The function fchdir() could not be found. mailx will be compiled to use
1361 : chdir() instead. This is not a problem unless the current working
1362 : directory of mailx is moved while the IMAP cache is used.
1363 #endif
1364 #ifndef HAVE_GETOPT
1365 : . Using a minimal builtin POSIX-like getopt()
1366 #endif
1367 #ifdef HAVE_DEBUG
1368 : . Debug enabled binary: not meant to be used by end-users: THANKS!
1369 #endif
1373 ${make} -f ${makefile} ${tmp2}.x
1374 < ${tmp2}.x >&5 ${sed} -e '/^[^:]/d; /^$/d; s/^://'
1376 # vim:set fenc=utf-8:s-it-mode