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