2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.645 2013/08/10 13:44:25 tg Exp $'
4 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
6 # Thorsten Glaser <tg@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 echo "For the build logs, demonstrate that /dev/null and /dev/tty exist:"
32 ls -l /dev/null /dev/tty
34 case $ZSH_VERSION:$VERSION in
35 :zsh*) ZSH_VERSION=2 ;;
38 if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then
43 if test -d /usr/xpg4/bin/. >/dev/null 2>&1; then
44 # Solaris: some of the tools have weird behaviour, use portable ones
45 PATH=/usr/xpg4/bin:$PATH
58 eval "$@" >vv.out 2>&1
59 sed "s
\a^
\a${_c}
\a" <vv.out
69 Build.sh|check.pl|check.t|dot.mkshrc|*.c|*.h|*.ico|*.1) ;;
75 allu=QWERTYUIOPASDFGHJKLZXCVBNM
76 alll=qwertyuiopasdfghjklzxcvbnm
78 alls=______________________________________________________________
89 oldish_ed=stdout-ed,no-stderr-ed
98 echo :"$@" | sed 's/^://' | tr $alll $allu
101 # clean up after ac_testrun()
105 test 0 = $fv || fr=yes
106 $e "$bi==> $fd...$ao $ui$fr$ao$fx"
110 # ac_cache label: sets f, fu, fv?=0
125 # ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
126 # returns 1 if value was cached/implied, 0 otherwise: call ac_testdone
129 test x"$2" = x"!" && shift
130 test x"$2" = x"" || shift
136 if test x"$2" = x""; then
139 if test x"$2" = x"!"; then
143 eval ft=\$HAVE_`upper $2`
147 if test $fc = "$ft"; then
157 # pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
159 if test x"$1" = x"!"; then
165 ac_testinit "$@" || return 1
167 vv ']' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN conftest.c $LIBS $ccpr"
168 test $tcfn = no && test -f a.out && tcfn=a.out
169 test $tcfn = no && test -f a.exe && tcfn=a.exe
170 test $tcfn = no && test -f conftest && tcfn=conftest
171 if test -f $tcfn; then
177 if test $phase = u; then
178 test $ct = gcc && vscan='unrecogni[sz]ed'
179 test $ct = hpcc && vscan='unsupported'
180 test $ct = pcc && vscan='unsupported'
181 test $ct = sunpro && vscan='-e ignored -e turned.off'
183 test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr
187 ac_testnnd "$@" || return
188 rmf conftest.c conftest.o ${tcfn}* vv.out
192 # ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput
196 extern int thiswillneverbedefinedIhope(void);
197 int main(void) { return (
201 /* force a failure: expr is false */
202 thiswillneverbedefinedIhope()
206 test x"$1" = x"!" && shift
214 CPPFLAGS="$CPPFLAGS $*"
218 test x"$1" = x"" || fu=$1
220 test x"$2" = x"" && eval fv=\$HAVE_$fu
221 add_cppflags -DHAVE_$fu=$fv
229 # ac_flags [-] add varname cflags [text] [ldflags]
231 if test x"$1" = x"-"; then
242 test x"$ft" = x"" && ft="if $f can be used"
245 if test -n "$fl"; then
246 save_LDFLAGS=$LDFLAGS
247 LDFLAGS="$LDFLAGS $fl"
249 if test 1 = $hf; then
250 ac_testn can_$vn '' "$ft"
252 ac_testn can_$vn '' "$ft" <<-'EOF'
253 /* evil apo'stroph in comment test */
254 int main(void) { return (0); }
257 eval fv=\$HAVE_CAN_`upper $vn`
258 if test -n "$fl"; then
259 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
261 test 11 = $fa$fv || CFLAGS=$save_CFLAGS
264 # ac_header [!] header [prereq ...]
266 if test x"$1" = x"!"; then
273 hv=`echo "$hf" | tr -d '\012\015' | tr -c $alll$allu$alln $alls`
274 echo "/* NeXTstep bug workaround */" >x
279 echo '#if HAVE_BOTH_TIME_H' >>x
280 echo '#include <sys/time.h>' >>x
281 echo '#include <time.h>' >>x
282 echo '#elif HAVE_SYS_TIME_H' >>x
283 echo '#include <sys/time.h>' >>x
284 echo '#elif HAVE_TIME_H' >>x
285 echo '#include <time.h>' >>x
289 echo "#include <$i>" >>x
293 echo "#include <$hf>" >>x
294 echo 'int main(void) { return (0); }' >>x
295 ac_testn "$hv" "" "<$hf>" <x
297 test 1 = $na || ac_cppflags
302 if test x"$1" = x"-s"; then
307 if test x"$1" = x"!"; then
314 if test $addsrcs_s = 1; then
315 if test -f "$2" || test -f "$srcdir/$2"; then
316 # always add $2, since it exists
321 test $fr = "$i" && case " $SRCS " in
323 *) SRCS="$SRCS $2" ;;
328 curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null` check_categories=
329 test -n "$srcdir" || srcdir=. # in case dirname does not exist
330 dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' $srcdir/sh.h`
331 add_cppflags -DMKSH_BUILDSH
338 optflags=-std-compile-opts
346 c:combine|c:dragonegg|c:llvm|c:lto)
351 echo "$me: Unknown option -c '$i'!" >&2
366 # checker, debug, valgrind build
368 CFLAGS="$CFLAGS -g3 -fno-builtin"
383 optflags=-std-compile-opts
398 echo "Build.sh $srcversion"
399 echo "for mksh $dstversion"
403 echo "$me: Unknown option '$i'!" >&2
407 echo "$me: Unknown option -'$last' '$i'!" >&2
412 if test -n "$last"; then
413 echo "$me: Option -'$last' not followed by argument!" >&2
417 test -z "$tfn" && if test $legacy = 0; then
422 if test -d $tfn || test -d $tfn.exe; then
423 echo "$me: Error: ./$tfn is a directory!" >&2
426 rmf a.exe* a.out* conftest.c *core core.* lft ${tfn}* no *.bc *.ll *.o \
427 Rebuild.sh signames.inc test.sh x vv.out
429 SRCS="lalloc.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
430 SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
432 if test $legacy = 0; then
434 check_categories="$check_categories shell:legacy-no int:32"
436 check_categories="$check_categories shell:legacy-yes"
437 add_cppflags -DMKSH_LEGACY_MODE
438 HAVE_PERSISTENT_HISTORY=0
439 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h
442 if test x"$srcdir" = x"."; then
443 CPPFLAGS="-I. $CPPFLAGS"
445 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
447 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
448 LDFLAGS="$LDFLAGS $LDSTATIC"
453 if test -z "$TARGET_OS"; then
454 x=`uname -s 2>/dev/null || uname`
455 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x
457 if test -z "$TARGET_OS"; then
458 echo "$me: Set TARGET_OS, your uname is broken!" >&2
465 ccpr='|| for _f in ${tcfn}*; do case $_f in Build.sh|check.pl|check.t|dot.mkshrc|*.c|*.h|*.ico|*.1) ;; *) rm -f "$_f" ;; esac; done'
468 if test x"$TARGET_OS" = x"Android"; then
469 check_categories="$check_categories android"
474 if test x"$TARGET_OS" = x"Minix"; then
476 WARNING: additional checks before running Build.sh required!
477 You can avoid these by calling Build.sh correctly, see below.
479 cat >conftest.c <<'EOF'
480 #include <sys/types.h>
482 #ifdef _NETBSD_SOURCE
490 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x"
497 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
498 Please set it to either Minix3 or Ninix3, whereas the latter is
499 all versions of Minix with even partial NetBSD(R) userland. The
500 value determined from your compiler for the current compilation
501 (which may be wrong) is: $ct
507 Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous.
508 Please set it to either Minix3 or Ninix3, whereas the latter is
509 all versions of Minix with even partial NetBSD(R) userland. The
510 proper value couldn't be determined, continue at your own risk.
516 # Configuration depending on OS revision, on OSes that need them
519 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \
520 grep 'NeXT Mach [0-9][0-9.]*:' | \
521 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'`
524 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
528 # Configuration depending on OS name
532 add_cppflags -DMKSH_NO_SIGSETJMP
533 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
534 add_cppflags -DMKSH_CONSERVATIVE_FDS
537 add_cppflags -D_ALL_SOURCE
538 : ${HAVE_SETLOCALE_CTYPE=0}
543 oswarn="; it has minor issues"
546 oswarn="; you must recompile mksh with"
547 oswarn="$oswarn${nl}itself in a second stage"
550 # BeOS has no real tty either
551 add_cppflags -DMKSH_UNEMPLOYED
552 add_cppflags -DMKSH_DISABLE_TTY_WARNING
553 # BeOS doesn't have different UIDs and GIDs
554 add_cppflags -DMKSH__NO_SETEUGID
557 : ${HAVE_SETLOCALE_CTYPE=0}
560 oswarn="; it has major issues"
561 add_cppflags -DMKSH__NO_SYMLINK
562 check_categories="$check_categories nosymlink"
563 add_cppflags -DMKSH__NO_SETEUGID
564 add_cppflags -DMKSH_CONSERVATIVE_FDS
565 add_cppflags -DMKSH_DISABLE_TTY_WARNING
568 : ${HAVE_SETLOCALE_CTYPE=0}
571 add_cppflags -D_DARWIN_C_SOURCE
578 oswarn="; it has minor issues"
579 add_cppflags -D_GNU_SOURCE
580 add_cppflags -DMKSH_CONSERVATIVE_FDS
581 : ${HAVE_SETLOCALE_CTYPE=0}
586 *) add_cppflags -D_GNU_SOURCE ;;
588 # define MKSH__NO_PATH_MAX to use Hurd-only functions
589 add_cppflags -DMKSH__NO_PATH_MAX
594 *) add_cppflags -D_GNU_SOURCE ;;
598 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
605 add_cppflags -D_ALL_SOURCE
607 : ${HAVE_SETLOCALE_CTYPE=0}
610 : ${HAVE_SETLOCALE_CTYPE=0}
615 *) add_cppflags -D_GNU_SOURCE ;;
617 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
621 oswarn="; it has minor issues"
626 add_cppflags -DMKSH__NO_SETEUGID
627 add_cppflags -DMKSH_UNEMPLOYED
628 add_cppflags -DMKSH_CONSERVATIVE_FDS
629 add_cppflags -D_MINIX_SOURCE
630 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
631 : ${HAVE_SETLOCALE_CTYPE=0}
634 add_cppflags -DMKSH_UNEMPLOYED
635 add_cppflags -DMKSH_CONSERVATIVE_FDS
636 add_cppflags -DMKSH_NO_LIMITS
637 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
638 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
639 : ${HAVE_SETLOCALE_CTYPE=0}
644 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1
645 # almost same as CYGWIN* (from RT|Chatzilla)
646 : ${HAVE_SETLOCALE_CTYPE=0}
647 # broken on this OE (from ir0nh34d)
653 add_cppflags -D_NEXT_SOURCE
654 add_cppflags -D_POSIX_SOURCE
655 : ${AWK=gawk} ${CC=cc -posix}
656 add_cppflags -DMKSH_NO_SIGSETJMP
657 # NeXTstep cannot get a controlling tty
658 add_cppflags -DMKSH_UNEMPLOYED
659 case $TARGET_OSREV in
661 # OpenStep 4.2 is broken by default
662 oswarn="; it needs libposix.a"
665 add_cppflags -DMKSH_CONSERVATIVE_FDS
669 add_cppflags -DMKSH_UNEMPLOYED
670 add_cppflags -DMKSH_CONSERVATIVE_FDS
671 add_cppflags -DMKSH_NO_LIMITS
672 # but no idea what else could be needed
673 oswarn="; it has unknown issues"
676 : ${HAVE_SETLOCALE_CTYPE=0}
679 HAVE_SIG_T=0 # incompatible
680 add_cppflags -D_OSF_SOURCE
681 add_cppflags -D_POSIX_C_SOURCE=200112L
682 add_cppflags -D_XOPEN_SOURCE=600
683 add_cppflags -D_XOPEN_SOURCE_EXTENDED
684 : ${HAVE_SETLOCALE_CTYPE=0}
687 add_cppflags -D_POSIX_SOURCE
688 add_cppflags -D_LIMITS_EXTENSION
689 add_cppflags -D_BSD_EXTENSION
690 add_cppflags -D_SUSV2_SOURCE
691 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1
692 add_cppflags -DMKSH_NO_CMDLINE_EDITING
693 add_cppflags -DMKSH__NO_SETEUGID
694 oswarn=' and will currently not work'
695 add_cppflags -DMKSH_UNEMPLOYED
696 # this is for detecting kencc
697 add_cppflags -DMKSH_MAYBE_KENCC
700 HAVE_SIG_T=0 # incompatible
701 oswarn=' and will currently not work'
702 : ${HAVE_SETLOCALE_CTYPE=0}
705 add_cppflags -D__NO_EXT_QNX
706 add_cppflags -D__EXT_UNIX_MISC
707 case $TARGET_OSREV in
708 [012345].*|6.[0123].*|6.4.[01])
709 oldish_ed=no-stderr-ed # oldish /bin/ed is broken
712 : ${HAVE_SETLOCALE_CTYPE=0}
715 case $TARGET_OSREV in
718 add_cppflags -DMKSH_UNEMPLOYED
724 oswarn='; this is an unknown version of'
725 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do"
728 add_cppflags -DMKSH_CONSERVATIVE_FDS
729 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0}
732 oswarn="; it has minor issues"
735 add_cppflags -D_BSD_SOURCE
736 add_cppflags -D__EXTENSIONS__
739 add_cppflags -D_GNU_SOURCE
740 add_cppflags -DMKSH_NO_SIGSUSPEND
741 oswarn=' and will currently not work'
745 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
746 add_cppflags -DMKSH_CONSERVATIVE_FDS
747 : ${HAVE_SETLOCALE_CTYPE=0}
751 add_cppflags -DMKSH_CONSERVATIVE_FDS
752 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0}
758 oswarn="; it will compile, but the target"
759 oswarn="$oswarn${nl}platform itself is very flakey/unreliable"
760 : ${HAVE_SETLOCALE_CTYPE=0}
763 # generic target for SVR4 Unix with uname -s = uname -n
764 # this duplicates the * target below
765 oswarn='; it may or may not work'
766 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
769 oswarn='; it may or may not work'
770 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
776 : ${AWK=awk} ${CC=cc} ${NROFF=nroff} ${SIZE=size}
777 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
780 # this aids me in tracing FTBFSen without access to the buildd
781 $e "Hi from$ao $bi$srcversion$ao on:"
785 vv '|' "uname -a >&2"
788 vv '|' "hwprefs machine_type os_type os_class >&2"
789 vv '|' "uname -a >&2"
792 vv '|' "uname -a >&2"
796 vv '|' "uname -a >&2"
797 vv '|' "/usr/sbin/sizer -v >&2"
799 SCO_SV|UnixWare|UNIX_SV)
800 vv '|' "uname -a >&2"
801 vv '|' "uname -X >&2"
804 vv '|' "uname -a >&2"
807 test -z "$oswarn" || echo >&2 "
808 Warning: mksh has not yet been ported to or tested on your
809 operating system '$TARGET_OS'$oswarn. If you can provide
810 a shell account to the developer, this may improve; please
811 drop us a success or failure notice or even send in diffs.
813 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
816 # Begin of mirtoconf checks
818 $e $bi$me: Scanning for functions... please ignore any errors.$ao
821 # Compiler: which one?
824 # - ICC defines __GNUC__ too
825 # - GCC defines __hpux too
826 # - LLVM+clang defines __GNUC__ too
827 # - nwcc defines __GNUC__ too
829 $e ... which compiler seems to be used
830 cat >conftest.c <<'EOF'
832 #if defined(__ICC) || defined(__INTEL_COMPILER)
834 #elif defined(__xlC__) || defined(__IBMC__)
836 #elif defined(__SUNPRO_C)
838 #elif defined(__ACK__)
840 #elif defined(__BORLANDC__)
842 #elif defined(__WATCOMC__)
844 #elif defined(__MWERKS__)
846 #elif defined(__HP_cc)
848 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
852 #elif defined(__DMC__)
854 #elif defined(_MSC_VER)
856 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
858 #elif defined(__IAR_SYSTEMS_ICC__)
862 #elif defined(__PCC__)
864 #elif defined(__TenDRA__)
866 #elif defined(__TINYC__)
868 #elif defined(__llvm__) && defined(__clang__)
870 #elif defined(__NWCC__)
872 #elif defined(__GNUC__)
874 #elif defined(_COMPILER_VERSION)
878 #elif defined(__hpux) || defined(__hpua)
880 #elif defined(__ultrix)
882 #elif defined(__USLC__)
884 #elif defined(__LCC__)
886 #elif defined(MKSH_MAYBE_KENCC)
887 /* and none of the above matches */
894 #if defined(__KLIBC__)
903 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
904 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
908 echo 'int main(void) { return (0); }' >conftest.c
911 # work around "the famous ACK const bug"
912 CPPFLAGS="-Dconst= $CPPFLAGS"
915 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC
916 and SHARC (21000) DSPs detected. This compiler has not yet
917 been tested for compatibility with mksh. Continue at your
918 own risk, please report success/failure to the developers.'
921 echo >&2 "Warning: Borland C++ Builder detected. This compiler might
922 produce broken executables. Continue at your own risk,
923 please report success/failure to the developers."
926 # does not work with current "ccc" compiler driver
927 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
928 # one of these two works, for now
929 vv '|' "${CLANG-clang} -version"
930 vv '|' "${CLANG-clang} --version"
931 # ensure compiler and linker are in sync unless overridden
932 case $CCC_CC:$CCC_LD in
934 *:) CCC_LD=$CCC_CC; export CCC_LD ;;
938 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
939 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
942 echo >&2 "Warning: Digital Mars Compiler detected. When running under"
943 echo >&2 " UWIN, mksh tends to be unstable due to the limitations"
944 echo >&2 " of this platform. Continue at your own risk,"
945 echo >&2 " please report success/failure to the developers."
948 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
949 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \
950 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \
954 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
957 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded
958 systems detected. This unsupported compiler has not yet
959 been tested for compatibility with mksh. Continue at your
960 own risk, please report success/failure to the developers.'
963 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
966 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
969 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
970 add_cppflags -D__inline__=__inline
973 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet
974 been tested for compatibility with mksh. Continue at your
975 own risk, please report success/failure to the developers.'
978 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
981 ccpr= # errorlevels are not reliable
984 if [[ -n $C89_COMPILER ]]; then
985 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"`
989 if [[ -n $C89_LINKER ]]; then
990 C89_LINKER=`ntpath2posix -c "$C89_LINKER"`
994 vv '|' "$C89_COMPILER /HELP >&2"
995 vv '|' "$C89_LINKER /LINK >&2"
1000 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version"
1003 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1006 echo >&2 'Warning: PGI detected. This unknown compiler has not yet
1007 been tested for compatibility with mksh. Continue at your
1008 own risk, please report success/failure to the developers.'
1011 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices
1012 C compiler for embedded systems detected. This has not yet
1013 been tested for compatibility with mksh. Continue at your
1014 own risk, please report success/failure to the developers.'
1017 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1020 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v"
1023 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \
1024 fgrep -i -e version -e release"
1027 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1028 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1031 case $TARGET_OS:$TARGET_OSREV in
1035 : ${HAVE_CAN_OTWO=0} ${HAVE_CAN_OPTIMISE=0}
1038 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1041 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1044 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
1045 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1049 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
1052 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1053 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1058 vv '|' "llc -version"
1063 add_cppflags -DMKSH_NO_LIMITS
1066 # nothing special detected, don’t worry
1073 $e "$bi==> which compiler seems to be used...$ao $ui$ct${et+ on $et}$ao"
1074 rmf conftest.c conftest.o conftest a.out* a.exe* vv.out
1077 # Compiler: works as-is, with -Wno-error and -Werror
1082 ac_flags 0 compiler_works '' 'if the compiler works'
1083 test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
1084 HAVE_COMPILER_KNOWN=0
1085 test $ct = unknown || HAVE_COMPILER_KNOWN=1
1086 if ac_ifcpp 'if 0' compiler_fails '' \
1087 'if the compiler does not fail correctly'; then
1089 : ${HAVE_CAN_DELEXE=x}
1092 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1093 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
1094 int main(void) { return (0); }
1098 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1099 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
1100 int main(void) { return (0); }
1107 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS
1108 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF
1110 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1
1112 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \
1113 'if this could be tcc'; then
1115 CPP='cpp -D__TINYC__'
1116 HAVE_COMPILER_KNOWN=1
1121 save_NOWARN="${ccpc}-w"
1125 # -msg_* flags not used yet, or is -w2 correct?
1128 save_NOWARN="${ccpc}-w"
1141 DOWARN="-diag_error 1-10000"
1144 save_NOWARN="${ccpc}/w"
1148 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none'
1149 ac_flags 0 errwarnnone "$save_NOWARN"
1150 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN=
1151 ac_flags 0 errwarnall "-errwarn=%all"
1152 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all"
1166 save_NOWARN=-qflag=i:e
1170 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error
1171 ac_flags 0 wnoerror "$save_NOWARN"
1172 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
1173 ac_flags 0 werror -Werror
1174 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror
1175 test $ct = icc && DOWARN="$DOWARN -wd1419"
1181 # Compiler: extra flags (-O2 -f* -W* etc.)
1183 i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln`
1184 # optimisation: only if orig_CFLAGS is empty
1185 test x"$i" = x"" && case $ct in
1192 # no special optimisation
1196 int main(void) { return (0); }
1197 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p
1198 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p)
1199 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { }
1201 yes pad | head -n 256 >>x
1202 ac_flags - 1 otwo -xO2 <x
1206 ac_flags 1 othree "-O3 -qstrict"
1207 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
1211 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
1214 # other flags: just add them if they are supported
1218 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled'
1224 ac_flags 0 verb -verbose
1225 ac_flags 1 rodata -readonly_strings
1228 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks'
1229 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking'
1232 # The following tests run with -Werror (gcc only) if possible
1233 NOWARN=$DOWARN; phase=u
1234 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
1235 # mksh is not written in CFrustFrust!
1236 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
1237 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1238 ac_flags 1 fstackprotectorall -fstack-protector-all
1239 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1240 *\ -fplugin=*dragonegg*) ;;
1241 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1250 checks='1 2 3 4 5 6 7 8'
1256 test $fv = 1 || for what in $checks; do
1257 test $fv = 1 && break
1259 1) t_cflags='-flto=jobserver'
1260 t_ldflags='-fuse-linker-plugin'
1261 t_use=1 t_name=fltojs_lp ;;
1262 2) t_cflags='-flto=jobserver' t_ldflags=''
1263 t_use=1 t_name=fltojs_nn ;;
1264 3) t_cflags='-flto=jobserver'
1265 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1266 t_use=1 t_name=fltojs_np ;;
1268 t_ldflags='-fuse-linker-plugin'
1269 t_use=1 t_name=fltons_lp ;;
1270 5) t_cflags='-flto' t_ldflags=''
1271 t_use=1 t_name=fltons_nn ;;
1273 t_ldflags='-fno-use-linker-plugin -fwhole-program'
1274 t_use=1 t_name=fltons_np ;;
1275 7) t_cflags='-fwhole-program --combine' t_ldflags=''
1276 t_use=0 t_name=combine cm=combine ;;
1277 8) fv=1 cm=normal ;;
1279 test $fv = 1 && break
1280 ac_flags $t_use $t_name "$t_cflags" \
1281 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags"
1287 # probably not needed
1288 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
1292 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode
1293 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
1294 ac_flags 1 fstacksecuritycheck -fstack-security-check
1298 ac_flags 1 fullwarn -fullwarn 'for remark output support'
1301 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled'
1302 echo 'int main(void) { char test[64] = ""; return (*test); }' >x
1303 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x
1304 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x
1305 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x
1307 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings'
1308 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings'
1312 #broken# ac_flags 1 ssp -stackprotect
1317 ac_flags 1 ipo -xipo 'for cross-module optimisation'
1321 : #broken# ac_flags 1 boundschk -b
1324 ac_flags 0 ysystem -Ysystem
1325 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS"
1326 ac_flags 1 extansi -Xa
1329 ac_flags 1 rodata "-qro -qroconst -qroptr"
1330 ac_flags 1 rtcheck -qcheck=all
1331 #ac_flags 1 rtchkc -qextchk # reported broken
1332 ac_flags 1 wformat "-qformat=all -qformat=nozln"
1333 #ac_flags 1 wp64 -qwarn64 # too verbose for now
1336 # flags common to a subset of compilers (run with -Werror on gcc)
1337 if test 1 = $i; then
1338 ac_flags 1 wall -Wall
1339 ac_flags 1 fwrapv -fwrapv
1343 # The following tests run with -Werror or similar (all compilers) if possible
1345 test $ct = pcc && phase=u
1348 # Compiler: check for stuff that only generates warnings
1350 ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1351 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1352 extern int thiswillneverbedefinedIhope(void);
1353 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1354 int main(void) { return (thiswillneverbedefinedIhope()); }
1357 #undef __attribute__
1358 int xcopy(const void *, void *, size_t)
1359 __attribute__((__bounded__ (__buffer__, 1, 3)))
1360 __attribute__((__bounded__ (__buffer__, 2, 3)));
1361 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1362 int xcopy(const void *s, void *d, size_t n) {
1364 * if memmove does not exist, we are not on a system
1365 * with GCC with __bounded__ attribute either so poo
1367 memmove(d, s, n); return ((int)n);
1371 ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1372 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1373 extern int thiswillneverbedefinedIhope(void);
1374 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1375 int main(void) { return (thiswillneverbedefinedIhope()); }
1377 #define fprintf printfoo
1379 #undef __attribute__
1381 extern int fprintf(FILE *, const char *format, ...)
1382 __attribute__((__format__ (__printf__, 2, 3)));
1383 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
1386 ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1387 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1388 extern int thiswillneverbedefinedIhope(void);
1389 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1390 int main(void) { return (thiswillneverbedefinedIhope()); }
1393 #undef __attribute__
1394 void fnord(void) __attribute__((__noreturn__));
1395 int main(void) { fnord(); }
1396 void fnord(void) { exit(0); }
1399 ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1400 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1401 extern int thiswillneverbedefinedIhope(void);
1402 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1403 int main(void) { return (thiswillneverbedefinedIhope()); }
1405 int main(int ac __attribute__((__unused__)), char **av
1406 __attribute__((__unused__))) { return (0); }
1409 ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1410 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
1411 extern int thiswillneverbedefinedIhope(void);
1412 /* force a failure: TenDRA and gcc 1.42 have false positive here */
1413 int main(void) { return (thiswillneverbedefinedIhope()); }
1415 static const char fnord[] __attribute__((__used__)) = "42";
1416 int main(void) { return (0); }
1420 # End of tests run with -Werror
1425 # mksh: flavours (full/small mksh, omit certain stuff)
1427 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \
1428 "if a reduced-feature mksh is requested"; then
1430 : ${HAVE_PERSISTENT_HISTORY=0}
1431 check_categories="$check_categories smksh"
1432 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h
1434 ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1435 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
1436 check_categories="$check_categories binsh"
1437 ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1438 "if mksh will be built without job control" && \
1439 check_categories="$check_categories arge"
1440 ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \
1441 "if mksh will be built without job signals" && \
1442 check_categories="$check_categories arge nojsig"
1443 ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
1444 'if the default UTF-8 mode is specified' && : ${HAVE_SETLOCALE_CTYPE=0}
1445 ac_ifcpp 'ifdef MKSH_CONSERVATIVE_FDS' isset_MKSH_CONSERVATIVE_FDS '' \
1446 'if traditional/conservative fd use is requested' && \
1447 check_categories="$check_categories convfds"
1448 #ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \
1449 # "if deprecated features are to be omitted" && \
1450 # check_categories="$check_categories nodeprecated"
1451 #ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \
1452 # "if experimental features are to be omitted" && \
1453 # check_categories="$check_categories noexperimental"
1454 ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \
1455 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \
1456 check_categories="$check_categories mnbsdash"
1459 # Environment: headers
1461 ac_header sys/time.h sys/types.h
1462 ac_header time.h sys/types.h
1463 test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0
1464 ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF'
1465 #include <sys/types.h>
1466 #include <sys/time.h>
1468 int main(void) { struct tm tm; return ((int)sizeof(tm)); }
1470 ac_header sys/bsdtypes.h
1471 ac_header sys/file.h sys/types.h
1472 ac_header sys/mkdev.h sys/types.h
1473 ac_header sys/mman.h sys/types.h
1474 ac_header sys/param.h
1475 ac_header sys/resource.h sys/types.h _time
1476 ac_header sys/select.h sys/types.h
1477 ac_header sys/sysmacros.h
1479 ac_header grp.h sys/types.h
1481 ac_header libutil.h sys/types.h
1483 ac_header stdint.h stdarg.h
1484 # include strings.h only if compatible with string.h
1485 ac_header strings.h sys/types.h string.h
1487 ac_header ulimit.h sys/types.h
1491 # Environment: definitions
1493 echo '#include <sys/types.h>
1494 /* check that off_t can represent 2^63-1 correctly, thx FSF */
1495 #define LARGE_OFF_T (((off_t)1 << 62) - 1 + ((off_t)1 << 62))
1496 int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1497 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
1498 int main(void) { return (0); }' >lft.c
1499 ac_testn can_lfs '' "for large file support" <lft.c
1500 save_CPPFLAGS=$CPPFLAGS
1501 add_cppflags -D_FILE_OFFSET_BITS=64
1502 ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1503 if test 0 = $HAVE_CAN_LFS_SUS; then
1504 CPPFLAGS=$save_CPPFLAGS
1505 add_cppflags -D_LARGE_FILES=1
1506 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
1507 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
1509 rmf lft* # end of large file support test
1512 # Environment: types
1514 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF'
1515 #include <sys/types.h>
1517 int main(int ac, char **av) { return ((uint32_t)(ptrdiff_t)*av + (int32_t)ac); }
1519 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1520 #include <sys/types.h>
1522 int main(int ac, char **av) { return ((u_int32_t)(ptrdiff_t)*av + (int32_t)ac); }
1524 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1525 #include <sys/types.h>
1527 int main(int ac, char **av) { return ((uint8_t)(ptrdiff_t)av[ac]); }
1529 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1530 #include <sys/types.h>
1532 int main(int ac, char **av) { return ((u_int8_t)(ptrdiff_t)av[ac]); }
1535 ac_test rlim_t <<-'EOF'
1536 #include <sys/types.h>
1537 #if HAVE_BOTH_TIME_H
1538 #include <sys/time.h>
1540 #elif HAVE_SYS_TIME_H
1541 #include <sys/time.h>
1545 #if HAVE_SYS_RESOURCE_H
1546 #include <sys/resource.h>
1549 int main(void) { return ((int)(rlim_t)0); }
1552 # only testn: added later below
1553 ac_testn sig_t <<-'EOF'
1554 #include <sys/types.h>
1557 volatile sig_t foo = (sig_t)0;
1558 int main(void) { return (foo == (sig_t)0); }
1561 ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1562 #include <sys/types.h>
1565 volatile sighandler_t foo = (sighandler_t)0;
1566 int main(void) { return (foo == (sighandler_t)0); }
1568 if test 1 = $HAVE_SIGHANDLER_T; then
1569 add_cppflags -Dsig_t=sighandler_t
1573 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
1574 #include <sys/types.h>
1577 volatile __sighandler_t foo = (__sighandler_t)0;
1578 int main(void) { return (foo == (__sighandler_t)0); }
1580 if test 1 = $HAVE___SIGHANDLER_T; then
1581 add_cppflags -Dsig_t=__sighandler_t
1585 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
1589 # check whether whatever we use for the final link will succeed
1591 if test $cm = makefile; then
1595 ac_testinit link_works '' 'checking if the final link command may succeed'
1597 cat >conftest.c <<-'EOF'
1599 #define MKSH_INCLUDES_ONLY
1601 __RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.645 2013/08/10 13:44:25 tg Exp $");
1602 int main(void) { printf("Hello, World!\n"); return (0); }
1606 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0
1608 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0
1609 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1612 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0
1613 test $fv = 0 || v "mv conftest.s conftest.ll"
1614 test $fv = 0 || v "llvm-as conftest.ll" || fv=0
1616 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0
1617 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr"
1620 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr"
1624 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0
1625 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr"
1628 test -f $tcfn || fv=0
1630 test $fv = 1 || exit 1
1634 # Environment: errors and signals
1636 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1638 ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1639 extern const int sys_nerr;
1640 extern const char * const sys_errlist[];
1641 int main(void) { return (*sys_errlist[sys_nerr - 1]); }
1643 ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF'
1644 extern const int _sys_nerr;
1645 extern const char * const _sys_errlist[];
1646 int main(void) { return (*_sys_errlist[_sys_nerr - 1]); }
1648 if test 1 = "$HAVE__SYS_ERRLIST"; then
1649 add_cppflags -Dsys_nerr=_sys_nerr
1650 add_cppflags -Dsys_errlist=_sys_errlist
1653 ac_cppflags SYS_ERRLIST
1655 for what in name list; do
1657 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
1658 extern const char * const sys_sig${what}[];
1659 int main(void) { return (sys_sig${what}[0][0]); }
1661 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
1662 extern const char * const _sys_sig${what}[];
1663 int main(void) { return (_sys_sig${what}[0][0]); }
1665 eval uwhat_v=\$HAVE__SYS_SIG$uwhat
1666 if test 1 = "$uwhat_v"; then
1667 add_cppflags -Dsys_sig$what=_sys_sig$what
1668 eval HAVE_SYS_SIG$uwhat=1
1670 ac_cppflags SYS_SIG$uwhat
1674 # Environment: library functions
1676 ac_test flock <<-'EOF'
1677 #include <sys/types.h>
1681 #include <sys/file.h>
1683 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); }
1686 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF'
1691 lks.l_type = F_WRLCK | F_UNLCK;
1692 return (fcntl(0, F_SETLKW, &lks));
1696 ac_test getrusage <<-'EOF'
1697 #define MKSH_INCLUDES_ONLY
1701 return (getrusage(RUSAGE_SELF, &ru) +
1702 getrusage(RUSAGE_CHILDREN, &ru));
1706 ac_test gettimeofday <<-'EOF'
1707 #define MKSH_INCLUDES_ONLY
1709 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
1712 ac_test killpg <<-'EOF'
1714 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
1717 ac_test memmove <<-'EOF'
1718 #include <sys/types.h>
1722 #include <strings.h>
1724 int main(int ac, char *av[]) {
1725 return (*(int *)(void *)memmove(av[0], av[1], ac));
1729 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF'
1730 #define MKSH_INCLUDES_ONLY
1732 int main(int ac, char *av[]) {
1734 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]);
1735 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) :
1740 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF'
1741 #include <sys/types.h>
1743 #include <sys/file.h>
1746 #include <sys/mman.h>
1750 int main(void) { return ((void *)mmap(NULL, (size_t)0,
1751 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 :
1755 ac_test nice <<-'EOF'
1757 int main(void) { return (nice(4)); }
1760 ac_test revoke <<-'EOF'
1761 #include <sys/types.h>
1763 #include <libutil.h>
1766 int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
1769 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF'
1772 int main(void) { return ((int)(ptrdiff_t)(void *)setlocale(LC_CTYPE, "")); }
1775 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
1776 #include <langinfo.h>
1778 int main(void) { return ((int)(ptrdiff_t)(void *)nl_langinfo(CODESET)); }
1781 ac_test select <<-'EOF'
1782 #include <sys/types.h>
1783 #if HAVE_BOTH_TIME_H
1784 #include <sys/time.h>
1786 #elif HAVE_SYS_TIME_H
1787 #include <sys/time.h>
1791 #if HAVE_SYS_BSDTYPES_H
1792 #include <sys/bsdtypes.h>
1794 #if HAVE_SYS_SELECT_H
1795 #include <sys/select.h>
1798 #include <bstring.h>
1804 #include <strings.h>
1808 struct timeval tv = { 1, 200000 };
1809 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds);
1810 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv));
1814 ac_test setresugid <<-'EOF'
1815 #include <sys/types.h>
1817 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
1820 ac_test setgroups setresugid 0 <<-'EOF'
1821 #include <sys/types.h>
1826 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
1829 if test x"$et" = x"klibc"; then
1831 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF'
1832 #define MKSH_INCLUDES_ONLY
1834 extern int __rt_sigsuspend(const sigset_t *, size_t);
1835 int main(void) { return (__rt_sigsuspend(NULL, 0)); }
1838 # no? damn! legacy crap ahead!
1840 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \
1841 'whether sigsuspend is usable (1/2)' <<-'EOF'
1842 #define MKSH_INCLUDES_ONLY
1844 extern int __sigsuspend_s(sigset_t);
1845 int main(void) { return (__sigsuspend_s(0)); }
1847 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \
1848 'whether sigsuspend is usable (2/2)' <<-'EOF'
1849 #define MKSH_INCLUDES_ONLY
1851 extern int __sigsuspend_xxs(int, int, sigset_t);
1852 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); }
1855 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then
1856 # no usable sigsuspend(), use pause() *ugh*
1857 add_cppflags -DMKSH_NO_SIGSUSPEND
1861 ac_test strerror '!' sys_errlist 0 <<-'EOF'
1862 extern char *strerror(int);
1863 int main(int ac, char *av[]) { return (*strerror(*av[ac])); }
1866 ac_test strsignal '!' sys_siglist 0 <<-'EOF'
1869 int main(void) { return (strsignal(1)[0]); }
1872 ac_test strlcpy <<-'EOF'
1874 int main(int ac, char *av[]) { return (strlcpy(*av, av[1],
1879 # check headers for declarations
1881 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
1882 #define MKSH_INCLUDES_ONLY
1885 #include <sys/file.h>
1887 int main(void) { return ((flock)(0, 0)); }
1889 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
1890 #define MKSH_INCLUDES_ONLY
1892 int main(void) { return ((revoke)("")); }
1894 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF'
1895 #define MKSH_INCLUDES_ONLY
1897 int main(void) { return (*sys_errlist[sys_nerr - 1]); }
1899 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
1900 #define MKSH_INCLUDES_ONLY
1902 int main(void) { return (sys_siglist[0][0]); }
1908 fd='if to use persistent history'
1909 ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
1912 test 1 = $fv || check_categories="$check_categories no-histfile"
1917 ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF'
1918 #define MKSH_INCLUDES_ONLY
1921 #define CHAR_BIT 8 /* defuse this test on really legacy systems */
1924 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
1925 /* this one should be defined by the standard */
1926 cta(char_is_1_char, (sizeof(char) == 1) && (sizeof(signed char) == 1) &&
1927 (sizeof(unsigned char) == 1));
1928 cta(char_is_8_bits, ((CHAR_BIT) == 8) && ((int)(unsigned char)0xFF == 0xFF) &&
1929 ((int)(unsigned char)0x100 == 0) && ((int)(unsigned char)(int)-1 == 0xFF));
1930 /* the next assertion is probably not really needed */
1931 cta(short_is_2_char, sizeof(short) == 2);
1932 cta(short_size_no_matter_of_signedness, sizeof(short) == sizeof(unsigned short));
1933 /* the next assertion is probably not really needed */
1934 cta(int_is_4_char, sizeof(int) == 4);
1935 cta(int_size_no_matter_of_signedness, sizeof(int) == sizeof(unsigned int));
1937 cta(long_ge_int, sizeof(long) >= sizeof(int));
1938 cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long));
1940 #ifndef MKSH_LEGACY_MODE
1941 /* the next assertion is probably not really needed */
1942 cta(ari_is_4_char, sizeof(mksh_ari_t) == 4);
1944 cta(ari_has_31_bit, 0 < (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1));
1945 /* the next assertion is probably not really needed */
1946 cta(uari_is_4_char, sizeof(mksh_uari_t) == 4);
1947 /* but the next three are; we REQUIRE unsigned integer wraparound */
1948 cta(uari_has_31_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 2 + 1));
1949 cta(uari_has_32_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3));
1950 cta(uari_wrap_32_bit,
1951 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3) >
1952 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 4));
1957 /* these are always required */
1958 cta(ari_is_signed, (mksh_ari_t)-1 < (mksh_ari_t)0);
1959 cta(uari_is_unsigned, (mksh_uari_t)-1 > (mksh_uari_t)0);
1960 /* we require these to have the precisely same size and assume 2s complement */
1961 cta(ari_size_no_matter_of_signedness, sizeof(mksh_ari_t) == sizeof(mksh_uari_t));
1963 cta(sizet_size_no_matter_of_signedness, sizeof(ssize_t) == sizeof(size_t));
1964 cta(ptrdifft_sizet_same_size, sizeof(ptrdiff_t) == sizeof(size_t));
1965 cta(ptrdifft_voidptr_same_size, sizeof(ptrdiff_t) == sizeof(void *));
1966 cta(ptrdifft_funcptr_same_size, sizeof(ptrdiff_t) == sizeof(void (*)(void)));
1967 /* our formatting routines assume this */
1968 cta(ptr_fits_in_long, sizeof(ptrdiff_t) <= sizeof(long));
1969 /* for struct alignment people */
1970 char padding[64 - NUM];
1972 char ctasserts_dblcheck[sizeof(struct ctasserts) == 64 ? 1 : -1];
1973 int main(void) { return (sizeof(ctasserts_dblcheck)); }
1976 eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1
1979 # extra checks for legacy mksh
1981 if test $legacy = 1; then
1982 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF'
1983 #define MKSH_INCLUDES_ONLY
1989 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
1990 cta(char_is_8_bits, (CHAR_BIT) == 8);
1991 cta(long_is_32_bits, sizeof(long) == 4);
1993 int main(void) { return (sizeof(struct ctasserts)); }
1996 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF'
1997 #define MKSH_INCLUDES_ONLY
2003 #define cta(name, assertion) char name[(assertion) ? 1 : -1]
2004 cta(char_is_8_bits, (CHAR_BIT) == 8);
2005 cta(long_is_64_bits, sizeof(long) == 8);
2007 int main(void) { return (sizeof(struct ctasserts)); }
2010 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in
2011 10) check_categories="$check_categories int:32" ;;
2012 01) check_categories="$check_categories int:64" ;;
2013 *) check_categories="$check_categories int:u" ;;
2018 # Compiler: Praeprocessor (only if needed)
2020 test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \
2021 'checking if the C Preprocessor supports -dD'; then
2022 echo '#define foo bar' >conftest.c
2023 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x"
2024 grep '#define foo bar' x >/dev/null 2>&1 && fv=1
2025 rmf conftest.c x vv.out
2030 # End of mirtoconf checks
2034 # Some operating systems have ancient versions of ed(1) writing
2035 # the character count to standard output; cope for that
2037 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
2038 check_categories="$check_categories $oldish_ed"
2041 if test 0 = $HAVE_SYS_SIGNAME; then
2042 if test 1 = $HAVE_CPP_DD; then
2043 $e Generating list of signal names...
2045 $e No list of signal names available via cpp. Falling back...
2049 echo '#include <signal.h>
2053 #elif defined(SIGMAX)
2054 #define NSIG (SIGMAX+1)
2055 #elif defined(_SIGMAX)
2056 #define NSIG (_SIGMAX+1)
2062 # GNU sed 2.03 segfaults when optimising this to sed -n
2063 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2064 grep '^ *mksh_cfg *=' | \
2065 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
2067 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2068 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
2071 (printf hallo) >/dev/null 2>&1 || printf=echo
2072 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
2073 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2074 $printf "NSIG=$NSIG ... "
2075 sigs="INT SEGV ABRT KILL ALRM BUS CHLD CLD CONT DIL EMT FPE HUP ILL"
2076 sigs="$sigs INFO IO IOT LOST PIPE PROF PWR QUIT RESV SAK STOP SYS TERM"
2077 sigs="$sigs TRAP TSTP TTIN TTOU URG USR1 USR2 VTALRM WINCH XCPU XFSZ"
2078 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2079 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
2080 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2081 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
2082 test $NSIG -gt 1 || sigs=
2083 for name in $sigs; do
2085 *:$name:*) continue ;;
2087 sigseenone=$sigseenone$name:
2088 echo '#include <signal.h>' >conftest.c
2089 echo int >>conftest.c
2090 echo mksh_cfg= SIG$name >>conftest.c
2091 echo ';' >>conftest.c
2092 # GNU sed 2.03 croaks on optimising this, too
2093 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
2094 grep '^ *mksh_cfg *=' | \
2095 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/
2096 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do
2097 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
2098 test $nr -gt 0 && test $nr -le $NSIG || continue
2101 *) echo " { \"$name\", $nr },"
2102 sigseentwo=$sigseentwo$nr:
2103 $printf "$name=$nr " >&2
2106 done 2>&1 >signames.inc
2111 addsrcs -s '!' HAVE_STRLCPY strlcpy.c
2112 addsrcs USE_PRINTF_BUILTIN printf.c
2113 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
2114 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
2115 test -n "$LDSTATIC" && add_cppflags -DMKSH_OPTSTATIC
2116 add_cppflags -DMKSH_BUILD_R=481
2118 $e $bi$me: Finished configuration testing, now producing output.$ao
2124 a.exe) mkshexe=$tfn.exe ;;
2128 *\ *) mkshshebang="#!./$mkshexe" ;;
2129 *) mkshshebang="#!$curdir/$mkshexe" ;;
2133 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2134 test -n "\$KSH_VERSION" || exit 1
2135 set -A check_categories -- $check_categories
2136 pflag='$curdir/$mkshexe'
2137 sflag='$srcdir/check.t'
2138 usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0
2139 while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch {
2140 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2141 (e) usee=1; eflag=\$OPTARG ;;
2142 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
2145 (p) pflag=\$OPTARG ;;
2150 (s) sflag=\$OPTARG ;;
2151 (t) uset=1; tflag=\$OPTARG ;;
2157 shift \$((OPTIND - 1))
2158 set -A args -- '$srcdir/check.pl' -p "\$pflag"
2160 for y in "\${check_categories[@]}"; do
2163 if [[ -n \$x ]]; then
2164 args[\${#args[*]}]=-C
2165 args[\${#args[*]}]=\${x#,}
2168 args[\${#args[*]}]=-e
2169 args[\${#args[*]}]=\$eflag
2171 (( Pflag )) && args[\${#args[*]}]=-P
2173 args[\${#args[*]}]=-t
2174 args[\${#args[*]}]=\$tflag
2176 (( vflag )) && args[\${#args[*]}]=-v
2177 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
2178 print Testing mksh for conformance:
2179 fgrep -e MirOS: -e MIRBSD "\$sflag"
2180 print "This shell is actually:\\n\\t\$KSH_VERSION"
2181 print 'test.sh built for mksh $dstversion'
2182 cstr='\$os = defined \$^O ? \$^O : "unknown";'
2183 cstr="\$cstr"'print \$os . ", Perl version " . \$];'
2184 for perli in \$PERL perl5 perl no; do
2185 if [[ \$perli = no ]]; then
2186 print Cannot find a working Perl interpreter, aborting.
2189 print "Trying Perl interpreter '\$perli'..."
2190 perlos=\$(\$perli -e "\$cstr")
2192 print "Errorlevel \$rv, running on '\$perlos'"
2194 print "=> not using"
2197 if [[ -n \$perlos ]]; then
2202 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@"
2203 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts
2204 # use of the -S option for check.t split into multiple chunks
2206 for s in "\$sflag".*; do
2207 echo + \$perli "\${args[@]}" -s "\$s" "\$@"
2208 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts
2210 (( rv = rv ? rv : rc ))
2220 emitbc="-emit-llvm -c"
2226 echo ": # work around NeXTstep bug" >Rebuild.sh
2227 echo set -x >>Rebuild.sh
2228 for file in $SRCS; do
2229 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2230 test -f $file || file=$srcdir/$file
2231 files="$files$sp$file"
2233 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh
2234 if test $cm = dragonegg; then
2235 echo "mv ${op}s ${op}ll" >>Rebuild.sh
2236 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh
2237 objs="$objs$sp${op}bc"
2239 objs="$objs$sp${op}o"
2244 echo "rm -f $tfn.s" >>Rebuild.sh
2245 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh
2252 echo tcfn=$mkshexe >>Rebuild.sh
2253 echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
2254 echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
2255 if test $cm = makefile; then
2256 extras='emacsfn.h sh.h sh_flags.h var_spec.h'
2257 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
2258 cat >Makefrag.inc <<EOF
2259 # Makefile fragment for building mksh $dstversion
2267 NONSRCS_INST= dot.mkshrc \$(MAN)
2268 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh
2275 # not BSD make only:
2278 #\$(PROG): \$(OBJS_BP)
2279 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS)
2280 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS)
2282 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$<
2284 # for all make variants:
2287 # ./test.sh \$(REGRESS_FLAGS)
2288 check_categories=$check_categories
2290 # for BSD make only:
2292 #.include <bsd.prog.mk>
2295 $e Generated Makefrag.inc successfully.
2298 if test $cm = combine; then
2300 for file in $SRCS; do
2301 test -f $file || file=$srcdir/$file
2304 emitbc="-fwhole-program --combine"
2305 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr"
2306 elif test 1 = $pm; then
2307 for file in $SRCS; do
2308 test -f $file || file=$srcdir/$file
2309 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" &
2313 for file in $SRCS; do
2314 test $cm = dragonegg && \
2315 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'`
2316 test -f $file || file=$srcdir/$file
2317 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1
2318 if test $cm = dragonegg; then
2319 v "mv ${op}s ${op}ll"
2320 v "llvm-as ${op}ll" || exit 1
2327 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
2331 test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2332 test -f $tcfn || exit 1
2333 test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >$tfn.cat1" || \
2335 test 0 = $eq && v $SIZE $tcfn
2337 test -f /usr/ucb/$i && i=/usr/ucb/$i
2340 $e Installing the shell:
2341 $e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
2342 if test $legacy = 0; then
2343 $e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells"
2344 $e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
2347 $e Installing the manual:
2348 if test -f $tfn.cat1; then
2349 $e "# $i -c -o root -g bin -m 444 $tfn.cat1" \
2350 "/usr/share/man/cat1/$tfn.0"
2353 $e "# $i -c -o root -g bin -m 444 $tfn.1 /usr/share/man/man1/$tfn.1"
2355 $e Run the regression test suite: ./test.sh
2356 $e Please also read the sample file dot.mkshrc and the fine manual.
2361 === Environment used ===
2363 ==== build environment ====
2366 CFLAGS if empty, defaults to -xO2 or +O2
2367 or -O3 -qstrict or -O2, per compiler
2368 CPPFLAGS default empty
2369 LDFLAGS default empty; added before sources
2370 LDSTATIC set this to '-static'; default unset
2371 LIBS default empty; added after sources
2372 [Interix] default: -lcrypt (XXX still needed?)
2373 NOWARN -Wno-error or similar
2374 NROFF default: nroff
2375 TARGET_OS default: $(uname -s || uname)
2376 TARGET_OSREV [QNX] default: $(uname -r)
2378 ==== feature selectors ====
2379 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin
2380 ===== general format =====
2382 HAVE_STRING_H ac_header
2383 HAVE_CAN_FSTACKPROTECTORALL ac_flags
2385 ==== cpp definitions ====
2386 DEBUG dont use in production, wants gcc, implies:
2387 DEBUG_LEAKS enable freeing resources before exiting
2388 MKSHRC_PATH "~/.mkshrc" (do not change)
2389 MKSH_A4PB force use of arc4random_pushb
2390 MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset)
2391 MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
2392 MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
2393 MKSH_CLRTOEOL_STRING "\033[K"
2394 MKSH_CLS_STRING "\033[;H\033[J"
2395 MKSH_CONSERVATIVE_FDS fd 0-9 for scripts, shell only up to 31
2396 MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change)
2397 MKSH_DEFAULT_PROFILEDIR "/etc" (do not change)
2398 MKSH_DEFAULT_TMPDIR "/tmp" (do not change)
2399 MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal
2400 MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots
2401 MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed
2402 MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary
2403 MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2404 MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
2405 MKSH_NOPWNAM skip PAM calls, for -static on eglibc, Solaris
2406 MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2407 MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
2408 MKSH_NO_EXTERNAL_CAT omit hack to skip cat builtin when flags passed
2409 MKSH_NO_LIMITS omit ulimit code
2410 MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
2411 MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend
2412 MKSH_SMALL omit some code, optimise hard for size (slower)
2413 MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.)
2414 MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL)
2415 MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing
2416 MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t
2417 MKSH_UNEMPLOYED disable job control (but not jobs/co-processes)
2419 === generic installation instructions ===
2421 Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling,
2422 also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable
2423 them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For
2424 MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well.
2426 Normally, the following command is what you want to run, then:
2427 $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
2429 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
2430 /bin; install the manpage, if omitting the -r flag a catmanpage is made
2431 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
2432 https://www.mirbsd.org/cvs.cgi/contrib/hosted/tg/deb/mksh/debian/.mkshrc?rev=HEAD
2433 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.