2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.734 2019/03/01 16:18:13 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)); }
423 eval fv=\$HAVE_CAN_`upper $vn`
424 if test -n "$fl"; then
425 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
427 test 11 = $fa$fv || CFLAGS=$save_CFLAGS
430 # ac_header [!] header [prereq ...]
432 if test x"$1" = x"!"; then
439 hv=`echo "$hf" | tr -d "$lfcr" | tr -c $alll$allu$alln $alls`
440 echo "/* NeXTstep bug workaround */" >x
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
455 echo "#include <$i>" >>x
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
464 test 1 = $na || ac_cppflags
468 if test x"$1" = x"!"; then
475 test $fr = "$i" && case " $SRCS " in
477 *) SRCS="$SRCS $2" ;;
482 curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null`
488 echo >&2 Source directory should not contain space or tab or newline.
489 echo >&2 Errors may occur.
492 echo Source directory must not contain single quotes.
496 dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' "$srcdir/sh.h"`
497 add_cppflags -DMKSH_BUILDSH
504 optflags=-std-compile-opts
515 c:combine|c:dragonegg|c:llvm|c:lto)
520 echo "$me: Unknown option -c '$i'!" >&2
538 echo "$me: Do not call me with '-G'!" >&2
542 # checker, debug, valgrind build
544 CFLAGS="$CFLAGS -g3 -fno-builtin"
559 optflags=-std-compile-opts
580 echo "Build.sh $srcversion"
581 echo "for mksh $dstversion"
585 echo "$me: Unknown option '$i'!" >&2
589 echo "$me: Unknown option -'$last' '$i'!" >&2
594 if test -n "$last"; then
595 echo "$me: Option -'$last' not followed by argument!" >&2
599 test -z "$tfn" && if test $legacy = 0; then
604 if test -d $tfn || test -d $tfn.exe; then
605 echo "$me: Error: ./$tfn is a directory!" >&2
608 rmf 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
611 SRCS="lalloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
612 SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
614 if test $legacy = 0; then
615 check_categories="$check_categories shell:legacy-no int:32"
617 check_categories="$check_categories shell:legacy-yes"
618 add_cppflags -DMKSH_LEGACY_MODE
622 add_cppflags -DMKSH_EBCDIC
625 if test $textmode = 0; then
626 check_categories="$check_categories shell:textmode-no shell:binmode-yes"
628 check_categories="$check_categories shell:textmode-yes shell:binmode-no"
629 add_cppflags -DMKSH_WITH_TEXTMODE
632 if test x"$srcdir" = x"."; then
633 CPPFLAGS="-I. $CPPFLAGS"
635 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
637 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
638 LDFLAGS="$LDFLAGS $LDSTATIC"
643 if 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
647 if test -z "$TARGET_OS"; then
648 echo "$me: Set TARGET_OS, your uname is broken!" >&2
655 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'
658 if test x"$TARGET_OS" = x"Android"; then
659 check_categories="$check_categories android"
664 if test x"$TARGET_OS" = x"Minix"; then
666 WARNING: additional checks before running Build.sh required!
667 You can avoid these by calling Build.sh correctly, see below.
669 cat >conftest.c <<'EOF'
670 #include <sys/types.h>
672 #ifdef _NETBSD_SOURCE
680 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
687 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
688 Please set it to either Minix3 or Ninix3, whereas the latter is
689 all versions of Minix with even partial NetBSD(R) userland. The
690 value determined from your compiler for the current compilation
691 (which may be wrong) is: $ct
697 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
698 Please set it to either Minix3 or Ninix3, whereas the latter is
699 all versions of Minix with even partial NetBSD(R) userland. The
700 proper value couldn't be determined, continue at your own risk.
706 # Configuration depending on OS revision, on OSes that need them
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/'`
714 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
718 # Configuration depending on OS name
721 : "${HAVE_CAN_OTWO=0}"
722 add_cppflags -DMKSH_NO_SIGSETJMP
723 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
726 add_cppflags -D_ALL_SOURCE
727 : "${HAVE_SETLOCALE_CTYPE=0}"
732 oswarn="; it has minor issues"
735 oswarn="; you must recompile mksh with"
736 oswarn="$oswarn${nl}itself in a second stage"
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
746 : "${HAVE_SETLOCALE_CTYPE=0}"
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
756 : "${HAVE_SETLOCALE_CTYPE=0}"
759 add_cppflags -D_DARWIN_C_SOURCE
766 oswarn="; it has minor issues"
767 add_cppflags -D_GNU_SOURCE
768 : "${HAVE_SETLOCALE_CTYPE=0}"
773 *) add_cppflags -D_GNU_SOURCE ;;
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
782 *) add_cppflags -D_GNU_SOURCE ;;
784 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
787 add_cppflags -DMKSH_ASSUME_UTF8
788 HAVE_ISSET_MKSH_ASSUME_UTF8=1
789 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
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}"
818 add_cppflags -D_ALL_SOURCE
820 : "${HAVE_SETLOCALE_CTYPE=0}"
823 : "${HAVE_SETLOCALE_CTYPE=0}"
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"
842 *) add_cppflags -D_GNU_SOURCE ;;
844 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
848 oswarn="; it has minor issues"
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}"
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}"
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}"
880 add_cppflags -D_NEXT_SOURCE
881 add_cppflags -D_POSIX_SOURCE
884 add_cppflags -DMKSH_NO_SIGSETJMP
885 # NeXTstep cannot get a controlling tty
886 add_cppflags -DMKSH_UNEMPLOYED
887 case $TARGET_OSREV in
889 # OpenStep 4.2 is broken by default
890 oswarn="; it needs libposix.a"
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"
902 : "${HAVE_SETLOCALE_CTYPE=0}"
905 add_cppflags -DMKSH_ASSUME_UTF8=0
906 HAVE_ISSET_MKSH_ASSUME_UTF8=1
907 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
909 HAVE_MKNOD=0 # setmode() incompatible
910 oswarn="; it is being ported"
911 check_categories="$check_categories nosymlink"
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
921 y='standard OS/2 tools'
924 y='standard Unix mksh and other tools'
927 OS/2 Note: mksh can be built with or without 'textmode'.
928 Without 'textmode' it will behave like a standard Unix utility,
929 compatible to mksh on all other platforms, using only ASCII LF
930 (0x0A) as line ending character. This is supported by the mksh
932 With 'textmode', mksh will be modified to behave more like other
933 OS/2 utilities, supporting ASCII CR+LF (0x0D 0x0A) as line ending
934 at the cost of deviation from standard mksh. This is supported by
937 ] You are currently compiling with textmode ${x}abled, introducing
938 ] incompatibilities with $y.
942 add_cppflags -DMKSH_ASSUME_UTF8=0
943 HAVE_ISSET_MKSH_ASSUME_UTF8=1
944 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
947 add_cppflags -DMKSH_FOR_Z_OS
948 add_cppflags -D_ALL_SOURCE
949 oswarn='; EBCDIC support is incomplete'
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}"
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
977 HAVE_SIG_T=0 # incompatible
978 oswarn=' and will currently not work'
979 : "${HAVE_SETLOCALE_CTYPE=0}"
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
989 : "${HAVE_SETLOCALE_CTYPE=0}"
992 case $TARGET_OSREV in
995 add_cppflags -DMKSH_UNEMPLOYED
1001 oswarn='; this is an unknown version of'
1002 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
1005 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
1008 oswarn="; it has minor issues"
1011 add_cppflags -D_BSD_SOURCE
1012 add_cppflags -D__EXTENSIONS__
1015 add_cppflags -D_GNU_SOURCE
1016 add_cppflags -DMKSH_NO_SIGSUSPEND
1017 oswarn=' and will currently not work'
1020 : "${CC=cc -YPOSIX}"
1021 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
1022 : "${HAVE_SETLOCALE_CTYPE=0}"
1026 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
1032 oswarn="; it will compile, but the target"
1033 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
1034 : "${HAVE_SETLOCALE_CTYPE=0}"
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`
1043 oswarn='; it may or may not work'
1044 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
1050 : "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
1051 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
1052 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
1054 # this aids me in tracing FTBFSen without access to the buildd
1055 $e "Hi from$ao $bi$srcversion$ao on:"
1058 vv '|' "oslevel >&2"
1059 vv '|' "uname -a >&2"
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"
1072 vv '|' "uname -a >&2"
1073 vv '|' "hinv -v >&2"
1076 vv '|' "uname -a >&2"
1077 vv '|' "/usr/sbin/sizer -v >&2"
1079 SCO_SV|UnixWare|UNIX_SV)
1080 vv '|' "uname -a >&2"
1081 vv '|' "uname -X >&2"
1084 vv '|' "uname -a >&2"
1087 test -z "$oswarn" || echo >&2 "
1088 Warning: mksh has not yet been ported to or tested on your
1089 operating system '$TARGET_OS'$oswarn. If you can provide
1090 a shell account to the developer, this may improve; please
1091 drop us a success or failure notice or even send in diffs.
1093 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
1096 # Start of mirtoconf checks
1098 $e $bi$me: Scanning for functions... please ignore any errors.$ao
1101 # Compiler: which one?
1104 # - ICC defines __GNUC__ too
1105 # - GCC defines __hpux too
1106 # - LLVM+clang defines __GNUC__ too
1107 # - nwcc defines __GNUC__ too
1109 $e ... which compiler type seems to be used
1110 cat >conftest.c <<'EOF'
1112 #if defined(__ICC) || defined(__INTEL_COMPILER)
1114 #elif defined(__xlC__) || defined(__IBMC__)
1116 #elif defined(__SUNPRO_C)
1118 #elif defined(__ACK__)
1120 #elif defined(__BORLANDC__)
1122 #elif defined(__WATCOMC__)
1124 #elif defined(__MWERKS__)
1126 #elif defined(__HP_cc)
1128 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1130 #elif defined(__PGI)
1132 #elif defined(__DMC__)
1134 #elif defined(_MSC_VER)
1136 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1138 #elif defined(__IAR_SYSTEMS_ICC__)
1142 #elif defined(__PCC__)
1144 #elif defined(__TenDRA__)
1146 #elif defined(__TINYC__)
1148 #elif defined(__llvm__) && defined(__clang__)
1150 #elif defined(__NWCC__)
1152 #elif defined(__GNUC__)
1154 #elif defined(_COMPILER_VERSION)
1156 #elif defined(__sgi)
1158 #elif defined(__hpux) || defined(__hpua)
1160 #elif defined(__ultrix)
1162 #elif defined(__USLC__)
1164 #elif defined(__LCC__)
1166 #elif defined(MKSH_MAYBE_KENCC)
1167 /* and none of the above matches */
1174 #if defined(__KLIBC__) && !defined(__OS2__)
1183 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1184 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1188 cat >conftest.c <<'EOF'
1190 int main(void) { return (isatty(0)); }
1194 # work around "the famous ACK const bug"
1195 CPPFLAGS="-Dconst= $CPPFLAGS"
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.'
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."
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
1217 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
1219 : "${HAVE_STRING_POOLING=i1}"
1222 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1223 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
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."
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}"
1239 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
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.'
1248 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1251 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1254 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1255 add_cppflags -D__inline__=__inline
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.'
1263 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1266 ccpr= # errorlevels are not reliable
1269 if [[ -n $C89_COMPILER ]]; then
1270 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1274 if [[ -n $C89_LINKER ]]; then
1275 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1279 vv '|' "$C89_COMPILER /HELP >&2"
1280 vv '|' "$C89_LINKER /LINK >&2"
1285 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1288 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
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.'
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.'
1302 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1305 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1308 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1309 grep -F -i -e version -e release"
1312 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1313 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1316 case $TARGET_OS:$TARGET_OSREV in
1320 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1323 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1326 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1329 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1330 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1334 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1337 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1338 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1343 vv '|' "llc -version"
1349 add_cppflags -DMKSH_NO_LIMITS
1352 # nothing special detected, don’t worry
1359 $e "$bi==> which compiler type seems to be used...$ao $ui$ct$etd$ao"
1360 rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1363 # Compiler: works as-is, with -Wno-error and -Werror
1368 ac_flags 0 compiler_works '' 'if the compiler works'
1369 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1370 HAVE_COMPILER_KNOWN=0
1371 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1372 if ac_ifcpp 'if 0' compiler_fails '' \
1373 'if the compiler does not fail correctly'; then
1375 : "${HAVE_CAN_DELEXE=x}"
1378 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1379 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1381 int main(void) { return (isatty(0)); }
1385 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1386 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1388 int main(void) { return (isatty(0)); }
1395 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1396 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1398 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1400 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1401 'if this could be tcc'; then
1403 CPP='cpp -D__TINYC__'
1404 HAVE_COMPILER_KNOWN=1
1409 save_NOWARN="${ccpc}-w"
1413 # -msg_* flags not used yet, or is -w2 correct?
1416 save_NOWARN="${ccpc}-w"
1429 DOWARN="-diag_error 1-10000"
1432 save_NOWARN="${ccpc}/w"
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"
1456 save_NOWARN=-qflag=e
1460 save_NOWARN=-qflag=i:e
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"
1477 # Compiler: extra flags (-O2 -f* -W* etc.)
1479 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1480 # optimisation: only if orig_CFLAGS is empty
1481 test x"$i" = x"" && case $ct in
1488 # no special optimisation
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) { }
1498 yes pad | head -n 256 >>x
1499 ac_flags - 1 otwo -xO2 <x
1503 ac_flags 1 othree "-O3 -qstrict"
1504 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1508 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1511 # other flags: just add them if they are supported
1515 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1521 ac_flags 0 verb -verbose
1522 ac_flags 1 rodata -readonly_strings
1525 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1526 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
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 ;;
1549 checks='1 2 3 4 5 6 7 8'
1555 test $fv = 1 || for what in $checks; do
1556 test $fv = 1 && break
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 ;;
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 ;;
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 ;;
1578 test $fv = 1 && break
1579 ac_flags $t_use $t_name "$t_cflags" \
1580 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1582 ac_flags 1 data_abi_align -malign-data=abi
1587 # probably not needed
1588 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1592 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1593 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1594 ac_flags 1 fstacksecuritycheck -fstack-security-check
1598 ac_flags 1 fullwarn -fullwarn 'for remark output support'
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
1607 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1608 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1611 #broken# ac_flags 1 ssp -stackprotect
1615 ac_flags 1 fstackprotectorall -fstack-protector-all
1621 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1625 : #broken# ac_flags 1 boundschk -b
1628 ac_flags 0 ysystem -Ysystem
1629 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1630 ac_flags 1 extansi -Xa
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'
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'
1651 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1654 # flags common to a subset of compilers (run with -Werror on gcc)
1655 if test 1 = $i; then
1656 ac_flags 1 wall -Wall
1657 ac_flags 1 fwrapv -fwrapv
1660 # “on demand” means: GCC version >= 4
1661 fd='if to rely on compiler for string pooling'
1662 ac_cache string_pooling || case $HAVE_STRING_POOLING in
1663 2) fx=' (on demand, cached)' ;;
1665 i2) fv=2; fx=' (on demand)' ;;
1668 test x"$HAVE_STRING_POOLING" = x"0" || ac_cppflags
1671 # The following tests run with -Werror or similar (all compilers) if possible
1673 test $ct = pcc && phase=u
1676 # Compiler: check for stuff that only generates warnings
1678 ac_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()); }
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) {
1692 * if memmove does not exist, we are not on a system
1693 * with GCC with __bounded__ attribute either so poo
1695 memmove(d, s, n); return ((int)n);
1699 ac_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()); }
1705 #define fprintf printfoo
1707 #undef __attribute__
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)); }
1714 ac_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()); }
1721 #undef __attribute__
1722 void fnord(void) __attribute__((__noreturn__));
1723 int main(void) { fnord(); }
1724 void fnord(void) { exit(0); }
1727 ac_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()); }
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]); }
1740 ac_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()); }
1747 #undef __attribute__
1748 int main(int ac __attribute__((__unused__)), char **av
1749 __attribute__((__unused__))) { return (isatty(0)); }
1752 ac_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()); }
1759 #undef __attribute__
1760 static const char fnord[] __attribute__((__used__)) = "42";
1761 int main(void) { return (isatty(0)); }
1765 # End of tests run with -Werror
1770 # mksh: flavours (full/small mksh, omit certain stuff)
1772 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1773 "if a reduced-feature mksh is requested"; then
1775 : "${HAVE_PERSISTENT_HISTORY=0}"
1776 check_categories="$check_categories smksh"
1778 ac_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"
1781 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1782 "if mksh will be built without job control" && \
1783 check_categories="$check_categories arge"
1784 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1785 "if mksh will be built without job signals" && \
1786 check_categories="$check_categories arge nojsig"
1787 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1788 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1789 ac_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"
1799 ac_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"
1804 # Environment: headers
1806 ac_header sys/time.h sys/types.h
1807 ac_header time.h sys/types.h
1808 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1809 ac_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>
1814 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1816 ac_header sys/bsdtypes.h
1817 ac_header sys/file.h sys/types.h
1818 ac_header sys/mkdev.h sys/types.h
1819 ac_header sys/mman.h sys/types.h
1820 ac_header sys/param.h
1821 ac_header sys/resource.h sys/types.h _time
1822 ac_header sys/select.h sys/types.h
1823 ac_header sys/sysmacros.h
1825 ac_header grp.h sys/types.h
1828 ac_header libutil.h sys/types.h
1830 ac_header stdint.h stdarg.h
1831 # include strings.h only if compatible with string.h
1832 ac_header strings.h sys/types.h string.h
1834 ac_header ulimit.h sys/types.h
1838 # Environment: definitions
1840 echo '#include <sys/types.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))
1844 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1845 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1846 int main(void) { return (isatty(0)); }' >lft.c
1847 ac_testn can_lfs '' "for large file support" <lft.c
1848 save_CPPFLAGS=$CPPFLAGS
1849 add_cppflags -D_FILE_OFFSET_BITS=64
1850 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1851 if 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
1858 rmf lft* # end of large file support test
1861 # Environment: types
1863 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1864 #include <sys/types.h>
1866 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1868 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1869 #include <sys/types.h>
1871 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1873 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1874 #include <sys/types.h>
1876 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1878 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1879 #include <sys/types.h>
1881 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1884 ac_test rlim_t <<-'EOF'
1885 #include <sys/types.h>
1886 #if HAVE_BOTH_TIME_H
1887 #include <sys/time.h>
1889 #elif HAVE_SYS_TIME_H
1890 #include <sys/time.h>
1894 #if HAVE_SYS_RESOURCE_H
1895 #include <sys/resource.h>
1898 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1901 # only testn: added later below
1902 ac_testn sig_t <<-'EOF'
1903 #include <sys/types.h>
1906 volatile sig_t foo = (sig_t)0;
1907 int main(void) { return (foo == (sig_t)0); }
1910 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1911 #include <sys/types.h>
1914 volatile sighandler_t foo = (sighandler_t)0;
1915 int main(void) { return (foo == (sighandler_t)0); }
1917 if test 1 = $HAVE_SIGHANDLER_T; then
1918 add_cppflags -Dsig_t=sighandler_t
1922 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1923 #include <sys/types.h>
1926 volatile __sighandler_t foo = (__sighandler_t)0;
1927 int main(void) { return (foo == (__sighandler_t)0); }
1929 if test 1 = $HAVE___SIGHANDLER_T; then
1930 add_cppflags -Dsig_t=__sighandler_t
1934 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1938 # check whether whatever we use for the final link will succeed
1940 if test $cm = makefile; then
1944 ac_testinit link_works '' 'checking if the final link command may succeed'
1946 cat >conftest.c <<-EOF
1948 #define MKSH_INCLUDES_ONLY
1950 __RCSID("$srcversion");
1951 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1955 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
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"
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
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"
1969 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
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"
1977 test -f $tcfn || fv=0
1979 test $fv = 1 || exit 1
1983 # Environment: errors and signals
1985 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1987 ac_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)); }
1993 ac_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)); }
1999 if test 1 = "$HAVE__SYS_ERRLIST"; then
2000 add_cppflags -Dsys_nerr=_sys_nerr
2001 add_cppflags -Dsys_errlist=_sys_errlist
2004 ac_cppflags SYS_ERRLIST
2006 for what in name list; do
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)); }
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)); }
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
2023 ac_cppflags SYS_SIG$uwhat
2027 # Environment: library functions
2029 ac_test flock <<-'EOF'
2030 #include <sys/types.h>
2034 #include <sys/file.h>
2036 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
2039 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
2044 lks.l_type = F_WRLCK | F_UNLCK;
2045 return (fcntl(0, F_SETLKW, &lks));
2049 ac_test getrusage <<-'EOF'
2050 #define MKSH_INCLUDES_ONLY
2054 return (getrusage(RUSAGE_SELF, &ru) +
2055 getrusage(RUSAGE_CHILDREN, &ru));
2059 ac_test getsid <<-'EOF'
2061 int main(void) { return ((int)getsid(0)); }
2064 ac_test gettimeofday <<-'EOF'
2065 #define MKSH_INCLUDES_ONLY
2067 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
2070 ac_test killpg <<-'EOF'
2072 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
2075 ac_test memmove <<-'EOF'
2076 #include <sys/types.h>
2080 #include <strings.h>
2082 int main(int ac, char *av[]) {
2083 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
2087 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
2088 #define MKSH_INCLUDES_ONLY
2090 int main(int ac, char *av[]) {
2092 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
2093 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
2098 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
2099 #include <sys/types.h>
2101 #include <sys/file.h>
2104 #include <sys/mman.h>
2108 int main(void) { return ((void *)mmap(NULL, (size_t)0,
2109 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
2113 ac_test ftruncate mmap 0 'for ftruncate' <<-'EOF'
2115 int main(void) { return (ftruncate(0, 0)); }
2118 ac_test nice <<-'EOF'
2120 int main(void) { return (nice(4)); }
2123 ac_test revoke <<-'EOF'
2124 #include <sys/types.h>
2126 #include <libutil.h>
2129 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
2132 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
2135 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
2138 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2139 #include <langinfo.h>
2141 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
2144 ac_test select <<-'EOF'
2145 #include <sys/types.h>
2146 #if HAVE_BOTH_TIME_H
2147 #include <sys/time.h>
2149 #elif HAVE_SYS_TIME_H
2150 #include <sys/time.h>
2154 #if HAVE_SYS_BSDTYPES_H
2155 #include <sys/bsdtypes.h>
2157 #if HAVE_SYS_SELECT_H
2158 #include <sys/select.h>
2161 #include <bstring.h>
2167 #include <strings.h>
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));
2177 ac_test setresugid <<-'EOF'
2178 #include <sys/types.h>
2180 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2183 ac_test setgroups setresugid 0 <<-'EOF'
2184 #include <sys/types.h>
2189 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2192 if test x"$et" = x"klibc"; then
2194 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2195 #define MKSH_INCLUDES_ONLY
2197 extern int __rt_sigsuspend(const sigset_t *, size_t);
2198 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2201 # no? damn! legacy crap ahead!
2203 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2204 'whether sigsuspend is usable (1/2)' <<-'EOF'
2205 #define MKSH_INCLUDES_ONLY
2207 extern int __sigsuspend_s(sigset_t);
2208 int main(void) { return (__sigsuspend_s(0)); }
2210 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2211 'whether sigsuspend is usable (2/2)' <<-'EOF'
2212 #define MKSH_INCLUDES_ONLY
2214 extern int __sigsuspend_xxs(int, int, sigset_t);
2215 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
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
2224 ac_test strerror '!' sys_errlist 0 <<-'EOF'
2225 extern char *strerror(int);
2226 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2229 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2232 int main(void) { return (strsignal(1)[0]); }
2235 ac_test strlcpy <<-'EOF'
2237 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2242 # check headers for declarations
2244 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2245 #define MKSH_INCLUDES_ONLY
2248 #include <sys/file.h>
2250 int main(void) { return ((flock)(0, 0)); }
2252 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2253 #define MKSH_INCLUDES_ONLY
2255 int main(void) { return ((revoke)("")); }
2257 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2258 #define MKSH_INCLUDES_ONLY
2260 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2262 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2263 #define MKSH_INCLUDES_ONLY
2265 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2271 fd='if to use persistent history'
2272 ac_cache PERSISTENT_HISTORY || case $HAVE_FTRUNCATE$HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2275 test 1 = $fv || check_categories="$check_categories no-histfile"
2280 # extra checks for legacy mksh
2282 if test $legacy = 1; then
2283 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2284 #define MKSH_INCLUDES_ONLY
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);
2294 int main(void) { return (sizeof(struct ctasserts)); }
2297 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2298 #define MKSH_INCLUDES_ONLY
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);
2308 int main(void) { return (sizeof(struct ctasserts)); }
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" ;;
2319 # Compiler: Praeprocessor (only if needed)
2321 test 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
2331 # End of mirtoconf checks
2335 # Some operating systems have ancient versions of ed(1) writing
2336 # the character count to standard output; cope for that
2338 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2339 check_categories="$check_categories $oldish_ed"
2342 if test 0 = $HAVE_SYS_SIGNAME; then
2343 if test 1 = $HAVE_CPP_DD; then
2344 $e Generating list of signal names...
2346 $e No list of signal names available via cpp. Falling back...
2350 echo '#include <signal.h>
2351 #if defined(NSIG_MAX)
2352 #define cfg_NSIG NSIG_MAX
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)
2362 /*XXX better error out, see sh.h */
2368 # GNU sed 2.03 segfaults when optimising this to sed -n
2369 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2371 sed '/mksh_cfg.*= *$/{
2375 grep '^ *mksh_cfg *=' | \
2376 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2378 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2379 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
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
2397 *:$name:*) continue ;;
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" | \
2407 sed '/mksh_cfg.*= *$/{
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
2418 *) echo " { \"$name\", $nr },"
2419 sigseentwo=$sigseentwo$nr:
2420 $printf "$name=$nr " >&2
2423 done 2>&1 >signames.inc
2428 addsrcs '!' HAVE_STRLCPY strlcpy.c
2429 addsrcs USE_PRINTF_BUILTIN printf.c
2430 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2431 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2432 add_cppflags -DMKSH_BUILD_R=571
2434 $e $bi$me: Finished configuration testing, now producing output.$ao
2442 add_cppflags -DMKSH_EXE_EXT
2449 *\ *) mkshshebang="#!./$mkshexe" ;;
2450 *) mkshshebang="#!$curdir/$mkshexe" ;;
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 ;;
2466 (p) pflag=\$OPTARG ;;
2471 (s) sflag=\$OPTARG ;;
2472 (t) uset=1; tflag=\$OPTARG ;;
2473 (U) useU=1; Uflag=\$OPTARG ;;
2479 shift \$((OPTIND - 1))
2480 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2482 args[\${#args[*]}]=-E
2485 for y in "\${check_categories[@]}"; do
2488 if [[ -n \$x ]]; then
2489 args[\${#args[*]}]=-C
2490 args[\${#args[*]}]=\${x#,}
2493 args[\${#args[*]}]=-e
2494 args[\${#args[*]}]=\$eflag
2496 (( Pflag )) && args[\${#args[*]}]=-P
2498 args[\${#args[*]}]=-t
2499 args[\${#args[*]}]=\$tflag
2502 args[\${#args[*]}]=-U
2503 args[\${#args[*]}]=\$Uflag
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
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.
2522 print "Trying Perl interpreter '\$perli'..."
2523 perlos=\$(\$perli -e "\$cstr")
2525 print "Errorlevel \$rv, running on '\$perlos'"
2527 print "=> not using"
2530 if [[ -n \$perlos ]]; then
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
2539 for s in "\$sflag".*; do
2540 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2541 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2543 (( rv = rv ? rv : rc ))
2553 emitbc="-emit-llvm -c"
2559 echo ": # work around NeXTstep bug" >Rebuild.sh
2561 optfiles=`echo *.opt`
2563 for file in $optfiles; do
2564 echo "echo + Running genopt on '$file'..."
2565 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2567 echo set -x >>Rebuild.sh
2568 for 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"
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"
2579 objs="$objs$sp${op}o"
2584 echo "rm -f $tfn.s" >>Rebuild.sh
2585 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2592 echo tcfn=$mkshexe >>Rebuild.sh
2593 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2594 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2595 if 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"
2599 for file in $optfiles; do
2600 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2602 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2603 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2605 cat >Makefrag.inc <<EOF
2606 # Makefile fragment for building mksh $dstversion
2614 NONSRCS_INST= dot.mkshrc \$(MAN)
2615 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2622 .depend \$(OBJS_BP):$gens$genq
2624 # not BSD make only:
2627 #\$(PROG): \$(OBJS_BP)
2628 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2629 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2631 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2633 # for all make variants:
2636 # ./test.sh \$(REGRESS_FLAGS)
2637 check_categories=$check_categories
2639 # for BSD make only:
2641 #.include <bsd.prog.mk>
2644 $e Generated Makefrag.inc successfully.
2647 for file in $optfiles; do
2648 $e "+ Running genopt on '$file'..."
2649 do_genopt "$srcdir/$file" || exit 1
2651 if test $cm = combine; then
2653 for file in $SRCS; do
2654 test -f $file || file=$srcdir/$file
2657 emitbc="-fwhole-program --combine"
2658 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2659 elif test 1 = $pm; then
2660 for file in $SRCS; do
2661 test -f $file || file=$srcdir/$file
2662 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
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
2680 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2684 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2685 test -f $tcfn || exit 1
2686 test 1 = $r || v "$NROFF -mdoc <'$srcdir/lksh.1' >lksh.cat1" || rmf lksh.cat1
2687 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || rmf mksh.cat1
2688 test 0 = $eq && v $SIZE $tcfn
2690 test -f /usr/ucb/$i && i=/usr/ucb/$i
2693 $e Installing the shell:
2694 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2695 if 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/"
2700 $e Installing the manual:
2701 if 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"
2708 $e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
2710 $e Run the regression test suite: ./test.sh
2711 $e Please also read the sample file dot.mkshrc and the fine manual.
2716 === Environment used ===
2718 ==== build environment ====
2721 CFLAGS if empty, defaults to -xO2 or +O2
2722 or -O3 -qstrict or -O2, per compiler
2723 CPPFLAGS default empty
2724 LDFLAGS default empty; added before sources
2725 LDSTATIC set this to '-static'; default unset
2726 LIBS default empty; added after sources
2727 [Interix] default: -lcrypt (XXX still needed?)
2728 NOWARN -Wno-error or similar
2729 NROFF default: nroff
2730 TARGET_OS default: $(uname -s || uname)
2731 TARGET_OSREV [QNX] default: $(uname -r)
2733 ==== feature selectors ====
2734 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2735 ===== general format =====
2737 HAVE_STRING_H ac_header
2738 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2740 ==== cpp definitions ====
2741 DEBUG dont use in production, wants gcc, implies:
2742 DEBUG_LEAKS enable freeing resources before exiting
2743 MKSHRC_PATH "~/.mkshrc" (do not change)
2744 MKSH_A4PB force use of arc4random_pushb
2745 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2746 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2747 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2748 MKSH_CLS_STRING KSH_ESC_STRING "[;H" KSH_ESC_STRING "[J"
2749 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2750 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2751 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2752 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2753 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2754 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2755 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2756 MKSH_EARLY_LOCALE_TRACKING track utf8-mode from POSIX locale, for SuSE
2757 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2758 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2759 MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
2760 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2761 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2762 MKSH_NO_LIMITS omit ulimit code
2763 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2764 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2765 MKSH_SMALL omit some code, optimise hard for size (slower)
2766 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2767 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2768 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2769 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2770 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2772 === generic installation instructions ===
2774 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2775 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2776 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2777 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2779 Normally, the following command is what you want to run, then:
2780 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2782 Copy 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
2784 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2785 http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2786 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2788 You 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