2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.695 2016/01/02 20:11:31 tg Exp $'
4 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
5 # 2011, 2012, 2013, 2014, 2015, 2016
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=______________________________________________________________
59 echo >&2 "E: in '$srcfile': '$line'"
61 echo >&2 "E: invalid input in '$srcfile': '$line'"
68 optc=`echo "$line" | sed 's/^[<>]\(.\).*$/\1/'`
69 test x"$optc" = x'|' && return
70 optclo=`echo "$optc" | tr $allu $alll`
71 if test x"$optc" = x"$optclo"; then
76 sym=`echo "$line" | sed 's/^[<>]/|/'`
77 o_str=$o_str$nl"<$optclo$islo$sym"
86 cond=`echo "$cond" | sed 's/^ //'`
90 cond=`echo "$cond" | sed 's/^!//'`
101 test -f "$srcfile" || genopt_die Source file \$srcfile not set.
102 bn=`basename "$srcfile" | sed 's/.opt$//'`
103 o_hdr='/* +++ GENERATED FILE +++ DO NOT EDIT +++ */'
111 while IFS= read line; do
116 o_sym=`echo "$line" | sed 's/^.//'`
117 o_gen=$o_gen$nl"#undef F0"
118 o_gen=$o_gen$nl"#undef FN"
123 # begin of data block
124 o_gen=$o_gen$nl"#endif"
125 o_gen=$o_gen$nl"#ifndef F0"
126 o_gen=$o_gen$nl"#define F0 FN"
127 o_gen=$o_gen$nl"#endif"
136 # begin of a definition block
137 sym=`echo "$line" | sed 's/^@//'`
138 if test $state = 0; then
139 o_gen=$o_gen$nl"#if defined($sym)"
141 o_gen=$o_gen$nl"#elif defined($sym)"
143 ddefs="$ddefs$nl#undef $sym"
157 cond=`echo "$line" | sed 's/^[^|]*|//'`
163 IFS= read line || genopt_die Unexpected EOF
165 test -n "$cond" && o_gen=$o_gen$nl"$cond"
166 o_gen=$o_gen$nl"$line, $optc)"
167 test -n "$cond" && o_gen=$o_gen$nl"#endif"
171 case $state:$o_sym in
172 3:) genopt_die Expected optc sym at EOF ;;
174 *) genopt_die Missing EOF marker ;;
176 echo "$o_str" | sort | while IFS='|' read x opts cond; do
178 test -n "$x" || continue
180 test -n "$cond" && echo "$cond"
182 test -n "$cond" && echo "#endif"
185 echo "#ifndef $o_sym$o_gen"
195 if test x"$BUILDSH_RUN_GENOPT" = x"1"; then
199 if test x"$1" = x"-G"; then
204 echo "For the build logs, demonstrate that /dev/null and /dev/tty exist:"
205 ls -l /dev/null /dev/tty
216 eval "$@" >vv.out 2>&1
217 sed "s
\a^
\a${_c}
\a" <vv.out
227 Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;;
241 oldish_ed=stdout-ed,no-stderr-ed
250 echo :"$@" | sed 's/^://' | tr $alll $allu
253 # clean up after ac_testrun()
257 test 0 = $fv || fr=yes
258 $e "$bi==> $fd...$ao $ui$fr$ao$fx"
262 # ac_cache label: sets f, fu, fv?=0
277 # ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
278 # returns 1 if value was cached/implied, 0 otherwise: call ac_testdone
281 test x"$2" = x"!" && shift
282 test x"$2" = x"" || shift
288 if test x"$2" = x""; then
291 if test x"$2" = x"!"; then
295 eval ft=\$HAVE_`upper $2`
299 if test $fc = "$ft"; then
309 # pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
311 if test x"$1" = x"!"; then
317 ac_testinit "$@" || return 1
319 vv ']' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN conftest.c $LIBS $ccpr"
320 test $tcfn = no && test -f a.out && tcfn=a.out
321 test $tcfn = no && test -f a.exe && tcfn=a.exe
322 test $tcfn = no && test -f conftest.exe && tcfn=conftest.exe
323 test $tcfn = no && test -f conftest && tcfn=conftest
324 if test -f $tcfn; then
330 if test $phase = u; then
331 test $ct = gcc && vscan='unrecogni[sz]ed'
332 test $ct = hpcc && vscan='unsupported'
333 test $ct = pcc && vscan='unsupported'
334 test $ct = sunpro && vscan='-e ignored -e turned.off'
336 test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr
340 ac_testnnd "$@" || return
341 rmf conftest.c conftest.o ${tcfn}* vv.out
345 # ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
350 extern int thiswillneverbedefinedIhope(void);
351 int main(void) { return (isatty(0) +
355 /* force a failure: expr is false */
356 thiswillneverbedefinedIhope()
360 test x"$1" = x"!" && shift
368 CPPFLAGS="$CPPFLAGS $*"
372 test x"$1" = x"" || fu=$1
374 test x"$2" = x"" && eval fv=\$HAVE_$fu
375 add_cppflags -DHAVE_$fu=$fv
383 # ac_flags [-] add varname cflags [text] [ldflags]
385 if test x"$1" = x"-"; then
396 test x"$ft" = x"" && ft="if $f can be used"
399 if test -n "$fl"; then
400 save_LDFLAGS=$LDFLAGS
401 LDFLAGS="$LDFLAGS $fl"
403 if test 1 = $hf; then
404 ac_testn can_$vn '' "$ft"
406 ac_testn can_$vn '' "$ft" <<-'EOF'
407 /* evil apo'stroph in comment test */
409 int main(void) { return (isatty(0)); }
412 eval fv=\$HAVE_CAN_`upper $vn`
413 if test -n "$fl"; then
414 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
416 test 11 = $fa$fv || CFLAGS=$save_CFLAGS
419 # ac_header [!] header [prereq ...]
421 if test x"$1" = x"!"; then
428 hv=`echo "$hf" | tr -d '\012\015' | tr -c $alll$allu$alln $alls`
429 echo "/* NeXTstep bug workaround */" >x
434 echo '#if HAVE_BOTH_TIME_H' >>x
435 echo '#include <sys/time.h>' >>x
436 echo '#include <time.h>' >>x
437 echo '#elif HAVE_SYS_TIME_H' >>x
438 echo '#include <sys/time.h>' >>x
439 echo '#elif HAVE_TIME_H' >>x
440 echo '#include <time.h>' >>x
444 echo "#include <$i>" >>x
448 echo "#include <$hf>" >>x
449 echo '#include <unistd.h>' >>x
450 echo 'int main(void) { return (isatty(0)); }' >>x
451 ac_testn "$hv" "" "<$hf>" <x
453 test 1 = $na || ac_cppflags
457 if test x"$1" = x"!"; then
464 test $fr = "$i" && case " $SRCS " in
466 *) SRCS="$SRCS $2" ;;
471 curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null`
477 echo >&2 Source directory should not contain space or tab or newline.
478 echo >&2 Errors may occur.
481 echo Source directory must not contain single quotes.
485 dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' "$srcdir/sh.h"`
486 add_cppflags -DMKSH_BUILDSH
493 optflags=-std-compile-opts
502 c:combine|c:dragonegg|c:llvm|c:lto)
507 echo "$me: Unknown option -c '$i'!" >&2
522 echo "$me: Do not call me with '-G'!" >&2
526 # checker, debug, valgrind build
528 CFLAGS="$CFLAGS -g3 -fno-builtin"
543 optflags=-std-compile-opts
558 echo "Build.sh $srcversion"
559 echo "for mksh $dstversion"
563 echo "$me: Unknown option '$i'!" >&2
567 echo "$me: Unknown option -'$last' '$i'!" >&2
572 if test -n "$last"; then
573 echo "$me: Option -'$last' not followed by argument!" >&2
577 test -z "$tfn" && if test $legacy = 0; then
582 if test -d $tfn || test -d $tfn.exe; then
583 echo "$me: Error: ./$tfn is a directory!" >&2
586 rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \
587 *.ll *.o *.gen Rebuild.sh lft no signames.inc test.sh x vv.out
589 SRCS="lalloc.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
590 SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
592 if test $legacy = 0; then
594 check_categories="$check_categories shell:legacy-no int:32"
596 check_categories="$check_categories shell:legacy-yes"
597 add_cppflags -DMKSH_LEGACY_MODE
598 HAVE_PERSISTENT_HISTORY=0
599 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h
602 if test x"$srcdir" = x"."; then
603 CPPFLAGS="-I. $CPPFLAGS"
605 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
607 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
608 LDFLAGS="$LDFLAGS $LDSTATIC"
613 if test -z "$TARGET_OS"; then
614 x=`uname -s 2>/dev/null || uname`
615 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
617 if test -z "$TARGET_OS"; then
618 echo "$me: Set TARGET_OS, your uname is broken!" >&2
625 ccpr='|| for _f in ${tcfn}*; do case $_f in Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;; *) rm -f "$_f" ;; esac; done'
628 if test x"$TARGET_OS" = x"Android"; then
629 check_categories="$check_categories android"
634 if test x"$TARGET_OS" = x"Minix"; then
636 WARNING: additional checks before running Build.sh required!
637 You can avoid these by calling Build.sh correctly, see below.
639 cat >conftest.c <<'EOF'
640 #include <sys/types.h>
642 #ifdef _NETBSD_SOURCE
650 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
657 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
658 Please set it to either Minix3 or Ninix3, whereas the latter is
659 all versions of Minix with even partial NetBSD(R) userland. The
660 value determined from your compiler for the current compilation
661 (which may be wrong) is: $ct
667 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
668 Please set it to either Minix3 or Ninix3, whereas the latter is
669 all versions of Minix with even partial NetBSD(R) userland. The
670 proper value couldn't be determined, continue at your own risk.
676 # Configuration depending on OS revision, on OSes that need them
679 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
680 grep 'NeXT Mach [0-9][0-9.]*:' | \
681 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
684 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
688 # Configuration depending on OS name
691 : "${HAVE_CAN_OTWO=0}"
692 add_cppflags -DMKSH_NO_SIGSETJMP
693 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
694 add_cppflags -DMKSH_CONSERVATIVE_FDS
697 add_cppflags -D_ALL_SOURCE
698 : "${HAVE_SETLOCALE_CTYPE=0}"
703 oswarn="; it has minor issues"
706 oswarn="; you must recompile mksh with"
707 oswarn="$oswarn${nl}itself in a second stage"
710 # BeOS has no real tty either
711 add_cppflags -DMKSH_UNEMPLOYED
712 add_cppflags -DMKSH_DISABLE_TTY_WARNING
713 # BeOS doesn't have different UIDs and GIDs
714 add_cppflags -DMKSH__NO_SETEUGID
717 : "${HAVE_SETLOCALE_CTYPE=0}"
720 oswarn="; it has major issues"
721 add_cppflags -DMKSH__NO_SYMLINK
722 check_categories="$check_categories nosymlink"
723 add_cppflags -DMKSH__NO_SETEUGID
724 add_cppflags -DMKSH_CONSERVATIVE_FDS
725 add_cppflags -DMKSH_DISABLE_TTY_WARNING
728 : "${HAVE_SETLOCALE_CTYPE=0}"
731 add_cppflags -D_DARWIN_C_SOURCE
738 oswarn="; it has minor issues"
739 add_cppflags -D_GNU_SOURCE
740 add_cppflags -DMKSH_CONSERVATIVE_FDS
741 : "${HAVE_SETLOCALE_CTYPE=0}"
746 *) add_cppflags -D_GNU_SOURCE ;;
748 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
749 # define MKSH__NO_PATH_MAX to use Hurd-only functions
750 add_cppflags -DMKSH__NO_PATH_MAX
755 *) add_cppflags -D_GNU_SOURCE ;;
757 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
760 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
767 add_cppflags -D_ALL_SOURCE
769 : "${HAVE_SETLOCALE_CTYPE=0}"
772 : "${HAVE_SETLOCALE_CTYPE=0}"
777 *) add_cppflags -D_GNU_SOURCE ;;
779 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
783 oswarn="; it has minor issues"
788 add_cppflags -DMKSH__NO_SETEUGID
789 add_cppflags -DMKSH_UNEMPLOYED
790 add_cppflags -DMKSH_CONSERVATIVE_FDS
791 add_cppflags -D_MINIX_SOURCE
792 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
793 : "${HAVE_SETLOCALE_CTYPE=0}"
796 add_cppflags -DMKSH_UNEMPLOYED
797 add_cppflags -DMKSH_CONSERVATIVE_FDS
798 add_cppflags -DMKSH_NO_LIMITS
799 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
800 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
801 : "${HAVE_SETLOCALE_CTYPE=0}"
806 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
807 # almost same as CYGWIN* (from RT|Chatzilla)
808 : "${HAVE_SETLOCALE_CTYPE=0}"
809 # broken on this OE (from ir0nh34d)
810 : "${HAVE_STDINT_H=0}"
815 add_cppflags -D_NEXT_SOURCE
816 add_cppflags -D_POSIX_SOURCE
819 add_cppflags -DMKSH_NO_SIGSETJMP
820 # NeXTstep cannot get a controlling tty
821 add_cppflags -DMKSH_UNEMPLOYED
822 case $TARGET_OSREV in
824 # OpenStep 4.2 is broken by default
825 oswarn="; it needs libposix.a"
828 add_cppflags -DMKSH_CONSERVATIVE_FDS
832 add_cppflags -DMKSH_UNEMPLOYED
833 add_cppflags -DMKSH_CONSERVATIVE_FDS
834 add_cppflags -DMKSH_NO_LIMITS
835 # but no idea what else could be needed
836 oswarn="; it has unknown issues"
839 : "${HAVE_SETLOCALE_CTYPE=0}"
843 HAVE_MKNOD=0 # setmode() incompatible
844 oswarn="; it is currently being ported"
845 check_categories="$check_categories nosymlink"
848 add_cppflags -DMKSH_UNEMPLOYED
849 add_cppflags -DMKSH_NOPROSPECTOFWORK
852 HAVE_SIG_T=0 # incompatible
853 add_cppflags -D_OSF_SOURCE
854 add_cppflags -D_POSIX_C_SOURCE=200112L
855 add_cppflags -D_XOPEN_SOURCE=600
856 add_cppflags -D_XOPEN_SOURCE_EXTENDED
857 : "${HAVE_SETLOCALE_CTYPE=0}"
860 add_cppflags -D_POSIX_SOURCE
861 add_cppflags -D_LIMITS_EXTENSION
862 add_cppflags -D_BSD_EXTENSION
863 add_cppflags -D_SUSV2_SOURCE
864 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
865 add_cppflags -DMKSH_NO_CMDLINE_EDITING
866 add_cppflags -DMKSH__NO_SETEUGID
867 oswarn=' and will currently not work'
868 add_cppflags -DMKSH_UNEMPLOYED
869 # this is for detecting kencc
870 add_cppflags -DMKSH_MAYBE_KENCC
873 HAVE_SIG_T=0 # incompatible
874 oswarn=' and will currently not work'
875 : "${HAVE_SETLOCALE_CTYPE=0}"
878 add_cppflags -D__NO_EXT_QNX
879 add_cppflags -D__EXT_UNIX_MISC
880 case $TARGET_OSREV in
881 [012345].*|6.[0123].*|6.4.[01])
882 oldish_ed=no-stderr-ed # oldish /bin/ed is broken
885 : "${HAVE_SETLOCALE_CTYPE=0}"
888 case $TARGET_OSREV in
891 add_cppflags -DMKSH_UNEMPLOYED
897 oswarn='; this is an unknown version of'
898 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
901 add_cppflags -DMKSH_CONSERVATIVE_FDS
902 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
905 oswarn="; it has minor issues"
908 add_cppflags -D_BSD_SOURCE
909 add_cppflags -D__EXTENSIONS__
912 add_cppflags -D_GNU_SOURCE
913 add_cppflags -DMKSH_NO_SIGSUSPEND
914 oswarn=' and will currently not work'
918 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
919 add_cppflags -DMKSH_CONSERVATIVE_FDS
920 : "${HAVE_SETLOCALE_CTYPE=0}"
924 add_cppflags -DMKSH_CONSERVATIVE_FDS
925 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
931 oswarn="; it will compile, but the target"
932 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
933 : "${HAVE_SETLOCALE_CTYPE=0}"
936 # generic target for SVR4 Unix with uname -s = uname -n
937 # this duplicates the * target below
938 oswarn='; it may or may not work'
939 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
942 oswarn='; it may or may not work'
943 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
949 : "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
950 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
951 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
953 # this aids me in tracing FTBFSen without access to the buildd
954 $e "Hi from$ao $bi$srcversion$ao on:"
958 vv '|' "uname -a >&2"
961 vv '|' "hwprefs machine_type os_type os_class >&2"
963 vv '|' "system_profiler SPSoftwareDataType SPHardwareDataType >&2"
964 vv '|' "/bin/sh --version >&2"
965 vv '|' "xcodebuild -version >&2"
966 vv '|' "uname -a >&2"
967 vv '|' "sysctl kern.version hw.machine hw.model hw.memsize hw.availcpu hw.cpufrequency hw.byteorder hw.cpu64bit_capable >&2"
970 vv '|' "uname -a >&2"
974 vv '|' "uname -a >&2"
975 vv '|' "/usr/sbin/sizer -v >&2"
977 SCO_SV|UnixWare|UNIX_SV)
978 vv '|' "uname -a >&2"
979 vv '|' "uname -X >&2"
982 vv '|' "uname -a >&2"
985 test -z "$oswarn" || echo >&2 "
986 Warning: mksh has not yet been ported to or tested on your
987 operating system '$TARGET_OS'$oswarn. If you can provide
988 a shell account to the developer, this may improve; please
989 drop us a success or failure notice or even send in diffs.
991 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
994 # Begin of mirtoconf checks
996 $e $bi$me: Scanning for functions... please ignore any errors.$ao
999 # Compiler: which one?
1002 # - ICC defines __GNUC__ too
1003 # - GCC defines __hpux too
1004 # - LLVM+clang defines __GNUC__ too
1005 # - nwcc defines __GNUC__ too
1007 $e ... which compiler seems to be used
1008 cat >conftest.c <<'EOF'
1010 #if defined(__ICC) || defined(__INTEL_COMPILER)
1012 #elif defined(__xlC__) || defined(__IBMC__)
1014 #elif defined(__SUNPRO_C)
1016 #elif defined(__ACK__)
1018 #elif defined(__BORLANDC__)
1020 #elif defined(__WATCOMC__)
1022 #elif defined(__MWERKS__)
1024 #elif defined(__HP_cc)
1026 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1028 #elif defined(__PGI)
1030 #elif defined(__DMC__)
1032 #elif defined(_MSC_VER)
1034 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1036 #elif defined(__IAR_SYSTEMS_ICC__)
1040 #elif defined(__PCC__)
1042 #elif defined(__TenDRA__)
1044 #elif defined(__TINYC__)
1046 #elif defined(__llvm__) && defined(__clang__)
1048 #elif defined(__NWCC__)
1050 #elif defined(__GNUC__)
1052 #elif defined(_COMPILER_VERSION)
1054 #elif defined(__sgi)
1056 #elif defined(__hpux) || defined(__hpua)
1058 #elif defined(__ultrix)
1060 #elif defined(__USLC__)
1062 #elif defined(__LCC__)
1064 #elif defined(MKSH_MAYBE_KENCC)
1065 /* and none of the above matches */
1072 #if defined(__KLIBC__) && !defined(__OS2__)
1081 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1082 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1086 cat >conftest.c <<'EOF'
1088 int main(void) { return (isatty(0)); }
1092 # work around "the famous ACK const bug"
1093 CPPFLAGS="-Dconst= $CPPFLAGS"
1096 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
1097 and SHARC (21000) DSPs detected. This compiler has not yet
1098 been tested for compatibility with mksh. Continue at your
1099 own risk, please report success/failure to the developers.'
1102 echo >&2 "Warning: Borland C++ Builder detected. This compiler might
1103 produce broken executables. Continue at your own risk,
1104 please report success/failure to the developers."
1107 # does not work with current "ccc" compiler driver
1108 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1109 # one of these two works, for now
1110 vv '|' "${CLANG-clang} -version"
1111 vv '|' "${CLANG-clang} --version"
1112 # ensure compiler and linker are in sync unless overridden
1113 case $CCC_CC:$CCC_LD in
1115 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
1119 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1120 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1123 echo >&2 "Warning: Digital Mars Compiler detected. When running under"
1124 echo >&2 " UWIN, mksh tends to be unstable due to the limitations"
1125 echo >&2 " of this platform. Continue at your own risk,"
1126 echo >&2 " please report success/failure to the developers."
1129 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1130 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
1131 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
1132 $LIBS -dumpversion`'
1135 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1138 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
1139 systems detected. This unsupported compiler has not yet
1140 been tested for compatibility with mksh. Continue at your
1141 own risk, please report success/failure to the developers.'
1144 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1147 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1150 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1151 add_cppflags -D__inline__=__inline
1154 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
1155 been tested for compatibility with mksh. Continue at your
1156 own risk, please report success/failure to the developers.'
1159 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1162 ccpr= # errorlevels are not reliable
1165 if [[ -n $C89_COMPILER ]]; then
1166 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1170 if [[ -n $C89_LINKER ]]; then
1171 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1175 vv '|' "$C89_COMPILER /HELP >&2"
1176 vv '|' "$C89_LINKER /LINK >&2"
1181 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1184 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1187 echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1188 been tested for compatibility with mksh. Continue at your
1189 own risk, please report success/failure to the developers.'
1192 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1193 C compiler for embedded systems detected. This has not yet
1194 been tested for compatibility with mksh. Continue at your
1195 own risk, please report success/failure to the developers.'
1198 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1201 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1204 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1205 grep -F -i -e version -e release"
1208 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1209 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1212 case $TARGET_OS:$TARGET_OSREV in
1216 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1219 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1222 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1225 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1226 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1230 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1233 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1234 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1239 vv '|' "llc -version"
1245 add_cppflags -DMKSH_NO_LIMITS
1248 # nothing special detected, don’t worry
1255 $e "$bi==> which compiler seems to be used...$ao $ui$ct$etd$ao"
1256 rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1259 # Compiler: works as-is, with -Wno-error and -Werror
1264 ac_flags 0 compiler_works '' 'if the compiler works'
1265 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1266 HAVE_COMPILER_KNOWN=0
1267 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1268 if ac_ifcpp 'if 0' compiler_fails '' \
1269 'if the compiler does not fail correctly'; then
1271 : "${HAVE_CAN_DELEXE=x}"
1274 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1275 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1277 int main(void) { return (isatty(0)); }
1281 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1282 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1284 int main(void) { return (isatty(0)); }
1291 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1292 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1294 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1296 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1297 'if this could be tcc'; then
1299 CPP='cpp -D__TINYC__'
1300 HAVE_COMPILER_KNOWN=1
1305 save_NOWARN="${ccpc}-w"
1309 # -msg_* flags not used yet, or is -w2 correct?
1312 save_NOWARN="${ccpc}-w"
1325 DOWARN="-diag_error 1-10000"
1328 save_NOWARN="${ccpc}/w"
1332 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1333 ac_flags 0 errwarnnone "$save_NOWARN"
1334 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1335 ac_flags 0 errwarnall "-errwarn=%all"
1336 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1350 save_NOWARN=-qflag=i:e
1354 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1355 ac_flags 0 wnoerror "$save_NOWARN"
1356 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1357 ac_flags 0 werror -Werror
1358 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1359 test $ct = icc && DOWARN="$DOWARN -wd1419"
1365 # Compiler: extra flags (-O2 -f* -W* etc.)
1367 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1368 # optimisation: only if orig_CFLAGS is empty
1369 test x"$i" = x"" && case $ct in
1376 # no special optimisation
1381 int main(void) { return (isatty(0)); }
1382 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p
1383 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p)
1384 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1386 yes pad | head -n 256 >>x
1387 ac_flags - 1 otwo -xO2 <x
1391 ac_flags 1 othree "-O3 -qstrict"
1392 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1396 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1399 # other flags: just add them if they are supported
1403 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1409 ac_flags 0 verb -verbose
1410 ac_flags 1 rodata -readonly_strings
1413 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1414 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1417 # The following tests run with -Werror (gcc only) if possible
1418 NOWARN=$DOWARN; phase=u
1419 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1420 # mksh is not written in CFrustFrust!
1421 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1422 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1423 ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1424 test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1425 ac_flags 1 fstackprotectorall -fstack-protector-all
1426 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1427 *\ -fplugin=*dragonegg*) ;;
1428 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1437 checks='1 2 3 4 5 6 7 8'
1443 test $fv = 1 || for what in $checks; do
1444 test $fv = 1 && break
1446 1) t_cflags='-flto=jobserver'
1447 t_ldflags='-fuse-linker-plugin'
1448 t_use=1 t_name=fltojs_lp ;;
1449 2) t_cflags='-flto=jobserver' t_ldflags=''
1450 t_use=1 t_name=fltojs_nn ;;
1451 3) t_cflags='-flto=jobserver'
1452 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1453 t_use=1 t_name=fltojs_np ;;
1455 t_ldflags='-fuse-linker-plugin'
1456 t_use=1 t_name=fltons_lp ;;
1457 5) t_cflags='-flto' t_ldflags=''
1458 t_use=1 t_name=fltons_nn ;;
1460 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1461 t_use=1 t_name=fltons_np ;;
1462 7) t_cflags='-fwhole-program --combine' t_ldflags=''
1463 t_use=0 t_name=combine cm=combine ;;
1464 8) fv=1 cm=normal ;;
1466 test $fv = 1 && break
1467 ac_flags $t_use $t_name "$t_cflags" \
1468 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1474 # probably not needed
1475 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1479 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1480 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1481 ac_flags 1 fstacksecuritycheck -fstack-security-check
1485 ac_flags 1 fullwarn -fullwarn 'for remark output support'
1488 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1489 echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1490 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1491 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1492 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1494 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1495 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1499 #broken# ac_flags 1 ssp -stackprotect
1504 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1508 : #broken# ac_flags 1 boundschk -b
1511 ac_flags 0 ysystem -Ysystem
1512 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1513 ac_flags 1 extansi -Xa
1516 ac_flags 1 rodata "-qro -qroconst -qroptr"
1517 ac_flags 1 rtcheck -qcheck=all
1518 #ac_flags 1 rtchkc -qextchk # reported broken
1519 ac_flags 1 wformat "-qformat=all -qformat=nozln"
1520 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1523 # flags common to a subset of compilers (run with -Werror on gcc)
1524 if test 1 = $i; then
1525 ac_flags 1 wall -Wall
1526 ac_flags 1 fwrapv -fwrapv
1530 # The following tests run with -Werror or similar (all compilers) if possible
1532 test $ct = pcc && phase=u
1535 # Compiler: check for stuff that only generates warnings
1537 ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1538 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1539 extern int thiswillneverbedefinedIhope(void);
1540 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1541 int main(void) { return (thiswillneverbedefinedIhope()); }
1544 #undef __attribute__
1545 int xcopy(const void *, void *, size_t)
1546 __attribute__((__bounded__(__buffer__, 1, 3)))
1547 __attribute__((__bounded__(__buffer__, 2, 3)));
1548 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1549 int xcopy(const void *s, void *d, size_t n) {
1551 * if memmove does not exist, we are not on a system
1552 * with GCC with __bounded__ attribute either so poo
1554 memmove(d, s, n); return ((int)n);
1558 ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1559 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1560 extern int thiswillneverbedefinedIhope(void);
1561 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1562 int main(void) { return (thiswillneverbedefinedIhope()); }
1564 #define fprintf printfoo
1566 #undef __attribute__
1568 extern int fprintf(FILE *, const char *format, ...)
1569 __attribute__((__format__(__printf__, 2, 3)));
1570 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1573 ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1574 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1575 extern int thiswillneverbedefinedIhope(void);
1576 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1577 int main(void) { return (thiswillneverbedefinedIhope()); }
1580 #undef __attribute__
1581 void fnord(void) __attribute__((__noreturn__));
1582 int main(void) { fnord(); }
1583 void fnord(void) { exit(0); }
1586 ac_test attribute_pure '' 'for __attribute__((__pure__))' <<-'EOF'
1587 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1588 extern int thiswillneverbedefinedIhope(void);
1589 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1590 int main(void) { return (thiswillneverbedefinedIhope()); }
1593 #undef __attribute__
1594 int foo(const char *) __attribute__((__pure__));
1595 int main(int ac, char **av) { return (foo(av[ac - 1]) + isatty(0)); }
1596 int foo(const char *s) { return ((int)s[0]); }
1599 ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1600 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1601 extern int thiswillneverbedefinedIhope(void);
1602 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1603 int main(void) { return (thiswillneverbedefinedIhope()); }
1606 #undef __attribute__
1607 int main(int ac __attribute__((__unused__)), char **av
1608 __attribute__((__unused__))) { return (isatty(0)); }
1611 ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1612 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1613 extern int thiswillneverbedefinedIhope(void);
1614 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1615 int main(void) { return (thiswillneverbedefinedIhope()); }
1618 #undef __attribute__
1619 static const char fnord[] __attribute__((__used__)) = "42";
1620 int main(void) { return (isatty(0)); }
1624 # End of tests run with -Werror
1629 # mksh: flavours (full/small mksh, omit certain stuff)
1631 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1632 "if a reduced-feature mksh is requested"; then
1634 : "${HAVE_PERSISTENT_HISTORY=0}"
1635 check_categories="$check_categories smksh"
1636 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h
1638 ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1639 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1640 check_categories="$check_categories binsh"
1641 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1642 "if mksh will be built without job control" && \
1643 check_categories="$check_categories arge"
1644 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1645 "if mksh will be built without job signals" && \
1646 check_categories="$check_categories arge nojsig"
1647 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1648 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1649 ac_ifcpp 'ifdef MKSH_CONSERVATIVE_FDS' isset_MKSH_CONSERVATIVE_FDS '' \
1650 'if traditional/conservative fd use is requested' && \
1651 check_categories="$check_categories convfds"
1652 #ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1653 # "if deprecated features are to be omitted" && \
1654 # check_categories="$check_categories nodeprecated"
1655 #ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1656 # "if experimental features are to be omitted" && \
1657 # check_categories="$check_categories noexperimental"
1658 ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1659 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1660 check_categories="$check_categories mnbsdash"
1663 # Environment: headers
1665 ac_header sys/time.h sys/types.h
1666 ac_header time.h sys/types.h
1667 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1668 ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1669 #include <sys/types.h>
1670 #include <sys/time.h>
1673 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1675 ac_header sys/bsdtypes.h
1676 ac_header sys/file.h sys/types.h
1677 ac_header sys/mkdev.h sys/types.h
1678 ac_header sys/mman.h sys/types.h
1679 ac_header sys/param.h
1680 ac_header sys/resource.h sys/types.h _time
1681 ac_header sys/select.h sys/types.h
1682 ac_header sys/sysmacros.h
1684 ac_header grp.h sys/types.h
1687 ac_header libutil.h sys/types.h
1689 ac_header stdint.h stdarg.h
1690 # include strings.h only if compatible with string.h
1691 ac_header strings.h sys/types.h string.h
1693 ac_header ulimit.h sys/types.h
1697 # Environment: definitions
1699 echo '#include <sys/types.h>
1701 /* check that off_t can represent 2^63-1 correctly, thx FSF */
1702 #define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
1703 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1704 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1705 int main(void) { return (isatty(0)); }' >lft.c
1706 ac_testn can_lfs '' "for large file support" <lft.c
1707 save_CPPFLAGS=$CPPFLAGS
1708 add_cppflags -D_FILE_OFFSET_BITS=64
1709 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1710 if test 0 = $HAVE_CAN_LFS_SUS; then
1711 CPPFLAGS=$save_CPPFLAGS
1712 add_cppflags -D_LARGE_FILES=1
1713 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1714 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1717 rmf lft* # end of large file support test
1720 # Environment: types
1722 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1723 #include <sys/types.h>
1725 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1727 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1728 #include <sys/types.h>
1730 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1732 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1733 #include <sys/types.h>
1735 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1737 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1738 #include <sys/types.h>
1740 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1743 ac_test rlim_t <<-'EOF'
1744 #include <sys/types.h>
1745 #if HAVE_BOTH_TIME_H
1746 #include <sys/time.h>
1748 #elif HAVE_SYS_TIME_H
1749 #include <sys/time.h>
1753 #if HAVE_SYS_RESOURCE_H
1754 #include <sys/resource.h>
1757 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1760 # only testn: added later below
1761 ac_testn sig_t <<-'EOF'
1762 #include <sys/types.h>
1765 volatile sig_t foo = (sig_t)0;
1766 int main(void) { return (foo == (sig_t)0); }
1769 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1770 #include <sys/types.h>
1773 volatile sighandler_t foo = (sighandler_t)0;
1774 int main(void) { return (foo == (sighandler_t)0); }
1776 if test 1 = $HAVE_SIGHANDLER_T; then
1777 add_cppflags -Dsig_t=sighandler_t
1781 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1782 #include <sys/types.h>
1785 volatile __sighandler_t foo = (__sighandler_t)0;
1786 int main(void) { return (foo == (__sighandler_t)0); }
1788 if test 1 = $HAVE___SIGHANDLER_T; then
1789 add_cppflags -Dsig_t=__sighandler_t
1793 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1797 # check whether whatever we use for the final link will succeed
1799 if test $cm = makefile; then
1803 ac_testinit link_works '' 'checking if the final link command may succeed'
1805 cat >conftest.c <<-EOF
1807 #define MKSH_INCLUDES_ONLY
1809 __RCSID("$srcversion");
1810 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1814 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1816 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1817 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1820 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1821 test $fv = 0 || v "mv conftest.s conftest.ll"
1822 test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1824 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1825 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1828 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1832 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1833 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1836 test -f $tcfn || fv=0
1838 test $fv = 1 || exit 1
1842 # Environment: errors and signals
1844 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1846 ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1847 extern const int sys_nerr;
1848 extern const char * const sys_errlist[];
1849 extern int isatty(int);
1850 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
1852 ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1853 extern const int _sys_nerr;
1854 extern const char * const _sys_errlist[];
1855 extern int isatty(int);
1856 int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
1858 if test 1 = "$HAVE__SYS_ERRLIST"; then
1859 add_cppflags -Dsys_nerr=_sys_nerr
1860 add_cppflags -Dsys_errlist=_sys_errlist
1863 ac_cppflags SYS_ERRLIST
1865 for what in name list; do
1867 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
1868 extern const char * const sys_sig${what}[];
1869 extern int isatty(int);
1870 int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
1872 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
1873 extern const char * const _sys_sig${what}[];
1874 extern int isatty(int);
1875 int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
1877 eval uwhat_v=\$HAVE__SYS_SIG$uwhat
1878 if test 1 = "$uwhat_v"; then
1879 add_cppflags -Dsys_sig$what=_sys_sig$what
1880 eval HAVE_SYS_SIG$uwhat=1
1882 ac_cppflags SYS_SIG$uwhat
1886 # Environment: library functions
1888 ac_test flock <<-'EOF'
1889 #include <sys/types.h>
1893 #include <sys/file.h>
1895 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
1898 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
1903 lks.l_type = F_WRLCK | F_UNLCK;
1904 return (fcntl(0, F_SETLKW, &lks));
1908 ac_test getrusage <<-'EOF'
1909 #define MKSH_INCLUDES_ONLY
1913 return (getrusage(RUSAGE_SELF, &ru) +
1914 getrusage(RUSAGE_CHILDREN, &ru));
1918 ac_test getsid <<-'EOF'
1920 int main(void) { return ((int)getsid(0)); }
1923 ac_test gettimeofday <<-'EOF'
1924 #define MKSH_INCLUDES_ONLY
1926 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
1929 ac_test killpg <<-'EOF'
1931 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
1934 ac_test memmove <<-'EOF'
1935 #include <sys/types.h>
1939 #include <strings.h>
1941 int main(int ac, char *av[]) {
1942 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
1946 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
1947 #define MKSH_INCLUDES_ONLY
1949 int main(int ac, char *av[]) {
1951 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
1952 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
1957 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
1958 #include <sys/types.h>
1960 #include <sys/file.h>
1963 #include <sys/mman.h>
1967 int main(void) { return ((void *)mmap(NULL, (size_t)0,
1968 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
1972 ac_test nice <<-'EOF'
1974 int main(void) { return (nice(4)); }
1977 ac_test revoke <<-'EOF'
1978 #include <sys/types.h>
1980 #include <libutil.h>
1983 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
1986 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
1989 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
1992 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
1993 #include <langinfo.h>
1995 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
1998 ac_test select <<-'EOF'
1999 #include <sys/types.h>
2000 #if HAVE_BOTH_TIME_H
2001 #include <sys/time.h>
2003 #elif HAVE_SYS_TIME_H
2004 #include <sys/time.h>
2008 #if HAVE_SYS_BSDTYPES_H
2009 #include <sys/bsdtypes.h>
2011 #if HAVE_SYS_SELECT_H
2012 #include <sys/select.h>
2015 #include <bstring.h>
2021 #include <strings.h>
2025 struct timeval tv = { 1, 200000 };
2026 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
2027 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
2031 ac_test setresugid <<-'EOF'
2032 #include <sys/types.h>
2034 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2037 ac_test setgroups setresugid 0 <<-'EOF'
2038 #include <sys/types.h>
2043 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2046 if test x"$et" = x"klibc"; then
2048 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2049 #define MKSH_INCLUDES_ONLY
2051 extern int __rt_sigsuspend(const sigset_t *, size_t);
2052 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2055 # no? damn! legacy crap ahead!
2057 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2058 'whether sigsuspend is usable (1/2)' <<-'EOF'
2059 #define MKSH_INCLUDES_ONLY
2061 extern int __sigsuspend_s(sigset_t);
2062 int main(void) { return (__sigsuspend_s(0)); }
2064 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2065 'whether sigsuspend is usable (2/2)' <<-'EOF'
2066 #define MKSH_INCLUDES_ONLY
2068 extern int __sigsuspend_xxs(int, int, sigset_t);
2069 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
2072 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
2073 # no usable sigsuspend(), use pause() *ugh*
2074 add_cppflags -DMKSH_NO_SIGSUSPEND
2078 ac_test strerror '!' sys_errlist 0 <<-'EOF'
2079 extern char *strerror(int);
2080 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2083 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2086 int main(void) { return (strsignal(1)[0]); }
2089 ac_test strlcpy <<-'EOF'
2091 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2096 # check headers for declarations
2098 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2099 #define MKSH_INCLUDES_ONLY
2102 #include <sys/file.h>
2104 int main(void) { return ((flock)(0, 0)); }
2106 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2107 #define MKSH_INCLUDES_ONLY
2109 int main(void) { return ((revoke)("")); }
2111 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2112 #define MKSH_INCLUDES_ONLY
2114 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2116 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2117 #define MKSH_INCLUDES_ONLY
2119 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2125 fd='if to use persistent history'
2126 ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2129 test 1 = $fv || check_categories="$check_categories no-histfile"
2134 ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF'
2135 #define MKSH_INCLUDES_ONLY
2138 #define CHAR_BIT 8 /* defuse this test on really legacy systems */
2141 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2142 /* this one should be defined by the standard */
2143 cta(char_is_1_char, (sizeof(char) == 1) && (sizeof(signed char) == 1) &&
2144 (sizeof(unsigned char) == 1));
2145 cta(char_is_8_bits, ((CHAR_BIT) == 8) && ((int)(unsigned char)0xFF == 0xFF) &&
2146 ((int)(unsigned char)0x100 == 0) && ((int)(unsigned char)(int)-1 == 0xFF));
2147 /* the next assertion is probably not really needed */
2148 cta(short_is_2_char, sizeof(short) == 2);
2149 cta(short_size_no_matter_of_signedness, sizeof(short) == sizeof(unsigned short));
2150 /* the next assertion is probably not really needed */
2151 cta(int_is_4_char, sizeof(int) == 4);
2152 cta(int_size_no_matter_of_signedness, sizeof(int) == sizeof(unsigned int));
2154 cta(long_ge_int, sizeof(long) >= sizeof(int));
2155 cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long));
2157 #ifndef MKSH_LEGACY_MODE
2158 /* the next assertion is probably not really needed */
2159 cta(ari_is_4_char, sizeof(mksh_ari_t) == 4);
2161 cta(ari_has_31_bit, 0 < (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1));
2162 /* the next assertion is probably not really needed */
2163 cta(uari_is_4_char, sizeof(mksh_uari_t) == 4);
2164 /* but the next three are; we REQUIRE unsigned integer wraparound */
2165 cta(uari_has_31_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 2 + 1));
2166 cta(uari_has_32_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3));
2167 cta(uari_wrap_32_bit,
2168 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3) >
2169 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 4));
2174 /* these are always required */
2175 cta(ari_is_signed, (mksh_ari_t)-1 < (mksh_ari_t)0);
2176 cta(uari_is_unsigned, (mksh_uari_t)-1 > (mksh_uari_t)0);
2177 /* we require these to have the precisely same size and assume 2s complement */
2178 cta(ari_size_no_matter_of_signedness, sizeof(mksh_ari_t) == sizeof(mksh_uari_t));
2180 cta(sizet_size_no_matter_of_signedness, sizeof(ssize_t) == sizeof(size_t));
2181 cta(sizet_voidptr_same_size, sizeof(size_t) == sizeof(void *));
2182 cta(sizet_funcptr_same_size, sizeof(size_t) == sizeof(void (*)(void)));
2183 /* our formatting routines assume this */
2184 cta(ptr_fits_in_long, sizeof(size_t) <= sizeof(long));
2185 cta(ari_fits_in_long, sizeof(mksh_ari_t) <= sizeof(long));
2186 /* for struct alignment people */
2187 char padding[64 - NUM];
2189 char ctasserts_dblcheck[sizeof(struct ctasserts) == 64 ? 1 : -1];
2190 int main(void) { return (sizeof(ctasserts_dblcheck) + isatty(0)); }
2193 eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1
2196 # extra checks for legacy mksh
2198 if test $legacy = 1; then
2199 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2200 #define MKSH_INCLUDES_ONLY
2206 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2207 cta(char_is_8_bits, (CHAR_BIT) == 8);
2208 cta(long_is_32_bits, sizeof(long) == 4);
2210 int main(void) { return (sizeof(struct ctasserts)); }
2213 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2214 #define MKSH_INCLUDES_ONLY
2220 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2221 cta(char_is_8_bits, (CHAR_BIT) == 8);
2222 cta(long_is_64_bits, sizeof(long) == 8);
2224 int main(void) { return (sizeof(struct ctasserts)); }
2227 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2228 10) check_categories="$check_categories int:32" ;;
2229 01) check_categories="$check_categories int:64" ;;
2230 *) check_categories="$check_categories int:u" ;;
2235 # Compiler: Praeprocessor (only if needed)
2237 test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2238 'checking if the C Preprocessor supports -dD'; then
2239 echo '#define foo bar' >conftest.c
2240 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2241 grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2242 rmf conftest.c x vv.out
2247 # End of mirtoconf checks
2251 # Some operating systems have ancient versions of ed(1) writing
2252 # the character count to standard output; cope for that
2254 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2255 check_categories="$check_categories $oldish_ed"
2258 if test 0 = $HAVE_SYS_SIGNAME; then
2259 if test 1 = $HAVE_CPP_DD; then
2260 $e Generating list of signal names...
2262 $e No list of signal names available via cpp. Falling back...
2266 echo '#include <signal.h>
2267 #if defined(NSIG_MAX)
2268 #define cfg_NSIG NSIG_MAX
2270 #define cfg_NSIG NSIG
2271 #elif defined(_NSIG)
2272 #define cfg_NSIG _NSIG
2273 #elif defined(SIGMAX)
2274 #define cfg_NSIG (SIGMAX + 1)
2275 #elif defined(_SIGMAX)
2276 #define cfg_NSIG (_SIGMAX + 1)
2278 /*XXX better error out, see sh.h */
2284 # GNU sed 2.03 segfaults when optimising this to sed -n
2285 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2287 sed '/mksh_cfg.*= *$/{
2291 grep '^ *mksh_cfg *=' | \
2292 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2294 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2295 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2298 (printf hallo) >/dev/null 2>&1 || printf=echo
2299 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2300 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2301 $printf "NSIG=$NSIG ... "
2302 sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
2303 sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
2304 sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT STKFLT"
2305 sigs="$sigs ABND DCE DUMP IOERR TRACE DANGER THCONT THSTOP RESV UNUSED"
2306 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2307 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2308 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2309 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
2310 test $NSIG -gt 1 || sigs=
2311 for name in $sigs; do
2313 *:$name:*) continue ;;
2315 sigseenone=$sigseenone$name:
2316 echo '#include <signal.h>' >conftest.c
2317 echo int >>conftest.c
2318 echo mksh_cfg= SIG$name >>conftest.c
2319 echo ';' >>conftest.c
2320 # GNU sed 2.03 croaks on optimising this, too
2321 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2323 sed '/mksh_cfg.*= *$/{
2327 grep '^ *mksh_cfg *=' | \
2328 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2329 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2330 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2331 test $nr -gt 0 && test $nr -lt $NSIG || continue
2334 *) echo " { \"$name\", $nr },"
2335 sigseentwo=$sigseentwo$nr:
2336 $printf "$name=$nr " >&2
2339 done 2>&1 >signames.inc
2344 addsrcs '!' HAVE_STRLCPY strlcpy.c
2345 addsrcs USE_PRINTF_BUILTIN printf.c
2346 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2347 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2348 add_cppflags -DMKSH_BUILD_R=521
2350 $e $bi$me: Finished configuration testing, now producing output.$ao
2358 add_cppflags -DMKSH_EXE_EXT
2365 *\ *) mkshshebang="#!./$mkshexe" ;;
2366 *) mkshshebang="#!$curdir/$mkshexe" ;;
2370 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2371 test -n "\$KSH_VERSION" || exit 1
2372 set -A check_categories -- $check_categories
2373 pflag='$curdir/$mkshexe'
2374 sflag='$srcdir/check.t'
2375 usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2376 while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch {
2377 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2378 (e) usee=1; eflag=\$OPTARG ;;
2379 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
2382 (p) pflag=\$OPTARG ;;
2387 (s) sflag=\$OPTARG ;;
2388 (t) uset=1; tflag=\$OPTARG ;;
2394 shift \$((OPTIND - 1))
2395 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2397 for y in "\${check_categories[@]}"; do
2400 if [[ -n \$x ]]; then
2401 args[\${#args[*]}]=-C
2402 args[\${#args[*]}]=\${x#,}
2405 args[\${#args[*]}]=-e
2406 args[\${#args[*]}]=\$eflag
2408 (( Pflag )) && args[\${#args[*]}]=-P
2410 args[\${#args[*]}]=-t
2411 args[\${#args[*]}]=\$tflag
2413 (( vflag )) && args[\${#args[*]}]=-v
2414 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
2415 if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2416 args[\${#args[*]}]=-T
2417 args[\${#args[*]}]=\$TMPDIR
2419 print Testing mksh for conformance:
2420 grep -F -e Mir''OS: -e MIRBSD "\$sflag"
2421 print "This shell is actually:\\n\\t\$KSH_VERSION"
2422 print 'test.sh built for mksh $dstversion'
2423 cstr='\$os = defined \$^O ? \$^O : "unknown";'
2424 cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2425 for perli in \$PERL perl5 perl no; do
2426 if [[ \$perli = no ]]; then
2427 print Cannot find a working Perl interpreter, aborting.
2430 print "Trying Perl interpreter '\$perli'..."
2431 perlos=\$(\$perli -e "\$cstr")
2433 print "Errorlevel \$rv, running on '\$perlos'"
2435 print "=> not using"
2438 if [[ -n \$perlos ]]; then
2443 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2444 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2445 # use of the -S option for check.t split into multiple chunks
2447 for s in "\$sflag".*; do
2448 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2449 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2451 (( rv = rv ? rv : rc ))
2461 emitbc="-emit-llvm -c"
2467 echo ": # work around NeXTstep bug" >Rebuild.sh
2469 optfiles=`echo *.opt`
2471 for file in $optfiles; do
2472 echo "echo + Running genopt on '$file'..."
2473 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2475 echo set -x >>Rebuild.sh
2476 for file in $SRCS; do
2477 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2478 test -f $file || file=$srcdir/$file
2479 files="$files$sp$file"
2481 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2482 if test $cm = dragonegg; then
2483 echo "mv ${op}s ${op}ll" >>Rebuild.sh
2484 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2485 objs="$objs$sp${op}bc"
2487 objs="$objs$sp${op}o"
2492 echo "rm -f $tfn.s" >>Rebuild.sh
2493 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2500 echo tcfn=$mkshexe >>Rebuild.sh
2501 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2502 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2503 if test $cm = makefile; then
2504 extras='emacsfn.h rlimits.opt sh.h sh_flags.opt var_spec.h'
2505 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2507 for file in $optfiles; do
2508 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2510 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2511 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2513 cat >Makefrag.inc <<EOF
2514 # Makefile fragment for building mksh $dstversion
2522 NONSRCS_INST= dot.mkshrc \$(MAN)
2523 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2530 .depend \$(OBJS_BP):$gens$genq
2532 # not BSD make only:
2535 #\$(PROG): \$(OBJS_BP)
2536 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2537 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2539 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2541 # for all make variants:
2544 # ./test.sh \$(REGRESS_FLAGS)
2545 check_categories=$check_categories
2547 # for BSD make only:
2549 #.include <bsd.prog.mk>
2552 $e Generated Makefrag.inc successfully.
2555 for file in $optfiles; do
2556 $e "+ Running genopt on '$file'..."
2557 do_genopt "$srcdir/$file" || exit 1
2559 if test $cm = combine; then
2561 for file in $SRCS; do
2562 test -f $file || file=$srcdir/$file
2565 emitbc="-fwhole-program --combine"
2566 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2567 elif test 1 = $pm; then
2568 for file in $SRCS; do
2569 test -f $file || file=$srcdir/$file
2570 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2574 for file in $SRCS; do
2575 test $cm = dragonegg && \
2576 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2577 test -f $file || file=$srcdir/$file
2578 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2579 if test $cm = dragonegg; then
2580 v "mv ${op}s ${op}ll"
2581 v "llvm-as ${op}ll" || exit 1
2588 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2592 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2593 test -f $tcfn || exit 1
2594 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >$tfn.cat1" || \
2596 test 0 = $eq && v $SIZE $tcfn
2598 test -f /usr/ucb/$i && i=/usr/ucb/$i
2601 $e Installing the shell:
2602 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2603 if test $legacy = 0; then
2604 $e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2605 $e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2608 $e Installing the manual:
2609 if test -f $tfn.cat1; then
2610 $e "# $i -c -o root -g bin -m 444 $tfn.cat1" \
2611 "/usr/share/man/cat1/$tfn.0"
2614 $e "# $i -c -o root -g bin -m 444 $tfn.1 /usr/share/man/man1/$tfn.1"
2616 $e Run the regression test suite: ./test.sh
2617 $e Please also read the sample file dot.mkshrc and the fine manual.
2622 === Environment used ===
2624 ==== build environment ====
2627 CFLAGS if empty, defaults to -xO2 or +O2
2628 or -O3 -qstrict or -O2, per compiler
2629 CPPFLAGS default empty
2630 LDFLAGS default empty; added before sources
2631 LDSTATIC set this to '-static'; default unset
2632 LIBS default empty; added after sources
2633 [Interix] default: -lcrypt (XXX still needed?)
2634 NOWARN -Wno-error or similar
2635 NROFF default: nroff
2636 TARGET_OS default: $(uname -s || uname)
2637 TARGET_OSREV [QNX] default: $(uname -r)
2639 ==== feature selectors ====
2640 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2641 ===== general format =====
2643 HAVE_STRING_H ac_header
2644 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2646 ==== cpp definitions ====
2647 DEBUG dont use in production, wants gcc, implies:
2648 DEBUG_LEAKS enable freeing resources before exiting
2649 MKSHRC_PATH "~/.mkshrc" (do not change)
2650 MKSH_A4PB force use of arc4random_pushb
2651 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2652 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2653 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2654 MKSH_CLRTOEOL_STRING "\033[K"
2655 MKSH_CLS_STRING "\033[;H\033[J"
2656 MKSH_CONSERVATIVE_FDS fd 0-9 for scripts, shell only up to 31
2657 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2658 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2659 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2660 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2661 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2662 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2663 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2664 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2665 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2666 MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
2667 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2668 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2669 MKSH_NO_LIMITS omit ulimit code
2670 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2671 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2672 MKSH_SMALL omit some code, optimise hard for size (slower)
2673 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2674 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2675 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2676 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2677 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2679 === generic installation instructions ===
2681 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2682 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2683 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2684 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2686 Normally, the following command is what you want to run, then:
2687 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2689 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2690 /bin; install the manpage, if omitting the -r flag a catmanpage is made
2691 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2692 http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2693 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2695 You may also want to install the lksh binary (also as /bin/sh) built by:
2696 $ CPPFLAGS="$CPPFLAGS -DMKSH_BINSHPOSIX" sh Build.sh -L -r -c lto