2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.707 2016/11/11 23:31:29 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 # start 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 # start 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 *.cat1 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
601 if test x"$srcdir" = x"."; then
602 CPPFLAGS="-I. $CPPFLAGS"
604 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
606 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
607 LDFLAGS="$LDFLAGS $LDSTATIC"
612 if test -z "$TARGET_OS"; then
613 x=`uname -s 2>/dev/null || uname`
614 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
616 if test -z "$TARGET_OS"; then
617 echo "$me: Set TARGET_OS, your uname is broken!" >&2
624 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'
627 if test x"$TARGET_OS" = x"Android"; then
628 check_categories="$check_categories android"
633 if test x"$TARGET_OS" = x"Minix"; then
635 WARNING: additional checks before running Build.sh required!
636 You can avoid these by calling Build.sh correctly, see below.
638 cat >conftest.c <<'EOF'
639 #include <sys/types.h>
641 #ifdef _NETBSD_SOURCE
649 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
656 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
657 Please set it to either Minix3 or Ninix3, whereas the latter is
658 all versions of Minix with even partial NetBSD(R) userland. The
659 value determined from your compiler for the current compilation
660 (which may be wrong) is: $ct
666 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
667 Please set it to either Minix3 or Ninix3, whereas the latter is
668 all versions of Minix with even partial NetBSD(R) userland. The
669 proper value couldn't be determined, continue at your own risk.
675 # Configuration depending on OS revision, on OSes that need them
678 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
679 grep 'NeXT Mach [0-9][0-9.]*:' | \
680 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
683 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
687 # Configuration depending on OS name
690 : "${HAVE_CAN_OTWO=0}"
691 add_cppflags -DMKSH_NO_SIGSETJMP
692 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
695 add_cppflags -D_ALL_SOURCE
696 : "${HAVE_SETLOCALE_CTYPE=0}"
701 oswarn="; it has minor issues"
704 oswarn="; you must recompile mksh with"
705 oswarn="$oswarn${nl}itself in a second stage"
708 # BeOS has no real tty either
709 add_cppflags -DMKSH_UNEMPLOYED
710 add_cppflags -DMKSH_DISABLE_TTY_WARNING
711 # BeOS doesn't have different UIDs and GIDs
712 add_cppflags -DMKSH__NO_SETEUGID
715 : "${HAVE_SETLOCALE_CTYPE=0}"
718 oswarn="; it has major issues"
719 add_cppflags -DMKSH__NO_SYMLINK
720 check_categories="$check_categories nosymlink"
721 add_cppflags -DMKSH__NO_SETEUGID
722 add_cppflags -DMKSH_DISABLE_TTY_WARNING
725 : "${HAVE_SETLOCALE_CTYPE=0}"
728 add_cppflags -D_DARWIN_C_SOURCE
735 oswarn="; it has minor issues"
736 add_cppflags -D_GNU_SOURCE
737 : "${HAVE_SETLOCALE_CTYPE=0}"
742 *) add_cppflags -D_GNU_SOURCE ;;
744 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
745 # define MKSH__NO_PATH_MAX to use Hurd-only functions
746 add_cppflags -DMKSH__NO_PATH_MAX
751 *) add_cppflags -D_GNU_SOURCE ;;
753 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
756 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
759 add_cppflags -D_POSIX_SOURCE
760 add_cppflags -D_LIMITS_EXTENSION
761 add_cppflags -D_BSD_EXTENSION
762 add_cppflags -D_SUSV2_SOURCE
763 add_cppflags -D_GNU_SOURCE
764 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
765 add_cppflags -DMKSH_NO_CMDLINE_EDITING
766 add_cppflags -DMKSH__NO_SETEUGID
767 oswarn=' and will currently not work'
768 add_cppflags -DMKSH_UNEMPLOYED
769 add_cppflags -DMKSH_NOPROSPECTOFWORK
770 # these taken from Harvey-OS github and need re-checking
771 add_cppflags -D_setjmp=setjmp -D_longjmp=longjmp
772 : "${HAVE_CAN_NO_EH_FRAME=0}"
773 : "${HAVE_CAN_FNOSTRICTALIASING=0}"
774 : "${HAVE_CAN_FSTACKPROTECTORSTRONG=0}"
781 add_cppflags -D_ALL_SOURCE
783 : "${HAVE_SETLOCALE_CTYPE=0}"
786 : "${HAVE_SETLOCALE_CTYPE=0}"
791 *) add_cppflags -D_GNU_SOURCE ;;
793 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
797 oswarn="; it has minor issues"
802 add_cppflags -DMKSH__NO_SETEUGID
803 add_cppflags -DMKSH_UNEMPLOYED
804 add_cppflags -D_MINIX_SOURCE
805 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
806 : "${HAVE_SETLOCALE_CTYPE=0}"
809 add_cppflags -DMKSH_UNEMPLOYED
810 add_cppflags -DMKSH_NO_LIMITS
811 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
812 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
813 : "${HAVE_SETLOCALE_CTYPE=0}"
818 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
819 # almost same as CYGWIN* (from RT|Chatzilla)
820 : "${HAVE_SETLOCALE_CTYPE=0}"
821 # broken on this OE (from ir0nh34d)
822 : "${HAVE_STDINT_H=0}"
827 add_cppflags -D_NEXT_SOURCE
828 add_cppflags -D_POSIX_SOURCE
831 add_cppflags -DMKSH_NO_SIGSETJMP
832 # NeXTstep cannot get a controlling tty
833 add_cppflags -DMKSH_UNEMPLOYED
834 case $TARGET_OSREV in
836 # OpenStep 4.2 is broken by default
837 oswarn="; it needs libposix.a"
843 add_cppflags -DMKSH_UNEMPLOYED
844 add_cppflags -DMKSH_NO_LIMITS
845 # but no idea what else could be needed
846 oswarn="; it has unknown issues"
849 : "${HAVE_SETLOCALE_CTYPE=0}"
853 HAVE_MKNOD=0 # setmode() incompatible
854 oswarn="; it is currently being ported, get it from"
855 oswarn="$oswarn${nl}https://github.com/komh/mksh-os2 in the meanwhile"
856 check_categories="$check_categories nosymlink"
859 add_cppflags -DMKSH_UNEMPLOYED
860 add_cppflags -DMKSH_NOPROSPECTOFWORK
861 add_cppflags -DMKSH_NO_LIMITS
864 HAVE_SIG_T=0 # incompatible
865 add_cppflags -D_OSF_SOURCE
866 add_cppflags -D_POSIX_C_SOURCE=200112L
867 add_cppflags -D_XOPEN_SOURCE=600
868 add_cppflags -D_XOPEN_SOURCE_EXTENDED
869 : "${HAVE_SETLOCALE_CTYPE=0}"
872 add_cppflags -D_POSIX_SOURCE
873 add_cppflags -D_LIMITS_EXTENSION
874 add_cppflags -D_BSD_EXTENSION
875 add_cppflags -D_SUSV2_SOURCE
876 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
877 add_cppflags -DMKSH_NO_CMDLINE_EDITING
878 add_cppflags -DMKSH__NO_SETEUGID
879 oswarn=' and will currently not work'
880 add_cppflags -DMKSH_UNEMPLOYED
881 # this is for detecting kencc
882 add_cppflags -DMKSH_MAYBE_KENCC
885 HAVE_SIG_T=0 # incompatible
886 oswarn=' and will currently not work'
887 : "${HAVE_SETLOCALE_CTYPE=0}"
890 add_cppflags -D__NO_EXT_QNX
891 add_cppflags -D__EXT_UNIX_MISC
892 case $TARGET_OSREV in
893 [012345].*|6.[0123].*|6.4.[01])
894 oldish_ed=no-stderr-ed # oldish /bin/ed is broken
897 : "${HAVE_SETLOCALE_CTYPE=0}"
900 case $TARGET_OSREV in
903 add_cppflags -DMKSH_UNEMPLOYED
909 oswarn='; this is an unknown version of'
910 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
913 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
916 oswarn="; it has minor issues"
919 add_cppflags -D_BSD_SOURCE
920 add_cppflags -D__EXTENSIONS__
923 add_cppflags -D_GNU_SOURCE
924 add_cppflags -DMKSH_NO_SIGSUSPEND
925 oswarn=' and will currently not work'
929 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
930 : "${HAVE_SETLOCALE_CTYPE=0}"
934 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
940 oswarn="; it will compile, but the target"
941 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
942 : "${HAVE_SETLOCALE_CTYPE=0}"
945 # generic target for SVR4 Unix with uname -s = uname -n
946 # this duplicates the * target below
947 oswarn='; it may or may not work'
948 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
951 oswarn='; it may or may not work'
952 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
958 : "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
959 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
960 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
962 # this aids me in tracing FTBFSen without access to the buildd
963 $e "Hi from$ao $bi$srcversion$ao on:"
967 vv '|' "uname -a >&2"
970 vv '|' "hwprefs machine_type os_type os_class >&2"
972 vv '|' "system_profiler SPSoftwareDataType SPHardwareDataType >&2"
973 vv '|' "/bin/sh --version >&2"
974 vv '|' "xcodebuild -version >&2"
975 vv '|' "uname -a >&2"
976 vv '|' "sysctl kern.version hw.machine hw.model hw.memsize hw.availcpu hw.cpufrequency hw.byteorder hw.cpu64bit_capable >&2"
979 vv '|' "uname -a >&2"
983 vv '|' "uname -a >&2"
984 vv '|' "/usr/sbin/sizer -v >&2"
986 SCO_SV|UnixWare|UNIX_SV)
987 vv '|' "uname -a >&2"
988 vv '|' "uname -X >&2"
991 vv '|' "uname -a >&2"
994 test -z "$oswarn" || echo >&2 "
995 Warning: mksh has not yet been ported to or tested on your
996 operating system '$TARGET_OS'$oswarn. If you can provide
997 a shell account to the developer, this may improve; please
998 drop us a success or failure notice or even send in diffs.
1000 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
1003 # Start of mirtoconf checks
1005 $e $bi$me: Scanning for functions... please ignore any errors.$ao
1008 # Compiler: which one?
1011 # - ICC defines __GNUC__ too
1012 # - GCC defines __hpux too
1013 # - LLVM+clang defines __GNUC__ too
1014 # - nwcc defines __GNUC__ too
1016 $e ... which compiler seems to be used
1017 cat >conftest.c <<'EOF'
1019 #if defined(__ICC) || defined(__INTEL_COMPILER)
1021 #elif defined(__xlC__) || defined(__IBMC__)
1023 #elif defined(__SUNPRO_C)
1025 #elif defined(__ACK__)
1027 #elif defined(__BORLANDC__)
1029 #elif defined(__WATCOMC__)
1031 #elif defined(__MWERKS__)
1033 #elif defined(__HP_cc)
1035 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1037 #elif defined(__PGI)
1039 #elif defined(__DMC__)
1041 #elif defined(_MSC_VER)
1043 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1045 #elif defined(__IAR_SYSTEMS_ICC__)
1049 #elif defined(__PCC__)
1051 #elif defined(__TenDRA__)
1053 #elif defined(__TINYC__)
1055 #elif defined(__llvm__) && defined(__clang__)
1057 #elif defined(__NWCC__)
1059 #elif defined(__GNUC__)
1061 #elif defined(_COMPILER_VERSION)
1063 #elif defined(__sgi)
1065 #elif defined(__hpux) || defined(__hpua)
1067 #elif defined(__ultrix)
1069 #elif defined(__USLC__)
1071 #elif defined(__LCC__)
1073 #elif defined(MKSH_MAYBE_KENCC)
1074 /* and none of the above matches */
1081 #if defined(__KLIBC__) && !defined(__OS2__)
1090 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1091 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1095 cat >conftest.c <<'EOF'
1097 int main(void) { return (isatty(0)); }
1101 # work around "the famous ACK const bug"
1102 CPPFLAGS="-Dconst= $CPPFLAGS"
1105 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
1106 and SHARC (21000) DSPs detected. This compiler has not yet
1107 been tested for compatibility with mksh. Continue at your
1108 own risk, please report success/failure to the developers.'
1111 echo >&2 "Warning: Borland C++ Builder detected. This compiler might
1112 produce broken executables. Continue at your own risk,
1113 please report success/failure to the developers."
1116 # does not work with current "ccc" compiler driver
1117 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1118 # one of these two works, for now
1119 vv '|' "${CLANG-clang} -version"
1120 vv '|' "${CLANG-clang} --version"
1121 # ensure compiler and linker are in sync unless overridden
1122 case $CCC_CC:$CCC_LD in
1124 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
1126 : "${HAVE_STRING_POOLING=i1}"
1129 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1130 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1133 echo >&2 "Warning: Digital Mars Compiler detected. When running under"
1134 echo >&2 " UWIN, mksh tends to be unstable due to the limitations"
1135 echo >&2 " of this platform. Continue at your own risk,"
1136 echo >&2 " please report success/failure to the developers."
1139 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1140 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
1141 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
1142 $LIBS -dumpversion`'
1143 : "${HAVE_STRING_POOLING=i2}"
1146 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1149 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
1150 systems detected. This unsupported compiler has not yet
1151 been tested for compatibility with mksh. Continue at your
1152 own risk, please report success/failure to the developers.'
1155 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1158 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1161 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1162 add_cppflags -D__inline__=__inline
1165 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
1166 been tested for compatibility with mksh. Continue at your
1167 own risk, please report success/failure to the developers.'
1170 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1173 ccpr= # errorlevels are not reliable
1176 if [[ -n $C89_COMPILER ]]; then
1177 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1181 if [[ -n $C89_LINKER ]]; then
1182 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1186 vv '|' "$C89_COMPILER /HELP >&2"
1187 vv '|' "$C89_LINKER /LINK >&2"
1192 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1195 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1198 echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1199 been tested for compatibility with mksh. Continue at your
1200 own risk, please report success/failure to the developers.'
1203 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1204 C compiler for embedded systems detected. This has not yet
1205 been tested for compatibility with mksh. Continue at your
1206 own risk, please report success/failure to the developers.'
1209 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1212 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1215 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1216 grep -F -i -e version -e release"
1219 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1220 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1223 case $TARGET_OS:$TARGET_OSREV in
1227 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1230 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1233 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1236 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1237 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1241 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1244 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1245 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1250 vv '|' "llc -version"
1256 add_cppflags -DMKSH_NO_LIMITS
1259 # nothing special detected, don’t worry
1266 $e "$bi==> which compiler seems to be used...$ao $ui$ct$etd$ao"
1267 rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1270 # Compiler: works as-is, with -Wno-error and -Werror
1275 ac_flags 0 compiler_works '' 'if the compiler works'
1276 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1277 HAVE_COMPILER_KNOWN=0
1278 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1279 if ac_ifcpp 'if 0' compiler_fails '' \
1280 'if the compiler does not fail correctly'; then
1282 : "${HAVE_CAN_DELEXE=x}"
1285 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1286 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1288 int main(void) { return (isatty(0)); }
1292 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1293 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1295 int main(void) { return (isatty(0)); }
1302 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1303 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1305 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1307 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1308 'if this could be tcc'; then
1310 CPP='cpp -D__TINYC__'
1311 HAVE_COMPILER_KNOWN=1
1316 save_NOWARN="${ccpc}-w"
1320 # -msg_* flags not used yet, or is -w2 correct?
1323 save_NOWARN="${ccpc}-w"
1336 DOWARN="-diag_error 1-10000"
1339 save_NOWARN="${ccpc}/w"
1343 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1344 ac_flags 0 errwarnnone "$save_NOWARN"
1345 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1346 ac_flags 0 errwarnall "-errwarn=%all"
1347 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1361 save_NOWARN=-qflag=i:e
1365 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1366 ac_flags 0 wnoerror "$save_NOWARN"
1367 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1368 ac_flags 0 werror -Werror
1369 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1370 test $ct = icc && DOWARN="$DOWARN -wd1419"
1376 # Compiler: extra flags (-O2 -f* -W* etc.)
1378 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1379 # optimisation: only if orig_CFLAGS is empty
1380 test x"$i" = x"" && case $ct in
1387 # no special optimisation
1392 int main(void) { return (isatty(0)); }
1393 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p
1394 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p)
1395 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1397 yes pad | head -n 256 >>x
1398 ac_flags - 1 otwo -xO2 <x
1402 ac_flags 1 othree "-O3 -qstrict"
1403 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1407 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1410 # other flags: just add them if they are supported
1414 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1420 ac_flags 0 verb -verbose
1421 ac_flags 1 rodata -readonly_strings
1424 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1425 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1428 # The following tests run with -Werror (gcc only) if possible
1429 NOWARN=$DOWARN; phase=u
1430 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1431 # mksh is not written in CFrustFrust!
1432 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1433 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1434 ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1435 test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1436 ac_flags 1 fstackprotectorall -fstack-protector-all
1437 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1438 *\ -fplugin=*dragonegg*) ;;
1439 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1448 checks='1 2 3 4 5 6 7 8'
1454 test $fv = 1 || for what in $checks; do
1455 test $fv = 1 && break
1457 1) t_cflags='-flto=jobserver'
1458 t_ldflags='-fuse-linker-plugin'
1459 t_use=1 t_name=fltojs_lp ;;
1460 2) t_cflags='-flto=jobserver' t_ldflags=''
1461 t_use=1 t_name=fltojs_nn ;;
1462 3) t_cflags='-flto=jobserver'
1463 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1464 t_use=1 t_name=fltojs_np ;;
1466 t_ldflags='-fuse-linker-plugin'
1467 t_use=1 t_name=fltons_lp ;;
1468 5) t_cflags='-flto' t_ldflags=''
1469 t_use=1 t_name=fltons_nn ;;
1471 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1472 t_use=1 t_name=fltons_np ;;
1473 7) t_cflags='-fwhole-program --combine' t_ldflags=''
1474 t_use=0 t_name=combine cm=combine ;;
1475 8) fv=1 cm=normal ;;
1477 test $fv = 1 && break
1478 ac_flags $t_use $t_name "$t_cflags" \
1479 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1481 ac_flags 1 data_abi_align -malign-data=abi
1486 # probably not needed
1487 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1491 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1492 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1493 ac_flags 1 fstacksecuritycheck -fstack-security-check
1497 ac_flags 1 fullwarn -fullwarn 'for remark output support'
1500 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1501 echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1502 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1503 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1504 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1506 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1507 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1510 #broken# ac_flags 1 ssp -stackprotect
1514 ac_flags 1 fstackprotectorall -fstack-protector-all
1520 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1524 : #broken# ac_flags 1 boundschk -b
1527 ac_flags 0 ysystem -Ysystem
1528 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1529 ac_flags 1 extansi -Xa
1532 ac_flags 1 rodata "-qro -qroconst -qroptr"
1533 ac_flags 1 rtcheck -qcheck=all
1534 #ac_flags 1 rtchkc -qextchk # reported broken
1535 ac_flags 1 wformat "-qformat=all -qformat=nozln"
1536 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1539 # flags common to a subset of compilers (run with -Werror on gcc)
1540 if test 1 = $i; then
1541 ac_flags 1 wall -Wall
1542 ac_flags 1 fwrapv -fwrapv
1545 # “on demand” means: GCC version >= 4
1546 fd='if to rely on compiler for string pooling'
1547 ac_cache string_pooling || case $HAVE_STRING_POOLING in
1548 2) fx=' (on demand, cached)' ;;
1550 i2) fv=2; fx=' (on demand)' ;;
1553 test x"$HAVE_STRING_POOLING" = x"0" || ac_cppflags
1556 # The following tests run with -Werror or similar (all compilers) if possible
1558 test $ct = pcc && phase=u
1561 # Compiler: check for stuff that only generates warnings
1563 ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1564 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1565 extern int thiswillneverbedefinedIhope(void);
1566 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1567 int main(void) { return (thiswillneverbedefinedIhope()); }
1570 #undef __attribute__
1571 int xcopy(const void *, void *, size_t)
1572 __attribute__((__bounded__(__buffer__, 1, 3)))
1573 __attribute__((__bounded__(__buffer__, 2, 3)));
1574 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1575 int xcopy(const void *s, void *d, size_t n) {
1577 * if memmove does not exist, we are not on a system
1578 * with GCC with __bounded__ attribute either so poo
1580 memmove(d, s, n); return ((int)n);
1584 ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1585 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1586 extern int thiswillneverbedefinedIhope(void);
1587 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1588 int main(void) { return (thiswillneverbedefinedIhope()); }
1590 #define fprintf printfoo
1592 #undef __attribute__
1594 extern int fprintf(FILE *, const char *format, ...)
1595 __attribute__((__format__(__printf__, 2, 3)));
1596 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1599 ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'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 void fnord(void) __attribute__((__noreturn__));
1608 int main(void) { fnord(); }
1609 void fnord(void) { exit(0); }
1612 ac_test attribute_pure '' 'for __attribute__((__pure__))' <<-'EOF'
1613 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1614 extern int thiswillneverbedefinedIhope(void);
1615 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1616 int main(void) { return (thiswillneverbedefinedIhope()); }
1619 #undef __attribute__
1620 int foo(const char *) __attribute__((__pure__));
1621 int main(int ac, char **av) { return (foo(av[ac - 1]) + isatty(0)); }
1622 int foo(const char *s) { return ((int)s[0]); }
1625 ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1626 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1627 extern int thiswillneverbedefinedIhope(void);
1628 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1629 int main(void) { return (thiswillneverbedefinedIhope()); }
1632 #undef __attribute__
1633 int main(int ac __attribute__((__unused__)), char **av
1634 __attribute__((__unused__))) { return (isatty(0)); }
1637 ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1638 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1639 extern int thiswillneverbedefinedIhope(void);
1640 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1641 int main(void) { return (thiswillneverbedefinedIhope()); }
1644 #undef __attribute__
1645 static const char fnord[] __attribute__((__used__)) = "42";
1646 int main(void) { return (isatty(0)); }
1650 # End of tests run with -Werror
1655 # mksh: flavours (full/small mksh, omit certain stuff)
1657 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1658 "if a reduced-feature mksh is requested"; then
1660 : "${HAVE_PERSISTENT_HISTORY=0}"
1661 check_categories="$check_categories smksh"
1663 ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1664 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1665 check_categories="$check_categories binsh"
1666 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1667 "if mksh will be built without job control" && \
1668 check_categories="$check_categories arge"
1669 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1670 "if mksh will be built without job signals" && \
1671 check_categories="$check_categories arge nojsig"
1672 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1673 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1674 #ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1675 # "if deprecated features are to be omitted" && \
1676 # check_categories="$check_categories nodeprecated"
1677 #ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1678 # "if experimental features are to be omitted" && \
1679 # check_categories="$check_categories noexperimental"
1680 ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1681 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1682 check_categories="$check_categories mnbsdash"
1685 # Environment: headers
1687 ac_header sys/time.h sys/types.h
1688 ac_header time.h sys/types.h
1689 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1690 ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1691 #include <sys/types.h>
1692 #include <sys/time.h>
1695 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1697 ac_header sys/bsdtypes.h
1698 ac_header sys/file.h sys/types.h
1699 ac_header sys/mkdev.h sys/types.h
1700 ac_header sys/mman.h sys/types.h
1701 ac_header sys/param.h
1702 ac_header sys/resource.h sys/types.h _time
1703 ac_header sys/select.h sys/types.h
1704 ac_header sys/sysmacros.h
1706 ac_header grp.h sys/types.h
1709 ac_header libutil.h sys/types.h
1711 ac_header stdint.h stdarg.h
1712 # include strings.h only if compatible with string.h
1713 ac_header strings.h sys/types.h string.h
1715 ac_header ulimit.h sys/types.h
1719 # Environment: definitions
1721 echo '#include <sys/types.h>
1723 /* check that off_t can represent 2^63-1 correctly, thx FSF */
1724 #define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
1725 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1726 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1727 int main(void) { return (isatty(0)); }' >lft.c
1728 ac_testn can_lfs '' "for large file support" <lft.c
1729 save_CPPFLAGS=$CPPFLAGS
1730 add_cppflags -D_FILE_OFFSET_BITS=64
1731 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1732 if test 0 = $HAVE_CAN_LFS_SUS; then
1733 CPPFLAGS=$save_CPPFLAGS
1734 add_cppflags -D_LARGE_FILES=1
1735 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1736 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1739 rmf lft* # end of large file support test
1742 # Environment: types
1744 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1745 #include <sys/types.h>
1747 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1749 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1750 #include <sys/types.h>
1752 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1754 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1755 #include <sys/types.h>
1757 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1759 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1760 #include <sys/types.h>
1762 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1765 ac_test rlim_t <<-'EOF'
1766 #include <sys/types.h>
1767 #if HAVE_BOTH_TIME_H
1768 #include <sys/time.h>
1770 #elif HAVE_SYS_TIME_H
1771 #include <sys/time.h>
1775 #if HAVE_SYS_RESOURCE_H
1776 #include <sys/resource.h>
1779 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1782 # only testn: added later below
1783 ac_testn sig_t <<-'EOF'
1784 #include <sys/types.h>
1787 volatile sig_t foo = (sig_t)0;
1788 int main(void) { return (foo == (sig_t)0); }
1791 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1792 #include <sys/types.h>
1795 volatile sighandler_t foo = (sighandler_t)0;
1796 int main(void) { return (foo == (sighandler_t)0); }
1798 if test 1 = $HAVE_SIGHANDLER_T; then
1799 add_cppflags -Dsig_t=sighandler_t
1803 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1804 #include <sys/types.h>
1807 volatile __sighandler_t foo = (__sighandler_t)0;
1808 int main(void) { return (foo == (__sighandler_t)0); }
1810 if test 1 = $HAVE___SIGHANDLER_T; then
1811 add_cppflags -Dsig_t=__sighandler_t
1815 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1819 # check whether whatever we use for the final link will succeed
1821 if test $cm = makefile; then
1825 ac_testinit link_works '' 'checking if the final link command may succeed'
1827 cat >conftest.c <<-EOF
1829 #define MKSH_INCLUDES_ONLY
1831 __RCSID("$srcversion");
1832 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1836 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1838 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1839 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1842 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1843 test $fv = 0 || v "mv conftest.s conftest.ll"
1844 test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1846 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1847 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1850 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1854 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1855 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1858 test -f $tcfn || fv=0
1860 test $fv = 1 || exit 1
1864 # Environment: errors and signals
1866 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1868 ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1869 extern const int sys_nerr;
1870 extern const char * const sys_errlist[];
1871 extern int isatty(int);
1872 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
1874 ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1875 extern const int _sys_nerr;
1876 extern const char * const _sys_errlist[];
1877 extern int isatty(int);
1878 int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
1880 if test 1 = "$HAVE__SYS_ERRLIST"; then
1881 add_cppflags -Dsys_nerr=_sys_nerr
1882 add_cppflags -Dsys_errlist=_sys_errlist
1885 ac_cppflags SYS_ERRLIST
1887 for what in name list; do
1889 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
1890 extern const char * const sys_sig${what}[];
1891 extern int isatty(int);
1892 int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
1894 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
1895 extern const char * const _sys_sig${what}[];
1896 extern int isatty(int);
1897 int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
1899 eval uwhat_v=\$HAVE__SYS_SIG$uwhat
1900 if test 1 = "$uwhat_v"; then
1901 add_cppflags -Dsys_sig$what=_sys_sig$what
1902 eval HAVE_SYS_SIG$uwhat=1
1904 ac_cppflags SYS_SIG$uwhat
1908 # Environment: library functions
1910 ac_test flock <<-'EOF'
1911 #include <sys/types.h>
1915 #include <sys/file.h>
1917 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
1920 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
1925 lks.l_type = F_WRLCK | F_UNLCK;
1926 return (fcntl(0, F_SETLKW, &lks));
1930 ac_test getrusage <<-'EOF'
1931 #define MKSH_INCLUDES_ONLY
1935 return (getrusage(RUSAGE_SELF, &ru) +
1936 getrusage(RUSAGE_CHILDREN, &ru));
1940 ac_test getsid <<-'EOF'
1942 int main(void) { return ((int)getsid(0)); }
1945 ac_test gettimeofday <<-'EOF'
1946 #define MKSH_INCLUDES_ONLY
1948 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
1951 ac_test killpg <<-'EOF'
1953 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
1956 ac_test memmove <<-'EOF'
1957 #include <sys/types.h>
1961 #include <strings.h>
1963 int main(int ac, char *av[]) {
1964 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
1968 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
1969 #define MKSH_INCLUDES_ONLY
1971 int main(int ac, char *av[]) {
1973 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
1974 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
1979 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
1980 #include <sys/types.h>
1982 #include <sys/file.h>
1985 #include <sys/mman.h>
1989 int main(void) { return ((void *)mmap(NULL, (size_t)0,
1990 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
1994 ac_test nice <<-'EOF'
1996 int main(void) { return (nice(4)); }
1999 ac_test revoke <<-'EOF'
2000 #include <sys/types.h>
2002 #include <libutil.h>
2005 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
2008 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
2011 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
2014 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2015 #include <langinfo.h>
2017 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
2020 ac_test select <<-'EOF'
2021 #include <sys/types.h>
2022 #if HAVE_BOTH_TIME_H
2023 #include <sys/time.h>
2025 #elif HAVE_SYS_TIME_H
2026 #include <sys/time.h>
2030 #if HAVE_SYS_BSDTYPES_H
2031 #include <sys/bsdtypes.h>
2033 #if HAVE_SYS_SELECT_H
2034 #include <sys/select.h>
2037 #include <bstring.h>
2043 #include <strings.h>
2047 struct timeval tv = { 1, 200000 };
2048 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
2049 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
2053 ac_test setresugid <<-'EOF'
2054 #include <sys/types.h>
2056 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2059 ac_test setgroups setresugid 0 <<-'EOF'
2060 #include <sys/types.h>
2065 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2068 if test x"$et" = x"klibc"; then
2070 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2071 #define MKSH_INCLUDES_ONLY
2073 extern int __rt_sigsuspend(const sigset_t *, size_t);
2074 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2077 # no? damn! legacy crap ahead!
2079 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2080 'whether sigsuspend is usable (1/2)' <<-'EOF'
2081 #define MKSH_INCLUDES_ONLY
2083 extern int __sigsuspend_s(sigset_t);
2084 int main(void) { return (__sigsuspend_s(0)); }
2086 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2087 'whether sigsuspend is usable (2/2)' <<-'EOF'
2088 #define MKSH_INCLUDES_ONLY
2090 extern int __sigsuspend_xxs(int, int, sigset_t);
2091 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
2094 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
2095 # no usable sigsuspend(), use pause() *ugh*
2096 add_cppflags -DMKSH_NO_SIGSUSPEND
2100 ac_test strerror '!' sys_errlist 0 <<-'EOF'
2101 extern char *strerror(int);
2102 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2105 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2108 int main(void) { return (strsignal(1)[0]); }
2111 ac_test strlcpy <<-'EOF'
2113 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2118 # check headers for declarations
2120 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2121 #define MKSH_INCLUDES_ONLY
2124 #include <sys/file.h>
2126 int main(void) { return ((flock)(0, 0)); }
2128 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2129 #define MKSH_INCLUDES_ONLY
2131 int main(void) { return ((revoke)("")); }
2133 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2134 #define MKSH_INCLUDES_ONLY
2136 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2138 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2139 #define MKSH_INCLUDES_ONLY
2141 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2147 fd='if to use persistent history'
2148 ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2151 test 1 = $fv || check_categories="$check_categories no-histfile"
2156 ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF'
2157 #define MKSH_INCLUDES_ONLY
2160 #define CHAR_BIT 8 /* defuse this test on really legacy systems */
2163 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2164 /* this one should be defined by the standard */
2165 cta(char_is_1_char, (sizeof(char) == 1) && (sizeof(signed char) == 1) &&
2166 (sizeof(unsigned char) == 1));
2167 cta(char_is_8_bits, ((CHAR_BIT) == 8) && ((int)(unsigned char)0xFF == 0xFF) &&
2168 ((int)(unsigned char)0x100 == 0) && ((int)(unsigned char)(int)-1 == 0xFF));
2169 /* the next assertion is probably not really needed */
2170 cta(short_is_2_char, sizeof(short) == 2);
2171 cta(short_size_no_matter_of_signedness, sizeof(short) == sizeof(unsigned short));
2172 /* the next assertion is probably not really needed */
2173 cta(int_is_4_char, sizeof(int) == 4);
2174 cta(int_size_no_matter_of_signedness, sizeof(int) == sizeof(unsigned int));
2176 cta(long_ge_int, sizeof(long) >= sizeof(int));
2177 cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long));
2179 #ifndef MKSH_LEGACY_MODE
2180 /* the next assertion is probably not really needed */
2181 cta(ari_is_4_char, sizeof(mksh_ari_t) == 4);
2183 cta(ari_has_31_bit, 0 < (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1));
2184 /* the next assertion is probably not really needed */
2185 cta(uari_is_4_char, sizeof(mksh_uari_t) == 4);
2186 /* but the next three are; we REQUIRE unsigned integer wraparound */
2187 cta(uari_has_31_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 2 + 1));
2188 cta(uari_has_32_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3));
2189 cta(uari_wrap_32_bit,
2190 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3) >
2191 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 4));
2196 /* these are always required */
2197 cta(ari_is_signed, (mksh_ari_t)-1 < (mksh_ari_t)0);
2198 cta(uari_is_unsigned, (mksh_uari_t)-1 > (mksh_uari_t)0);
2199 /* we require these to have the precisely same size and assume 2s complement */
2200 cta(ari_size_no_matter_of_signedness, sizeof(mksh_ari_t) == sizeof(mksh_uari_t));
2202 cta(sizet_size_no_matter_of_signedness, sizeof(ssize_t) == sizeof(size_t));
2203 cta(sizet_voidptr_same_size, sizeof(size_t) == sizeof(void *));
2204 cta(sizet_funcptr_same_size, sizeof(size_t) == sizeof(void (*)(void)));
2205 /* our formatting routines assume this */
2206 cta(ptr_fits_in_long, sizeof(size_t) <= sizeof(long));
2207 cta(ari_fits_in_long, sizeof(mksh_ari_t) <= sizeof(long));
2208 /* for struct alignment people */
2209 char padding[64 - NUM];
2211 char ctasserts_dblcheck[sizeof(struct ctasserts) == 64 ? 1 : -1];
2212 int main(void) { return (sizeof(ctasserts_dblcheck) + isatty(0)); }
2215 eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1
2218 # extra checks for legacy mksh
2220 if test $legacy = 1; then
2221 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2222 #define MKSH_INCLUDES_ONLY
2228 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2229 cta(char_is_8_bits, (CHAR_BIT) == 8);
2230 cta(long_is_32_bits, sizeof(long) == 4);
2232 int main(void) { return (sizeof(struct ctasserts)); }
2235 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2236 #define MKSH_INCLUDES_ONLY
2242 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2243 cta(char_is_8_bits, (CHAR_BIT) == 8);
2244 cta(long_is_64_bits, sizeof(long) == 8);
2246 int main(void) { return (sizeof(struct ctasserts)); }
2249 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2250 10) check_categories="$check_categories int:32" ;;
2251 01) check_categories="$check_categories int:64" ;;
2252 *) check_categories="$check_categories int:u" ;;
2257 # Compiler: Praeprocessor (only if needed)
2259 test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2260 'checking if the C Preprocessor supports -dD'; then
2261 echo '#define foo bar' >conftest.c
2262 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2263 grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2264 rmf conftest.c x vv.out
2269 # End of mirtoconf checks
2273 # Some operating systems have ancient versions of ed(1) writing
2274 # the character count to standard output; cope for that
2276 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2277 check_categories="$check_categories $oldish_ed"
2280 if test 0 = $HAVE_SYS_SIGNAME; then
2281 if test 1 = $HAVE_CPP_DD; then
2282 $e Generating list of signal names...
2284 $e No list of signal names available via cpp. Falling back...
2288 echo '#include <signal.h>
2289 #if defined(NSIG_MAX)
2290 #define cfg_NSIG NSIG_MAX
2292 #define cfg_NSIG NSIG
2293 #elif defined(_NSIG)
2294 #define cfg_NSIG _NSIG
2295 #elif defined(SIGMAX)
2296 #define cfg_NSIG (SIGMAX + 1)
2297 #elif defined(_SIGMAX)
2298 #define cfg_NSIG (_SIGMAX + 1)
2300 /*XXX better error out, see sh.h */
2306 # GNU sed 2.03 segfaults when optimising this to sed -n
2307 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2309 sed '/mksh_cfg.*= *$/{
2313 grep '^ *mksh_cfg *=' | \
2314 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2316 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2317 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2320 (printf hallo) >/dev/null 2>&1 || printf=echo
2321 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2322 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2323 $printf "NSIG=$NSIG ... "
2324 sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
2325 sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
2326 sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT STKFLT"
2327 sigs="$sigs ABND DCE DUMP IOERR TRACE DANGER THCONT THSTOP RESV UNUSED"
2328 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2329 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2330 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2331 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
2332 test $NSIG -gt 1 || sigs=
2333 for name in $sigs; do
2335 *:$name:*) continue ;;
2337 sigseenone=$sigseenone$name:
2338 echo '#include <signal.h>' >conftest.c
2339 echo int >>conftest.c
2340 echo mksh_cfg= SIG$name >>conftest.c
2341 echo ';' >>conftest.c
2342 # GNU sed 2.03 croaks on optimising this, too
2343 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2345 sed '/mksh_cfg.*= *$/{
2349 grep '^ *mksh_cfg *=' | \
2350 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2351 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2352 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2353 test $nr -gt 0 && test $nr -lt $NSIG || continue
2356 *) echo " { \"$name\", $nr },"
2357 sigseentwo=$sigseentwo$nr:
2358 $printf "$name=$nr " >&2
2361 done 2>&1 >signames.inc
2366 addsrcs '!' HAVE_STRLCPY strlcpy.c
2367 addsrcs USE_PRINTF_BUILTIN printf.c
2368 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2369 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2370 add_cppflags -DMKSH_BUILD_R=541
2372 $e $bi$me: Finished configuration testing, now producing output.$ao
2380 add_cppflags -DMKSH_EXE_EXT
2387 *\ *) mkshshebang="#!./$mkshexe" ;;
2388 *) mkshshebang="#!$curdir/$mkshexe" ;;
2392 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2393 test -n "\$KSH_VERSION" || exit 1
2394 set -A check_categories -- $check_categories
2395 pflag='$curdir/$mkshexe'
2396 sflag='$srcdir/check.t'
2397 usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2398 while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch {
2399 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2400 (e) usee=1; eflag=\$OPTARG ;;
2401 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
2404 (p) pflag=\$OPTARG ;;
2409 (s) sflag=\$OPTARG ;;
2410 (t) uset=1; tflag=\$OPTARG ;;
2416 shift \$((OPTIND - 1))
2417 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2419 for y in "\${check_categories[@]}"; do
2422 if [[ -n \$x ]]; then
2423 args[\${#args[*]}]=-C
2424 args[\${#args[*]}]=\${x#,}
2427 args[\${#args[*]}]=-e
2428 args[\${#args[*]}]=\$eflag
2430 (( Pflag )) && args[\${#args[*]}]=-P
2432 args[\${#args[*]}]=-t
2433 args[\${#args[*]}]=\$tflag
2435 (( vflag )) && args[\${#args[*]}]=-v
2436 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
2437 if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2438 args[\${#args[*]}]=-T
2439 args[\${#args[*]}]=\$TMPDIR
2441 print Testing mksh for conformance:
2442 grep -F -e Mir''OS: -e MIRBSD "\$sflag"
2443 print "This shell is actually:\\n\\t\$KSH_VERSION"
2444 print 'test.sh built for mksh $dstversion'
2445 cstr='\$os = defined \$^O ? \$^O : "unknown";'
2446 cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2447 for perli in \$PERL perl5 perl no; do
2448 if [[ \$perli = no ]]; then
2449 print Cannot find a working Perl interpreter, aborting.
2452 print "Trying Perl interpreter '\$perli'..."
2453 perlos=\$(\$perli -e "\$cstr")
2455 print "Errorlevel \$rv, running on '\$perlos'"
2457 print "=> not using"
2460 if [[ -n \$perlos ]]; then
2465 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2466 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2467 # use of the -S option for check.t split into multiple chunks
2469 for s in "\$sflag".*; do
2470 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2471 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2473 (( rv = rv ? rv : rc ))
2483 emitbc="-emit-llvm -c"
2489 echo ": # work around NeXTstep bug" >Rebuild.sh
2491 optfiles=`echo *.opt`
2493 for file in $optfiles; do
2494 echo "echo + Running genopt on '$file'..."
2495 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2497 echo set -x >>Rebuild.sh
2498 for file in $SRCS; do
2499 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2500 test -f $file || file=$srcdir/$file
2501 files="$files$sp$file"
2503 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2504 if test $cm = dragonegg; then
2505 echo "mv ${op}s ${op}ll" >>Rebuild.sh
2506 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2507 objs="$objs$sp${op}bc"
2509 objs="$objs$sp${op}o"
2514 echo "rm -f $tfn.s" >>Rebuild.sh
2515 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2522 echo tcfn=$mkshexe >>Rebuild.sh
2523 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2524 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2525 if test $cm = makefile; then
2526 extras='emacsfn.h exprtok.h rlimits.opt sh.h sh_flags.opt var_spec.h'
2527 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2529 for file in $optfiles; do
2530 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2532 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2533 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2535 cat >Makefrag.inc <<EOF
2536 # Makefile fragment for building mksh $dstversion
2544 NONSRCS_INST= dot.mkshrc \$(MAN)
2545 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2552 .depend \$(OBJS_BP):$gens$genq
2554 # not BSD make only:
2557 #\$(PROG): \$(OBJS_BP)
2558 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2559 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2561 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2563 # for all make variants:
2566 # ./test.sh \$(REGRESS_FLAGS)
2567 check_categories=$check_categories
2569 # for BSD make only:
2571 #.include <bsd.prog.mk>
2574 $e Generated Makefrag.inc successfully.
2577 for file in $optfiles; do
2578 $e "+ Running genopt on '$file'..."
2579 do_genopt "$srcdir/$file" || exit 1
2581 if test $cm = combine; then
2583 for file in $SRCS; do
2584 test -f $file || file=$srcdir/$file
2587 emitbc="-fwhole-program --combine"
2588 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2589 elif test 1 = $pm; then
2590 for file in $SRCS; do
2591 test -f $file || file=$srcdir/$file
2592 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2596 for file in $SRCS; do
2597 test $cm = dragonegg && \
2598 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2599 test -f $file || file=$srcdir/$file
2600 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2601 if test $cm = dragonegg; then
2602 v "mv ${op}s ${op}ll"
2603 v "llvm-as ${op}ll" || exit 1
2610 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2614 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2615 test -f $tcfn || exit 1
2616 test 1 = $r || v "$NROFF -mdoc <'$srcdir/lksh.1' >lksh.cat1" || rmf lksh.cat1
2617 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || rmf mksh.cat1
2618 test 0 = $eq && v $SIZE $tcfn
2620 test -f /usr/ucb/$i && i=/usr/ucb/$i
2623 $e Installing the shell:
2624 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2625 if test $legacy = 0; then
2626 $e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2627 $e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2630 $e Installing the manual:
2631 if test -f mksh.cat1; then
2632 $e "# $i -c -o root -g bin -m 444 lksh.cat1" \
2633 "/usr/share/man/cat1/lksh.0"
2634 $e "# $i -c -o root -g bin -m 444 mksh.cat1" \
2635 "/usr/share/man/cat1/mksh.0"
2638 $e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
2640 $e Run the regression test suite: ./test.sh
2641 $e Please also read the sample file dot.mkshrc and the fine manual.
2646 === Environment used ===
2648 ==== build environment ====
2651 CFLAGS if empty, defaults to -xO2 or +O2
2652 or -O3 -qstrict or -O2, per compiler
2653 CPPFLAGS default empty
2654 LDFLAGS default empty; added before sources
2655 LDSTATIC set this to '-static'; default unset
2656 LIBS default empty; added after sources
2657 [Interix] default: -lcrypt (XXX still needed?)
2658 NOWARN -Wno-error or similar
2659 NROFF default: nroff
2660 TARGET_OS default: $(uname -s || uname)
2661 TARGET_OSREV [QNX] default: $(uname -r)
2663 ==== feature selectors ====
2664 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2665 ===== general format =====
2667 HAVE_STRING_H ac_header
2668 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2670 ==== cpp definitions ====
2671 DEBUG dont use in production, wants gcc, implies:
2672 DEBUG_LEAKS enable freeing resources before exiting
2673 MKSHRC_PATH "~/.mkshrc" (do not change)
2674 MKSH_A4PB force use of arc4random_pushb
2675 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2676 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2677 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2678 MKSH_CLS_STRING "\033[;H\033[J"
2679 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2680 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2681 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2682 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2683 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2684 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2685 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2686 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2687 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2688 MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
2689 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2690 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2691 MKSH_NO_LIMITS omit ulimit code
2692 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2693 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2694 MKSH_SMALL omit some code, optimise hard for size (slower)
2695 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2696 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2697 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2698 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2699 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2701 === generic installation instructions ===
2703 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2704 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2705 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2706 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2708 Normally, the following command is what you want to run, then:
2709 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2711 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2712 /bin; install the manpage, if omitting the -r flag a catmanpage is made
2713 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2714 http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2715 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2717 You may also want to install the lksh binary (also as /bin/sh) built by:
2718 $ CPPFLAGS="$CPPFLAGS -DMKSH_BINSHPOSIX" sh Build.sh -L -r -c lto