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