1#!/bin/sh
2srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.707 2016/11/11 23:31:29 tg Exp $'
3#-
4# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
5#		2011, 2012, 2013, 2014, 2015, 2016
6#	mirabilos <m@mirbsd.org>
7#
8# Provided that these terms and disclaimer and all copyright notices
9# are retained or reproduced in an accompanying document, permission
10# is granted to deal in this work without restriction, including un-
11# limited rights to use, publicly perform, distribute, sell, modify,
12# merge, give away, or sublicence.
13#
14# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
15# the utmost extent permitted by applicable law, neither express nor
16# implied; without malicious intent or gross negligence. In no event
17# may a licensor, author or contributor be held liable for indirect,
18# direct, other damage, loss, or other issues arising in any way out
19# of dealing in the work, even if advised of the possibility of such
20# damage or existence of a defect, except proven that it results out
21# of said person's immediate fault when using the work as intended.
22#-
23# People analysing the output must whitelist conftest.c for any kind
24# of compiler warning checks (mirtoconf is by design not quiet).
25#
26# Used environment documentation is at the end of this file.
27
28LC_ALL=C
29export LC_ALL
30
31case $ZSH_VERSION:$VERSION in
32:zsh*) ZSH_VERSION=2 ;;
33esac
34
35if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then
36	emulate sh
37	NULLCMD=:
38fi
39
40if test -d /usr/xpg4/bin/. >/dev/null 2>&1; then
41	# Solaris: some of the tools have weird behaviour, use portable ones
42	PATH=/usr/xpg4/bin:$PATH
43	export PATH
44fi
45
46nl='
47'
48safeIFS='	'
49safeIFS=" $safeIFS$nl"
50IFS=$safeIFS
51allu=QWERTYUIOPASDFGHJKLZXCVBNM
52alll=qwertyuiopasdfghjklzxcvbnm
53alln=0123456789
54alls=______________________________________________________________
55
56genopt_die() {
57	if test -n "$1"; then
58		echo >&2 "E: $*"
59		echo >&2 "E: in '$srcfile': '$line'"
60	else
61		echo >&2 "E: invalid input in '$srcfile': '$line'"
62	fi
63	rm -f "$bn.gen"
64	exit 1
65}
66
67genopt_soptc() {
68	optc=`echo "$line" | sed 's/^[<>]\(.\).*$/\1/'`
69	test x"$optc" = x'|' && return
70	optclo=`echo "$optc" | tr $allu $alll`
71	if test x"$optc" = x"$optclo"; then
72		islo=1
73	else
74		islo=0
75	fi
76	sym=`echo "$line" | sed 's/^[<>]/|/'`
77	o_str=$o_str$nl"<$optclo$islo$sym"
78}
79
80genopt_scond() {
81	case x$cond in
82	x)
83		cond=
84		;;
85	x*' '*)
86		cond=`echo "$cond" | sed 's/^ //'`
87		cond="#if $cond"
88		;;
89	x'!'*)
90		cond=`echo "$cond" | sed 's/^!//'`
91		cond="#ifndef $cond"
92		;;
93	x*)
94		cond="#ifdef $cond"
95		;;
96	esac
97}
98
99do_genopt() {
100	srcfile=$1
101	test -f "$srcfile" || genopt_die Source file \$srcfile not set.
102	bn=`basename "$srcfile" | sed 's/.opt$//'`
103	o_hdr='/* +++ GENERATED FILE +++ DO NOT EDIT +++ */'
104	o_gen=
105	o_str=
106	o_sym=
107	ddefs=
108	state=0
109	exec <"$srcfile"
110	IFS=
111	while IFS= read line; do
112		IFS=$safeIFS
113		case $state:$line in
114		2:'|'*)
115			# end of input
116			o_sym=`echo "$line" | sed 's/^.//'`
117			o_gen=$o_gen$nl"#undef F0"
118			o_gen=$o_gen$nl"#undef FN"
119			o_gen=$o_gen$ddefs
120			state=3
121			;;
122		1:@@)
123			# start of data block
124			o_gen=$o_gen$nl"#endif"
125			o_gen=$o_gen$nl"#ifndef F0"
126			o_gen=$o_gen$nl"#define F0 FN"
127			o_gen=$o_gen$nl"#endif"
128			state=2
129			;;
130		*:@@*)
131			genopt_die ;;
132		0:/\*-|0:\ \**|0:)
133			o_hdr=$o_hdr$nl$line
134			;;
135		0:@*|1:@*)
136			# start of a definition block
137			sym=`echo "$line" | sed 's/^@//'`
138			if test $state = 0; then
139				o_gen=$o_gen$nl"#if defined($sym)"
140			else
141				o_gen=$o_gen$nl"#elif defined($sym)"
142			fi
143			ddefs="$ddefs$nl#undef $sym"
144			state=1
145			;;
146		0:*|3:*)
147			genopt_die ;;
148		1:*)
149			# definition line
150			o_gen=$o_gen$nl$line
151			;;
152		2:'<'*'|'*)
153			genopt_soptc
154			;;
155		2:'>'*'|'*)
156			genopt_soptc
157			cond=`echo "$line" | sed 's/^[^|]*|//'`
158			genopt_scond
159			case $optc in
160			'|') optc=0 ;;
161			*) optc=\'$optc\' ;;
162			esac
163			IFS= read line || genopt_die Unexpected EOF
164			IFS=$safeIFS
165			test -n "$cond" && o_gen=$o_gen$nl"$cond"
166			o_gen=$o_gen$nl"$line, $optc)"
167			test -n "$cond" && o_gen=$o_gen$nl"#endif"
168			;;
169		esac
170	done
171	case $state:$o_sym in
172	3:) genopt_die Expected optc sym at EOF ;;
173	3:*) ;;
174	*) genopt_die Missing EOF marker ;;
175	esac
176	echo "$o_str" | sort | while IFS='|' read x opts cond; do
177		IFS=$safeIFS
178		test -n "$x" || continue
179		genopt_scond
180		test -n "$cond" && echo "$cond"
181		echo "\"$opts\""
182		test -n "$cond" && echo "#endif"
183	done | {
184		echo "$o_hdr"
185		echo "#ifndef $o_sym$o_gen"
186		echo "#else"
187		cat
188		echo "#undef $o_sym"
189		echo "#endif"
190	} >"$bn.gen"
191	IFS=$safeIFS
192	return 0
193}
194
195if test x"$BUILDSH_RUN_GENOPT" = x"1"; then
196	set x -G "$srcfile"
197	shift
198fi
199if test x"$1" = x"-G"; then
200	do_genopt "$2"
201	exit $?
202fi
203
204echo "For the build logs, demonstrate that /dev/null and /dev/tty exist:"
205ls -l /dev/null /dev/tty
206
207v() {
208	$e "$*"
209	eval "$@"
210}
211
212vv() {
213	_c=$1
214	shift
215	$e "\$ $*" 2>&1
216	eval "$@" >vv.out 2>&1
217	sed "s^${_c} " <vv.out
218}
219
220vq() {
221	eval "$@"
222}
223
224rmf() {
225	for _f in "$@"; do
226		case $_f in
227		Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;;
228		*) rm -f "$_f" ;;
229		esac
230	done
231}
232
233tcfn=no
234bi=
235ui=
236ao=
237fx=
238me=`basename "$0"`
239orig_CFLAGS=$CFLAGS
240phase=x
241oldish_ed=stdout-ed,no-stderr-ed
242
243if test -t 1; then
244	bi=''
245	ui=''
246	ao=''
247fi
248
249upper() {
250	echo :"$@" | sed 's/^://' | tr $alll $allu
251}
252
253# clean up after ac_testrun()
254ac_testdone() {
255	eval HAVE_$fu=$fv
256	fr=no
257	test 0 = $fv || fr=yes
258	$e "$bi==> $fd...$ao $ui$fr$ao$fx"
259	fx=
260}
261
262# ac_cache label: sets f, fu, fv?=0
263ac_cache() {
264	f=$1
265	fu=`upper $f`
266	eval fv=\$HAVE_$fu
267	case $fv in
268	0|1)
269		fx=' (cached)'
270		return 0
271		;;
272	esac
273	fv=0
274	return 1
275}
276
277# ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
278# returns 1 if value was cached/implied, 0 otherwise: call ac_testdone
279ac_testinit() {
280	if ac_cache $1; then
281		test x"$2" = x"!" && shift
282		test x"$2" = x"" || shift
283		fd=${3-$f}
284		ac_testdone
285		return 1
286	fi
287	fc=0
288	if test x"$2" = x""; then
289		ft=1
290	else
291		if test x"$2" = x"!"; then
292			fc=1
293			shift
294		fi
295		eval ft=\$HAVE_`upper $2`
296		shift
297	fi
298	fd=${3-$f}
299	if test $fc = "$ft"; then
300		fv=$2
301		fx=' (implied)'
302		ac_testdone
303		return 1
304	fi
305	$e ... $fd
306	return 0
307}
308
309# pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
310ac_testnnd() {
311	if test x"$1" = x"!"; then
312		fr=1
313		shift
314	else
315		fr=0
316	fi
317	ac_testinit "$@" || return 1
318	cat >conftest.c
319	vv ']' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN conftest.c $LIBS $ccpr"
320	test $tcfn = no && test -f a.out && tcfn=a.out
321	test $tcfn = no && test -f a.exe && tcfn=a.exe
322	test $tcfn = no && test -f conftest.exe && tcfn=conftest.exe
323	test $tcfn = no && test -f conftest && tcfn=conftest
324	if test -f $tcfn; then
325		test 1 = $fr || fv=1
326	else
327		test 0 = $fr || fv=1
328	fi
329	vscan=
330	if test $phase = u; then
331		test $ct = gcc && vscan='unrecogni[sz]ed'
332		test $ct = hpcc && vscan='unsupported'
333		test $ct = pcc && vscan='unsupported'
334		test $ct = sunpro && vscan='-e ignored -e turned.off'
335	fi
336	test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr
337	return 0
338}
339ac_testn() {
340	ac_testnnd "$@" || return
341	rmf conftest.c conftest.o ${tcfn}* vv.out
342	ac_testdone
343}
344
345# ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
346ac_ifcpp() {
347	expr=$1; shift
348	ac_testn "$@" <<-EOF
349		#include <unistd.h>
350		extern int thiswillneverbedefinedIhope(void);
351		int main(void) { return (isatty(0) +
352		#$expr
353		    0
354		#else
355		/* force a failure: expr is false */
356		    thiswillneverbedefinedIhope()
357		#endif
358		    ); }
359EOF
360	test x"$1" = x"!" && shift
361	f=$1
362	fu=`upper $f`
363	eval fv=\$HAVE_$fu
364	test x"$fv" = x"1"
365}
366
367add_cppflags() {
368	CPPFLAGS="$CPPFLAGS $*"
369}
370
371ac_cppflags() {
372	test x"$1" = x"" || fu=$1
373	fv=$2
374	test x"$2" = x"" && eval fv=\$HAVE_$fu
375	add_cppflags -DHAVE_$fu=$fv
376}
377
378ac_test() {
379	ac_testn "$@"
380	ac_cppflags
381}
382
383# ac_flags [-] add varname cflags [text] [ldflags]
384ac_flags() {
385	if test x"$1" = x"-"; then
386		shift
387		hf=1
388	else
389		hf=0
390	fi
391	fa=$1
392	vn=$2
393	f=$3
394	ft=$4
395	fl=$5
396	test x"$ft" = x"" && ft="if $f can be used"
397	save_CFLAGS=$CFLAGS
398	CFLAGS="$CFLAGS $f"
399	if test -n "$fl"; then
400		save_LDFLAGS=$LDFLAGS
401		LDFLAGS="$LDFLAGS $fl"
402	fi
403	if test 1 = $hf; then
404		ac_testn can_$vn '' "$ft"
405	else
406		ac_testn can_$vn '' "$ft" <<-'EOF'
407			/* evil apo'stroph in comment test */
408			#include <unistd.h>
409			int main(void) { return (isatty(0)); }
410		EOF
411	fi
412	eval fv=\$HAVE_CAN_`upper $vn`
413	if test -n "$fl"; then
414		test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
415	fi
416	test 11 = $fa$fv || CFLAGS=$save_CFLAGS
417}
418
419# ac_header [!] header [prereq ...]
420ac_header() {
421	if test x"$1" = x"!"; then
422		na=1
423		shift
424	else
425		na=0
426	fi
427	hf=$1; shift
428	hv=`echo "$hf" | tr -d '\012\015' | tr -c $alll$allu$alln $alls`
429	echo "/* NeXTstep bug workaround */" >x
430	for i
431	do
432		case $i in
433		_time)
434			echo '#if HAVE_BOTH_TIME_H' >>x
435			echo '#include <sys/time.h>' >>x
436			echo '#include <time.h>' >>x
437			echo '#elif HAVE_SYS_TIME_H' >>x
438			echo '#include <sys/time.h>' >>x
439			echo '#elif HAVE_TIME_H' >>x
440			echo '#include <time.h>' >>x
441			echo '#endif' >>x
442			;;
443		*)
444			echo "#include <$i>" >>x
445			;;
446		esac
447	done
448	echo "#include <$hf>" >>x
449	echo '#include <unistd.h>' >>x
450	echo 'int main(void) { return (isatty(0)); }' >>x
451	ac_testn "$hv" "" "<$hf>" <x
452	rmf x
453	test 1 = $na || ac_cppflags
454}
455
456addsrcs() {
457	if test x"$1" = x"!"; then
458		fr=0
459		shift
460	else
461		fr=1
462	fi
463	eval i=\$$1
464	test $fr = "$i" && case " $SRCS " in
465	*\ $2\ *)	;;
466	*)		SRCS="$SRCS $2" ;;
467	esac
468}
469
470
471curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null`
472case x$srcdir in
473x)
474	srcdir=.
475	;;
476*\ *|*"	"*|*"$nl"*)
477	echo >&2 Source directory should not contain space or tab or newline.
478	echo >&2 Errors may occur.
479	;;
480*"'"*)
481	echo Source directory must not contain single quotes.
482	exit 1
483	;;
484esac
485dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' "$srcdir/sh.h"`
486add_cppflags -DMKSH_BUILDSH
487
488e=echo
489r=0
490eq=0
491pm=0
492cm=normal
493optflags=-std-compile-opts
494check_categories=
495last=
496tfn=
497legacy=0
498
499for i
500do
501	case $last:$i in
502	c:combine|c:dragonegg|c:llvm|c:lto)
503		cm=$i
504		last=
505		;;
506	c:*)
507		echo "$me: Unknown option -c '$i'!" >&2
508		exit 1
509		;;
510	o:*)
511		optflags=$i
512		last=
513		;;
514	t:*)
515		tfn=$i
516		last=
517		;;
518	:-c)
519		last=c
520		;;
521	:-G)
522		echo "$me: Do not call me with '-G'!" >&2
523		exit 1
524		;;
525	:-g)
526		# checker, debug, valgrind build
527		add_cppflags -DDEBUG
528		CFLAGS="$CFLAGS -g3 -fno-builtin"
529		;;
530	:-j)
531		pm=1
532		;;
533	:-L)
534		legacy=1
535		;;
536	:+L)
537		legacy=0
538		;;
539	:-M)
540		cm=makefile
541		;;
542	:-O)
543		optflags=-std-compile-opts
544		;;
545	:-o)
546		last=o
547		;;
548	:-Q)
549		eq=1
550		;;
551	:-r)
552		r=1
553		;;
554	:-t)
555		last=t
556		;;
557	:-v)
558		echo "Build.sh $srcversion"
559		echo "for mksh $dstversion"
560		exit 0
561		;;
562	:*)
563		echo "$me: Unknown option '$i'!" >&2
564		exit 1
565		;;
566	*)
567		echo "$me: Unknown option -'$last' '$i'!" >&2
568		exit 1
569		;;
570	esac
571done
572if test -n "$last"; then
573	echo "$me: Option -'$last' not followed by argument!" >&2
574	exit 1
575fi
576
577test -z "$tfn" && if test $legacy = 0; then
578	tfn=mksh
579else
580	tfn=lksh
581fi
582if test -d $tfn || test -d $tfn.exe; then
583	echo "$me: Error: ./$tfn is a directory!" >&2
584	exit 1
585fi
586rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \
587    *.ll *.o *.gen *.cat1 Rebuild.sh lft no signames.inc test.sh x vv.out
588
589SRCS="lalloc.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
590SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
591
592if test $legacy = 0; then
593	SRCS="$SRCS edit.c"
594	check_categories="$check_categories shell:legacy-no int:32"
595else
596	check_categories="$check_categories shell:legacy-yes"
597	add_cppflags -DMKSH_LEGACY_MODE
598	HAVE_PERSISTENT_HISTORY=0
599fi
600
601if test x"$srcdir" = x"."; then
602	CPPFLAGS="-I. $CPPFLAGS"
603else
604	CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
605fi
606test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
607	LDFLAGS="$LDFLAGS $LDSTATIC"
608else
609	LDFLAGS=$LDSTATIC
610fi
611
612if test -z "$TARGET_OS"; then
613	x=`uname -s 2>/dev/null || uname`
614	test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
615fi
616if test -z "$TARGET_OS"; then
617	echo "$me: Set TARGET_OS, your uname is broken!" >&2
618	exit 1
619fi
620oswarn=
621ccpc=-Wc,
622ccpl=-Wl,
623tsts=
624ccpr='|| for _f in ${tcfn}*; do case $_f in Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;; *) rm -f "$_f" ;; esac; done'
625
626# Evil hack
627if test x"$TARGET_OS" = x"Android"; then
628	check_categories="$check_categories android"
629	TARGET_OS=Linux
630fi
631
632# Evil OS
633if test x"$TARGET_OS" = x"Minix"; then
634	echo >&2 "
635WARNING: additional checks before running Build.sh required!
636You can avoid these by calling Build.sh correctly, see below.
637"
638	cat >conftest.c <<'EOF'
639#include <sys/types.h>
640const char *
641#ifdef _NETBSD_SOURCE
642ct="Ninix3"
643#else
644ct="Minix3"
645#endif
646;
647EOF
648	ct=unknown
649	vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
650	sed 's/^/[ /' x
651	eval `cat x`
652	rmf x vv.out
653	case $ct in
654	Minix3|Ninix3)
655		echo >&2 "
656Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
657Please set it to either Minix3 or Ninix3, whereas the latter is
658all versions of Minix with even partial NetBSD(R) userland. The
659value determined from your compiler for the current compilation
660(which may be wrong) is: $ct
661"
662		TARGET_OS=$ct
663		;;
664	*)
665		echo >&2 "
666Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
667Please set it to either Minix3 or Ninix3, whereas the latter is
668all versions of Minix with even partial NetBSD(R) userland. The
669proper value couldn't be determined, continue at your own risk.
670"
671		;;
672	esac
673fi
674
675# Configuration depending on OS revision, on OSes that need them
676case $TARGET_OS in
677NEXTSTEP)
678	test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
679	    grep 'NeXT Mach [0-9][0-9.]*:' | \
680	    sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
681	;;
682QNX|SCO_SV)
683	test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
684	;;
685esac
686
687# Configuration depending on OS name
688case $TARGET_OS in
689386BSD)
690	: "${HAVE_CAN_OTWO=0}"
691	add_cppflags -DMKSH_NO_SIGSETJMP
692	add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
693	;;
694AIX)
695	add_cppflags -D_ALL_SOURCE
696	: "${HAVE_SETLOCALE_CTYPE=0}"
697	;;
698BeOS)
699	case $KSH_VERSION in
700	*MIRBSD\ KSH*)
701		oswarn="; it has minor issues"
702		;;
703	*)
704		oswarn="; you must recompile mksh with"
705		oswarn="$oswarn${nl}itself in a second stage"
706		;;
707	esac
708	# BeOS has no real tty either
709	add_cppflags -DMKSH_UNEMPLOYED
710	add_cppflags -DMKSH_DISABLE_TTY_WARNING
711	# BeOS doesn't have different UIDs and GIDs
712	add_cppflags -DMKSH__NO_SETEUGID
713	;;
714BSD/OS)
715	: "${HAVE_SETLOCALE_CTYPE=0}"
716	;;
717Coherent)
718	oswarn="; it has major issues"
719	add_cppflags -DMKSH__NO_SYMLINK
720	check_categories="$check_categories nosymlink"
721	add_cppflags -DMKSH__NO_SETEUGID
722	add_cppflags -DMKSH_DISABLE_TTY_WARNING
723	;;
724CYGWIN*)
725	: "${HAVE_SETLOCALE_CTYPE=0}"
726	;;
727Darwin)
728	add_cppflags -D_DARWIN_C_SOURCE
729	;;
730DragonFly)
731	;;
732FreeBSD)
733	;;
734FreeMiNT)
735	oswarn="; it has minor issues"
736	add_cppflags -D_GNU_SOURCE
737	: "${HAVE_SETLOCALE_CTYPE=0}"
738	;;
739GNU)
740	case $CC in
741	*tendracc*) ;;
742	*) add_cppflags -D_GNU_SOURCE ;;
743	esac
744	add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
745	# define MKSH__NO_PATH_MAX to use Hurd-only functions
746	add_cppflags -DMKSH__NO_PATH_MAX
747	;;
748GNU/kFreeBSD)
749	case $CC in
750	*tendracc*) ;;
751	*) add_cppflags -D_GNU_SOURCE ;;
752	esac
753	add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
754	;;
755Haiku)
756	add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
757	;;
758Harvey)
759	add_cppflags -D_POSIX_SOURCE
760	add_cppflags -D_LIMITS_EXTENSION
761	add_cppflags -D_BSD_EXTENSION
762	add_cppflags -D_SUSV2_SOURCE
763	add_cppflags -D_GNU_SOURCE
764	add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
765	add_cppflags -DMKSH_NO_CMDLINE_EDITING
766	add_cppflags -DMKSH__NO_SETEUGID
767	oswarn=' and will currently not work'
768	add_cppflags -DMKSH_UNEMPLOYED
769	add_cppflags -DMKSH_NOPROSPECTOFWORK
770	# these taken from Harvey-OS github and need re-checking
771	add_cppflags -D_setjmp=setjmp -D_longjmp=longjmp
772	: "${HAVE_CAN_NO_EH_FRAME=0}"
773	: "${HAVE_CAN_FNOSTRICTALIASING=0}"
774	: "${HAVE_CAN_FSTACKPROTECTORSTRONG=0}"
775	;;
776HP-UX)
777	;;
778Interix)
779	ccpc='-X '
780	ccpl='-Y '
781	add_cppflags -D_ALL_SOURCE
782	: "${LIBS=-lcrypt}"
783	: "${HAVE_SETLOCALE_CTYPE=0}"
784	;;
785IRIX*)
786	: "${HAVE_SETLOCALE_CTYPE=0}"
787	;;
788Linux)
789	case $CC in
790	*tendracc*) ;;
791	*) add_cppflags -D_GNU_SOURCE ;;
792	esac
793	add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
794	: "${HAVE_REVOKE=0}"
795	;;
796LynxOS)
797	oswarn="; it has minor issues"
798	;;
799MidnightBSD)
800	;;
801Minix-vmd)
802	add_cppflags -DMKSH__NO_SETEUGID
803	add_cppflags -DMKSH_UNEMPLOYED
804	add_cppflags -D_MINIX_SOURCE
805	oldish_ed=no-stderr-ed		# no /bin/ed, maybe see below
806	: "${HAVE_SETLOCALE_CTYPE=0}"
807	;;
808Minix3)
809	add_cppflags -DMKSH_UNEMPLOYED
810	add_cppflags -DMKSH_NO_LIMITS
811	add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
812	oldish_ed=no-stderr-ed		# /usr/bin/ed(!) is broken
813	: "${HAVE_SETLOCALE_CTYPE=0}"
814	;;
815MirBSD)
816	;;
817MSYS_*)
818	add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
819	# almost same as CYGWIN* (from RT|Chatzilla)
820	: "${HAVE_SETLOCALE_CTYPE=0}"
821	# broken on this OE (from ir0nh34d)
822	: "${HAVE_STDINT_H=0}"
823	;;
824NetBSD)
825	;;
826NEXTSTEP)
827	add_cppflags -D_NEXT_SOURCE
828	add_cppflags -D_POSIX_SOURCE
829	: "${AWK=gawk}"
830	: "${CC=cc -posix}"
831	add_cppflags -DMKSH_NO_SIGSETJMP
832	# NeXTstep cannot get a controlling tty
833	add_cppflags -DMKSH_UNEMPLOYED
834	case $TARGET_OSREV in
835	4.2*)
836		# OpenStep 4.2 is broken by default
837		oswarn="; it needs libposix.a"
838		;;
839	esac
840	;;
841Ninix3)
842	# similar to Minix3
843	add_cppflags -DMKSH_UNEMPLOYED
844	add_cppflags -DMKSH_NO_LIMITS
845	# but no idea what else could be needed
846	oswarn="; it has unknown issues"
847	;;
848OpenBSD)
849	: "${HAVE_SETLOCALE_CTYPE=0}"
850	;;
851OS/2)
852	HAVE_TERMIOS_H=0
853	HAVE_MKNOD=0	# setmode() incompatible
854	oswarn="; it is currently being ported, get it from"
855	oswarn="$oswarn${nl}https://github.com/komh/mksh-os2 in the meanwhile"
856	check_categories="$check_categories nosymlink"
857	: "${CC=gcc}"
858	: "${SIZE=: size}"
859	add_cppflags -DMKSH_UNEMPLOYED
860	add_cppflags -DMKSH_NOPROSPECTOFWORK
861	add_cppflags -DMKSH_NO_LIMITS
862	;;
863OSF1)
864	HAVE_SIG_T=0	# incompatible
865	add_cppflags -D_OSF_SOURCE
866	add_cppflags -D_POSIX_C_SOURCE=200112L
867	add_cppflags -D_XOPEN_SOURCE=600
868	add_cppflags -D_XOPEN_SOURCE_EXTENDED
869	: "${HAVE_SETLOCALE_CTYPE=0}"
870	;;
871Plan9)
872	add_cppflags -D_POSIX_SOURCE
873	add_cppflags -D_LIMITS_EXTENSION
874	add_cppflags -D_BSD_EXTENSION
875	add_cppflags -D_SUSV2_SOURCE
876	add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
877	add_cppflags -DMKSH_NO_CMDLINE_EDITING
878	add_cppflags -DMKSH__NO_SETEUGID
879	oswarn=' and will currently not work'
880	add_cppflags -DMKSH_UNEMPLOYED
881	# this is for detecting kencc
882	add_cppflags -DMKSH_MAYBE_KENCC
883	;;
884PW32*)
885	HAVE_SIG_T=0	# incompatible
886	oswarn=' and will currently not work'
887	: "${HAVE_SETLOCALE_CTYPE=0}"
888	;;
889QNX)
890	add_cppflags -D__NO_EXT_QNX
891	add_cppflags -D__EXT_UNIX_MISC
892	case $TARGET_OSREV in
893	[012345].*|6.[0123].*|6.4.[01])
894		oldish_ed=no-stderr-ed		# oldish /bin/ed is broken
895		;;
896	esac
897	: "${HAVE_SETLOCALE_CTYPE=0}"
898	;;
899SCO_SV)
900	case $TARGET_OSREV in
901	3.2*)
902		# SCO OpenServer 5
903		add_cppflags -DMKSH_UNEMPLOYED
904		;;
905	5*)
906		# SCO OpenServer 6
907		;;
908	*)
909		oswarn='; this is an unknown version of'
910		oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
911		;;
912	esac
913	: "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
914	;;
915skyos)
916	oswarn="; it has minor issues"
917	;;
918SunOS)
919	add_cppflags -D_BSD_SOURCE
920	add_cppflags -D__EXTENSIONS__
921	;;
922syllable)
923	add_cppflags -D_GNU_SOURCE
924	add_cppflags -DMKSH_NO_SIGSUSPEND
925	oswarn=' and will currently not work'
926	;;
927ULTRIX)
928	: "${CC=cc -YPOSIX}"
929	add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
930	: "${HAVE_SETLOCALE_CTYPE=0}"
931	;;
932UnixWare|UNIX_SV)
933	# SCO UnixWare
934	: "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
935	;;
936UWIN*)
937	ccpc='-Yc,'
938	ccpl='-Yl,'
939	tsts=" 3<>/dev/tty"
940	oswarn="; it will compile, but the target"
941	oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
942	: "${HAVE_SETLOCALE_CTYPE=0}"
943	;;
944_svr4)
945	# generic target for SVR4 Unix with uname -s = uname -n
946	# this duplicates the * target below
947	oswarn='; it may or may not work'
948	test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
949	;;
950*)
951	oswarn='; it may or may not work'
952	test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
953	;;
954esac
955
956: "${HAVE_MKNOD=0}"
957
958: "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
959test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
960    echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
961
962# this aids me in tracing FTBFSen without access to the buildd
963$e "Hi from$ao $bi$srcversion$ao on:"
964case $TARGET_OS in
965AIX)
966	vv '|' "oslevel >&2"
967	vv '|' "uname -a >&2"
968	;;
969Darwin)
970	vv '|' "hwprefs machine_type os_type os_class >&2"
971	vv '|' "sw_vers >&2"
972	vv '|' "system_profiler SPSoftwareDataType SPHardwareDataType >&2"
973	vv '|' "/bin/sh --version >&2"
974	vv '|' "xcodebuild -version >&2"
975	vv '|' "uname -a >&2"
976	vv '|' "sysctl kern.version hw.machine hw.model hw.memsize hw.availcpu hw.cpufrequency hw.byteorder hw.cpu64bit_capable >&2"
977	;;
978IRIX*)
979	vv '|' "uname -a >&2"
980	vv '|' "hinv -v >&2"
981	;;
982OSF1)
983	vv '|' "uname -a >&2"
984	vv '|' "/usr/sbin/sizer -v >&2"
985	;;
986SCO_SV|UnixWare|UNIX_SV)
987	vv '|' "uname -a >&2"
988	vv '|' "uname -X >&2"
989	;;
990*)
991	vv '|' "uname -a >&2"
992	;;
993esac
994test -z "$oswarn" || echo >&2 "
995Warning: mksh has not yet been ported to or tested on your
996operating system '$TARGET_OS'$oswarn. If you can provide
997a shell account to the developer, this may improve; please
998drop us a success or failure notice or even send in diffs.
999"
1000$e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
1001
1002#
1003# Start of mirtoconf checks
1004#
1005$e $bi$me: Scanning for functions... please ignore any errors.$ao
1006
1007#
1008# Compiler: which one?
1009#
1010# notes:
1011# - ICC defines __GNUC__ too
1012# - GCC defines __hpux too
1013# - LLVM+clang defines __GNUC__ too
1014# - nwcc defines __GNUC__ too
1015CPP="$CC -E"
1016$e ... which compiler seems to be used
1017cat >conftest.c <<'EOF'
1018const char *
1019#if defined(__ICC) || defined(__INTEL_COMPILER)
1020ct="icc"
1021#elif defined(__xlC__) || defined(__IBMC__)
1022ct="xlc"
1023#elif defined(__SUNPRO_C)
1024ct="sunpro"
1025#elif defined(__ACK__)
1026ct="ack"
1027#elif defined(__BORLANDC__)
1028ct="bcc"
1029#elif defined(__WATCOMC__)
1030ct="watcom"
1031#elif defined(__MWERKS__)
1032ct="metrowerks"
1033#elif defined(__HP_cc)
1034ct="hpcc"
1035#elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1036ct="dec"
1037#elif defined(__PGI)
1038ct="pgi"
1039#elif defined(__DMC__)
1040ct="dmc"
1041#elif defined(_MSC_VER)
1042ct="msc"
1043#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1044ct="adsp"
1045#elif defined(__IAR_SYSTEMS_ICC__)
1046ct="iar"
1047#elif defined(SDCC)
1048ct="sdcc"
1049#elif defined(__PCC__)
1050ct="pcc"
1051#elif defined(__TenDRA__)
1052ct="tendra"
1053#elif defined(__TINYC__)
1054ct="tcc"
1055#elif defined(__llvm__) && defined(__clang__)
1056ct="clang"
1057#elif defined(__NWCC__)
1058ct="nwcc"
1059#elif defined(__GNUC__)
1060ct="gcc"
1061#elif defined(_COMPILER_VERSION)
1062ct="mipspro"
1063#elif defined(__sgi)
1064ct="mipspro"
1065#elif defined(__hpux) || defined(__hpua)
1066ct="hpcc"
1067#elif defined(__ultrix)
1068ct="ucode"
1069#elif defined(__USLC__)
1070ct="uslc"
1071#elif defined(__LCC__)
1072ct="lcc"
1073#elif defined(MKSH_MAYBE_KENCC)
1074/* and none of the above matches */
1075ct="kencc"
1076#else
1077ct="unknown"
1078#endif
1079;
1080const char *
1081#if defined(__KLIBC__) && !defined(__OS2__)
1082et="klibc"
1083#else
1084et="unknown"
1085#endif
1086;
1087EOF
1088ct=untested
1089et=untested
1090vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1091    sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1092sed 's/^/[ /' x
1093eval `cat x`
1094rmf x vv.out
1095cat >conftest.c <<'EOF'
1096#include <unistd.h>
1097int main(void) { return (isatty(0)); }
1098EOF
1099case $ct in
1100ack)
1101	# work around "the famous ACK const bug"
1102	CPPFLAGS="-Dconst= $CPPFLAGS"
1103	;;
1104adsp)
1105	echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
1106    and SHARC (21000) DSPs detected. This compiler has not yet
1107    been tested for compatibility with mksh. Continue at your
1108    own risk, please report success/failure to the developers.'
1109	;;
1110bcc)
1111	echo >&2 "Warning: Borland C++ Builder detected. This compiler might
1112    produce broken executables. Continue at your own risk,
1113    please report success/failure to the developers."
1114	;;
1115clang)
1116	# does not work with current "ccc" compiler driver
1117	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1118	# one of these two works, for now
1119	vv '|' "${CLANG-clang} -version"
1120	vv '|' "${CLANG-clang} --version"
1121	# ensure compiler and linker are in sync unless overridden
1122	case $CCC_CC:$CCC_LD in
1123	:*)	;;
1124	*:)	CCC_LD=$CCC_CC; export CCC_LD ;;
1125	esac
1126	: "${HAVE_STRING_POOLING=i1}"
1127	;;
1128dec)
1129	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1130	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1131	;;
1132dmc)
1133	echo >&2 "Warning: Digital Mars Compiler detected. When running under"
1134	echo >&2 "    UWIN, mksh tends to be unstable due to the limitations"
1135	echo >&2 "    of this platform. Continue at your own risk,"
1136	echo >&2 "    please report success/failure to the developers."
1137	;;
1138gcc)
1139	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1140	vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
1141	    -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
1142	    $LIBS -dumpversion`'
1143	: "${HAVE_STRING_POOLING=i2}"
1144	;;
1145hpcc)
1146	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1147	;;
1148iar)
1149	echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
1150    systems detected. This unsupported compiler has not yet
1151    been tested for compatibility with mksh. Continue at your
1152    own risk, please report success/failure to the developers.'
1153	;;
1154icc)
1155	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1156	;;
1157kencc)
1158	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1159	;;
1160lcc)
1161	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1162	add_cppflags -D__inline__=__inline
1163	;;
1164metrowerks)
1165	echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
1166    been tested for compatibility with mksh. Continue at your
1167    own risk, please report success/failure to the developers.'
1168	;;
1169mipspro)
1170	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1171	;;
1172msc)
1173	ccpr=		# errorlevels are not reliable
1174	case $TARGET_OS in
1175	Interix)
1176		if [[ -n $C89_COMPILER ]]; then
1177			C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1178		else
1179			C89_COMPILER=CL.EXE
1180		fi
1181		if [[ -n $C89_LINKER ]]; then
1182			C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1183		else
1184			C89_LINKER=LINK.EXE
1185		fi
1186		vv '|' "$C89_COMPILER /HELP >&2"
1187		vv '|' "$C89_LINKER /LINK >&2"
1188		;;
1189	esac
1190	;;
1191nwcc)
1192	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1193	;;
1194pcc)
1195	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1196	;;
1197pgi)
1198	echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1199    been tested for compatibility with mksh. Continue at your
1200    own risk, please report success/failure to the developers.'
1201	;;
1202sdcc)
1203	echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1204    C compiler for embedded systems detected. This has not yet
1205    been tested for compatibility with mksh. Continue at your
1206    own risk, please report success/failure to the developers.'
1207	;;
1208sunpro)
1209	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1210	;;
1211tcc)
1212	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1213	;;
1214tendra)
1215	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1216	    grep -F -i -e version -e release"
1217	;;
1218ucode)
1219	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1220	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1221	;;
1222uslc)
1223	case $TARGET_OS:$TARGET_OSREV in
1224	SCO_SV:3.2*)
1225		# SCO OpenServer 5
1226		CFLAGS="$CFLAGS -g"
1227		: "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1228		;;
1229	esac
1230	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1231	;;
1232watcom)
1233	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1234	;;
1235xlc)
1236	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1237	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1238	vv '|' "ld -V"
1239	;;
1240*)
1241	test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1242	ct=unknown
1243	vv "$CC --version"
1244	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1245	vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1246	;;
1247esac
1248case $cm in
1249dragonegg|llvm)
1250	vv '|' "llc -version"
1251	;;
1252esac
1253etd=" on $et"
1254case $et in
1255klibc)
1256	add_cppflags -DMKSH_NO_LIMITS
1257	;;
1258unknown)
1259	# nothing special detected, don’t worry
1260	etd=
1261	;;
1262*)
1263	# huh?
1264	;;
1265esac
1266$e "$bi==> which compiler seems to be used...$ao $ui$ct$etd$ao"
1267rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1268
1269#
1270# Compiler: works as-is, with -Wno-error and -Werror
1271#
1272save_NOWARN=$NOWARN
1273NOWARN=
1274DOWARN=
1275ac_flags 0 compiler_works '' 'if the compiler works'
1276test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1277HAVE_COMPILER_KNOWN=0
1278test $ct = unknown || HAVE_COMPILER_KNOWN=1
1279if ac_ifcpp 'if 0' compiler_fails '' \
1280    'if the compiler does not fail correctly'; then
1281	save_CFLAGS=$CFLAGS
1282	: "${HAVE_CAN_DELEXE=x}"
1283	case $ct in
1284	dec)
1285		CFLAGS="$CFLAGS ${ccpl}-non_shared"
1286		ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1287			#include <unistd.h>
1288			int main(void) { return (isatty(0)); }
1289		EOF
1290		;;
1291	dmc)
1292		CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1293		ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1294			#include <unistd.h>
1295			int main(void) { return (isatty(0)); }
1296		EOF
1297		;;
1298	*)
1299		exit 1
1300		;;
1301	esac
1302	test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1303	ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1304	EOF
1305	test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1306fi
1307if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1308    'if this could be tcc'; then
1309	ct=tcc
1310	CPP='cpp -D__TINYC__'
1311	HAVE_COMPILER_KNOWN=1
1312fi
1313
1314case $ct in
1315bcc)
1316	save_NOWARN="${ccpc}-w"
1317	DOWARN="${ccpc}-w!"
1318	;;
1319dec)
1320	# -msg_* flags not used yet, or is -w2 correct?
1321	;;
1322dmc)
1323	save_NOWARN="${ccpc}-w"
1324	DOWARN="${ccpc}-wx"
1325	;;
1326hpcc)
1327	save_NOWARN=
1328	DOWARN=+We
1329	;;
1330kencc)
1331	save_NOWARN=
1332	DOWARN=
1333	;;
1334mipspro)
1335	save_NOWARN=
1336	DOWARN="-diag_error 1-10000"
1337	;;
1338msc)
1339	save_NOWARN="${ccpc}/w"
1340	DOWARN="${ccpc}/WX"
1341	;;
1342sunpro)
1343	test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1344	ac_flags 0 errwarnnone "$save_NOWARN"
1345	test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1346	ac_flags 0 errwarnall "-errwarn=%all"
1347	test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1348	;;
1349tendra)
1350	save_NOWARN=-w
1351	;;
1352ucode)
1353	save_NOWARN=
1354	DOWARN=-w2
1355	;;
1356watcom)
1357	save_NOWARN=
1358	DOWARN=-Wc,-we
1359	;;
1360xlc)
1361	save_NOWARN=-qflag=i:e
1362	DOWARN=-qflag=i:i
1363	;;
1364*)
1365	test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1366	ac_flags 0 wnoerror "$save_NOWARN"
1367	test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1368	ac_flags 0 werror -Werror
1369	test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1370	test $ct = icc && DOWARN="$DOWARN -wd1419"
1371	;;
1372esac
1373NOWARN=$save_NOWARN
1374
1375#
1376# Compiler: extra flags (-O2 -f* -W* etc.)
1377#
1378i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1379# optimisation: only if orig_CFLAGS is empty
1380test x"$i" = x"" && case $ct in
1381hpcc)
1382	phase=u
1383	ac_flags 1 otwo +O2
1384	phase=x
1385	;;
1386kencc|tcc|tendra)
1387	# no special optimisation
1388	;;
1389sunpro)
1390	cat >x <<-'EOF'
1391		#include <unistd.h>
1392		int main(void) { return (isatty(0)); }
1393		#define __IDSTRING_CONCAT(l,p)	__LINTED__ ## l ## _ ## p
1394		#define __IDSTRING_EXPAND(l,p)	__IDSTRING_CONCAT(l,p)
1395		#define pad			void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1396	EOF
1397	yes pad | head -n 256 >>x
1398	ac_flags - 1 otwo -xO2 <x
1399	rmf x
1400	;;
1401xlc)
1402	ac_flags 1 othree "-O3 -qstrict"
1403	test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1404	;;
1405*)
1406	ac_flags 1 otwo -O2
1407	test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1408	;;
1409esac
1410# other flags: just add them if they are supported
1411i=0
1412case $ct in
1413bcc)
1414	ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1415	;;
1416clang)
1417	i=1
1418	;;
1419dec)
1420	ac_flags 0 verb -verbose
1421	ac_flags 1 rodata -readonly_strings
1422	;;
1423dmc)
1424	ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1425	ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1426	;;
1427gcc)
1428	# The following tests run with -Werror (gcc only) if possible
1429	NOWARN=$DOWARN; phase=u
1430	ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1431	# mksh is not written in CFrustFrust!
1432	ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1433	ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1434	ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1435	test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1436	    ac_flags 1 fstackprotectorall -fstack-protector-all
1437	test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1438	*\ -fplugin=*dragonegg*) ;;
1439	*) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1440	esac
1441	case $cm in
1442	combine)
1443		fv=0
1444		checks='7 8'
1445		;;
1446	lto)
1447		fv=0
1448		checks='1 2 3 4 5 6 7 8'
1449		;;
1450	*)
1451		fv=1
1452		;;
1453	esac
1454	test $fv = 1 || for what in $checks; do
1455		test $fv = 1 && break
1456		case $what in
1457		1)	t_cflags='-flto=jobserver'
1458			t_ldflags='-fuse-linker-plugin'
1459			t_use=1 t_name=fltojs_lp ;;
1460		2)	t_cflags='-flto=jobserver' t_ldflags=''
1461			t_use=1 t_name=fltojs_nn ;;
1462		3)	t_cflags='-flto=jobserver'
1463			t_ldflags='-fno-use-linker-plugin -fwhole-program'
1464			t_use=1 t_name=fltojs_np ;;
1465		4)	t_cflags='-flto'
1466			t_ldflags='-fuse-linker-plugin'
1467			t_use=1 t_name=fltons_lp ;;
1468		5)	t_cflags='-flto' t_ldflags=''
1469			t_use=1 t_name=fltons_nn ;;
1470		6)	t_cflags='-flto'
1471			t_ldflags='-fno-use-linker-plugin -fwhole-program'
1472			t_use=1 t_name=fltons_np ;;
1473		7)	t_cflags='-fwhole-program --combine' t_ldflags=''
1474			t_use=0 t_name=combine cm=combine ;;
1475		8)	fv=1 cm=normal ;;
1476		esac
1477		test $fv = 1 && break
1478		ac_flags $t_use $t_name "$t_cflags" \
1479		    "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1480	done
1481	ac_flags 1 data_abi_align -malign-data=abi
1482	i=1
1483	;;
1484hpcc)
1485	phase=u
1486	# probably not needed
1487	#ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1488	phase=x
1489	;;
1490icc)
1491	ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1492	ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1493	ac_flags 1 fstacksecuritycheck -fstack-security-check
1494	i=1
1495	;;
1496mipspro)
1497	ac_flags 1 fullwarn -fullwarn 'for remark output support'
1498	;;
1499msc)
1500	ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1501	echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1502	ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1503	ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1504	ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1505	rmf x
1506	ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1507	ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1508	;;
1509nwcc)
1510	#broken# ac_flags 1 ssp -stackprotect
1511	i=1
1512	;;
1513pcc)
1514	ac_flags 1 fstackprotectorall -fstack-protector-all
1515	i=1
1516	;;
1517sunpro)
1518	phase=u
1519	ac_flags 1 v -v
1520	ac_flags 1 ipo -xipo 'for cross-module optimisation'
1521	phase=x
1522	;;
1523tcc)
1524	: #broken# ac_flags 1 boundschk -b
1525	;;
1526tendra)
1527	ac_flags 0 ysystem -Ysystem
1528	test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1529	ac_flags 1 extansi -Xa
1530	;;
1531xlc)
1532	ac_flags 1 rodata "-qro -qroconst -qroptr"
1533	ac_flags 1 rtcheck -qcheck=all
1534	#ac_flags 1 rtchkc -qextchk	# reported broken
1535	ac_flags 1 wformat "-qformat=all -qformat=nozln"
1536	#ac_flags 1 wp64 -qwarn64	# too verbose for now
1537	;;
1538esac
1539# flags common to a subset of compilers (run with -Werror on gcc)
1540if test 1 = $i; then
1541	ac_flags 1 wall -Wall
1542	ac_flags 1 fwrapv -fwrapv
1543fi
1544
1545# “on demand” means: GCC version >= 4
1546fd='if to rely on compiler for string pooling'
1547ac_cache string_pooling || case $HAVE_STRING_POOLING in
15482) fx=' (on demand, cached)' ;;
1549i1) fv=1 ;;
1550i2) fv=2; fx=' (on demand)' ;;
1551esac
1552ac_testdone
1553test x"$HAVE_STRING_POOLING" = x"0" || ac_cppflags
1554
1555phase=x
1556# The following tests run with -Werror or similar (all compilers) if possible
1557NOWARN=$DOWARN
1558test $ct = pcc && phase=u
1559
1560#
1561# Compiler: check for stuff that only generates warnings
1562#
1563ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1564	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1565	extern int thiswillneverbedefinedIhope(void);
1566	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1567	int main(void) { return (thiswillneverbedefinedIhope()); }
1568	#else
1569	#include <string.h>
1570	#undef __attribute__
1571	int xcopy(const void *, void *, size_t)
1572	    __attribute__((__bounded__(__buffer__, 1, 3)))
1573	    __attribute__((__bounded__(__buffer__, 2, 3)));
1574	int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1575	int xcopy(const void *s, void *d, size_t n) {
1576		/*
1577		 * if memmove does not exist, we are not on a system
1578		 * with GCC with __bounded__ attribute either so poo
1579		 */
1580		memmove(d, s, n); return ((int)n);
1581	}
1582	#endif
1583EOF
1584ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1585	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1586	extern int thiswillneverbedefinedIhope(void);
1587	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1588	int main(void) { return (thiswillneverbedefinedIhope()); }
1589	#else
1590	#define fprintf printfoo
1591	#include <stdio.h>
1592	#undef __attribute__
1593	#undef fprintf
1594	extern int fprintf(FILE *, const char *format, ...)
1595	    __attribute__((__format__(__printf__, 2, 3)));
1596	int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1597	#endif
1598EOF
1599ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1600	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1601	extern int thiswillneverbedefinedIhope(void);
1602	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1603	int main(void) { return (thiswillneverbedefinedIhope()); }
1604	#else
1605	#include <stdlib.h>
1606	#undef __attribute__
1607	void fnord(void) __attribute__((__noreturn__));
1608	int main(void) { fnord(); }
1609	void fnord(void) { exit(0); }
1610	#endif
1611EOF
1612ac_test attribute_pure '' 'for __attribute__((__pure__))' <<-'EOF'
1613	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1614	extern int thiswillneverbedefinedIhope(void);
1615	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1616	int main(void) { return (thiswillneverbedefinedIhope()); }
1617	#else
1618	#include <unistd.h>
1619	#undef __attribute__
1620	int foo(const char *) __attribute__((__pure__));
1621	int main(int ac, char **av) { return (foo(av[ac - 1]) + isatty(0)); }
1622	int foo(const char *s) { return ((int)s[0]); }
1623	#endif
1624EOF
1625ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1626	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1627	extern int thiswillneverbedefinedIhope(void);
1628	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1629	int main(void) { return (thiswillneverbedefinedIhope()); }
1630	#else
1631	#include <unistd.h>
1632	#undef __attribute__
1633	int main(int ac __attribute__((__unused__)), char **av
1634	    __attribute__((__unused__))) { return (isatty(0)); }
1635	#endif
1636EOF
1637ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1638	#if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1639	extern int thiswillneverbedefinedIhope(void);
1640	/* force a failure: TenDRA and gcc 1.42 have false positive here */
1641	int main(void) { return (thiswillneverbedefinedIhope()); }
1642	#else
1643	#include <unistd.h>
1644	#undef __attribute__
1645	static const char fnord[] __attribute__((__used__)) = "42";
1646	int main(void) { return (isatty(0)); }
1647	#endif
1648EOF
1649
1650# End of tests run with -Werror
1651NOWARN=$save_NOWARN
1652phase=x
1653
1654#
1655# mksh: flavours (full/small mksh, omit certain stuff)
1656#
1657if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1658    "if a reduced-feature mksh is requested"; then
1659	: "${HAVE_NICE=0}"
1660	: "${HAVE_PERSISTENT_HISTORY=0}"
1661	check_categories="$check_categories smksh"
1662fi
1663ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1664    isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1665    check_categories="$check_categories binsh"
1666ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1667    "if mksh will be built without job control" && \
1668    check_categories="$check_categories arge"
1669ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1670    "if mksh will be built without job signals" && \
1671    check_categories="$check_categories arge nojsig"
1672ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1673    'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1674#ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1675#    "if deprecated features are to be omitted" && \
1676#    check_categories="$check_categories nodeprecated"
1677#ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1678#    "if experimental features are to be omitted" && \
1679#    check_categories="$check_categories noexperimental"
1680ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1681    'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1682    check_categories="$check_categories mnbsdash"
1683
1684#
1685# Environment: headers
1686#
1687ac_header sys/time.h sys/types.h
1688ac_header time.h sys/types.h
1689test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1690ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1691	#include <sys/types.h>
1692	#include <sys/time.h>
1693	#include <time.h>
1694	#include <unistd.h>
1695	int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1696EOF
1697ac_header sys/bsdtypes.h
1698ac_header sys/file.h sys/types.h
1699ac_header sys/mkdev.h sys/types.h
1700ac_header sys/mman.h sys/types.h
1701ac_header sys/param.h
1702ac_header sys/resource.h sys/types.h _time
1703ac_header sys/select.h sys/types.h
1704ac_header sys/sysmacros.h
1705ac_header bstring.h
1706ac_header grp.h sys/types.h
1707ac_header io.h
1708ac_header libgen.h
1709ac_header libutil.h sys/types.h
1710ac_header paths.h
1711ac_header stdint.h stdarg.h
1712# include strings.h only if compatible with string.h
1713ac_header strings.h sys/types.h string.h
1714ac_header termios.h
1715ac_header ulimit.h sys/types.h
1716ac_header values.h
1717
1718#
1719# Environment: definitions
1720#
1721echo '#include <sys/types.h>
1722#include <unistd.h>
1723/* check that off_t can represent 2^63-1 correctly, thx FSF */
1724#define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
1725int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1726    LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1727int main(void) { return (isatty(0)); }' >lft.c
1728ac_testn can_lfs '' "for large file support" <lft.c
1729save_CPPFLAGS=$CPPFLAGS
1730add_cppflags -D_FILE_OFFSET_BITS=64
1731ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1732if test 0 = $HAVE_CAN_LFS_SUS; then
1733	CPPFLAGS=$save_CPPFLAGS
1734	add_cppflags -D_LARGE_FILES=1
1735	ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1736	test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1737fi
1738rm -f lft.c
1739rmf lft*	# end of large file support test
1740
1741#
1742# Environment: types
1743#
1744ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1745	#include <sys/types.h>
1746	#include <stddef.h>
1747	int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1748EOF
1749ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1750	#include <sys/types.h>
1751	#include <stddef.h>
1752	int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1753EOF
1754ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1755	#include <sys/types.h>
1756	#include <stddef.h>
1757	int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1758EOF
1759ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1760	#include <sys/types.h>
1761	#include <stddef.h>
1762	int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1763EOF
1764
1765ac_test rlim_t <<-'EOF'
1766	#include <sys/types.h>
1767	#if HAVE_BOTH_TIME_H
1768	#include <sys/time.h>
1769	#include <time.h>
1770	#elif HAVE_SYS_TIME_H
1771	#include <sys/time.h>
1772	#elif HAVE_TIME_H
1773	#include <time.h>
1774	#endif
1775	#if HAVE_SYS_RESOURCE_H
1776	#include <sys/resource.h>
1777	#endif
1778	#include <unistd.h>
1779	int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1780EOF
1781
1782# only testn: added later below
1783ac_testn sig_t <<-'EOF'
1784	#include <sys/types.h>
1785	#include <signal.h>
1786	#include <stddef.h>
1787	volatile sig_t foo = (sig_t)0;
1788	int main(void) { return (foo == (sig_t)0); }
1789EOF
1790
1791ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1792	#include <sys/types.h>
1793	#include <signal.h>
1794	#include <stddef.h>
1795	volatile sighandler_t foo = (sighandler_t)0;
1796	int main(void) { return (foo == (sighandler_t)0); }
1797EOF
1798if test 1 = $HAVE_SIGHANDLER_T; then
1799	add_cppflags -Dsig_t=sighandler_t
1800	HAVE_SIG_T=1
1801fi
1802
1803ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1804	#include <sys/types.h>
1805	#include <signal.h>
1806	#include <stddef.h>
1807	volatile __sighandler_t foo = (__sighandler_t)0;
1808	int main(void) { return (foo == (__sighandler_t)0); }
1809EOF
1810if test 1 = $HAVE___SIGHANDLER_T; then
1811	add_cppflags -Dsig_t=__sighandler_t
1812	HAVE_SIG_T=1
1813fi
1814
1815test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1816ac_cppflags SIG_T
1817
1818#
1819# check whether whatever we use for the final link will succeed
1820#
1821if test $cm = makefile; then
1822	: nothing to check
1823else
1824	HAVE_LINK_WORKS=x
1825	ac_testinit link_works '' 'checking if the final link command may succeed'
1826	fv=1
1827	cat >conftest.c <<-EOF
1828		#define EXTERN
1829		#define MKSH_INCLUDES_ONLY
1830		#include "sh.h"
1831		__RCSID("$srcversion");
1832		int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1833EOF
1834	case $cm in
1835	llvm)
1836		v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1837		rmf $tfn.s
1838		test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1839		test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1840		;;
1841	dragonegg)
1842		v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1843		test $fv = 0 || v "mv conftest.s conftest.ll"
1844		test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1845		rmf $tfn.s
1846		test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1847		test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1848		;;
1849	combine)
1850		v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1851		;;
1852	lto|normal)
1853		cm=normal
1854		v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1855		test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1856		;;
1857	esac
1858	test -f $tcfn || fv=0
1859	ac_testdone
1860	test $fv = 1 || exit 1
1861fi
1862
1863#
1864# Environment: errors and signals
1865#
1866test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1867
1868ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1869	extern const int sys_nerr;
1870	extern const char * const sys_errlist[];
1871	extern int isatty(int);
1872	int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
1873EOF
1874ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1875	extern const int _sys_nerr;
1876	extern const char * const _sys_errlist[];
1877	extern int isatty(int);
1878	int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
1879EOF
1880if test 1 = "$HAVE__SYS_ERRLIST"; then
1881	add_cppflags -Dsys_nerr=_sys_nerr
1882	add_cppflags -Dsys_errlist=_sys_errlist
1883	HAVE_SYS_ERRLIST=1
1884fi
1885ac_cppflags SYS_ERRLIST
1886
1887for what in name list; do
1888	uwhat=`upper $what`
1889	ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
1890		extern const char * const sys_sig${what}[];
1891		extern int isatty(int);
1892		int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
1893	EOF
1894	ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
1895		extern const char * const _sys_sig${what}[];
1896		extern int isatty(int);
1897		int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
1898	EOF
1899	eval uwhat_v=\$HAVE__SYS_SIG$uwhat
1900	if test 1 = "$uwhat_v"; then
1901		add_cppflags -Dsys_sig$what=_sys_sig$what
1902		eval HAVE_SYS_SIG$uwhat=1
1903	fi
1904	ac_cppflags SYS_SIG$uwhat
1905done
1906
1907#
1908# Environment: library functions
1909#
1910ac_test flock <<-'EOF'
1911	#include <sys/types.h>
1912	#include <fcntl.h>
1913	#undef flock
1914	#if HAVE_SYS_FILE_H
1915	#include <sys/file.h>
1916	#endif
1917	int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
1918EOF
1919
1920ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
1921	#include <fcntl.h>
1922	#undef flock
1923	int main(void) {
1924		struct flock lks;
1925		lks.l_type = F_WRLCK | F_UNLCK;
1926		return (fcntl(0, F_SETLKW, &lks));
1927	}
1928EOF
1929
1930ac_test getrusage <<-'EOF'
1931	#define MKSH_INCLUDES_ONLY
1932	#include "sh.h"
1933	int main(void) {
1934		struct rusage ru;
1935		return (getrusage(RUSAGE_SELF, &ru) +
1936		    getrusage(RUSAGE_CHILDREN, &ru));
1937	}
1938EOF
1939
1940ac_test getsid <<-'EOF'
1941	#include <unistd.h>
1942	int main(void) { return ((int)getsid(0)); }
1943EOF
1944
1945ac_test gettimeofday <<-'EOF'
1946	#define MKSH_INCLUDES_ONLY
1947	#include "sh.h"
1948	int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
1949EOF
1950
1951ac_test killpg <<-'EOF'
1952	#include <signal.h>
1953	int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
1954EOF
1955
1956ac_test memmove <<-'EOF'
1957	#include <sys/types.h>
1958	#include <stddef.h>
1959	#include <string.h>
1960	#if HAVE_STRINGS_H
1961	#include <strings.h>
1962	#endif
1963	int main(int ac, char *av[]) {
1964		return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
1965	}
1966EOF
1967
1968ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
1969	#define MKSH_INCLUDES_ONLY
1970	#include "sh.h"
1971	int main(int ac, char *av[]) {
1972		dev_t dv;
1973		dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
1974		return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
1975		    (int)minor(dv));
1976	}
1977EOF
1978
1979ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
1980	#include <sys/types.h>
1981	#if HAVE_SYS_FILE_H
1982	#include <sys/file.h>
1983	#endif
1984	#if HAVE_SYS_MMAN_H
1985	#include <sys/mman.h>
1986	#endif
1987	#include <stddef.h>
1988	#include <stdlib.h>
1989	int main(void) { return ((void *)mmap(NULL, (size_t)0,
1990	    PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
1991	    munmap(NULL, 0)); }
1992EOF
1993
1994ac_test nice <<-'EOF'
1995	#include <unistd.h>
1996	int main(void) { return (nice(4)); }
1997EOF
1998
1999ac_test revoke <<-'EOF'
2000	#include <sys/types.h>
2001	#if HAVE_LIBUTIL_H
2002	#include <libutil.h>
2003	#endif
2004	#include <unistd.h>
2005	int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
2006EOF
2007
2008ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
2009	#include <locale.h>
2010	#include <stddef.h>
2011	int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
2012EOF
2013
2014ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2015	#include <langinfo.h>
2016	#include <stddef.h>
2017	int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
2018EOF
2019
2020ac_test select <<-'EOF'
2021	#include <sys/types.h>
2022	#if HAVE_BOTH_TIME_H
2023	#include <sys/time.h>
2024	#include <time.h>
2025	#elif HAVE_SYS_TIME_H
2026	#include <sys/time.h>
2027	#elif HAVE_TIME_H
2028	#include <time.h>
2029	#endif
2030	#if HAVE_SYS_BSDTYPES_H
2031	#include <sys/bsdtypes.h>
2032	#endif
2033	#if HAVE_SYS_SELECT_H
2034	#include <sys/select.h>
2035	#endif
2036	#if HAVE_BSTRING_H
2037	#include <bstring.h>
2038	#endif
2039	#include <stddef.h>
2040	#include <stdlib.h>
2041	#include <string.h>
2042	#if HAVE_STRINGS_H
2043	#include <strings.h>
2044	#endif
2045	#include <unistd.h>
2046	int main(void) {
2047		struct timeval tv = { 1, 200000 };
2048		fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
2049		return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
2050	}
2051EOF
2052
2053ac_test setresugid <<-'EOF'
2054	#include <sys/types.h>
2055	#include <unistd.h>
2056	int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2057EOF
2058
2059ac_test setgroups setresugid 0 <<-'EOF'
2060	#include <sys/types.h>
2061	#if HAVE_GRP_H
2062	#include <grp.h>
2063	#endif
2064	#include <unistd.h>
2065	int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2066EOF
2067
2068if test x"$et" = x"klibc"; then
2069
2070	ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2071		#define MKSH_INCLUDES_ONLY
2072		#include "sh.h"
2073		extern int __rt_sigsuspend(const sigset_t *, size_t);
2074		int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2075EOF
2076
2077	# no? damn! legacy crap ahead!
2078
2079	ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2080	    'whether sigsuspend is usable (1/2)' <<-'EOF'
2081		#define MKSH_INCLUDES_ONLY
2082		#include "sh.h"
2083		extern int __sigsuspend_s(sigset_t);
2084		int main(void) { return (__sigsuspend_s(0)); }
2085EOF
2086	ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2087	    'whether sigsuspend is usable (2/2)' <<-'EOF'
2088		#define MKSH_INCLUDES_ONLY
2089		#include "sh.h"
2090		extern int __sigsuspend_xxs(int, int, sigset_t);
2091		int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
2092EOF
2093
2094	if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
2095		# no usable sigsuspend(), use pause() *ugh*
2096		add_cppflags -DMKSH_NO_SIGSUSPEND
2097	fi
2098fi
2099
2100ac_test strerror '!' sys_errlist 0 <<-'EOF'
2101	extern char *strerror(int);
2102	int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2103EOF
2104
2105ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2106	#include <string.h>
2107	#include <signal.h>
2108	int main(void) { return (strsignal(1)[0]); }
2109EOF
2110
2111ac_test strlcpy <<-'EOF'
2112	#include <string.h>
2113	int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2114	    (size_t)ac)); }
2115EOF
2116
2117#
2118# check headers for declarations
2119#
2120ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2121	#define MKSH_INCLUDES_ONLY
2122	#include "sh.h"
2123	#if HAVE_SYS_FILE_H
2124	#include <sys/file.h>
2125	#endif
2126	int main(void) { return ((flock)(0, 0)); }
2127EOF
2128ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2129	#define MKSH_INCLUDES_ONLY
2130	#include "sh.h"
2131	int main(void) { return ((revoke)("")); }
2132EOF
2133ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2134	#define MKSH_INCLUDES_ONLY
2135	#include "sh.h"
2136	int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2137EOF
2138ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2139	#define MKSH_INCLUDES_ONLY
2140	#include "sh.h"
2141	int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2142EOF
2143
2144#
2145# other checks
2146#
2147fd='if to use persistent history'
2148ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
214911*|101) fv=1 ;;
2150esac
2151test 1 = $fv || check_categories="$check_categories no-histfile"
2152ac_testdone
2153ac_cppflags
2154
2155save_CFLAGS=$CFLAGS
2156ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF'
2157	#define MKSH_INCLUDES_ONLY
2158	#include "sh.h"
2159	#ifndef CHAR_BIT
2160	#define CHAR_BIT 8	/* defuse this test on really legacy systems */
2161	#endif
2162	struct ctasserts {
2163	#define cta(name, assertion) char name[(assertion) ? 1 : -1]
2164/* this one should be defined by the standard */
2165cta(char_is_1_char, (sizeof(char) == 1) && (sizeof(signed char) == 1) &&
2166    (sizeof(unsigned char) == 1));
2167cta(char_is_8_bits, ((CHAR_BIT) == 8) && ((int)(unsigned char)0xFF == 0xFF) &&
2168    ((int)(unsigned char)0x100 == 0) && ((int)(unsigned char)(int)-1 == 0xFF));
2169/* the next assertion is probably not really needed */
2170cta(short_is_2_char, sizeof(short) == 2);
2171cta(short_size_no_matter_of_signedness, sizeof(short) == sizeof(unsigned short));
2172/* the next assertion is probably not really needed */
2173cta(int_is_4_char, sizeof(int) == 4);
2174cta(int_size_no_matter_of_signedness, sizeof(int) == sizeof(unsigned int));
2175
2176cta(long_ge_int, sizeof(long) >= sizeof(int));
2177cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long));
2178
2179#ifndef MKSH_LEGACY_MODE
2180/* the next assertion is probably not really needed */
2181cta(ari_is_4_char, sizeof(mksh_ari_t) == 4);
2182/* but this is */
2183cta(ari_has_31_bit, 0 < (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1));
2184/* the next assertion is probably not really needed */
2185cta(uari_is_4_char, sizeof(mksh_uari_t) == 4);
2186/* but the next three are; we REQUIRE unsigned integer wraparound */
2187cta(uari_has_31_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 2 + 1));
2188cta(uari_has_32_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3));
2189cta(uari_wrap_32_bit,
2190    (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3) >
2191    (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 4));
2192#define NUM 22
2193#else
2194#define NUM 16
2195#endif
2196/* these are always required */
2197cta(ari_is_signed, (mksh_ari_t)-1 < (mksh_ari_t)0);
2198cta(uari_is_unsigned, (mksh_uari_t)-1 > (mksh_uari_t)0);
2199/* we require these to have the precisely same size and assume 2s complement */
2200cta(ari_size_no_matter_of_signedness, sizeof(mksh_ari_t) == sizeof(mksh_uari_t));
2201
2202cta(sizet_size_no_matter_of_signedness, sizeof(ssize_t) == sizeof(size_t));
2203cta(sizet_voidptr_same_size, sizeof(size_t) == sizeof(void *));
2204cta(sizet_funcptr_same_size, sizeof(size_t) == sizeof(void (*)(void)));
2205/* our formatting routines assume this */
2206cta(ptr_fits_in_long, sizeof(size_t) <= sizeof(long));
2207cta(ari_fits_in_long, sizeof(mksh_ari_t) <= sizeof(long));
2208/* for struct alignment people */
2209		char padding[64 - NUM];
2210	};
2211char ctasserts_dblcheck[sizeof(struct ctasserts) == 64 ? 1 : -1];
2212	int main(void) { return (sizeof(ctasserts_dblcheck) + isatty(0)); }
2213EOF
2214CFLAGS=$save_CFLAGS
2215eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1
2216
2217#
2218# extra checks for legacy mksh
2219#
2220if test $legacy = 1; then
2221	ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2222		#define MKSH_INCLUDES_ONLY
2223		#include "sh.h"
2224		#ifndef CHAR_BIT
2225		#define CHAR_BIT 0
2226		#endif
2227		struct ctasserts {
2228		#define cta(name, assertion) char name[(assertion) ? 1 : -1]
2229			cta(char_is_8_bits, (CHAR_BIT) == 8);
2230			cta(long_is_32_bits, sizeof(long) == 4);
2231		};
2232		int main(void) { return (sizeof(struct ctasserts)); }
2233EOF
2234
2235	ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2236		#define MKSH_INCLUDES_ONLY
2237		#include "sh.h"
2238		#ifndef CHAR_BIT
2239		#define CHAR_BIT 0
2240		#endif
2241		struct ctasserts {
2242		#define cta(name, assertion) char name[(assertion) ? 1 : -1]
2243			cta(char_is_8_bits, (CHAR_BIT) == 8);
2244			cta(long_is_64_bits, sizeof(long) == 8);
2245		};
2246		int main(void) { return (sizeof(struct ctasserts)); }
2247EOF
2248
2249	case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2250	10) check_categories="$check_categories int:32" ;;
2251	01) check_categories="$check_categories int:64" ;;
2252	*) check_categories="$check_categories int:u" ;;
2253	esac
2254fi
2255
2256#
2257# Compiler: Praeprocessor (only if needed)
2258#
2259test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2260    'checking if the C Preprocessor supports -dD'; then
2261	echo '#define foo bar' >conftest.c
2262	vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2263	grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2264	rmf conftest.c x vv.out
2265	ac_testdone
2266fi
2267
2268#
2269# End of mirtoconf checks
2270#
2271$e ... done.
2272
2273# Some operating systems have ancient versions of ed(1) writing
2274# the character count to standard output; cope for that
2275echo wq >x
2276ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2277    check_categories="$check_categories $oldish_ed"
2278rmf x vv.out
2279
2280if test 0 = $HAVE_SYS_SIGNAME; then
2281	if test 1 = $HAVE_CPP_DD; then
2282		$e Generating list of signal names...
2283	else
2284		$e No list of signal names available via cpp. Falling back...
2285	fi
2286	sigseenone=:
2287	sigseentwo=:
2288	echo '#include <signal.h>
2289#if defined(NSIG_MAX)
2290#define cfg_NSIG NSIG_MAX
2291#elif defined(NSIG)
2292#define cfg_NSIG NSIG
2293#elif defined(_NSIG)
2294#define cfg_NSIG _NSIG
2295#elif defined(SIGMAX)
2296#define cfg_NSIG (SIGMAX + 1)
2297#elif defined(_SIGMAX)
2298#define cfg_NSIG (_SIGMAX + 1)
2299#else
2300/*XXX better error out, see sh.h */
2301#define cfg_NSIG 64
2302#endif
2303int
2304mksh_cfg= cfg_NSIG
2305;' >conftest.c
2306	# GNU sed 2.03 segfaults when optimising this to sed -n
2307	NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2308	    grep -v '^#' | \
2309	    sed '/mksh_cfg.*= *$/{
2310		N
2311		s/\n/ /
2312		}' | \
2313	    grep '^ *mksh_cfg *=' | \
2314	    sed 's/^ *mksh_cfg *=[	 ]*\([()0-9x+-][()0-9x+	 -]*\).*$/\1/'`
2315	case $NSIG in
2316	*mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2317	*[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2318	esac
2319	printf=printf
2320	(printf hallo) >/dev/null 2>&1 || printf=echo
2321	test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2322	test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2323	$printf "NSIG=$NSIG ... "
2324	sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
2325	sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
2326	sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT STKFLT"
2327	sigs="$sigs ABND DCE DUMP IOERR TRACE DANGER THCONT THSTOP RESV UNUSED"
2328	test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2329	    "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2330	    grep '[	 ]SIG[A-Z0-9][A-Z0-9]*[	 ]' | \
2331	    sed 's/^.*[	 ]SIG\([A-Z0-9][A-Z0-9]*\)[	 ].*$/\1/' | sort`
2332	test $NSIG -gt 1 || sigs=
2333	for name in $sigs; do
2334		case $sigseenone in
2335		*:$name:*) continue ;;
2336		esac
2337		sigseenone=$sigseenone$name:
2338		echo '#include <signal.h>' >conftest.c
2339		echo int >>conftest.c
2340		echo mksh_cfg= SIG$name >>conftest.c
2341		echo ';' >>conftest.c
2342		# GNU sed 2.03 croaks on optimising this, too
2343		vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2344		    grep -v '^#' | \
2345		    sed '/mksh_cfg.*= *$/{
2346			N
2347			s/\n/ /
2348			}' | \
2349		    grep '^ *mksh_cfg *=' | \
2350		    sed 's/^ *mksh_cfg *=[	 ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2351	done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2352		test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2353		test $nr -gt 0 && test $nr -lt $NSIG || continue
2354		case $sigseentwo in
2355		*:$nr:*) ;;
2356		*)	echo "		{ \"$name\", $nr },"
2357			sigseentwo=$sigseentwo$nr:
2358			$printf "$name=$nr " >&2
2359			;;
2360		esac
2361	done 2>&1 >signames.inc
2362	rmf conftest.c
2363	$e done.
2364fi
2365
2366addsrcs '!' HAVE_STRLCPY strlcpy.c
2367addsrcs USE_PRINTF_BUILTIN printf.c
2368test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2369test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2370add_cppflags -DMKSH_BUILD_R=541
2371
2372$e $bi$me: Finished configuration testing, now producing output.$ao
2373
2374files=
2375objs=
2376sp=
2377case $tcfn in
2378a.exe|conftest.exe)
2379	mkshexe=$tfn.exe
2380	add_cppflags -DMKSH_EXE_EXT
2381	;;
2382*)
2383	mkshexe=$tfn
2384	;;
2385esac
2386case $curdir in
2387*\ *)	mkshshebang="#!./$mkshexe" ;;
2388*)	mkshshebang="#!$curdir/$mkshexe" ;;
2389esac
2390cat >test.sh <<-EOF
2391	$mkshshebang
2392	LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2393	test -n "\$KSH_VERSION" || exit 1
2394	set -A check_categories -- $check_categories
2395	pflag='$curdir/$mkshexe'
2396	sflag='$srcdir/check.t'
2397	usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2398	while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch {
2399	(C)	check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2400	(e)	usee=1; eflag=\$OPTARG ;;
2401	(f)	check_categories[\${#check_categories[*]}]=fastbox ;;
2402	(P)	Pflag=1 ;;
2403	(+P)	Pflag=0 ;;
2404	(p)	pflag=\$OPTARG ;;
2405	(Q)	vflag=0 ;;
2406	(+Q)	vflag=1 ;;
2407	(S)	Sflag=1 ;;
2408	(+S)	Sflag=0 ;;
2409	(s)	sflag=\$OPTARG ;;
2410	(t)	uset=1; tflag=\$OPTARG ;;
2411	(v)	vflag=1 ;;
2412	(+v)	vflag=0 ;;
2413	(*)	xflag=1 ;;
2414	}
2415	done
2416	shift \$((OPTIND - 1))
2417	set -A args -- '$srcdir/check.pl' -p "\$pflag"
2418	x=
2419	for y in "\${check_categories[@]}"; do
2420		x=\$x,\$y
2421	done
2422	if [[ -n \$x ]]; then
2423		args[\${#args[*]}]=-C
2424		args[\${#args[*]}]=\${x#,}
2425	fi
2426	if (( usee )); then
2427		args[\${#args[*]}]=-e
2428		args[\${#args[*]}]=\$eflag
2429	fi
2430	(( Pflag )) && args[\${#args[*]}]=-P
2431	if (( uset )); then
2432		args[\${#args[*]}]=-t
2433		args[\${#args[*]}]=\$tflag
2434	fi
2435	(( vflag )) && args[\${#args[*]}]=-v
2436	(( xflag )) && args[\${#args[*]}]=-x	# force usage by synerr
2437	if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2438		args[\${#args[*]}]=-T
2439		args[\${#args[*]}]=\$TMPDIR
2440	fi
2441	print Testing mksh for conformance:
2442	grep -F -e Mir''OS: -e MIRBSD "\$sflag"
2443	print "This shell is actually:\\n\\t\$KSH_VERSION"
2444	print 'test.sh built for mksh $dstversion'
2445	cstr='\$os = defined \$^O ? \$^O : "unknown";'
2446	cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2447	for perli in \$PERL perl5 perl no; do
2448		if [[ \$perli = no ]]; then
2449			print Cannot find a working Perl interpreter, aborting.
2450			exit 1
2451		fi
2452		print "Trying Perl interpreter '\$perli'..."
2453		perlos=\$(\$perli -e "\$cstr")
2454		rv=\$?
2455		print "Errorlevel \$rv, running on '\$perlos'"
2456		if (( rv )); then
2457			print "=> not using"
2458			continue
2459		fi
2460		if [[ -n \$perlos ]]; then
2461			print "=> using it"
2462			break
2463		fi
2464	done
2465	(( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2466	(( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2467	# use of the -S option for check.t split into multiple chunks
2468	rv=0
2469	for s in "\$sflag".*; do
2470		echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2471		\$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2472		rc=\$?
2473		(( rv = rv ? rv : rc ))
2474	done
2475	exit \$rv
2476EOF
2477chmod 755 test.sh
2478case $cm in
2479dragonegg)
2480	emitbc="-S -flto"
2481	;;
2482llvm)
2483	emitbc="-emit-llvm -c"
2484	;;
2485*)
2486	emitbc=-c
2487	;;
2488esac
2489echo ": # work around NeXTstep bug" >Rebuild.sh
2490cd "$srcdir"
2491optfiles=`echo *.opt`
2492cd "$curdir"
2493for file in $optfiles; do
2494	echo "echo + Running genopt on '$file'..."
2495	echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2496done >>Rebuild.sh
2497echo set -x >>Rebuild.sh
2498for file in $SRCS; do
2499	op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2500	test -f $file || file=$srcdir/$file
2501	files="$files$sp$file"
2502	sp=' '
2503	echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2504	if test $cm = dragonegg; then
2505		echo "mv ${op}s ${op}ll" >>Rebuild.sh
2506		echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2507		objs="$objs$sp${op}bc"
2508	else
2509		objs="$objs$sp${op}o"
2510	fi
2511done
2512case $cm in
2513dragonegg|llvm)
2514	echo "rm -f $tfn.s" >>Rebuild.sh
2515	echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2516	lobjs=$tfn.s
2517	;;
2518*)
2519	lobjs=$objs
2520	;;
2521esac
2522echo tcfn=$mkshexe >>Rebuild.sh
2523echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2524echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2525if test $cm = makefile; then
2526	extras='emacsfn.h exprtok.h rlimits.opt sh.h sh_flags.opt var_spec.h'
2527	test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2528	gens= genq=
2529	for file in $optfiles; do
2530		genf=`basename "$file" | sed 's/.opt$/.gen/'`
2531		gens="$gens $genf"
2532		genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2533			srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2534	done
2535	cat >Makefrag.inc <<EOF
2536# Makefile fragment for building mksh $dstversion
2537
2538PROG=		$mkshexe
2539MAN=		mksh.1
2540SRCS=		$SRCS
2541SRCS_FP=	$files
2542OBJS_BP=	$objs
2543INDSRCS=	$extras
2544NONSRCS_INST=	dot.mkshrc \$(MAN)
2545NONSRCS_NOINST=	Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2546CC=		$CC
2547CFLAGS=		$CFLAGS
2548CPPFLAGS=	$CPPFLAGS
2549LDFLAGS=	$LDFLAGS
2550LIBS=		$LIBS
2551
2552.depend \$(OBJS_BP):$gens$genq
2553
2554# not BSD make only:
2555#VPATH=		$srcdir
2556#all: \$(PROG)
2557#\$(PROG): \$(OBJS_BP)
2558#	\$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2559#\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2560#.c.o:
2561#	\$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2562
2563# for all make variants:
2564#REGRESS_FLAGS=	-f
2565#regress:
2566#	./test.sh \$(REGRESS_FLAGS)
2567check_categories=$check_categories
2568
2569# for BSD make only:
2570#.PATH: $srcdir
2571#.include <bsd.prog.mk>
2572EOF
2573	$e
2574	$e Generated Makefrag.inc successfully.
2575	exit 0
2576fi
2577for file in $optfiles; do
2578	$e "+ Running genopt on '$file'..."
2579	do_genopt "$srcdir/$file" || exit 1
2580done
2581if test $cm = combine; then
2582	objs="-o $mkshexe"
2583	for file in $SRCS; do
2584		test -f $file || file=$srcdir/$file
2585		objs="$objs $file"
2586	done
2587	emitbc="-fwhole-program --combine"
2588	v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2589elif test 1 = $pm; then
2590	for file in $SRCS; do
2591		test -f $file || file=$srcdir/$file
2592		v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2593	done
2594	wait
2595else
2596	for file in $SRCS; do
2597		test $cm = dragonegg && \
2598		    op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2599		test -f $file || file=$srcdir/$file
2600		v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2601		if test $cm = dragonegg; then
2602			v "mv ${op}s ${op}ll"
2603			v "llvm-as ${op}ll" || exit 1
2604		fi
2605	done
2606fi
2607case $cm in
2608dragonegg|llvm)
2609	rmf $tfn.s
2610	v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2611	;;
2612esac
2613tcfn=$mkshexe
2614test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2615test -f $tcfn || exit 1
2616test 1 = $r || v "$NROFF -mdoc <'$srcdir/lksh.1' >lksh.cat1" || rmf lksh.cat1
2617test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || rmf mksh.cat1
2618test 0 = $eq && v $SIZE $tcfn
2619i=install
2620test -f /usr/ucb/$i && i=/usr/ucb/$i
2621test 1 = $eq && e=:
2622$e
2623$e Installing the shell:
2624$e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2625if test $legacy = 0; then
2626	$e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2627	$e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2628fi
2629$e
2630$e Installing the manual:
2631if test -f mksh.cat1; then
2632	$e "# $i -c -o root -g bin -m 444 lksh.cat1" \
2633	    "/usr/share/man/cat1/lksh.0"
2634	$e "# $i -c -o root -g bin -m 444 mksh.cat1" \
2635	    "/usr/share/man/cat1/mksh.0"
2636	$e or
2637fi
2638$e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
2639$e
2640$e Run the regression test suite: ./test.sh
2641$e Please also read the sample file dot.mkshrc and the fine manual.
2642exit 0
2643
2644: <<'EOD'
2645
2646=== Environment used ===
2647
2648==== build environment ====
2649AWK				default: awk
2650CC				default: cc
2651CFLAGS				if empty, defaults to -xO2 or +O2
2652				or -O3 -qstrict or -O2, per compiler
2653CPPFLAGS			default empty
2654LDFLAGS				default empty; added before sources
2655LDSTATIC			set this to '-static'; default unset
2656LIBS				default empty; added after sources
2657				[Interix] default: -lcrypt (XXX still needed?)
2658NOWARN				-Wno-error or similar
2659NROFF				default: nroff
2660TARGET_OS			default: $(uname -s || uname)
2661TARGET_OSREV			[QNX] default: $(uname -r)
2662
2663==== feature selectors ====
2664USE_PRINTF_BUILTIN		1 to include (unsupported) printf(1) as builtin
2665===== general format =====
2666HAVE_STRLEN			ac_test
2667HAVE_STRING_H			ac_header
2668HAVE_CAN_FSTACKPROTECTORALL	ac_flags
2669
2670==== cpp definitions ====
2671DEBUG				dont use in production, wants gcc, implies:
2672DEBUG_LEAKS			enable freeing resources before exiting
2673MKSHRC_PATH			"~/.mkshrc" (do not change)
2674MKSH_A4PB			force use of arc4random_pushb
2675MKSH_ASSUME_UTF8		(0=disabled, 1=enabled; default: unset)
2676MKSH_BINSHPOSIX			if */sh or */-sh, enable set -o posix
2677MKSH_BINSHREDUCED		if */sh or */-sh, enable set -o sh
2678MKSH_CLS_STRING			"\033[;H\033[J"
2679MKSH_DEFAULT_EXECSHELL		"/bin/sh" (do not change)
2680MKSH_DEFAULT_PROFILEDIR		"/etc" (do not change)
2681MKSH_DEFAULT_TMPDIR		"/tmp" (do not change)
2682MKSH_DISABLE_DEPRECATED		disable code paths scheduled for later removal
2683MKSH_DISABLE_EXPERIMENTAL	disable code not yet comfy for (LTS) snapshots
2684MKSH_DISABLE_TTY_WARNING	shut up warning about ctty if OS cant be fixed
2685MKSH_DONT_EMIT_IDSTRING		omit RCS IDs from binary
2686MKSH_MIDNIGHTBSD01ASH_COMPAT	set -o sh: additional compatibility quirk
2687MKSH_NOPROSPECTOFWORK		disable jobs, co-processes, etc. (do not use)
2688MKSH_NOPWNAM			skip PAM calls, for -static on glibc or Solaris
2689MKSH_NO_CMDLINE_EDITING		disable command line editing code entirely
2690MKSH_NO_DEPRECATED_WARNING	omit warning when deprecated stuff is run
2691MKSH_NO_LIMITS			omit ulimit code
2692MKSH_NO_SIGSETJMP		define if sigsetjmp is broken or not available
2693MKSH_NO_SIGSUSPEND		use sigprocmask+pause instead of sigsuspend
2694MKSH_SMALL			omit some code, optimise hard for size (slower)
2695MKSH_SMALL_BUT_FAST		disable some hard-for-size optim. (modern sys.)
2696MKSH_S_NOVI=1			disable Vi editing mode (default if MKSH_SMALL)
2697MKSH_TYPEDEF_SIG_ATOMIC_T	define to e.g. 'int' if sig_atomic_t is missing
2698MKSH_TYPEDEF_SSIZE_T		define to e.g. 'long' if your OS has no ssize_t
2699MKSH_UNEMPLOYED			disable job control (but not jobs/co-processes)
2700
2701=== generic installation instructions ===
2702
2703Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2704also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2705them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2706MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2707
2708Normally, the following command is what you want to run, then:
2709$ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2710
2711Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2712/bin; install the manpage, if omitting the -r flag a catmanpage is made
2713using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2714http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2715and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2716
2717You may also want to install the lksh binary (also as /bin/sh) built by:
2718$ CPPFLAGS="$CPPFLAGS -DMKSH_BINSHPOSIX" sh Build.sh -L -r -c lto
2719
2720EOD
2721