2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.731 2018/01/13 21:38:06 tg Exp $'
4 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
5 # 2011, 2012, 2013, 2014, 2015, 2016, 2017
6 # mirabilos <m@mirbsd.org>
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.
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.
23 # People analysing the output must whitelist conftest.c for any kind
24 # of compiler warning checks (mirtoconf is by design not quiet).
26 # Used environment documentation is at the end of this file.
31 case $ZSH_VERSION:$VERSION in
32 :zsh*) ZSH_VERSION=2 ;;
35 if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then
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
49 safeIFS=" $safeIFS$nl"
51 allu=QWERTYUIOPASDFGHJKLZXCVBNM
52 alll=qwertyuiopasdfghjklzxcvbnm
54 alls=______________________________________________________________
56 case `echo a | tr '\201' X` in
69 echo >&2 "E: in '$srcfile': '$line'"
71 echo >&2 "E: invalid input in '$srcfile': '$line'"
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
86 sym=`echo "$line" | sed 's/^[<>]/|/'`
87 o_str=$o_str$nl"<$optclo$islo$sym"
96 cond=`echo "$cond" | sed 's/^ //'`
100 cond=`echo "$cond" | sed 's/^!//'`
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 +++ */'
121 while IFS= read line; do
126 o_sym=`echo "$line" | sed 's/^.//'`
127 o_gen=$o_gen$nl"#undef F0"
128 o_gen=$o_gen$nl"#undef FN"
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"
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)"
151 o_gen=$o_gen$nl"#elif defined($sym)"
153 ddefs="$ddefs$nl#undef $sym"
167 cond=`echo "$line" | sed 's/^[^|]*|//'`
173 IFS= read line || genopt_die Unexpected EOF
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"
181 case $state:$o_sym in
182 3:) genopt_die Expected optc sym at EOF ;;
184 *) genopt_die Missing EOF marker ;;
186 echo "$o_str" | sort | while IFS='|' read x opts cond; do
188 test -n "$x" || continue
190 test -n "$cond" && echo "$cond"
192 test -n "$cond" && echo "#endif"
195 echo "#ifndef $o_sym$o_gen"
205 if test x"$BUILDSH_RUN_GENOPT" = x"1"; then
209 if test x"$1" = x"-G"; then
214 echo "For the build logs, demonstrate that /dev/null and /dev/tty exist:"
215 ls -l /dev/null /dev/tty
226 eval "$@" >vv.out 2>&1
227 sed "s
\a^
\a${_c}
\a" <vv.out
237 Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;;
251 oldish_ed=stdout-ed,no-stderr-ed
260 echo :"$@" | sed 's/^://' | tr $alll $allu
263 # clean up after ac_testrun()
267 test 0 = $fv || fr=yes
268 $e "$bi==> $fd...$ao $ui$fr$ao$fx"
272 # ac_cache label: sets f, fu, fv?=0
287 # ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
288 # returns 1 if value was cached/implied, 0 otherwise: call ac_testdone
291 test x"$2" = x"!" && shift
292 test x"$2" = x"" || shift
298 if test x"$2" = x""; then
301 if test x"$2" = x"!"; then
305 eval ft=\$HAVE_`upper $2`
309 if test $fc = "$ft"; then
319 # pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
321 if test x"$1" = x"!"; then
327 ac_testinit "$@" || return 1
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
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'
346 test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr
350 ac_testnnd "$@" || return
351 rmf conftest.c conftest.o ${tcfn}* vv.out
355 # ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
360 extern int thiswillneverbedefinedIhope(void);
361 int main(void) { return (isatty(0) +
365 /* force a failure: expr is false */
366 thiswillneverbedefinedIhope()
370 test x"$1" = x"!" && shift
378 CPPFLAGS="$CPPFLAGS $*"
382 test x"$1" = x"" || fu=$1
384 test x"$2" = x"" && eval fv=\$HAVE_$fu
385 add_cppflags -DHAVE_$fu=$fv
393 # ac_flags [-] add varname cflags [text] [ldflags]
395 if test x"$1" = x"-"; then
406 test x"$ft" = x"" && ft="if $f can be used"
409 if test -n "$fl"; then
410 save_LDFLAGS=$LDFLAGS
411 LDFLAGS="$LDFLAGS $fl"
413 if test 1 = $hf; then
414 ac_testn can_$vn '' "$ft"
416 ac_testn can_$vn '' "$ft" <<-'EOF'
417 /* evil apo'stroph in comment test */
419 int main(void) { return (isatty(0)); }
422 eval fv=\$HAVE_CAN_`upper $vn`
423 if test -n "$fl"; then
424 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
426 test 11 = $fa$fv || CFLAGS=$save_CFLAGS
429 # ac_header [!] header [prereq ...]
431 if test x"$1" = x"!"; then
438 hv=`echo "$hf" | tr -d "$lfcr" | tr -c $alll$allu$alln $alls`
439 echo "/* NeXTstep bug workaround */" >x
444 echo '#if HAVE_BOTH_TIME_H' >>x
445 echo '#include <sys/time.h>' >>x
446 echo '#include <time.h>' >>x
447 echo '#elif HAVE_SYS_TIME_H' >>x
448 echo '#include <sys/time.h>' >>x
449 echo '#elif HAVE_TIME_H' >>x
450 echo '#include <time.h>' >>x
454 echo "#include <$i>" >>x
458 echo "#include <$hf>" >>x
459 echo '#include <unistd.h>' >>x
460 echo 'int main(void) { return (isatty(0)); }' >>x
461 ac_testn "$hv" "" "<$hf>" <x
463 test 1 = $na || ac_cppflags
467 if test x"$1" = x"!"; then
474 test $fr = "$i" && case " $SRCS " in
476 *) SRCS="$SRCS $2" ;;
481 curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null`
487 echo >&2 Source directory should not contain space or tab or newline.
488 echo >&2 Errors may occur.
491 echo Source directory must not contain single quotes.
495 dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' "$srcdir/sh.h"`
496 add_cppflags -DMKSH_BUILDSH
503 optflags=-std-compile-opts
514 c:combine|c:dragonegg|c:llvm|c:lto)
519 echo "$me: Unknown option -c '$i'!" >&2
537 echo "$me: Do not call me with '-G'!" >&2
541 # checker, debug, valgrind build
543 CFLAGS="$CFLAGS -g3 -fno-builtin"
558 optflags=-std-compile-opts
579 echo "Build.sh $srcversion"
580 echo "for mksh $dstversion"
584 echo "$me: Unknown option '$i'!" >&2
588 echo "$me: Unknown option -'$last' '$i'!" >&2
593 if test -n "$last"; then
594 echo "$me: Option -'$last' not followed by argument!" >&2
598 test -z "$tfn" && if test $legacy = 0; then
603 if test -d $tfn || test -d $tfn.exe; then
604 echo "$me: Error: ./$tfn is a directory!" >&2
607 rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \
608 *.ll *.o *.gen *.cat1 Rebuild.sh lft no signames.inc test.sh x vv.out
610 SRCS="lalloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
611 SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
613 if test $legacy = 0; then
614 check_categories="$check_categories shell:legacy-no int:32"
616 check_categories="$check_categories shell:legacy-yes"
617 add_cppflags -DMKSH_LEGACY_MODE
621 add_cppflags -DMKSH_EBCDIC
624 if test $textmode = 0; then
625 check_categories="$check_categories shell:textmode-no shell:binmode-yes"
627 check_categories="$check_categories shell:textmode-yes shell:binmode-no"
628 add_cppflags -DMKSH_WITH_TEXTMODE
631 if test x"$srcdir" = x"."; then
632 CPPFLAGS="-I. $CPPFLAGS"
634 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
636 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
637 LDFLAGS="$LDFLAGS $LDSTATIC"
642 if test -z "$TARGET_OS"; then
643 x=`uname -s 2>/dev/null || uname`
644 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
646 if test -z "$TARGET_OS"; then
647 echo "$me: Set TARGET_OS, your uname is broken!" >&2
654 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'
657 if test x"$TARGET_OS" = x"Android"; then
658 check_categories="$check_categories android"
663 if test x"$TARGET_OS" = x"Minix"; then
665 WARNING: additional checks before running Build.sh required!
666 You can avoid these by calling Build.sh correctly, see below.
668 cat >conftest.c <<'EOF'
669 #include <sys/types.h>
671 #ifdef _NETBSD_SOURCE
679 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
686 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
687 Please set it to either Minix3 or Ninix3, whereas the latter is
688 all versions of Minix with even partial NetBSD(R) userland. The
689 value determined from your compiler for the current compilation
690 (which may be wrong) is: $ct
696 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
697 Please set it to either Minix3 or Ninix3, whereas the latter is
698 all versions of Minix with even partial NetBSD(R) userland. The
699 proper value couldn't be determined, continue at your own risk.
705 # Configuration depending on OS revision, on OSes that need them
708 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
709 grep 'NeXT Mach [0-9][0-9.]*:' | \
710 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
713 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
717 # Configuration depending on OS name
720 : "${HAVE_CAN_OTWO=0}"
721 add_cppflags -DMKSH_NO_SIGSETJMP
722 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
725 add_cppflags -D_ALL_SOURCE
726 : "${HAVE_SETLOCALE_CTYPE=0}"
731 oswarn="; it has minor issues"
734 oswarn="; you must recompile mksh with"
735 oswarn="$oswarn${nl}itself in a second stage"
738 # BeOS has no real tty either
739 add_cppflags -DMKSH_UNEMPLOYED
740 add_cppflags -DMKSH_DISABLE_TTY_WARNING
741 # BeOS doesn't have different UIDs and GIDs
742 add_cppflags -DMKSH__NO_SETEUGID
745 : "${HAVE_SETLOCALE_CTYPE=0}"
748 oswarn="; it has major issues"
749 add_cppflags -DMKSH__NO_SYMLINK
750 check_categories="$check_categories nosymlink"
751 add_cppflags -DMKSH__NO_SETEUGID
752 add_cppflags -DMKSH_DISABLE_TTY_WARNING
755 : "${HAVE_SETLOCALE_CTYPE=0}"
758 add_cppflags -D_DARWIN_C_SOURCE
765 oswarn="; it has minor issues"
766 add_cppflags -D_GNU_SOURCE
767 : "${HAVE_SETLOCALE_CTYPE=0}"
772 *) add_cppflags -D_GNU_SOURCE ;;
774 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
775 # define MKSH__NO_PATH_MAX to use Hurd-only functions
776 add_cppflags -DMKSH__NO_PATH_MAX
781 *) add_cppflags -D_GNU_SOURCE ;;
783 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
786 add_cppflags -DMKSH_ASSUME_UTF8
787 HAVE_ISSET_MKSH_ASSUME_UTF8=1
788 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
791 add_cppflags -D_POSIX_SOURCE
792 add_cppflags -D_LIMITS_EXTENSION
793 add_cppflags -D_BSD_EXTENSION
794 add_cppflags -D_SUSV2_SOURCE
795 add_cppflags -D_GNU_SOURCE
796 add_cppflags -DMKSH_ASSUME_UTF8
797 HAVE_ISSET_MKSH_ASSUME_UTF8=1
798 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
799 add_cppflags -DMKSH__NO_SYMLINK
800 check_categories="$check_categories nosymlink"
801 add_cppflags -DMKSH_NO_CMDLINE_EDITING
802 add_cppflags -DMKSH__NO_SETEUGID
803 oswarn=' and will currently not work'
804 add_cppflags -DMKSH_UNEMPLOYED
805 add_cppflags -DMKSH_NOPROSPECTOFWORK
806 # these taken from Harvey-OS github and need re-checking
807 add_cppflags -D_setjmp=setjmp -D_longjmp=longjmp
808 : "${HAVE_CAN_NO_EH_FRAME=0}"
809 : "${HAVE_CAN_FNOSTRICTALIASING=0}"
810 : "${HAVE_CAN_FSTACKPROTECTORSTRONG=0}"
817 add_cppflags -D_ALL_SOURCE
819 : "${HAVE_SETLOCALE_CTYPE=0}"
822 : "${HAVE_SETLOCALE_CTYPE=0}"
825 add_cppflags -DMKSH_ASSUME_UTF8
826 HAVE_ISSET_MKSH_ASSUME_UTF8=1
827 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
828 add_cppflags -DMKSH__NO_SYMLINK
829 check_categories="$check_categories nosymlink"
830 add_cppflags -DMKSH_NO_CMDLINE_EDITING
831 add_cppflags -DMKSH_DISABLE_REVOKE_WARNING
832 add_cppflags '-D_PATH_DEFPATH=\"/cmd\"'
833 add_cppflags '-DMKSH_DEFAULT_EXECSHELL=\"/cmd/mksh\"'
834 add_cppflags '-DMKSH_DEFAULT_PROFILEDIR=\"/cfg/mksh\"'
835 add_cppflags '-DMKSH_ENVDIR=\"/env\"'
836 SRCS="$SRCS jehanne.c"
841 *) add_cppflags -D_GNU_SOURCE ;;
843 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
847 oswarn="; it has minor issues"
852 add_cppflags -DMKSH__NO_SETEUGID
853 add_cppflags -DMKSH_UNEMPLOYED
854 add_cppflags -D_MINIX_SOURCE
855 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
856 : "${HAVE_SETLOCALE_CTYPE=0}"
859 add_cppflags -DMKSH_UNEMPLOYED
860 add_cppflags -DMKSH_NO_LIMITS
861 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
862 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
863 : "${HAVE_SETLOCALE_CTYPE=0}"
868 add_cppflags -DMKSH_ASSUME_UTF8=0
869 HAVE_ISSET_MKSH_ASSUME_UTF8=1
870 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
871 # almost same as CYGWIN* (from RT|Chatzilla)
872 : "${HAVE_SETLOCALE_CTYPE=0}"
873 # broken on this OE (from ir0nh34d)
874 : "${HAVE_STDINT_H=0}"
879 add_cppflags -D_NEXT_SOURCE
880 add_cppflags -D_POSIX_SOURCE
883 add_cppflags -DMKSH_NO_SIGSETJMP
884 # NeXTstep cannot get a controlling tty
885 add_cppflags -DMKSH_UNEMPLOYED
886 case $TARGET_OSREV in
888 # OpenStep 4.2 is broken by default
889 oswarn="; it needs libposix.a"
895 add_cppflags -DMKSH_UNEMPLOYED
896 add_cppflags -DMKSH_NO_LIMITS
897 # but no idea what else could be needed
898 oswarn="; it has unknown issues"
901 : "${HAVE_SETLOCALE_CTYPE=0}"
904 add_cppflags -DMKSH_ASSUME_UTF8=0
905 HAVE_ISSET_MKSH_ASSUME_UTF8=1
906 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
908 HAVE_MKNOD=0 # setmode() incompatible
909 oswarn="; it is being ported"
910 check_categories="$check_categories nosymlink"
914 add_cppflags -DMKSH_UNEMPLOYED
915 add_cppflags -DMKSH_NOPROSPECTOFWORK
916 add_cppflags -DMKSH_NO_LIMITS
917 add_cppflags -DMKSH_DOSPATH
918 if test $textmode = 0; then
920 y='standard OS/2 tools'
923 y='standard Unix mksh and other tools'
926 OS/2 Note: mksh can be built with or without 'textmode'.
927 Without 'textmode' it will behave like a standard Unix utility,
928 compatible to mksh on all other platforms, using only ASCII LF
929 (0x0A) as line ending character. This is supported by the mksh
931 With 'textmode', mksh will be modified to behave more like other
932 OS/2 utilities, supporting ASCII CR+LF (0x0D 0x0A) as line ending
933 at the cost of deviation from standard mksh. This is supported by
936 ] You are currently compiling with textmode ${x}abled, introducing
937 ] incompatibilities with $y.
941 add_cppflags -DMKSH_ASSUME_UTF8=0
942 HAVE_ISSET_MKSH_ASSUME_UTF8=1
943 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
946 add_cppflags -DMKSH_FOR_Z_OS
947 add_cppflags -D_ALL_SOURCE
948 oswarn='; EBCDIC support is incomplete'
951 HAVE_SIG_T=0 # incompatible
952 add_cppflags -D_OSF_SOURCE
953 add_cppflags -D_POSIX_C_SOURCE=200112L
954 add_cppflags -D_XOPEN_SOURCE=600
955 add_cppflags -D_XOPEN_SOURCE_EXTENDED
956 : "${HAVE_SETLOCALE_CTYPE=0}"
959 add_cppflags -D_POSIX_SOURCE
960 add_cppflags -D_LIMITS_EXTENSION
961 add_cppflags -D_BSD_EXTENSION
962 add_cppflags -D_SUSV2_SOURCE
963 add_cppflags -DMKSH_ASSUME_UTF8
964 HAVE_ISSET_MKSH_ASSUME_UTF8=1
965 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
966 add_cppflags -DMKSH__NO_SYMLINK
967 check_categories="$check_categories nosymlink"
968 add_cppflags -DMKSH_NO_CMDLINE_EDITING
969 add_cppflags -DMKSH__NO_SETEUGID
970 oswarn=' and will currently not work'
971 add_cppflags -DMKSH_UNEMPLOYED
972 # this is for detecting kencc
973 add_cppflags -DMKSH_MAYBE_KENCC
976 HAVE_SIG_T=0 # incompatible
977 oswarn=' and will currently not work'
978 : "${HAVE_SETLOCALE_CTYPE=0}"
981 add_cppflags -D__NO_EXT_QNX
982 add_cppflags -D__EXT_UNIX_MISC
983 case $TARGET_OSREV in
984 [012345].*|6.[0123].*|6.4.[01])
985 oldish_ed=no-stderr-ed # oldish /bin/ed is broken
988 : "${HAVE_SETLOCALE_CTYPE=0}"
991 case $TARGET_OSREV in
994 add_cppflags -DMKSH_UNEMPLOYED
1000 oswarn='; this is an unknown version of'
1001 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
1004 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
1007 oswarn="; it has minor issues"
1010 add_cppflags -D_BSD_SOURCE
1011 add_cppflags -D__EXTENSIONS__
1014 add_cppflags -D_GNU_SOURCE
1015 add_cppflags -DMKSH_NO_SIGSUSPEND
1016 oswarn=' and will currently not work'
1019 : "${CC=cc -YPOSIX}"
1020 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
1021 : "${HAVE_SETLOCALE_CTYPE=0}"
1025 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
1031 oswarn="; it will compile, but the target"
1032 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
1033 : "${HAVE_SETLOCALE_CTYPE=0}"
1036 # generic target for SVR4 Unix with uname -s = uname -n
1037 # this duplicates the * target below
1038 oswarn='; it may or may not work'
1039 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
1042 oswarn='; it may or may not work'
1043 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
1049 : "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
1050 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
1051 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
1053 # this aids me in tracing FTBFSen without access to the buildd
1054 $e "Hi from$ao $bi$srcversion$ao on:"
1057 vv '|' "oslevel >&2"
1058 vv '|' "uname -a >&2"
1061 vv '|' "hwprefs machine_type os_type os_class >&2"
1062 vv '|' "sw_vers >&2"
1063 vv '|' "system_profiler SPSoftwareDataType SPHardwareDataType >&2"
1064 vv '|' "/bin/sh --version >&2"
1065 vv '|' "xcodebuild -version >&2"
1066 vv '|' "uname -a >&2"
1067 vv '|' "sysctl kern.version hw.machine hw.model hw.memsize hw.availcpu hw.cpufrequency hw.byteorder hw.cpu64bit_capable >&2"
1070 vv '|' "uname -a >&2"
1071 vv '|' "hinv -v >&2"
1074 vv '|' "uname -a >&2"
1075 vv '|' "/usr/sbin/sizer -v >&2"
1077 SCO_SV|UnixWare|UNIX_SV)
1078 vv '|' "uname -a >&2"
1079 vv '|' "uname -X >&2"
1082 vv '|' "uname -a >&2"
1085 test -z "$oswarn" || echo >&2 "
1086 Warning: mksh has not yet been ported to or tested on your
1087 operating system '$TARGET_OS'$oswarn. If you can provide
1088 a shell account to the developer, this may improve; please
1089 drop us a success or failure notice or even send in diffs.
1091 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
1094 # Start of mirtoconf checks
1096 $e $bi$me: Scanning for functions... please ignore any errors.$ao
1099 # Compiler: which one?
1102 # - ICC defines __GNUC__ too
1103 # - GCC defines __hpux too
1104 # - LLVM+clang defines __GNUC__ too
1105 # - nwcc defines __GNUC__ too
1107 $e ... which compiler type seems to be used
1108 cat >conftest.c <<'EOF'
1110 #if defined(__ICC) || defined(__INTEL_COMPILER)
1112 #elif defined(__xlC__) || defined(__IBMC__)
1114 #elif defined(__SUNPRO_C)
1116 #elif defined(__ACK__)
1118 #elif defined(__BORLANDC__)
1120 #elif defined(__WATCOMC__)
1122 #elif defined(__MWERKS__)
1124 #elif defined(__HP_cc)
1126 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1128 #elif defined(__PGI)
1130 #elif defined(__DMC__)
1132 #elif defined(_MSC_VER)
1134 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1136 #elif defined(__IAR_SYSTEMS_ICC__)
1140 #elif defined(__PCC__)
1142 #elif defined(__TenDRA__)
1144 #elif defined(__TINYC__)
1146 #elif defined(__llvm__) && defined(__clang__)
1148 #elif defined(__NWCC__)
1150 #elif defined(__GNUC__)
1152 #elif defined(_COMPILER_VERSION)
1154 #elif defined(__sgi)
1156 #elif defined(__hpux) || defined(__hpua)
1158 #elif defined(__ultrix)
1160 #elif defined(__USLC__)
1162 #elif defined(__LCC__)
1164 #elif defined(MKSH_MAYBE_KENCC)
1165 /* and none of the above matches */
1172 #if defined(__KLIBC__) && !defined(__OS2__)
1181 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1182 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1186 cat >conftest.c <<'EOF'
1188 int main(void) { return (isatty(0)); }
1192 # work around "the famous ACK const bug"
1193 CPPFLAGS="-Dconst= $CPPFLAGS"
1196 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
1197 and SHARC (21000) DSPs detected. This compiler has not yet
1198 been tested for compatibility with mksh. Continue at your
1199 own risk, please report success/failure to the developers.'
1202 echo >&2 "Warning: Borland C++ Builder detected. This compiler might
1203 produce broken executables. Continue at your own risk,
1204 please report success/failure to the developers."
1207 # does not work with current "ccc" compiler driver
1208 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1209 # one of these two works, for now
1210 vv '|' "${CLANG-clang} -version"
1211 vv '|' "${CLANG-clang} --version"
1212 # ensure compiler and linker are in sync unless overridden
1213 case $CCC_CC:$CCC_LD in
1215 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
1217 : "${HAVE_STRING_POOLING=i1}"
1220 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1221 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1224 echo >&2 "Warning: Digital Mars Compiler detected. When running under"
1225 echo >&2 " UWIN, mksh tends to be unstable due to the limitations"
1226 echo >&2 " of this platform. Continue at your own risk,"
1227 echo >&2 " please report success/failure to the developers."
1230 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1231 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
1232 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
1233 $LIBS -dumpversion`'
1234 : "${HAVE_STRING_POOLING=i2}"
1237 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1240 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
1241 systems detected. This unsupported compiler has not yet
1242 been tested for compatibility with mksh. Continue at your
1243 own risk, please report success/failure to the developers.'
1246 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1249 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1252 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1253 add_cppflags -D__inline__=__inline
1256 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
1257 been tested for compatibility with mksh. Continue at your
1258 own risk, please report success/failure to the developers.'
1261 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1264 ccpr= # errorlevels are not reliable
1267 if [[ -n $C89_COMPILER ]]; then
1268 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1272 if [[ -n $C89_LINKER ]]; then
1273 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1277 vv '|' "$C89_COMPILER /HELP >&2"
1278 vv '|' "$C89_LINKER /LINK >&2"
1283 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1286 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1289 echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1290 been tested for compatibility with mksh. Continue at your
1291 own risk, please report success/failure to the developers.'
1294 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1295 C compiler for embedded systems detected. This has not yet
1296 been tested for compatibility with mksh. Continue at your
1297 own risk, please report success/failure to the developers.'
1300 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1303 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1306 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1307 grep -F -i -e version -e release"
1310 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1311 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1314 case $TARGET_OS:$TARGET_OSREV in
1318 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1321 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1324 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1327 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1328 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1332 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1335 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1336 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1341 vv '|' "llc -version"
1347 add_cppflags -DMKSH_NO_LIMITS
1350 # nothing special detected, don’t worry
1357 $e "$bi==> which compiler type seems to be used...$ao $ui$ct$etd$ao"
1358 rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1361 # Compiler: works as-is, with -Wno-error and -Werror
1366 ac_flags 0 compiler_works '' 'if the compiler works'
1367 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1368 HAVE_COMPILER_KNOWN=0
1369 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1370 if ac_ifcpp 'if 0' compiler_fails '' \
1371 'if the compiler does not fail correctly'; then
1373 : "${HAVE_CAN_DELEXE=x}"
1376 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1377 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1379 int main(void) { return (isatty(0)); }
1383 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1384 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1386 int main(void) { return (isatty(0)); }
1393 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1394 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1396 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1398 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1399 'if this could be tcc'; then
1401 CPP='cpp -D__TINYC__'
1402 HAVE_COMPILER_KNOWN=1
1407 save_NOWARN="${ccpc}-w"
1411 # -msg_* flags not used yet, or is -w2 correct?
1414 save_NOWARN="${ccpc}-w"
1427 DOWARN="-diag_error 1-10000"
1430 save_NOWARN="${ccpc}/w"
1434 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1435 ac_flags 0 errwarnnone "$save_NOWARN"
1436 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1437 ac_flags 0 errwarnall "-errwarn=%all"
1438 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1454 save_NOWARN=-qflag=e
1458 save_NOWARN=-qflag=i:e
1464 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1465 ac_flags 0 wnoerror "$save_NOWARN"
1466 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1467 ac_flags 0 werror -Werror
1468 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1469 test $ct = icc && DOWARN="$DOWARN -wd1419"
1475 # Compiler: extra flags (-O2 -f* -W* etc.)
1477 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1478 # optimisation: only if orig_CFLAGS is empty
1479 test x"$i" = x"" && case $ct in
1486 # no special optimisation
1491 int main(void) { return (isatty(0)); }
1492 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p
1493 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p)
1494 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1496 yes pad | head -n 256 >>x
1497 ac_flags - 1 otwo -xO2 <x
1501 ac_flags 1 othree "-O3 -qstrict"
1502 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1506 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1509 # other flags: just add them if they are supported
1513 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1519 ac_flags 0 verb -verbose
1520 ac_flags 1 rodata -readonly_strings
1523 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1524 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1527 # The following tests run with -Werror (gcc only) if possible
1528 NOWARN=$DOWARN; phase=u
1529 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1530 # mksh is not written in CFrustFrust!
1531 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1532 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1533 ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1534 test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1535 ac_flags 1 fstackprotectorall -fstack-protector-all
1536 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1537 *\ -fplugin=*dragonegg*) ;;
1538 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1547 checks='1 2 3 4 5 6 7 8'
1553 test $fv = 1 || for what in $checks; do
1554 test $fv = 1 && break
1556 1) t_cflags='-flto=jobserver'
1557 t_ldflags='-fuse-linker-plugin'
1558 t_use=1 t_name=fltojs_lp ;;
1559 2) t_cflags='-flto=jobserver' t_ldflags=''
1560 t_use=1 t_name=fltojs_nn ;;
1561 3) t_cflags='-flto=jobserver'
1562 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1563 t_use=1 t_name=fltojs_np ;;
1565 t_ldflags='-fuse-linker-plugin'
1566 t_use=1 t_name=fltons_lp ;;
1567 5) t_cflags='-flto' t_ldflags=''
1568 t_use=1 t_name=fltons_nn ;;
1570 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1571 t_use=1 t_name=fltons_np ;;
1572 7) t_cflags='-fwhole-program --combine' t_ldflags=''
1573 t_use=0 t_name=combine cm=combine ;;
1574 8) fv=1 cm=normal ;;
1576 test $fv = 1 && break
1577 ac_flags $t_use $t_name "$t_cflags" \
1578 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1580 ac_flags 1 data_abi_align -malign-data=abi
1585 # probably not needed
1586 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1590 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1591 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1592 ac_flags 1 fstacksecuritycheck -fstack-security-check
1596 ac_flags 1 fullwarn -fullwarn 'for remark output support'
1599 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1600 echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1601 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1602 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1603 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1605 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1606 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1609 #broken# ac_flags 1 ssp -stackprotect
1613 ac_flags 1 fstackprotectorall -fstack-protector-all
1619 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1623 : #broken# ac_flags 1 boundschk -b
1626 ac_flags 0 ysystem -Ysystem
1627 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1628 ac_flags 1 extansi -Xa
1633 # On IBM z/OS, the following are warnings by default:
1634 # CCN3296: #include file <foo.h> not found.
1635 # CCN3944: Attribute "__foo__" is not supported and is ignored.
1636 # CCN3963: The attribute "foo" is not a valid variable attribute and is ignored.
1637 ac_flags 1 halton '-qhaltonmsg=CCN3296 -qhaltonmsg=CCN3944 -qhaltonmsg=CCN3963'
1638 # CCN3290: Unknown macro name FOO on #undef directive.
1639 # CCN4108: The use of keyword '__attribute__' is non-portable.
1640 ac_flags 1 supprss '-qsuppress=CCN3290 -qsuppress=CCN4108'
1643 ac_flags 1 rodata '-qro -qroconst -qroptr'
1644 ac_flags 1 rtcheck -qcheck=all
1645 #ac_flags 1 rtchkc -qextchk # reported broken
1646 ac_flags 1 wformat '-qformat=all -qformat=nozln'
1649 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1652 # flags common to a subset of compilers (run with -Werror on gcc)
1653 if test 1 = $i; then
1654 ac_flags 1 wall -Wall
1655 ac_flags 1 fwrapv -fwrapv
1658 # “on demand” means: GCC version >= 4
1659 fd='if to rely on compiler for string pooling'
1660 ac_cache string_pooling || case $HAVE_STRING_POOLING in
1661 2) fx=' (on demand, cached)' ;;
1663 i2) fv=2; fx=' (on demand)' ;;
1666 test x"$HAVE_STRING_POOLING" = x"0" || ac_cppflags
1669 # The following tests run with -Werror or similar (all compilers) if possible
1671 test $ct = pcc && phase=u
1674 # Compiler: check for stuff that only generates warnings
1676 ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1677 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1678 extern int thiswillneverbedefinedIhope(void);
1679 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1680 int main(void) { return (thiswillneverbedefinedIhope()); }
1683 #undef __attribute__
1684 int xcopy(const void *, void *, size_t)
1685 __attribute__((__bounded__(__buffer__, 1, 3)))
1686 __attribute__((__bounded__(__buffer__, 2, 3)));
1687 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1688 int xcopy(const void *s, void *d, size_t n) {
1690 * if memmove does not exist, we are not on a system
1691 * with GCC with __bounded__ attribute either so poo
1693 memmove(d, s, n); return ((int)n);
1697 ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1698 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1699 extern int thiswillneverbedefinedIhope(void);
1700 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1701 int main(void) { return (thiswillneverbedefinedIhope()); }
1703 #define fprintf printfoo
1705 #undef __attribute__
1707 extern int fprintf(FILE *, const char *format, ...)
1708 __attribute__((__format__(__printf__, 2, 3)));
1709 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1712 ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1713 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1714 extern int thiswillneverbedefinedIhope(void);
1715 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1716 int main(void) { return (thiswillneverbedefinedIhope()); }
1719 #undef __attribute__
1720 void fnord(void) __attribute__((__noreturn__));
1721 int main(void) { fnord(); }
1722 void fnord(void) { exit(0); }
1725 ac_test attribute_pure '' 'for __attribute__((__pure__))' <<-'EOF'
1726 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1727 extern int thiswillneverbedefinedIhope(void);
1728 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1729 int main(void) { return (thiswillneverbedefinedIhope()); }
1732 #undef __attribute__
1733 int foo(const char *) __attribute__((__pure__));
1734 int main(int ac, char **av) { return (foo(av[ac - 1]) + isatty(0)); }
1735 int foo(const char *s) { return ((int)s[0]); }
1738 ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1739 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1740 extern int thiswillneverbedefinedIhope(void);
1741 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1742 int main(void) { return (thiswillneverbedefinedIhope()); }
1745 #undef __attribute__
1746 int main(int ac __attribute__((__unused__)), char **av
1747 __attribute__((__unused__))) { return (isatty(0)); }
1750 ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1751 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1752 extern int thiswillneverbedefinedIhope(void);
1753 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1754 int main(void) { return (thiswillneverbedefinedIhope()); }
1757 #undef __attribute__
1758 static const char fnord[] __attribute__((__used__)) = "42";
1759 int main(void) { return (isatty(0)); }
1763 # End of tests run with -Werror
1768 # mksh: flavours (full/small mksh, omit certain stuff)
1770 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1771 "if a reduced-feature mksh is requested"; then
1773 : "${HAVE_PERSISTENT_HISTORY=0}"
1774 check_categories="$check_categories smksh"
1776 ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1777 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1778 check_categories="$check_categories binsh"
1779 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1780 "if mksh will be built without job control" && \
1781 check_categories="$check_categories arge"
1782 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1783 "if mksh will be built without job signals" && \
1784 check_categories="$check_categories arge nojsig"
1785 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1786 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1787 ac_ifcpp 'if !MKSH_ASSUME_UTF8' isoff_MKSH_ASSUME_UTF8 \
1788 isset_MKSH_ASSUME_UTF8 0 \
1789 'if the default UTF-8 mode is disabled' && \
1790 check_categories="$check_categories noutf8"
1791 #ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1792 # "if deprecated features are to be omitted" && \
1793 # check_categories="$check_categories nodeprecated"
1794 #ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1795 # "if experimental features are to be omitted" && \
1796 # check_categories="$check_categories noexperimental"
1797 ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1798 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1799 check_categories="$check_categories mnbsdash"
1802 # Environment: headers
1804 ac_header sys/time.h sys/types.h
1805 ac_header time.h sys/types.h
1806 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1807 ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1808 #include <sys/types.h>
1809 #include <sys/time.h>
1812 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1814 ac_header sys/bsdtypes.h
1815 ac_header sys/file.h sys/types.h
1816 ac_header sys/mkdev.h sys/types.h
1817 ac_header sys/mman.h sys/types.h
1818 ac_header sys/param.h
1819 ac_header sys/resource.h sys/types.h _time
1820 ac_header sys/select.h sys/types.h
1821 ac_header sys/sysmacros.h
1823 ac_header grp.h sys/types.h
1826 ac_header libutil.h sys/types.h
1828 ac_header stdint.h stdarg.h
1829 # include strings.h only if compatible with string.h
1830 ac_header strings.h sys/types.h string.h
1832 ac_header ulimit.h sys/types.h
1836 # Environment: definitions
1838 echo '#include <sys/types.h>
1840 /* check that off_t can represent 2^63-1 correctly, thx FSF */
1841 #define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
1842 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1843 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1844 int main(void) { return (isatty(0)); }' >lft.c
1845 ac_testn can_lfs '' "for large file support" <lft.c
1846 save_CPPFLAGS=$CPPFLAGS
1847 add_cppflags -D_FILE_OFFSET_BITS=64
1848 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1849 if test 0 = $HAVE_CAN_LFS_SUS; then
1850 CPPFLAGS=$save_CPPFLAGS
1851 add_cppflags -D_LARGE_FILES=1
1852 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1853 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1856 rmf lft* # end of large file support test
1859 # Environment: types
1861 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1862 #include <sys/types.h>
1864 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1866 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1867 #include <sys/types.h>
1869 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1871 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1872 #include <sys/types.h>
1874 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1876 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1877 #include <sys/types.h>
1879 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1882 ac_test rlim_t <<-'EOF'
1883 #include <sys/types.h>
1884 #if HAVE_BOTH_TIME_H
1885 #include <sys/time.h>
1887 #elif HAVE_SYS_TIME_H
1888 #include <sys/time.h>
1892 #if HAVE_SYS_RESOURCE_H
1893 #include <sys/resource.h>
1896 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1899 # only testn: added later below
1900 ac_testn sig_t <<-'EOF'
1901 #include <sys/types.h>
1904 volatile sig_t foo = (sig_t)0;
1905 int main(void) { return (foo == (sig_t)0); }
1908 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1909 #include <sys/types.h>
1912 volatile sighandler_t foo = (sighandler_t)0;
1913 int main(void) { return (foo == (sighandler_t)0); }
1915 if test 1 = $HAVE_SIGHANDLER_T; then
1916 add_cppflags -Dsig_t=sighandler_t
1920 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1921 #include <sys/types.h>
1924 volatile __sighandler_t foo = (__sighandler_t)0;
1925 int main(void) { return (foo == (__sighandler_t)0); }
1927 if test 1 = $HAVE___SIGHANDLER_T; then
1928 add_cppflags -Dsig_t=__sighandler_t
1932 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1936 # check whether whatever we use for the final link will succeed
1938 if test $cm = makefile; then
1942 ac_testinit link_works '' 'checking if the final link command may succeed'
1944 cat >conftest.c <<-EOF
1946 #define MKSH_INCLUDES_ONLY
1948 __RCSID("$srcversion");
1949 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1953 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1955 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1956 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1959 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1960 test $fv = 0 || v "mv conftest.s conftest.ll"
1961 test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1963 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1964 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1967 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1971 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1972 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1975 test -f $tcfn || fv=0
1977 test $fv = 1 || exit 1
1981 # Environment: errors and signals
1983 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1985 ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1986 extern const int sys_nerr;
1987 extern const char * const sys_errlist[];
1988 extern int isatty(int);
1989 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
1991 ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1992 extern const int _sys_nerr;
1993 extern const char * const _sys_errlist[];
1994 extern int isatty(int);
1995 int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
1997 if test 1 = "$HAVE__SYS_ERRLIST"; then
1998 add_cppflags -Dsys_nerr=_sys_nerr
1999 add_cppflags -Dsys_errlist=_sys_errlist
2002 ac_cppflags SYS_ERRLIST
2004 for what in name list; do
2006 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
2007 extern const char * const sys_sig${what}[];
2008 extern int isatty(int);
2009 int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
2011 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
2012 extern const char * const _sys_sig${what}[];
2013 extern int isatty(int);
2014 int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
2016 eval uwhat_v=\$HAVE__SYS_SIG$uwhat
2017 if test 1 = "$uwhat_v"; then
2018 add_cppflags -Dsys_sig$what=_sys_sig$what
2019 eval HAVE_SYS_SIG$uwhat=1
2021 ac_cppflags SYS_SIG$uwhat
2025 # Environment: library functions
2027 ac_test flock <<-'EOF'
2028 #include <sys/types.h>
2032 #include <sys/file.h>
2034 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
2037 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
2042 lks.l_type = F_WRLCK | F_UNLCK;
2043 return (fcntl(0, F_SETLKW, &lks));
2047 ac_test getrusage <<-'EOF'
2048 #define MKSH_INCLUDES_ONLY
2052 return (getrusage(RUSAGE_SELF, &ru) +
2053 getrusage(RUSAGE_CHILDREN, &ru));
2057 ac_test getsid <<-'EOF'
2059 int main(void) { return ((int)getsid(0)); }
2062 ac_test gettimeofday <<-'EOF'
2063 #define MKSH_INCLUDES_ONLY
2065 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
2068 ac_test killpg <<-'EOF'
2070 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
2073 ac_test memmove <<-'EOF'
2074 #include <sys/types.h>
2078 #include <strings.h>
2080 int main(int ac, char *av[]) {
2081 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
2085 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
2086 #define MKSH_INCLUDES_ONLY
2088 int main(int ac, char *av[]) {
2090 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
2091 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
2096 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
2097 #include <sys/types.h>
2099 #include <sys/file.h>
2102 #include <sys/mman.h>
2106 int main(void) { return ((void *)mmap(NULL, (size_t)0,
2107 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
2111 ac_test ftruncate mmap 0 'for ftruncate' <<-'EOF'
2113 int main(void) { return (ftruncate(0, 0)); }
2116 ac_test nice <<-'EOF'
2118 int main(void) { return (nice(4)); }
2121 ac_test revoke <<-'EOF'
2122 #include <sys/types.h>
2124 #include <libutil.h>
2127 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
2130 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
2133 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
2136 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2137 #include <langinfo.h>
2139 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
2142 ac_test select <<-'EOF'
2143 #include <sys/types.h>
2144 #if HAVE_BOTH_TIME_H
2145 #include <sys/time.h>
2147 #elif HAVE_SYS_TIME_H
2148 #include <sys/time.h>
2152 #if HAVE_SYS_BSDTYPES_H
2153 #include <sys/bsdtypes.h>
2155 #if HAVE_SYS_SELECT_H
2156 #include <sys/select.h>
2159 #include <bstring.h>
2165 #include <strings.h>
2169 struct timeval tv = { 1, 200000 };
2170 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
2171 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
2175 ac_test setresugid <<-'EOF'
2176 #include <sys/types.h>
2178 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2181 ac_test setgroups setresugid 0 <<-'EOF'
2182 #include <sys/types.h>
2187 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2190 if test x"$et" = x"klibc"; then
2192 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2193 #define MKSH_INCLUDES_ONLY
2195 extern int __rt_sigsuspend(const sigset_t *, size_t);
2196 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2199 # no? damn! legacy crap ahead!
2201 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2202 'whether sigsuspend is usable (1/2)' <<-'EOF'
2203 #define MKSH_INCLUDES_ONLY
2205 extern int __sigsuspend_s(sigset_t);
2206 int main(void) { return (__sigsuspend_s(0)); }
2208 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2209 'whether sigsuspend is usable (2/2)' <<-'EOF'
2210 #define MKSH_INCLUDES_ONLY
2212 extern int __sigsuspend_xxs(int, int, sigset_t);
2213 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
2216 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
2217 # no usable sigsuspend(), use pause() *ugh*
2218 add_cppflags -DMKSH_NO_SIGSUSPEND
2222 ac_test strerror '!' sys_errlist 0 <<-'EOF'
2223 extern char *strerror(int);
2224 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2227 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2230 int main(void) { return (strsignal(1)[0]); }
2233 ac_test strlcpy <<-'EOF'
2235 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2240 # check headers for declarations
2242 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2243 #define MKSH_INCLUDES_ONLY
2246 #include <sys/file.h>
2248 int main(void) { return ((flock)(0, 0)); }
2250 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2251 #define MKSH_INCLUDES_ONLY
2253 int main(void) { return ((revoke)("")); }
2255 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2256 #define MKSH_INCLUDES_ONLY
2258 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2260 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2261 #define MKSH_INCLUDES_ONLY
2263 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2269 fd='if to use persistent history'
2270 ac_cache PERSISTENT_HISTORY || case $HAVE_FTRUNCATE$HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2273 test 1 = $fv || check_categories="$check_categories no-histfile"
2278 # extra checks for legacy mksh
2280 if test $legacy = 1; then
2281 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2282 #define MKSH_INCLUDES_ONLY
2288 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2289 cta(char_is_8_bits, (CHAR_BIT) == 8);
2290 cta(long_is_32_bits, sizeof(long) == 4);
2292 int main(void) { return (sizeof(struct ctasserts)); }
2295 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2296 #define MKSH_INCLUDES_ONLY
2302 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2303 cta(char_is_8_bits, (CHAR_BIT) == 8);
2304 cta(long_is_64_bits, sizeof(long) == 8);
2306 int main(void) { return (sizeof(struct ctasserts)); }
2309 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2310 10) check_categories="$check_categories int:32" ;;
2311 01) check_categories="$check_categories int:64" ;;
2312 *) check_categories="$check_categories int:u" ;;
2317 # Compiler: Praeprocessor (only if needed)
2319 test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2320 'checking if the C Preprocessor supports -dD'; then
2321 echo '#define foo bar' >conftest.c
2322 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2323 grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2324 rmf conftest.c x vv.out
2329 # End of mirtoconf checks
2333 # Some operating systems have ancient versions of ed(1) writing
2334 # the character count to standard output; cope for that
2336 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2337 check_categories="$check_categories $oldish_ed"
2340 if test 0 = $HAVE_SYS_SIGNAME; then
2341 if test 1 = $HAVE_CPP_DD; then
2342 $e Generating list of signal names...
2344 $e No list of signal names available via cpp. Falling back...
2348 echo '#include <signal.h>
2349 #if defined(NSIG_MAX)
2350 #define cfg_NSIG NSIG_MAX
2352 #define cfg_NSIG NSIG
2353 #elif defined(_NSIG)
2354 #define cfg_NSIG _NSIG
2355 #elif defined(SIGMAX)
2356 #define cfg_NSIG (SIGMAX + 1)
2357 #elif defined(_SIGMAX)
2358 #define cfg_NSIG (_SIGMAX + 1)
2360 /*XXX better error out, see sh.h */
2366 # GNU sed 2.03 segfaults when optimising this to sed -n
2367 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2369 sed '/mksh_cfg.*= *$/{
2373 grep '^ *mksh_cfg *=' | \
2374 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2376 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2377 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2380 (printf hallo) >/dev/null 2>&1 || printf=echo
2381 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2382 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2383 $printf "NSIG=$NSIG ... "
2384 sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
2385 sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
2386 sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT STKFLT"
2387 sigs="$sigs ABND DCE DUMP IOERR TRACE DANGER THCONT THSTOP RESV UNUSED"
2388 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2389 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2390 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2391 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
2392 test $NSIG -gt 1 || sigs=
2393 for name in $sigs; do
2395 *:$name:*) continue ;;
2397 sigseenone=$sigseenone$name:
2398 echo '#include <signal.h>' >conftest.c
2399 echo int >>conftest.c
2400 echo mksh_cfg= SIG$name >>conftest.c
2401 echo ';' >>conftest.c
2402 # GNU sed 2.03 croaks on optimising this, too
2403 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2405 sed '/mksh_cfg.*= *$/{
2409 grep '^ *mksh_cfg *=' | \
2410 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2411 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2412 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2413 test $nr -gt 0 && test $nr -lt $NSIG || continue
2416 *) echo " { \"$name\", $nr },"
2417 sigseentwo=$sigseentwo$nr:
2418 $printf "$name=$nr " >&2
2421 done 2>&1 >signames.inc
2426 addsrcs '!' HAVE_STRLCPY strlcpy.c
2427 addsrcs USE_PRINTF_BUILTIN printf.c
2428 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2429 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2430 add_cppflags -DMKSH_BUILD_R=563
2432 $e $bi$me: Finished configuration testing, now producing output.$ao
2440 add_cppflags -DMKSH_EXE_EXT
2447 *\ *) mkshshebang="#!./$mkshexe" ;;
2448 *) mkshshebang="#!$curdir/$mkshexe" ;;
2452 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2453 test -n "\$KSH_VERSION" || exit 1
2454 set -A check_categories -- $check_categories
2455 pflag='$curdir/$mkshexe'
2456 sflag='$srcdir/check.t'
2457 usee=0 useU=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2458 while getopts "C:e:fPp:QSs:t:U:v" ch; do case \$ch {
2459 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2460 (e) usee=1; eflag=\$OPTARG ;;
2461 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
2464 (p) pflag=\$OPTARG ;;
2469 (s) sflag=\$OPTARG ;;
2470 (t) uset=1; tflag=\$OPTARG ;;
2471 (U) useU=1; Uflag=\$OPTARG ;;
2477 shift \$((OPTIND - 1))
2478 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2480 args[\${#args[*]}]=-E
2483 for y in "\${check_categories[@]}"; do
2486 if [[ -n \$x ]]; then
2487 args[\${#args[*]}]=-C
2488 args[\${#args[*]}]=\${x#,}
2491 args[\${#args[*]}]=-e
2492 args[\${#args[*]}]=\$eflag
2494 (( Pflag )) && args[\${#args[*]}]=-P
2496 args[\${#args[*]}]=-t
2497 args[\${#args[*]}]=\$tflag
2500 args[\${#args[*]}]=-U
2501 args[\${#args[*]}]=\$Uflag
2503 (( vflag )) && args[\${#args[*]}]=-v
2504 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
2505 if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2506 args[\${#args[*]}]=-T
2507 args[\${#args[*]}]=\$TMPDIR
2509 print Testing mksh for conformance:
2510 grep -F -e Mir''OS: -e MIRBSD "\$sflag"
2511 print "This shell is actually:\\n\\t\$KSH_VERSION"
2512 print 'test.sh built for mksh $dstversion'
2513 cstr='\$os = defined \$^O ? \$^O : "unknown";'
2514 cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2515 for perli in \$PERL perl5 perl no; do
2516 if [[ \$perli = no ]]; then
2517 print Cannot find a working Perl interpreter, aborting.
2520 print "Trying Perl interpreter '\$perli'..."
2521 perlos=\$(\$perli -e "\$cstr")
2523 print "Errorlevel \$rv, running on '\$perlos'"
2525 print "=> not using"
2528 if [[ -n \$perlos ]]; then
2533 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2534 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2535 # use of the -S option for check.t split into multiple chunks
2537 for s in "\$sflag".*; do
2538 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2539 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2541 (( rv = rv ? rv : rc ))
2551 emitbc="-emit-llvm -c"
2557 echo ": # work around NeXTstep bug" >Rebuild.sh
2559 optfiles=`echo *.opt`
2561 for file in $optfiles; do
2562 echo "echo + Running genopt on '$file'..."
2563 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2565 echo set -x >>Rebuild.sh
2566 for file in $SRCS; do
2567 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2568 test -f $file || file=$srcdir/$file
2569 files="$files$sp$file"
2571 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2572 if test $cm = dragonegg; then
2573 echo "mv ${op}s ${op}ll" >>Rebuild.sh
2574 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2575 objs="$objs$sp${op}bc"
2577 objs="$objs$sp${op}o"
2582 echo "rm -f $tfn.s" >>Rebuild.sh
2583 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2590 echo tcfn=$mkshexe >>Rebuild.sh
2591 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2592 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2593 if test $cm = makefile; then
2594 extras='emacsfn.h exprtok.h rlimits.opt sh.h sh_flags.opt var_spec.h'
2595 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2597 for file in $optfiles; do
2598 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2600 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2601 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2603 cat >Makefrag.inc <<EOF
2604 # Makefile fragment for building mksh $dstversion
2612 NONSRCS_INST= dot.mkshrc \$(MAN)
2613 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2620 .depend \$(OBJS_BP):$gens$genq
2622 # not BSD make only:
2625 #\$(PROG): \$(OBJS_BP)
2626 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2627 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2629 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2631 # for all make variants:
2634 # ./test.sh \$(REGRESS_FLAGS)
2635 check_categories=$check_categories
2637 # for BSD make only:
2639 #.include <bsd.prog.mk>
2642 $e Generated Makefrag.inc successfully.
2645 for file in $optfiles; do
2646 $e "+ Running genopt on '$file'..."
2647 do_genopt "$srcdir/$file" || exit 1
2649 if test $cm = combine; then
2651 for file in $SRCS; do
2652 test -f $file || file=$srcdir/$file
2655 emitbc="-fwhole-program --combine"
2656 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2657 elif test 1 = $pm; then
2658 for file in $SRCS; do
2659 test -f $file || file=$srcdir/$file
2660 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2664 for file in $SRCS; do
2665 test $cm = dragonegg && \
2666 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2667 test -f $file || file=$srcdir/$file
2668 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2669 if test $cm = dragonegg; then
2670 v "mv ${op}s ${op}ll"
2671 v "llvm-as ${op}ll" || exit 1
2678 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2682 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2683 test -f $tcfn || exit 1
2684 test 1 = $r || v "$NROFF -mdoc <'$srcdir/lksh.1' >lksh.cat1" || rmf lksh.cat1
2685 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || rmf mksh.cat1
2686 test 0 = $eq && v $SIZE $tcfn
2688 test -f /usr/ucb/$i && i=/usr/ucb/$i
2691 $e Installing the shell:
2692 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2693 if test $legacy = 0; then
2694 $e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2695 $e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2698 $e Installing the manual:
2699 if test -f mksh.cat1; then
2700 $e "# $i -c -o root -g bin -m 444 lksh.cat1" \
2701 "/usr/share/man/cat1/lksh.0"
2702 $e "# $i -c -o root -g bin -m 444 mksh.cat1" \
2703 "/usr/share/man/cat1/mksh.0"
2706 $e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
2708 $e Run the regression test suite: ./test.sh
2709 $e Please also read the sample file dot.mkshrc and the fine manual.
2714 === Environment used ===
2716 ==== build environment ====
2719 CFLAGS if empty, defaults to -xO2 or +O2
2720 or -O3 -qstrict or -O2, per compiler
2721 CPPFLAGS default empty
2722 LDFLAGS default empty; added before sources
2723 LDSTATIC set this to '-static'; default unset
2724 LIBS default empty; added after sources
2725 [Interix] default: -lcrypt (XXX still needed?)
2726 NOWARN -Wno-error or similar
2727 NROFF default: nroff
2728 TARGET_OS default: $(uname -s || uname)
2729 TARGET_OSREV [QNX] default: $(uname -r)
2731 ==== feature selectors ====
2732 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2733 ===== general format =====
2735 HAVE_STRING_H ac_header
2736 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2738 ==== cpp definitions ====
2739 DEBUG dont use in production, wants gcc, implies:
2740 DEBUG_LEAKS enable freeing resources before exiting
2741 MKSHRC_PATH "~/.mkshrc" (do not change)
2742 MKSH_A4PB force use of arc4random_pushb
2743 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2744 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2745 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2746 MKSH_CLS_STRING KSH_ESC_STRING "[;H" KSH_ESC_STRING "[J"
2747 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2748 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2749 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2750 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2751 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2752 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2753 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2754 MKSH_EARLY_LOCALE_TRACKING track utf8-mode from POSIX locale, for SuSE
2755 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2756 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2757 MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
2758 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2759 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2760 MKSH_NO_LIMITS omit ulimit code
2761 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2762 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2763 MKSH_SMALL omit some code, optimise hard for size (slower)
2764 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2765 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2766 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2767 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2768 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2770 === generic installation instructions ===
2772 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2773 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2774 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2775 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2777 Normally, the following command is what you want to run, then:
2778 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2780 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2781 /bin; install the manpage, if omitting the -r flag a catmanpage is made
2782 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2783 http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2784 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2786 You may also want to install the lksh binary (also as /bin/sh) built by:
2787 $ CPPFLAGS="$CPPFLAGS -DMKSH_BINSHPOSIX" sh Build.sh -L -r -c lto