2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.716 2017/04/12 18:33:22 tg Exp $'
4 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
5 # 2011, 2012, 2013, 2014, 2015, 2016, 2017
6 # mirabilos <m@mirbsd.org>
8 # Provided that these terms and disclaimer and all copyright notices
9 # are retained or reproduced in an accompanying document, permission
10 # is granted to deal in this work without restriction, including un-
11 # limited rights to use, publicly perform, distribute, sell, modify,
12 # merge, give away, or sublicence.
14 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
15 # the utmost extent permitted by applicable law, neither express nor
16 # implied; without malicious intent or gross negligence. In no event
17 # may a licensor, author or contributor be held liable for indirect,
18 # direct, other damage, loss, or other issues arising in any way out
19 # of dealing in the work, even if advised of the possibility of such
20 # damage or existence of a defect, except proven that it results out
21 # of said person's immediate fault when using the work as intended.
23 # People analysing the output must whitelist conftest.c for any kind
24 # of compiler warning checks (mirtoconf is by design not quiet).
26 # Used environment documentation is at the end of this file.
31 case $ZSH_VERSION:$VERSION in
32 :zsh*) ZSH_VERSION=2 ;;
35 if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then
40 if test -d /usr/xpg4/bin/. >/dev/null 2>&1; then
41 # Solaris: some of the tools have weird behaviour, use portable ones
42 PATH=/usr/xpg4/bin:$PATH
49 safeIFS=" $safeIFS$nl"
51 allu=QWERTYUIOPASDFGHJKLZXCVBNM
52 alll=qwertyuiopasdfghjklzxcvbnm
54 alls=______________________________________________________________
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
503 c:combine|c:dragonegg|c:llvm|c:lto)
508 echo "$me: Unknown option -c '$i'!" >&2
523 echo "$me: Do not call me with '-G'!" >&2
527 # checker, debug, valgrind build
529 CFLAGS="$CFLAGS -g3 -fno-builtin"
544 optflags=-std-compile-opts
565 echo "Build.sh $srcversion"
566 echo "for mksh $dstversion"
570 echo "$me: Unknown option '$i'!" >&2
574 echo "$me: Unknown option -'$last' '$i'!" >&2
579 if test -n "$last"; then
580 echo "$me: Option -'$last' not followed by argument!" >&2
584 test -z "$tfn" && if test $legacy = 0; then
589 if test -d $tfn || test -d $tfn.exe; then
590 echo "$me: Error: ./$tfn is a directory!" >&2
593 rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \
594 *.ll *.o *.gen *.cat1 Rebuild.sh lft no signames.inc test.sh x vv.out
596 SRCS="lalloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
597 SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
599 if test $legacy = 0; then
600 check_categories="$check_categories shell:legacy-no int:32"
602 check_categories="$check_categories shell:legacy-yes"
603 add_cppflags -DMKSH_LEGACY_MODE
606 if test $textmode = 0; then
607 check_categories="$check_categories shell:textmode-no shell:binmode-yes"
609 check_categories="$check_categories shell:textmode-yes shell:binmode-no"
610 add_cppflags -DMKSH_WITH_TEXTMODE
613 if test x"$srcdir" = x"."; then
614 CPPFLAGS="-I. $CPPFLAGS"
616 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
618 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
619 LDFLAGS="$LDFLAGS $LDSTATIC"
624 if test -z "$TARGET_OS"; then
625 x=`uname -s 2>/dev/null || uname`
626 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
628 if test -z "$TARGET_OS"; then
629 echo "$me: Set TARGET_OS, your uname is broken!" >&2
636 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'
639 if test x"$TARGET_OS" = x"Android"; then
640 check_categories="$check_categories android"
645 if test x"$TARGET_OS" = x"Minix"; then
647 WARNING: additional checks before running Build.sh required!
648 You can avoid these by calling Build.sh correctly, see below.
650 cat >conftest.c <<'EOF'
651 #include <sys/types.h>
653 #ifdef _NETBSD_SOURCE
661 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
668 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
669 Please set it to either Minix3 or Ninix3, whereas the latter is
670 all versions of Minix with even partial NetBSD(R) userland. The
671 value determined from your compiler for the current compilation
672 (which may be wrong) is: $ct
678 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
679 Please set it to either Minix3 or Ninix3, whereas the latter is
680 all versions of Minix with even partial NetBSD(R) userland. The
681 proper value couldn't be determined, continue at your own risk.
687 # Configuration depending on OS revision, on OSes that need them
690 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
691 grep 'NeXT Mach [0-9][0-9.]*:' | \
692 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
695 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
699 # Configuration depending on OS name
702 : "${HAVE_CAN_OTWO=0}"
703 add_cppflags -DMKSH_NO_SIGSETJMP
704 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
707 add_cppflags -D_ALL_SOURCE
708 : "${HAVE_SETLOCALE_CTYPE=0}"
713 oswarn="; it has minor issues"
716 oswarn="; you must recompile mksh with"
717 oswarn="$oswarn${nl}itself in a second stage"
720 # BeOS has no real tty either
721 add_cppflags -DMKSH_UNEMPLOYED
722 add_cppflags -DMKSH_DISABLE_TTY_WARNING
723 # BeOS doesn't have different UIDs and GIDs
724 add_cppflags -DMKSH__NO_SETEUGID
727 : "${HAVE_SETLOCALE_CTYPE=0}"
730 oswarn="; it has major issues"
731 add_cppflags -DMKSH__NO_SYMLINK
732 check_categories="$check_categories nosymlink"
733 add_cppflags -DMKSH__NO_SETEUGID
734 add_cppflags -DMKSH_DISABLE_TTY_WARNING
737 : "${HAVE_SETLOCALE_CTYPE=0}"
740 add_cppflags -D_DARWIN_C_SOURCE
747 oswarn="; it has minor issues"
748 add_cppflags -D_GNU_SOURCE
749 : "${HAVE_SETLOCALE_CTYPE=0}"
754 *) add_cppflags -D_GNU_SOURCE ;;
756 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
757 # define MKSH__NO_PATH_MAX to use Hurd-only functions
758 add_cppflags -DMKSH__NO_PATH_MAX
763 *) add_cppflags -D_GNU_SOURCE ;;
765 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
768 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
771 add_cppflags -D_POSIX_SOURCE
772 add_cppflags -D_LIMITS_EXTENSION
773 add_cppflags -D_BSD_EXTENSION
774 add_cppflags -D_SUSV2_SOURCE
775 add_cppflags -D_GNU_SOURCE
776 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
777 add_cppflags -DMKSH_NO_CMDLINE_EDITING
778 add_cppflags -DMKSH__NO_SETEUGID
779 oswarn=' and will currently not work'
780 add_cppflags -DMKSH_UNEMPLOYED
781 # these taken from Harvey-OS github and need re-checking
782 add_cppflags -D_setjmp=setjmp -D_longjmp=longjmp
783 : "${HAVE_CAN_NO_EH_FRAME=0}"
784 : "${HAVE_CAN_FNOSTRICTALIASING=0}"
785 : "${HAVE_CAN_FSTACKPROTECTORSTRONG=0}"
792 add_cppflags -D_ALL_SOURCE
794 : "${HAVE_SETLOCALE_CTYPE=0}"
797 : "${HAVE_SETLOCALE_CTYPE=0}"
802 *) add_cppflags -D_GNU_SOURCE ;;
804 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
808 oswarn="; it has minor issues"
813 add_cppflags -DMKSH__NO_SETEUGID
814 add_cppflags -DMKSH_UNEMPLOYED
815 add_cppflags -D_MINIX_SOURCE
816 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
817 : "${HAVE_SETLOCALE_CTYPE=0}"
820 add_cppflags -DMKSH_UNEMPLOYED
821 add_cppflags -DMKSH_NO_LIMITS
822 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
823 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
824 : "${HAVE_SETLOCALE_CTYPE=0}"
829 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
830 # almost same as CYGWIN* (from RT|Chatzilla)
831 : "${HAVE_SETLOCALE_CTYPE=0}"
832 # broken on this OE (from ir0nh34d)
833 : "${HAVE_STDINT_H=0}"
838 add_cppflags -D_NEXT_SOURCE
839 add_cppflags -D_POSIX_SOURCE
842 add_cppflags -DMKSH_NO_SIGSETJMP
843 # NeXTstep cannot get a controlling tty
844 add_cppflags -DMKSH_UNEMPLOYED
845 case $TARGET_OSREV in
847 # OpenStep 4.2 is broken by default
848 oswarn="; it needs libposix.a"
854 add_cppflags -DMKSH_UNEMPLOYED
855 add_cppflags -DMKSH_NO_LIMITS
856 # but no idea what else could be needed
857 oswarn="; it has unknown issues"
860 : "${HAVE_SETLOCALE_CTYPE=0}"
863 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
865 HAVE_MKNOD=0 # setmode() incompatible
866 oswarn="; it is being ported"
867 check_categories="$check_categories nosymlink"
871 add_cppflags -DMKSH_UNEMPLOYED
872 add_cppflags -DMKSH_NOPROSPECTOFWORK
873 add_cppflags -DMKSH_NO_LIMITS
874 add_cppflags -DMKSH_DOSPATH
875 if test $textmode = 0; then
877 y='standard OS/2 tools'
880 y='standard Unix mksh and other tools'
883 OS/2 Note: mksh can be built with or without 'textmode'.
884 Without 'textmode' it will behave like a standard Unix utility,
885 compatible to mksh on all other platforms, using only ASCII LF
886 (0x0A) as line ending character. This is supported by the mksh
888 With 'textmode', mksh will be modified to behave more like other
889 OS/2 utilities, supporting ASCII CR+LF (0x0D 0x0A) as line ending
890 at the cost of deviation from standard mksh. This is supported by
893 ] You are currently compiling with textmode ${x}abled, introducing
894 ] incompatibilities with $y.
898 HAVE_SIG_T=0 # incompatible
899 add_cppflags -D_OSF_SOURCE
900 add_cppflags -D_POSIX_C_SOURCE=200112L
901 add_cppflags -D_XOPEN_SOURCE=600
902 add_cppflags -D_XOPEN_SOURCE_EXTENDED
903 : "${HAVE_SETLOCALE_CTYPE=0}"
906 add_cppflags -D_POSIX_SOURCE
907 add_cppflags -D_LIMITS_EXTENSION
908 add_cppflags -D_BSD_EXTENSION
909 add_cppflags -D_SUSV2_SOURCE
910 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
911 add_cppflags -DMKSH_NO_CMDLINE_EDITING
912 add_cppflags -DMKSH__NO_SETEUGID
913 oswarn=' and will currently not work'
914 add_cppflags -DMKSH_UNEMPLOYED
915 # this is for detecting kencc
916 add_cppflags -DMKSH_MAYBE_KENCC
919 HAVE_SIG_T=0 # incompatible
920 oswarn=' and will currently not work'
921 : "${HAVE_SETLOCALE_CTYPE=0}"
924 add_cppflags -D__NO_EXT_QNX
925 add_cppflags -D__EXT_UNIX_MISC
926 case $TARGET_OSREV in
927 [012345].*|6.[0123].*|6.4.[01])
928 oldish_ed=no-stderr-ed # oldish /bin/ed is broken
931 : "${HAVE_SETLOCALE_CTYPE=0}"
934 case $TARGET_OSREV in
937 add_cppflags -DMKSH_UNEMPLOYED
943 oswarn='; this is an unknown version of'
944 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
947 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
950 oswarn="; it has minor issues"
953 add_cppflags -D_BSD_SOURCE
954 add_cppflags -D__EXTENSIONS__
957 add_cppflags -D_GNU_SOURCE
958 add_cppflags -DMKSH_NO_SIGSUSPEND
959 oswarn=' and will currently not work'
963 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
964 : "${HAVE_SETLOCALE_CTYPE=0}"
968 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
974 oswarn="; it will compile, but the target"
975 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
976 : "${HAVE_SETLOCALE_CTYPE=0}"
979 # generic target for SVR4 Unix with uname -s = uname -n
980 # this duplicates the * target below
981 oswarn='; it may or may not work'
982 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
985 oswarn='; it may or may not work'
986 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
992 : "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
993 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
994 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
996 # this aids me in tracing FTBFSen without access to the buildd
997 $e "Hi from$ao $bi$srcversion$ao on:"
1000 vv '|' "oslevel >&2"
1001 vv '|' "uname -a >&2"
1004 vv '|' "hwprefs machine_type os_type os_class >&2"
1005 vv '|' "sw_vers >&2"
1006 vv '|' "system_profiler SPSoftwareDataType SPHardwareDataType >&2"
1007 vv '|' "/bin/sh --version >&2"
1008 vv '|' "xcodebuild -version >&2"
1009 vv '|' "uname -a >&2"
1010 vv '|' "sysctl kern.version hw.machine hw.model hw.memsize hw.availcpu hw.cpufrequency hw.byteorder hw.cpu64bit_capable >&2"
1013 vv '|' "uname -a >&2"
1014 vv '|' "hinv -v >&2"
1017 vv '|' "uname -a >&2"
1018 vv '|' "/usr/sbin/sizer -v >&2"
1020 SCO_SV|UnixWare|UNIX_SV)
1021 vv '|' "uname -a >&2"
1022 vv '|' "uname -X >&2"
1025 vv '|' "uname -a >&2"
1028 test -z "$oswarn" || echo >&2 "
1029 Warning: mksh has not yet been ported to or tested on your
1030 operating system '$TARGET_OS'$oswarn. If you can provide
1031 a shell account to the developer, this may improve; please
1032 drop us a success or failure notice or even send in diffs.
1034 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
1037 # Start of mirtoconf checks
1039 $e $bi$me: Scanning for functions... please ignore any errors.$ao
1042 # Compiler: which one?
1045 # - ICC defines __GNUC__ too
1046 # - GCC defines __hpux too
1047 # - LLVM+clang defines __GNUC__ too
1048 # - nwcc defines __GNUC__ too
1050 $e ... which compiler seems to be used
1051 cat >conftest.c <<'EOF'
1053 #if defined(__ICC) || defined(__INTEL_COMPILER)
1055 #elif defined(__xlC__) || defined(__IBMC__)
1057 #elif defined(__SUNPRO_C)
1059 #elif defined(__ACK__)
1061 #elif defined(__BORLANDC__)
1063 #elif defined(__WATCOMC__)
1065 #elif defined(__MWERKS__)
1067 #elif defined(__HP_cc)
1069 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
1071 #elif defined(__PGI)
1073 #elif defined(__DMC__)
1075 #elif defined(_MSC_VER)
1077 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
1079 #elif defined(__IAR_SYSTEMS_ICC__)
1083 #elif defined(__PCC__)
1085 #elif defined(__TenDRA__)
1087 #elif defined(__TINYC__)
1089 #elif defined(__llvm__) && defined(__clang__)
1091 #elif defined(__NWCC__)
1093 #elif defined(__GNUC__)
1095 #elif defined(_COMPILER_VERSION)
1097 #elif defined(__sgi)
1099 #elif defined(__hpux) || defined(__hpua)
1101 #elif defined(__ultrix)
1103 #elif defined(__USLC__)
1105 #elif defined(__LCC__)
1107 #elif defined(MKSH_MAYBE_KENCC)
1108 /* and none of the above matches */
1115 #if defined(__KLIBC__) && !defined(__OS2__)
1124 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1125 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
1129 cat >conftest.c <<'EOF'
1131 int main(void) { return (isatty(0)); }
1135 # work around "the famous ACK const bug"
1136 CPPFLAGS="-Dconst= $CPPFLAGS"
1139 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
1140 and SHARC (21000) DSPs detected. This compiler has not yet
1141 been tested for compatibility with mksh. Continue at your
1142 own risk, please report success/failure to the developers.'
1145 echo >&2 "Warning: Borland C++ Builder detected. This compiler might
1146 produce broken executables. Continue at your own risk,
1147 please report success/failure to the developers."
1150 # does not work with current "ccc" compiler driver
1151 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1152 # one of these two works, for now
1153 vv '|' "${CLANG-clang} -version"
1154 vv '|' "${CLANG-clang} --version"
1155 # ensure compiler and linker are in sync unless overridden
1156 case $CCC_CC:$CCC_LD in
1158 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
1160 : "${HAVE_STRING_POOLING=i1}"
1163 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1164 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1167 echo >&2 "Warning: Digital Mars Compiler detected. When running under"
1168 echo >&2 " UWIN, mksh tends to be unstable due to the limitations"
1169 echo >&2 " of this platform. Continue at your own risk,"
1170 echo >&2 " please report success/failure to the developers."
1173 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1174 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
1175 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
1176 $LIBS -dumpversion`'
1177 : "${HAVE_STRING_POOLING=i2}"
1180 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1183 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
1184 systems detected. This unsupported compiler has not yet
1185 been tested for compatibility with mksh. Continue at your
1186 own risk, please report success/failure to the developers.'
1189 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1192 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1195 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1196 add_cppflags -D__inline__=__inline
1199 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
1200 been tested for compatibility with mksh. Continue at your
1201 own risk, please report success/failure to the developers.'
1204 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1207 ccpr= # errorlevels are not reliable
1210 if [[ -n $C89_COMPILER ]]; then
1211 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
1215 if [[ -n $C89_LINKER ]]; then
1216 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
1220 vv '|' "$C89_COMPILER /HELP >&2"
1221 vv '|' "$C89_LINKER /LINK >&2"
1226 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1229 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1232 echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1233 been tested for compatibility with mksh. Continue at your
1234 own risk, please report success/failure to the developers.'
1237 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1238 C compiler for embedded systems detected. This has not yet
1239 been tested for compatibility with mksh. Continue at your
1240 own risk, please report success/failure to the developers.'
1243 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1246 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1249 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1250 grep -F -i -e version -e release"
1253 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1254 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1257 case $TARGET_OS:$TARGET_OSREV in
1261 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
1264 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1267 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1270 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1271 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1275 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1278 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1279 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1284 vv '|' "llc -version"
1290 add_cppflags -DMKSH_NO_LIMITS
1293 # nothing special detected, don’t worry
1300 $e "$bi==> which compiler seems to be used...$ao $ui$ct$etd$ao"
1301 rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
1304 # Compiler: works as-is, with -Wno-error and -Werror
1309 ac_flags 0 compiler_works '' 'if the compiler works'
1310 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1311 HAVE_COMPILER_KNOWN=0
1312 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1313 if ac_ifcpp 'if 0' compiler_fails '' \
1314 'if the compiler does not fail correctly'; then
1316 : "${HAVE_CAN_DELEXE=x}"
1319 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1320 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1322 int main(void) { return (isatty(0)); }
1326 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1327 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1329 int main(void) { return (isatty(0)); }
1336 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1337 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1339 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1341 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1342 'if this could be tcc'; then
1344 CPP='cpp -D__TINYC__'
1345 HAVE_COMPILER_KNOWN=1
1350 save_NOWARN="${ccpc}-w"
1354 # -msg_* flags not used yet, or is -w2 correct?
1357 save_NOWARN="${ccpc}-w"
1370 DOWARN="-diag_error 1-10000"
1373 save_NOWARN="${ccpc}/w"
1377 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1378 ac_flags 0 errwarnnone "$save_NOWARN"
1379 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1380 ac_flags 0 errwarnall "-errwarn=%all"
1381 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1395 save_NOWARN=-qflag=i:e
1399 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1400 ac_flags 0 wnoerror "$save_NOWARN"
1401 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1402 ac_flags 0 werror -Werror
1403 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1404 test $ct = icc && DOWARN="$DOWARN -wd1419"
1410 # Compiler: extra flags (-O2 -f* -W* etc.)
1412 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1413 # optimisation: only if orig_CFLAGS is empty
1414 test x"$i" = x"" && case $ct in
1421 # no special optimisation
1426 int main(void) { return (isatty(0)); }
1427 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p
1428 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p)
1429 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1431 yes pad | head -n 256 >>x
1432 ac_flags - 1 otwo -xO2 <x
1436 ac_flags 1 othree "-O3 -qstrict"
1437 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1441 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1444 # other flags: just add them if they are supported
1448 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1454 ac_flags 0 verb -verbose
1455 ac_flags 1 rodata -readonly_strings
1458 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1459 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1462 # The following tests run with -Werror (gcc only) if possible
1463 NOWARN=$DOWARN; phase=u
1464 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1465 # mksh is not written in CFrustFrust!
1466 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1467 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1468 ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1469 test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1470 ac_flags 1 fstackprotectorall -fstack-protector-all
1471 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1472 *\ -fplugin=*dragonegg*) ;;
1473 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1482 checks='1 2 3 4 5 6 7 8'
1488 test $fv = 1 || for what in $checks; do
1489 test $fv = 1 && break
1491 1) t_cflags='-flto=jobserver'
1492 t_ldflags='-fuse-linker-plugin'
1493 t_use=1 t_name=fltojs_lp ;;
1494 2) t_cflags='-flto=jobserver' t_ldflags=''
1495 t_use=1 t_name=fltojs_nn ;;
1496 3) t_cflags='-flto=jobserver'
1497 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1498 t_use=1 t_name=fltojs_np ;;
1500 t_ldflags='-fuse-linker-plugin'
1501 t_use=1 t_name=fltons_lp ;;
1502 5) t_cflags='-flto' t_ldflags=''
1503 t_use=1 t_name=fltons_nn ;;
1505 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1506 t_use=1 t_name=fltons_np ;;
1507 7) t_cflags='-fwhole-program --combine' t_ldflags=''
1508 t_use=0 t_name=combine cm=combine ;;
1509 8) fv=1 cm=normal ;;
1511 test $fv = 1 && break
1512 ac_flags $t_use $t_name "$t_cflags" \
1513 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1515 ac_flags 1 data_abi_align -malign-data=abi
1520 # probably not needed
1521 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1525 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1526 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1527 ac_flags 1 fstacksecuritycheck -fstack-security-check
1531 ac_flags 1 fullwarn -fullwarn 'for remark output support'
1534 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1535 echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1536 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1537 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1538 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1540 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1541 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1544 #broken# ac_flags 1 ssp -stackprotect
1548 ac_flags 1 fstackprotectorall -fstack-protector-all
1554 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1558 : #broken# ac_flags 1 boundschk -b
1561 ac_flags 0 ysystem -Ysystem
1562 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1563 ac_flags 1 extansi -Xa
1566 ac_flags 1 rodata "-qro -qroconst -qroptr"
1567 ac_flags 1 rtcheck -qcheck=all
1568 #ac_flags 1 rtchkc -qextchk # reported broken
1569 ac_flags 1 wformat "-qformat=all -qformat=nozln"
1570 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1573 # flags common to a subset of compilers (run with -Werror on gcc)
1574 if test 1 = $i; then
1575 ac_flags 1 wall -Wall
1576 ac_flags 1 fwrapv -fwrapv
1579 # “on demand” means: GCC version >= 4
1580 fd='if to rely on compiler for string pooling'
1581 ac_cache string_pooling || case $HAVE_STRING_POOLING in
1582 2) fx=' (on demand, cached)' ;;
1584 i2) fv=2; fx=' (on demand)' ;;
1587 test x"$HAVE_STRING_POOLING" = x"0" || ac_cppflags
1590 # The following tests run with -Werror or similar (all compilers) if possible
1592 test $ct = pcc && phase=u
1595 # Compiler: check for stuff that only generates warnings
1597 ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1598 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1599 extern int thiswillneverbedefinedIhope(void);
1600 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1601 int main(void) { return (thiswillneverbedefinedIhope()); }
1604 #undef __attribute__
1605 int xcopy(const void *, void *, size_t)
1606 __attribute__((__bounded__(__buffer__, 1, 3)))
1607 __attribute__((__bounded__(__buffer__, 2, 3)));
1608 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1609 int xcopy(const void *s, void *d, size_t n) {
1611 * if memmove does not exist, we are not on a system
1612 * with GCC with __bounded__ attribute either so poo
1614 memmove(d, s, n); return ((int)n);
1618 ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1619 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1620 extern int thiswillneverbedefinedIhope(void);
1621 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1622 int main(void) { return (thiswillneverbedefinedIhope()); }
1624 #define fprintf printfoo
1626 #undef __attribute__
1628 extern int fprintf(FILE *, const char *format, ...)
1629 __attribute__((__format__(__printf__, 2, 3)));
1630 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1633 ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1634 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1635 extern int thiswillneverbedefinedIhope(void);
1636 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1637 int main(void) { return (thiswillneverbedefinedIhope()); }
1640 #undef __attribute__
1641 void fnord(void) __attribute__((__noreturn__));
1642 int main(void) { fnord(); }
1643 void fnord(void) { exit(0); }
1646 ac_test attribute_pure '' 'for __attribute__((__pure__))' <<-'EOF'
1647 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1648 extern int thiswillneverbedefinedIhope(void);
1649 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1650 int main(void) { return (thiswillneverbedefinedIhope()); }
1653 #undef __attribute__
1654 int foo(const char *) __attribute__((__pure__));
1655 int main(int ac, char **av) { return (foo(av[ac - 1]) + isatty(0)); }
1656 int foo(const char *s) { return ((int)s[0]); }
1659 ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1660 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1661 extern int thiswillneverbedefinedIhope(void);
1662 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1663 int main(void) { return (thiswillneverbedefinedIhope()); }
1666 #undef __attribute__
1667 int main(int ac __attribute__((__unused__)), char **av
1668 __attribute__((__unused__))) { return (isatty(0)); }
1671 ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1672 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1673 extern int thiswillneverbedefinedIhope(void);
1674 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1675 int main(void) { return (thiswillneverbedefinedIhope()); }
1678 #undef __attribute__
1679 static const char fnord[] __attribute__((__used__)) = "42";
1680 int main(void) { return (isatty(0)); }
1684 # End of tests run with -Werror
1689 # mksh: flavours (full/small mksh, omit certain stuff)
1691 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1692 "if a reduced-feature mksh is requested"; then
1694 : "${HAVE_PERSISTENT_HISTORY=0}"
1695 check_categories="$check_categories smksh"
1697 ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1698 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1699 check_categories="$check_categories binsh"
1700 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1701 "if mksh will be built without job control" && \
1702 check_categories="$check_categories arge"
1703 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1704 "if mksh will be built without job signals" && \
1705 check_categories="$check_categories arge nojsig"
1706 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1707 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
1708 #ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1709 # "if deprecated features are to be omitted" && \
1710 # check_categories="$check_categories nodeprecated"
1711 #ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1712 # "if experimental features are to be omitted" && \
1713 # check_categories="$check_categories noexperimental"
1714 ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1715 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1716 check_categories="$check_categories mnbsdash"
1719 # Environment: headers
1721 ac_header sys/time.h sys/types.h
1722 ac_header time.h sys/types.h
1723 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1724 ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1725 #include <sys/types.h>
1726 #include <sys/time.h>
1729 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
1731 ac_header sys/bsdtypes.h
1732 ac_header sys/file.h sys/types.h
1733 ac_header sys/mkdev.h sys/types.h
1734 ac_header sys/mman.h sys/types.h
1735 ac_header sys/param.h
1736 ac_header sys/resource.h sys/types.h _time
1737 ac_header sys/select.h sys/types.h
1738 ac_header sys/sysmacros.h
1740 ac_header grp.h sys/types.h
1743 ac_header libutil.h sys/types.h
1745 ac_header stdint.h stdarg.h
1746 # include strings.h only if compatible with string.h
1747 ac_header strings.h sys/types.h string.h
1749 ac_header ulimit.h sys/types.h
1753 # Environment: definitions
1755 echo '#include <sys/types.h>
1757 /* check that off_t can represent 2^63-1 correctly, thx FSF */
1758 #define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
1759 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1760 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1761 int main(void) { return (isatty(0)); }' >lft.c
1762 ac_testn can_lfs '' "for large file support" <lft.c
1763 save_CPPFLAGS=$CPPFLAGS
1764 add_cppflags -D_FILE_OFFSET_BITS=64
1765 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1766 if test 0 = $HAVE_CAN_LFS_SUS; then
1767 CPPFLAGS=$save_CPPFLAGS
1768 add_cppflags -D_LARGE_FILES=1
1769 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1770 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1773 rmf lft* # end of large file support test
1776 # Environment: types
1778 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1779 #include <sys/types.h>
1781 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
1783 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1784 #include <sys/types.h>
1786 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
1788 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1789 #include <sys/types.h>
1791 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
1793 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1794 #include <sys/types.h>
1796 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
1799 ac_test rlim_t <<-'EOF'
1800 #include <sys/types.h>
1801 #if HAVE_BOTH_TIME_H
1802 #include <sys/time.h>
1804 #elif HAVE_SYS_TIME_H
1805 #include <sys/time.h>
1809 #if HAVE_SYS_RESOURCE_H
1810 #include <sys/resource.h>
1813 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
1816 # only testn: added later below
1817 ac_testn sig_t <<-'EOF'
1818 #include <sys/types.h>
1821 volatile sig_t foo = (sig_t)0;
1822 int main(void) { return (foo == (sig_t)0); }
1825 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1826 #include <sys/types.h>
1829 volatile sighandler_t foo = (sighandler_t)0;
1830 int main(void) { return (foo == (sighandler_t)0); }
1832 if test 1 = $HAVE_SIGHANDLER_T; then
1833 add_cppflags -Dsig_t=sighandler_t
1837 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1838 #include <sys/types.h>
1841 volatile __sighandler_t foo = (__sighandler_t)0;
1842 int main(void) { return (foo == (__sighandler_t)0); }
1844 if test 1 = $HAVE___SIGHANDLER_T; then
1845 add_cppflags -Dsig_t=__sighandler_t
1849 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1853 # check whether whatever we use for the final link will succeed
1855 if test $cm = makefile; then
1859 ac_testinit link_works '' 'checking if the final link command may succeed'
1861 cat >conftest.c <<-EOF
1863 #define MKSH_INCLUDES_ONLY
1865 __RCSID("$srcversion");
1866 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
1870 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1872 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1873 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1876 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1877 test $fv = 0 || v "mv conftest.s conftest.ll"
1878 test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1880 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1881 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1884 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1888 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1889 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1892 test -f $tcfn || fv=0
1894 test $fv = 1 || exit 1
1898 # Environment: errors and signals
1900 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1902 ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1903 extern const int sys_nerr;
1904 extern const char * const sys_errlist[];
1905 extern int isatty(int);
1906 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
1908 ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1909 extern const int _sys_nerr;
1910 extern const char * const _sys_errlist[];
1911 extern int isatty(int);
1912 int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
1914 if test 1 = "$HAVE__SYS_ERRLIST"; then
1915 add_cppflags -Dsys_nerr=_sys_nerr
1916 add_cppflags -Dsys_errlist=_sys_errlist
1919 ac_cppflags SYS_ERRLIST
1921 for what in name list; do
1923 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
1924 extern const char * const sys_sig${what}[];
1925 extern int isatty(int);
1926 int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
1928 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
1929 extern const char * const _sys_sig${what}[];
1930 extern int isatty(int);
1931 int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
1933 eval uwhat_v=\$HAVE__SYS_SIG$uwhat
1934 if test 1 = "$uwhat_v"; then
1935 add_cppflags -Dsys_sig$what=_sys_sig$what
1936 eval HAVE_SYS_SIG$uwhat=1
1938 ac_cppflags SYS_SIG$uwhat
1942 # Environment: library functions
1944 ac_test flock <<-'EOF'
1945 #include <sys/types.h>
1949 #include <sys/file.h>
1951 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
1954 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
1959 lks.l_type = F_WRLCK | F_UNLCK;
1960 return (fcntl(0, F_SETLKW, &lks));
1964 ac_test getrusage <<-'EOF'
1965 #define MKSH_INCLUDES_ONLY
1969 return (getrusage(RUSAGE_SELF, &ru) +
1970 getrusage(RUSAGE_CHILDREN, &ru));
1974 ac_test getsid <<-'EOF'
1976 int main(void) { return ((int)getsid(0)); }
1979 ac_test gettimeofday <<-'EOF'
1980 #define MKSH_INCLUDES_ONLY
1982 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
1985 ac_test killpg <<-'EOF'
1987 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
1990 ac_test memmove <<-'EOF'
1991 #include <sys/types.h>
1995 #include <strings.h>
1997 int main(int ac, char *av[]) {
1998 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
2002 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
2003 #define MKSH_INCLUDES_ONLY
2005 int main(int ac, char *av[]) {
2007 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
2008 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
2013 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
2014 #include <sys/types.h>
2016 #include <sys/file.h>
2019 #include <sys/mman.h>
2023 int main(void) { return ((void *)mmap(NULL, (size_t)0,
2024 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
2028 ac_test nice <<-'EOF'
2030 int main(void) { return (nice(4)); }
2033 ac_test revoke <<-'EOF'
2034 #include <sys/types.h>
2036 #include <libutil.h>
2039 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
2042 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
2045 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
2048 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2049 #include <langinfo.h>
2051 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
2054 ac_test select <<-'EOF'
2055 #include <sys/types.h>
2056 #if HAVE_BOTH_TIME_H
2057 #include <sys/time.h>
2059 #elif HAVE_SYS_TIME_H
2060 #include <sys/time.h>
2064 #if HAVE_SYS_BSDTYPES_H
2065 #include <sys/bsdtypes.h>
2067 #if HAVE_SYS_SELECT_H
2068 #include <sys/select.h>
2071 #include <bstring.h>
2077 #include <strings.h>
2081 struct timeval tv = { 1, 200000 };
2082 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
2083 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
2087 ac_test setresugid <<-'EOF'
2088 #include <sys/types.h>
2090 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
2093 ac_test setgroups setresugid 0 <<-'EOF'
2094 #include <sys/types.h>
2099 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
2102 if test x"$et" = x"klibc"; then
2104 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
2105 #define MKSH_INCLUDES_ONLY
2107 extern int __rt_sigsuspend(const sigset_t *, size_t);
2108 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
2111 # no? damn! legacy crap ahead!
2113 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
2114 'whether sigsuspend is usable (1/2)' <<-'EOF'
2115 #define MKSH_INCLUDES_ONLY
2117 extern int __sigsuspend_s(sigset_t);
2118 int main(void) { return (__sigsuspend_s(0)); }
2120 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
2121 'whether sigsuspend is usable (2/2)' <<-'EOF'
2122 #define MKSH_INCLUDES_ONLY
2124 extern int __sigsuspend_xxs(int, int, sigset_t);
2125 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
2128 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
2129 # no usable sigsuspend(), use pause() *ugh*
2130 add_cppflags -DMKSH_NO_SIGSUSPEND
2134 ac_test strerror '!' sys_errlist 0 <<-'EOF'
2135 extern char *strerror(int);
2136 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
2139 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
2142 int main(void) { return (strsignal(1)[0]); }
2145 ac_test strlcpy <<-'EOF'
2147 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
2152 # check headers for declarations
2154 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
2155 #define MKSH_INCLUDES_ONLY
2158 #include <sys/file.h>
2160 int main(void) { return ((flock)(0, 0)); }
2162 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
2163 #define MKSH_INCLUDES_ONLY
2165 int main(void) { return ((revoke)("")); }
2167 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
2168 #define MKSH_INCLUDES_ONLY
2170 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
2172 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
2173 #define MKSH_INCLUDES_ONLY
2175 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
2181 fd='if to use persistent history'
2182 ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2185 test 1 = $fv || check_categories="$check_categories no-histfile"
2190 # extra checks for legacy mksh
2192 if test $legacy = 1; then
2193 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
2194 #define MKSH_INCLUDES_ONLY
2200 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2201 cta(char_is_8_bits, (CHAR_BIT) == 8);
2202 cta(long_is_32_bits, sizeof(long) == 4);
2204 int main(void) { return (sizeof(struct ctasserts)); }
2207 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
2208 #define MKSH_INCLUDES_ONLY
2214 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2215 cta(char_is_8_bits, (CHAR_BIT) == 8);
2216 cta(long_is_64_bits, sizeof(long) == 8);
2218 int main(void) { return (sizeof(struct ctasserts)); }
2221 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2222 10) check_categories="$check_categories int:32" ;;
2223 01) check_categories="$check_categories int:64" ;;
2224 *) check_categories="$check_categories int:u" ;;
2229 # Compiler: Praeprocessor (only if needed)
2231 test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2232 'checking if the C Preprocessor supports -dD'; then
2233 echo '#define foo bar' >conftest.c
2234 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2235 grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2236 rmf conftest.c x vv.out
2241 # End of mirtoconf checks
2245 # Some operating systems have ancient versions of ed(1) writing
2246 # the character count to standard output; cope for that
2248 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2249 check_categories="$check_categories $oldish_ed"
2252 if test 0 = $HAVE_SYS_SIGNAME; then
2253 if test 1 = $HAVE_CPP_DD; then
2254 $e Generating list of signal names...
2256 $e No list of signal names available via cpp. Falling back...
2260 echo '#include <signal.h>
2261 #if defined(NSIG_MAX)
2262 #define cfg_NSIG NSIG_MAX
2264 #define cfg_NSIG NSIG
2265 #elif defined(_NSIG)
2266 #define cfg_NSIG _NSIG
2267 #elif defined(SIGMAX)
2268 #define cfg_NSIG (SIGMAX + 1)
2269 #elif defined(_SIGMAX)
2270 #define cfg_NSIG (_SIGMAX + 1)
2272 /*XXX better error out, see sh.h */
2278 # GNU sed 2.03 segfaults when optimising this to sed -n
2279 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2281 sed '/mksh_cfg.*= *$/{
2285 grep '^ *mksh_cfg *=' | \
2286 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2288 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2289 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2292 (printf hallo) >/dev/null 2>&1 || printf=echo
2293 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2294 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2295 $printf "NSIG=$NSIG ... "
2296 sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
2297 sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
2298 sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT STKFLT"
2299 sigs="$sigs ABND DCE DUMP IOERR TRACE DANGER THCONT THSTOP RESV UNUSED"
2300 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2301 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2302 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2303 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
2304 test $NSIG -gt 1 || sigs=
2305 for name in $sigs; do
2307 *:$name:*) continue ;;
2309 sigseenone=$sigseenone$name:
2310 echo '#include <signal.h>' >conftest.c
2311 echo int >>conftest.c
2312 echo mksh_cfg= SIG$name >>conftest.c
2313 echo ';' >>conftest.c
2314 # GNU sed 2.03 croaks on optimising this, too
2315 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2317 sed '/mksh_cfg.*= *$/{
2321 grep '^ *mksh_cfg *=' | \
2322 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2323 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2324 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2325 test $nr -gt 0 && test $nr -lt $NSIG || continue
2328 *) echo " { \"$name\", $nr },"
2329 sigseentwo=$sigseentwo$nr:
2330 $printf "$name=$nr " >&2
2333 done 2>&1 >signames.inc
2338 addsrcs '!' HAVE_STRLCPY strlcpy.c
2339 addsrcs USE_PRINTF_BUILTIN printf.c
2340 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2341 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2342 add_cppflags -DMKSH_BUILD_R=551
2344 $e $bi$me: Finished configuration testing, now producing output.$ao
2352 add_cppflags -DMKSH_EXE_EXT
2359 *\ *) mkshshebang="#!./$mkshexe" ;;
2360 *) mkshshebang="#!$curdir/$mkshexe" ;;
2364 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2365 test -n "\$KSH_VERSION" || exit 1
2366 set -A check_categories -- $check_categories
2367 pflag='$curdir/$mkshexe'
2368 sflag='$srcdir/check.t'
2369 usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2370 while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch {
2371 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2372 (e) usee=1; eflag=\$OPTARG ;;
2373 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
2376 (p) pflag=\$OPTARG ;;
2381 (s) sflag=\$OPTARG ;;
2382 (t) uset=1; tflag=\$OPTARG ;;
2388 shift \$((OPTIND - 1))
2389 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2391 for y in "\${check_categories[@]}"; do
2394 if [[ -n \$x ]]; then
2395 args[\${#args[*]}]=-C
2396 args[\${#args[*]}]=\${x#,}
2399 args[\${#args[*]}]=-e
2400 args[\${#args[*]}]=\$eflag
2402 (( Pflag )) && args[\${#args[*]}]=-P
2404 args[\${#args[*]}]=-t
2405 args[\${#args[*]}]=\$tflag
2407 (( vflag )) && args[\${#args[*]}]=-v
2408 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
2409 if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2410 args[\${#args[*]}]=-T
2411 args[\${#args[*]}]=\$TMPDIR
2413 print Testing mksh for conformance:
2414 grep -F -e Mir''OS: -e MIRBSD "\$sflag"
2415 print "This shell is actually:\\n\\t\$KSH_VERSION"
2416 print 'test.sh built for mksh $dstversion'
2417 cstr='\$os = defined \$^O ? \$^O : "unknown";'
2418 cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2419 for perli in \$PERL perl5 perl no; do
2420 if [[ \$perli = no ]]; then
2421 print Cannot find a working Perl interpreter, aborting.
2424 print "Trying Perl interpreter '\$perli'..."
2425 perlos=\$(\$perli -e "\$cstr")
2427 print "Errorlevel \$rv, running on '\$perlos'"
2429 print "=> not using"
2432 if [[ -n \$perlos ]]; then
2437 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2438 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2439 # use of the -S option for check.t split into multiple chunks
2441 for s in "\$sflag".*; do
2442 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2443 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2445 (( rv = rv ? rv : rc ))
2455 emitbc="-emit-llvm -c"
2461 echo ": # work around NeXTstep bug" >Rebuild.sh
2463 optfiles=`echo *.opt`
2465 for file in $optfiles; do
2466 echo "echo + Running genopt on '$file'..."
2467 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
2469 echo set -x >>Rebuild.sh
2470 for file in $SRCS; do
2471 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2472 test -f $file || file=$srcdir/$file
2473 files="$files$sp$file"
2475 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2476 if test $cm = dragonegg; then
2477 echo "mv ${op}s ${op}ll" >>Rebuild.sh
2478 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2479 objs="$objs$sp${op}bc"
2481 objs="$objs$sp${op}o"
2486 echo "rm -f $tfn.s" >>Rebuild.sh
2487 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2494 echo tcfn=$mkshexe >>Rebuild.sh
2495 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2496 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2497 if test $cm = makefile; then
2498 extras='emacsfn.h exprtok.h rlimits.opt sh.h sh_flags.opt var_spec.h'
2499 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2501 for file in $optfiles; do
2502 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2504 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2505 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
2507 cat >Makefrag.inc <<EOF
2508 # Makefile fragment for building mksh $dstversion
2516 NONSRCS_INST= dot.mkshrc \$(MAN)
2517 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2524 .depend \$(OBJS_BP):$gens$genq
2526 # not BSD make only:
2529 #\$(PROG): \$(OBJS_BP)
2530 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2531 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2533 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2535 # for all make variants:
2538 # ./test.sh \$(REGRESS_FLAGS)
2539 check_categories=$check_categories
2541 # for BSD make only:
2543 #.include <bsd.prog.mk>
2546 $e Generated Makefrag.inc successfully.
2549 for file in $optfiles; do
2550 $e "+ Running genopt on '$file'..."
2551 do_genopt "$srcdir/$file" || exit 1
2553 if test $cm = combine; then
2555 for file in $SRCS; do
2556 test -f $file || file=$srcdir/$file
2559 emitbc="-fwhole-program --combine"
2560 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2561 elif test 1 = $pm; then
2562 for file in $SRCS; do
2563 test -f $file || file=$srcdir/$file
2564 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2568 for file in $SRCS; do
2569 test $cm = dragonegg && \
2570 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2571 test -f $file || file=$srcdir/$file
2572 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2573 if test $cm = dragonegg; then
2574 v "mv ${op}s ${op}ll"
2575 v "llvm-as ${op}ll" || exit 1
2582 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2586 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2587 test -f $tcfn || exit 1
2588 test 1 = $r || v "$NROFF -mdoc <'$srcdir/lksh.1' >lksh.cat1" || rmf lksh.cat1
2589 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || rmf mksh.cat1
2590 test 0 = $eq && v $SIZE $tcfn
2592 test -f /usr/ucb/$i && i=/usr/ucb/$i
2595 $e Installing the shell:
2596 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2597 if test $legacy = 0; then
2598 $e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2599 $e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2602 $e Installing the manual:
2603 if test -f mksh.cat1; then
2604 $e "# $i -c -o root -g bin -m 444 lksh.cat1" \
2605 "/usr/share/man/cat1/lksh.0"
2606 $e "# $i -c -o root -g bin -m 444 mksh.cat1" \
2607 "/usr/share/man/cat1/mksh.0"
2610 $e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
2612 $e Run the regression test suite: ./test.sh
2613 $e Please also read the sample file dot.mkshrc and the fine manual.
2618 === Environment used ===
2620 ==== build environment ====
2623 CFLAGS if empty, defaults to -xO2 or +O2
2624 or -O3 -qstrict or -O2, per compiler
2625 CPPFLAGS default empty
2626 LDFLAGS default empty; added before sources
2627 LDSTATIC set this to '-static'; default unset
2628 LIBS default empty; added after sources
2629 [Interix] default: -lcrypt (XXX still needed?)
2630 NOWARN -Wno-error or similar
2631 NROFF default: nroff
2632 TARGET_OS default: $(uname -s || uname)
2633 TARGET_OSREV [QNX] default: $(uname -r)
2635 ==== feature selectors ====
2636 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2637 ===== general format =====
2639 HAVE_STRING_H ac_header
2640 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2642 ==== cpp definitions ====
2643 DEBUG dont use in production, wants gcc, implies:
2644 DEBUG_LEAKS enable freeing resources before exiting
2645 MKSHRC_PATH "~/.mkshrc" (do not change)
2646 MKSH_A4PB force use of arc4random_pushb
2647 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2648 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2649 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2650 MKSH_CLS_STRING "\033[;H\033[J"
2651 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2652 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2653 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2654 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2655 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2656 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2657 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2658 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2659 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2660 MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
2661 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2662 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2663 MKSH_NO_LIMITS omit ulimit code
2664 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2665 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2666 MKSH_SMALL omit some code, optimise hard for size (slower)
2667 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2668 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2669 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2670 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2671 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2673 === generic installation instructions ===
2675 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2676 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2677 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2678 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2680 Normally, the following command is what you want to run, then:
2681 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2683 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2684 /bin; install the manpage, if omitting the -r flag a catmanpage is made
2685 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2686 http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
2687 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2689 You may also want to install the lksh binary (also as /bin/sh) built by:
2690 $ CPPFLAGS="$CPPFLAGS -DMKSH_BINSHPOSIX" sh Build.sh -L -r -c lto