1#!/bin/sh 2srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.622 2013/02/19 18:45:15 tg Exp $' 3#- 4# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 5# 2011, 2012, 2013 6# Thorsten Glaser <tg@mirbsd.org> 7# 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. 13# 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. 22#- 23# People analysing the output must whitelist conftest.c for any kind 24# of compiler warning checks (mirtoconf is by design not quiet). 25# 26# Used environment documentation is at the end of this file. 27 28LC_ALL=C 29export LC_ALL 30 31case $ZSH_VERSION:$VERSION in 32:zsh*) ZSH_VERSION=2 ;; 33esac 34 35if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then 36 emulate sh 37 NULLCMD=: 38fi 39 40if 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 43 export PATH 44fi 45 46v() { 47 $e "$*" 48 eval "$@" 49} 50 51vv() { 52 _c=$1 53 shift 54 $e "\$ $*" 2>&1 55 eval "$@" >vv.out 2>&1 56 sed "s^${_c} " <vv.out 57} 58 59vq() { 60 eval "$@" 61} 62 63rmf() { 64 for _f in "$@"; do 65 case $_f in 66 Build.sh|check.pl|check.t|dot.mkshrc|*.c|*.h|mksh.1) ;; 67 *) rm -f "$_f" ;; 68 esac 69 done 70} 71 72allu=QWERTYUIOPASDFGHJKLZXCVBNM 73alll=qwertyuiopasdfghjklzxcvbnm 74alln=0123456789 75alls=______________________________________________________________ 76nl=' 77' 78tcfn=no 79bi= 80ui= 81ao= 82fx= 83me=`basename "$0"` 84orig_CFLAGS=$CFLAGS 85phase=x 86oldish_ed=stdout-ed,no-stderr-ed 87 88if test -t 1; then 89 bi='[1m' 90 ui='[4m' 91 ao='[0m' 92fi 93 94upper() { 95 echo :"$@" | sed 's/^://' | tr $alll $allu 96} 97 98# clean up after ac_testrun() 99ac_testdone() { 100 eval HAVE_$fu=$fv 101 fr=no 102 test 0 = $fv || fr=yes 103 $e "$bi==> $fd...$ao $ui$fr$ao$fx" 104 fx= 105} 106 107# ac_cache label: sets f, fu, fv?=0 108ac_cache() { 109 f=$1 110 fu=`upper $f` 111 eval fv=\$HAVE_$fu 112 case $fv in 113 0|1) 114 fx=' (cached)' 115 return 0 116 ;; 117 esac 118 fv=0 119 return 1 120} 121 122# ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 123# returns 1 if value was cached/implied, 0 otherwise: call ac_testdone 124ac_testinit() { 125 if ac_cache $1; then 126 test x"$2" = x"!" && shift 127 test x"$2" = x"" || shift 128 fd=${3-$f} 129 ac_testdone 130 return 1 131 fi 132 fc=0 133 if test x"$2" = x""; then 134 ft=1 135 else 136 if test x"$2" = x"!"; then 137 fc=1 138 shift 139 fi 140 eval ft=\$HAVE_`upper $2` 141 shift 142 fi 143 fd=${3-$f} 144 if test $fc = "$ft"; then 145 fv=$2 146 fx=' (implied)' 147 ac_testdone 148 return 1 149 fi 150 $e ... $fd 151 return 0 152} 153 154# pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 155ac_testnnd() { 156 if test x"$1" = x"!"; then 157 fr=1 158 shift 159 else 160 fr=0 161 fi 162 ac_testinit "$@" || return 1 163 cat >conftest.c 164 vv ']' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN conftest.c $LIBS $ccpr" 165 test $tcfn = no && test -f a.out && tcfn=a.out 166 test $tcfn = no && test -f a.exe && tcfn=a.exe 167 test $tcfn = no && test -f conftest && tcfn=conftest 168 if test -f $tcfn; then 169 test 1 = $fr || fv=1 170 else 171 test 0 = $fr || fv=1 172 fi 173 vscan= 174 if test $phase = u; then 175 test $ct = gcc && vscan='unrecogni[sz]ed' 176 test $ct = hpcc && vscan='unsupported' 177 test $ct = pcc && vscan='unsupported' 178 test $ct = sunpro && vscan='-e ignored -e turned.off' 179 fi 180 test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr 181 return 0 182} 183ac_testn() { 184 ac_testnnd "$@" || return 185 rmf conftest.c conftest.o ${tcfn}* vv.out 186 ac_testdone 187} 188 189# ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 190ac_ifcpp() { 191 expr=$1; shift 192 ac_testn "$@" <<-EOF 193 int main(void) { return ( 194 #$expr 195 0 196 #else 197 /* force a failure: expr is false */ 198 thiswillneverbedefinedIhope() 199 #endif 200 ); } 201EOF 202 test x"$1" = x"!" && shift 203 f=$1 204 fu=`upper $f` 205 eval fv=\$HAVE_$fu 206 test x"$fv" = x"1" 207} 208 209add_cppflags() { 210 CPPFLAGS="$CPPFLAGS $*" 211} 212 213ac_cppflags() { 214 test x"$1" = x"" || fu=$1 215 fv=$2 216 test x"$2" = x"" && eval fv=\$HAVE_$fu 217 add_cppflags -DHAVE_$fu=$fv 218} 219 220ac_test() { 221 ac_testn "$@" 222 ac_cppflags 223} 224 225# ac_flags [-] add varname cflags [text] [ldflags] 226ac_flags() { 227 if test x"$1" = x"-"; then 228 shift 229 hf=1 230 else 231 hf=0 232 fi 233 fa=$1 234 vn=$2 235 f=$3 236 ft=$4 237 fl=$5 238 test x"$ft" = x"" && ft="if $f can be used" 239 save_CFLAGS=$CFLAGS 240 CFLAGS="$CFLAGS $f" 241 if test -n "$fl"; then 242 save_LDFLAGS=$LDFLAGS 243 LDFLAGS="$LDFLAGS $fl" 244 fi 245 if test 1 = $hf; then 246 ac_testn can_$vn '' "$ft" 247 else 248 ac_testn can_$vn '' "$ft" <<-'EOF' 249 /* evil apo'stroph in comment test */ 250 int main(void) { return (0); } 251 EOF 252 fi 253 eval fv=\$HAVE_CAN_`upper $vn` 254 if test -n "$fl"; then 255 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS 256 fi 257 test 11 = $fa$fv || CFLAGS=$save_CFLAGS 258} 259 260# ac_header [!] header [prereq ...] 261ac_header() { 262 if test x"$1" = x"!"; then 263 na=1 264 shift 265 else 266 na=0 267 fi 268 hf=$1; shift 269 hv=`echo "$hf" | tr -d '\012\015' | tr -c $alll$allu$alln $alls` 270 echo "/* NeXTstep bug workaround */" >x 271 for i 272 do 273 case $i in 274 _time) 275 echo '#if HAVE_BOTH_TIME_H' >>x 276 echo '#include <sys/time.h>' >>x 277 echo '#include <time.h>' >>x 278 echo '#elif HAVE_SYS_TIME_H' >>x 279 echo '#include <sys/time.h>' >>x 280 echo '#elif HAVE_TIME_H' >>x 281 echo '#include <time.h>' >>x 282 echo '#endif' >>x 283 ;; 284 *) 285 echo "#include <$i>" >>x 286 ;; 287 esac 288 done 289 echo "#include <$hf>" >>x 290 echo 'int main(void) { return (0); }' >>x 291 ac_testn "$hv" "" "<$hf>" <x 292 rmf x 293 test 1 = $na || ac_cppflags 294} 295 296addsrcs() { 297 addsrcs_s=0 298 if test x"$1" = x"-s"; then 299 # optstatic 300 addsrcs_s=1 301 shift 302 fi 303 if test x"$1" = x"!"; then 304 fr=0 305 shift 306 else 307 fr=1 308 fi 309 eval i=\$$1 310 if test $addsrcs_s = 1; then 311 if test -f "$2" || test -f "$srcdir/$2"; then 312 # always add $2, since it exists 313 fr=1 314 i=1 315 fi 316 fi 317 test $fr = "$i" && case " $SRCS " in 318 *\ $2\ *) ;; 319 *) SRCS="$SRCS $2" ;; 320 esac 321} 322 323 324curdir=`pwd` srcdir=`dirname "$0" 2>/dev/null` check_categories= 325test -n "$srcdir" || srcdir=. # in case dirname does not exist 326dstversion=`sed -n '/define MKSH_VERSION/s/^.*"\([^"]*\)".*$/\1/p' $srcdir/sh.h` 327add_cppflags -DMKSH_BUILDSH 328 329e=echo 330r=0 331eq=0 332pm=0 333cm=normal 334optflags=-std-compile-opts 335last= 336tfn= 337legacy=0 338 339for i 340do 341 case $last:$i in 342 c:combine|c:dragonegg|c:llvm|c:lto) 343 cm=$i 344 last= 345 ;; 346 c:*) 347 echo "$me: Unknown option -c '$i'!" >&2 348 exit 1 349 ;; 350 o:*) 351 optflags=$i 352 last= 353 ;; 354 t:*) 355 tfn=$i 356 last= 357 ;; 358 :-c) 359 last=c 360 ;; 361 :-g) 362 # checker, debug, valgrind build 363 add_cppflags -DDEBUG 364 CFLAGS="$CFLAGS -g3 -fno-builtin" 365 ;; 366 :-j) 367 pm=1 368 ;; 369 :-L) 370 legacy=1 371 ;; 372 :+L) 373 legacy=0 374 ;; 375 :-M) 376 cm=makefile 377 ;; 378 :-O) 379 optflags=-std-compile-opts 380 ;; 381 :-o) 382 last=o 383 ;; 384 :-Q) 385 eq=1 386 ;; 387 :-r) 388 r=1 389 ;; 390 :-t) 391 last=t 392 ;; 393 :-v) 394 echo "Build.sh $srcversion" 395 echo "for mksh $dstversion" 396 exit 0 397 ;; 398 :*) 399 echo "$me: Unknown option '$i'!" >&2 400 exit 1 401 ;; 402 *) 403 echo "$me: Unknown option -'$last' '$i'!" >&2 404 exit 1 405 ;; 406 esac 407done 408if test -n "$last"; then 409 echo "$me: Option -'$last' not followed by argument!" >&2 410 exit 1 411fi 412 413test -z "$tfn" && if test $legacy = 0; then 414 tfn=mksh 415else 416 tfn=lksh 417fi 418if test -d $tfn || test -d $tfn.exe; then 419 echo "$me: Error: ./$tfn is a directory!" >&2 420 exit 1 421fi 422rmf a.exe* a.out* conftest.c *core core.* lft ${tfn}* no *.bc *.ll *.o \ 423 Rebuild.sh signames.inc test.sh x vv.out 424 425SRCS="lalloc.c eval.c exec.c expr.c funcs.c histrap.c jobs.c" 426SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c" 427 428if test $legacy = 0; then 429 SRCS="$SRCS edit.c" 430 check_categories="$check_categories shell:legacy-no int:32" 431else 432 check_categories="$check_categories shell:legacy-yes" 433 add_cppflags -DMKSH_LEGACY_MODE 434 HAVE_PERSISTENT_HISTORY=0 435 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h 436fi 437 438if test x"$srcdir" = x"."; then 439 CPPFLAGS="-I. $CPPFLAGS" 440else 441 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS" 442fi 443test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then 444 LDFLAGS="$LDFLAGS $LDSTATIC" 445else 446 LDFLAGS=$LDSTATIC 447fi 448 449if test -z "$TARGET_OS"; then 450 x=`uname -s 2>/dev/null || uname` 451 test x"$x" = x"`uname -n 2>/dev/null`" || TARGET_OS=$x 452fi 453if test -z "$TARGET_OS"; then 454 echo "$me: Set TARGET_OS, your uname is broken!" >&2 455 exit 1 456fi 457oswarn= 458ccpc=-Wc, 459ccpl=-Wl, 460tsts= 461ccpr='|| for _f in ${tcfn}*; do case $_f in Build.sh|check.pl|check.t|dot.mkshrc|*.c|*.h|mksh.1) ;; *) rm -f "$_f" ;; esac; done' 462 463# Evil hack 464if test x"$TARGET_OS" = x"Android"; then 465 check_categories="$check_categories android" 466 TARGET_OS=Linux 467fi 468 469# Evil OS 470if test x"$TARGET_OS" = x"Minix"; then 471 echo >&2 " 472WARNING: additional checks before running Build.sh required! 473You can avoid these by calling Build.sh correctly, see below. 474" 475 cat >conftest.c <<'EOF' 476#include <sys/types.h> 477const char * 478#ifdef _NETBSD_SOURCE 479ct="Ninix3" 480#else 481ct="Minix3" 482#endif 483; 484EOF 485 ct=unknown 486 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x" 487 sed 's/^/[ /' x 488 eval `cat x` 489 rmf x vv.out 490 case $ct in 491 Minix3|Ninix3) 492 echo >&2 " 493Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous. 494Please set it to either Minix3 or Ninix3, whereas the latter is 495all versions of Minix with even partial NetBSD(R) userland. The 496value determined from your compiler for the current compilation 497(which may be wrong) is: $ct 498" 499 TARGET_OS=$ct 500 ;; 501 *) 502 echo >&2 " 503Warning: you set TARGET_OS to $TARGET_OS but that is ambiguous. 504Please set it to either Minix3 or Ninix3, whereas the latter is 505all versions of Minix with even partial NetBSD(R) userland. The 506proper value couldn't be determined, continue at your own risk. 507" 508 ;; 509 esac 510fi 511 512# Configuration depending on OS revision, on OSes that need them 513case $TARGET_OS in 514NEXTSTEP) 515 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`hostinfo 2>&1 | \ 516 grep 'NeXT Mach [0-9][0-9.]*:' | \ 517 sed 's/^.*NeXT Mach \([0-9][0-9.]*\):.*$/\1/'` 518 ;; 519QNX|SCO_SV) 520 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r` 521 ;; 522esac 523 524# Configuration depending on OS name 525case $TARGET_OS in 526386BSD) 527 : ${HAVE_CAN_OTWO=0} 528 add_cppflags -DMKSH_NO_SIGSETJMP 529 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int 530 add_cppflags -DMKSH_CONSERVATIVE_FDS 531 ;; 532AIX) 533 add_cppflags -D_ALL_SOURCE 534 : ${HAVE_SETLOCALE_CTYPE=0} 535 ;; 536BeOS) 537 case $KSH_VERSION in 538 *MIRBSD\ KSH*) 539 oswarn="; it has minor issues" 540 ;; 541 *) 542 oswarn="; you must recompile mksh with" 543 oswarn="$oswarn${nl}itself in a second stage" 544 ;; 545 esac 546 # BeOS has no real tty either 547 add_cppflags -DMKSH_UNEMPLOYED 548 add_cppflags -DMKSH_DISABLE_TTY_WARNING 549 # BeOS doesn't have different UIDs and GIDs 550 add_cppflags -DMKSH__NO_SETEUGID 551 ;; 552BSD/OS) 553 : ${HAVE_SETLOCALE_CTYPE=0} 554 ;; 555Coherent) 556 oswarn="; it has major issues" 557 add_cppflags -DMKSH__NO_SYMLINK 558 check_categories="$check_categories nosymlink" 559 add_cppflags -DMKSH__NO_SETEUGID 560 add_cppflags -DMKSH_CONSERVATIVE_FDS 561 add_cppflags -DMKSH_DISABLE_TTY_WARNING 562 ;; 563CYGWIN*) 564 : ${HAVE_SETLOCALE_CTYPE=0} 565 ;; 566Darwin) 567 add_cppflags -D_DARWIN_C_SOURCE 568 ;; 569DragonFly) 570 ;; 571FreeBSD) 572 ;; 573FreeMiNT) 574 oswarn="; it has minor issues" 575 add_cppflags -D_GNU_SOURCE 576 add_cppflags -DMKSH_CONSERVATIVE_FDS 577 : ${HAVE_SETLOCALE_CTYPE=0} 578 ;; 579GNU) 580 case $CC in 581 *tendracc*) ;; 582 *) add_cppflags -D_GNU_SOURCE ;; 583 esac 584 # define MKSH__NO_PATH_MAX to use Hurd-only functions 585 add_cppflags -DMKSH__NO_PATH_MAX 586 ;; 587GNU/kFreeBSD) 588 case $CC in 589 *tendracc*) ;; 590 *) add_cppflags -D_GNU_SOURCE ;; 591 esac 592 ;; 593Haiku) 594 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1 595 ;; 596HP-UX) 597 ;; 598Interix) 599 ccpc='-X ' 600 ccpl='-Y ' 601 add_cppflags -D_ALL_SOURCE 602 : ${LIBS='-lcrypt'} 603 : ${HAVE_SETLOCALE_CTYPE=0} 604 ;; 605IRIX*) 606 : ${HAVE_SETLOCALE_CTYPE=0} 607 ;; 608Linux) 609 case $CC in 610 *tendracc*) ;; 611 *) add_cppflags -D_GNU_SOURCE ;; 612 esac 613 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN 614 : ${HAVE_REVOKE=0} 615 ;; 616LynxOS) 617 oswarn="; it has minor issues" 618 ;; 619MidnightBSD) 620 ;; 621Minix-vmd) 622 add_cppflags -DMKSH__NO_SETEUGID 623 add_cppflags -DMKSH_UNEMPLOYED 624 add_cppflags -DMKSH_CONSERVATIVE_FDS 625 add_cppflags -D_MINIX_SOURCE 626 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below 627 : ${HAVE_SETLOCALE_CTYPE=0} 628 ;; 629Minix3) 630 add_cppflags -DMKSH_UNEMPLOYED 631 add_cppflags -DMKSH_CONSERVATIVE_FDS 632 add_cppflags -DMKSH_NO_LIMITS 633 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX 634 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken 635 : ${HAVE_SETLOCALE_CTYPE=0} 636 ;; 637MirBSD) 638 ;; 639MSYS_*) 640 add_cppflags -DMKSH_ASSUME_UTF8=0; HAVE_ISSET_MKSH_ASSUME_UTF8=1 641 # almost same as CYGWIN* (from RT|Chatzilla) 642 : ${HAVE_SETLOCALE_CTYPE=0} 643 # broken on this OE (from ir0nh34d) 644 : ${HAVE_STDINT_H=0} 645 ;; 646NetBSD) 647 ;; 648NEXTSTEP) 649 add_cppflags -D_NEXT_SOURCE 650 add_cppflags -D_POSIX_SOURCE 651 : ${AWK=gawk} ${CC=cc -posix} 652 add_cppflags -DMKSH_NO_SIGSETJMP 653 # NeXTstep cannot get a controlling tty 654 add_cppflags -DMKSH_UNEMPLOYED 655 case $TARGET_OSREV in 656 4.2*) 657 # OpenStep 4.2 is broken by default 658 oswarn="; it needs libposix.a" 659 ;; 660 esac 661 add_cppflags -DMKSH_CONSERVATIVE_FDS 662 ;; 663Ninix3) 664 # similar to Minix3 665 add_cppflags -DMKSH_UNEMPLOYED 666 add_cppflags -DMKSH_CONSERVATIVE_FDS 667 add_cppflags -DMKSH_NO_LIMITS 668 # but no idea what else could be needed 669 oswarn="; it has unknown issues" 670 ;; 671OpenBSD) 672 : ${HAVE_SETLOCALE_CTYPE=0} 673 ;; 674OSF1) 675 HAVE_SIG_T=0 # incompatible 676 add_cppflags -D_OSF_SOURCE 677 add_cppflags -D_POSIX_C_SOURCE=200112L 678 add_cppflags -D_XOPEN_SOURCE=600 679 add_cppflags -D_XOPEN_SOURCE_EXTENDED 680 : ${HAVE_SETLOCALE_CTYPE=0} 681 ;; 682Plan9) 683 add_cppflags -D_POSIX_SOURCE 684 add_cppflags -D_LIMITS_EXTENSION 685 add_cppflags -D_BSD_EXTENSION 686 add_cppflags -D_SUSV2_SOURCE 687 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1 688 add_cppflags -DMKSH_NO_CMDLINE_EDITING 689 oswarn=' and will currently not work' 690 add_cppflags -DMKSH_UNEMPLOYED 691 ;; 692PW32*) 693 HAVE_SIG_T=0 # incompatible 694 oswarn=' and will currently not work' 695 : ${HAVE_SETLOCALE_CTYPE=0} 696 ;; 697QNX) 698 add_cppflags -D__NO_EXT_QNX 699 add_cppflags -D__EXT_UNIX_MISC 700 case $TARGET_OSREV in 701 [012345].*|6.[0123].*|6.4.[01]) 702 oldish_ed=no-stderr-ed # oldish /bin/ed is broken 703 ;; 704 esac 705 : ${HAVE_SETLOCALE_CTYPE=0} 706 ;; 707SCO_SV) 708 case $TARGET_OSREV in 709 3.2*) 710 # SCO OpenServer 5 711 add_cppflags -DMKSH_UNEMPLOYED 712 ;; 713 5*) 714 # SCO OpenServer 6 715 ;; 716 *) 717 oswarn='; this is an unknown version of' 718 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do" 719 ;; 720 esac 721 add_cppflags -DMKSH_CONSERVATIVE_FDS 722 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0} 723 ;; 724skyos) 725 oswarn="; it has minor issues" 726 ;; 727SunOS) 728 add_cppflags -D_BSD_SOURCE 729 add_cppflags -D__EXTENSIONS__ 730 ;; 731syllable) 732 add_cppflags -D_GNU_SOURCE 733 add_cppflags -DMKSH_NO_SIGSUSPEND 734 oswarn=' and will currently not work' 735 ;; 736ULTRIX) 737 : ${CC=cc -YPOSIX} 738 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int 739 add_cppflags -DMKSH_CONSERVATIVE_FDS 740 : ${HAVE_SETLOCALE_CTYPE=0} 741 ;; 742UnixWare|UNIX_SV) 743 # SCO UnixWare 744 add_cppflags -DMKSH_CONSERVATIVE_FDS 745 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0} 746 ;; 747UWIN*) 748 ccpc='-Yc,' 749 ccpl='-Yl,' 750 tsts=" 3<>/dev/tty" 751 oswarn="; it will compile, but the target" 752 oswarn="$oswarn${nl}platform itself is very flakey/unreliable" 753 : ${HAVE_SETLOCALE_CTYPE=0} 754 ;; 755_svr4) 756 # generic target for SVR4 Unix with uname -s = uname -n 757 # this duplicates the * target below 758 oswarn='; it may or may not work' 759 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r` 760 ;; 761*) 762 oswarn='; it may or may not work' 763 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r` 764 ;; 765esac 766 767: ${HAVE_MKNOD=0} 768 769: ${AWK=awk} ${CC=cc} ${NROFF=nroff} 770test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \ 771 NROFF="$NROFF -c" 772 773# this aids me in tracing FTBFSen without access to the buildd 774$e "Hi from$ao $bi$srcversion$ao on:" 775case $TARGET_OS in 776AIX) 777 vv '|' "oslevel >&2" 778 vv '|' "uname -a >&2" 779 ;; 780Darwin) 781 vv '|' "hwprefs machine_type os_type os_class >&2" 782 vv '|' "uname -a >&2" 783 ;; 784IRIX*) 785 vv '|' "uname -a >&2" 786 vv '|' "hinv -v >&2" 787 ;; 788OSF1) 789 vv '|' "uname -a >&2" 790 vv '|' "/usr/sbin/sizer -v >&2" 791 ;; 792SCO_SV|UnixWare|UNIX_SV) 793 vv '|' "uname -a >&2" 794 vv '|' "uname -X >&2" 795 ;; 796*) 797 vv '|' "uname -a >&2" 798 ;; 799esac 800test -z "$oswarn" || echo >&2 " 801Warning: mksh has not yet been ported to or tested on your 802operating system '$TARGET_OS'$oswarn. If you can provide 803a shell account to the developer, this may improve; please 804drop us a success or failure notice or even send in diffs. 805" 806$e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..." 807 808# 809# Begin of mirtoconf checks 810# 811$e $bi$me: Scanning for functions... please ignore any errors.$ao 812 813# 814# Compiler: which one? 815# 816# notes: 817# - ICC defines __GNUC__ too 818# - GCC defines __hpux too 819# - LLVM+clang defines __GNUC__ too 820# - nwcc defines __GNUC__ too 821CPP="$CC -E" 822$e ... which compiler seems to be used 823cat >conftest.c <<'EOF' 824const char * 825#if defined(__ICC) || defined(__INTEL_COMPILER) 826ct="icc" 827#elif defined(__xlC__) || defined(__IBMC__) 828ct="xlc" 829#elif defined(__SUNPRO_C) 830ct="sunpro" 831#elif defined(__ACK__) 832ct="ack" 833#elif defined(__BORLANDC__) 834ct="bcc" 835#elif defined(__WATCOMC__) 836ct="watcom" 837#elif defined(__MWERKS__) 838ct="metrowerks" 839#elif defined(__HP_cc) 840ct="hpcc" 841#elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__)) 842ct="dec" 843#elif defined(__PGI) 844ct="pgi" 845#elif defined(__DMC__) 846ct="dmc" 847#elif defined(_MSC_VER) 848ct="msc" 849#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) 850ct="adsp" 851#elif defined(__IAR_SYSTEMS_ICC__) 852ct="iar" 853#elif defined(SDCC) 854ct="sdcc" 855#elif defined(__PCC__) 856ct="pcc" 857#elif defined(__TenDRA__) 858ct="tendra" 859#elif defined(__TINYC__) 860ct="tcc" 861#elif defined(__llvm__) && defined(__clang__) 862ct="clang" 863#elif defined(__NWCC__) 864ct="nwcc" 865#elif defined(__GNUC__) 866ct="gcc" 867#elif defined(_COMPILER_VERSION) 868ct="mipspro" 869#elif defined(__sgi) 870ct="mipspro" 871#elif defined(__hpux) || defined(__hpua) 872ct="hpcc" 873#elif defined(__ultrix) 874ct="ucode" 875#elif defined(__USLC__) 876ct="uslc" 877#elif defined(__LCC__) 878ct="lcc" 879#else 880ct="unknown" 881#endif 882; 883const char * 884#if defined(__KLIBC__) 885et="klibc" 886#else 887et="unknown" 888#endif 889; 890EOF 891ct=untested 892et=untested 893vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \ 894 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x" 895sed 's/^/[ /' x 896eval `cat x` 897rmf x vv.out 898echo 'int main(void) { return (0); }' >conftest.c 899case $ct in 900ack) 901 # work around "the famous ACK const bug" 902 CPPFLAGS="-Dconst= $CPPFLAGS" 903 ;; 904adsp) 905 echo >&2 'Warning: Analog Devices C++ compiler for Blackfin, TigerSHARC 906 and SHARC (21000) DSPs detected. This compiler has not yet 907 been tested for compatibility with mksh. Continue at your 908 own risk, please report success/failure to the developers.' 909 ;; 910bcc) 911 echo >&2 "Warning: Borland C++ Builder detected. This compiler might 912 produce broken executables. Continue at your own risk, 913 please report success/failure to the developers." 914 ;; 915clang) 916 # does not work with current "ccc" compiler driver 917 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version" 918 # one of these two works, for now 919 vv '|' "${CLANG-clang} -version" 920 vv '|' "${CLANG-clang} --version" 921 # ensure compiler and linker are in sync unless overridden 922 case $CCC_CC:$CCC_LD in 923 :*) ;; 924 *:) CCC_LD=$CCC_CC; export CCC_LD ;; 925 esac 926 ;; 927dec) 928 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 929 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS" 930 ;; 931dmc) 932 echo >&2 "Warning: Digital Mars Compiler detected. When running under" 933 echo >&2 " UWIN, mksh tends to be unstable due to the limitations" 934 echo >&2 " of this platform. Continue at your own risk," 935 echo >&2 " please report success/failure to the developers." 936 ;; 937gcc) 938 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 939 vv '|' 'echo `$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS \ 940 -dumpmachine` gcc`$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN \ 941 $LIBS -dumpversion`' 942 ;; 943hpcc) 944 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 945 ;; 946iar) 947 echo >&2 'Warning: IAR Systems (http://www.iar.com) compiler for embedded 948 systems detected. This unsupported compiler has not yet 949 been tested for compatibility with mksh. Continue at your 950 own risk, please report success/failure to the developers.' 951 ;; 952icc) 953 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 954 ;; 955lcc) 956 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 957 add_cppflags -D__inline__=__inline 958 ;; 959metrowerks) 960 echo >&2 'Warning: Metrowerks C compiler detected. This has not yet 961 been tested for compatibility with mksh. Continue at your 962 own risk, please report success/failure to the developers.' 963 ;; 964mipspro) 965 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version" 966 ;; 967msc) 968 ccpr= # errorlevels are not reliable 969 case $TARGET_OS in 970 Interix) 971 if [[ -n $C89_COMPILER ]]; then 972 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"` 973 else 974 C89_COMPILER=CL.EXE 975 fi 976 if [[ -n $C89_LINKER ]]; then 977 C89_LINKER=`ntpath2posix -c "$C89_LINKER"` 978 else 979 C89_LINKER=LINK.EXE 980 fi 981 vv '|' "$C89_COMPILER /HELP >&2" 982 vv '|' "$C89_LINKER /LINK >&2" 983 ;; 984 esac 985 ;; 986nwcc) 987 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version" 988 ;; 989pcc) 990 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v" 991 ;; 992pgi) 993 echo >&2 'Warning: PGI detected. This unknown compiler has not yet 994 been tested for compatibility with mksh. Continue at your 995 own risk, please report success/failure to the developers.' 996 ;; 997sdcc) 998 echo >&2 'Warning: sdcc (http://sdcc.sourceforge.net), the small devices 999 C compiler for embedded systems detected. This has not yet 1000 been tested for compatibility with mksh. Continue at your 1001 own risk, please report success/failure to the developers.' 1002 ;; 1003sunpro) 1004 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1005 ;; 1006tcc) 1007 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v" 1008 ;; 1009tendra) 1010 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \ 1011 fgrep -i -e version -e release" 1012 ;; 1013ucode) 1014 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 1015 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS" 1016 ;; 1017uslc) 1018 case $TARGET_OS:$TARGET_OSREV in 1019 SCO_SV:3.2*) 1020 # SCO OpenServer 5 1021 CFLAGS="$CFLAGS -g" 1022 : ${HAVE_CAN_OTWO=0} ${HAVE_CAN_OPTIMISE=0} 1023 ;; 1024 esac 1025 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1026 ;; 1027watcom) 1028 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 1029 ;; 1030xlc) 1031 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion" 1032 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose" 1033 vv '|' "ld -V" 1034 ;; 1035*) 1036 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed" 1037 ct=unknown 1038 vv "$CC --version" 1039 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 1040 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1041 ;; 1042esac 1043case $cm in 1044dragonegg|llvm) 1045 vv '|' "llc -version" 1046 ;; 1047esac 1048case $et in 1049klibc) 1050 add_cppflags -DMKSH_NO_LIMITS 1051 ;; 1052unknown) 1053 # nothing special detected, don’t worry 1054 unset et 1055 ;; 1056*) 1057 # huh? 1058 ;; 1059esac 1060$e "$bi==> which compiler seems to be used...$ao $ui$ct${et+ on $et}$ao" 1061rmf conftest.c conftest.o conftest a.out* a.exe* vv.out 1062 1063# 1064# Compiler: works as-is, with -Wno-error and -Werror 1065# 1066save_NOWARN=$NOWARN 1067NOWARN= 1068DOWARN= 1069ac_flags 0 compiler_works '' 'if the compiler works' 1070test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1 1071HAVE_COMPILER_KNOWN=0 1072test $ct = unknown || HAVE_COMPILER_KNOWN=1 1073if ac_ifcpp 'if 0' compiler_fails '' \ 1074 'if the compiler does not fail correctly'; then 1075 save_CFLAGS=$CFLAGS 1076 : ${HAVE_CAN_DELEXE=x} 1077 if test $ct = dmc; then 1078 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE" 1079 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF 1080 int main(void) { return (0); } 1081 EOF 1082 elif test $ct = dec; then 1083 CFLAGS="$CFLAGS ${ccpl}-non_shared" 1084 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF 1085 int main(void) { return (0); } 1086 EOF 1087 else 1088 exit 1 1089 fi 1090 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS 1091 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF 1092 EOF 1093 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1 1094fi 1095if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \ 1096 'if this could be tcc'; then 1097 ct=tcc 1098 CPP='cpp -D__TINYC__' 1099 HAVE_COMPILER_KNOWN=1 1100fi 1101 1102if test $ct = sunpro; then 1103 test x"$save_NOWARN" = x"" && save_NOWARN='-errwarn=%none' 1104 ac_flags 0 errwarnnone "$save_NOWARN" 1105 test 1 = $HAVE_CAN_ERRWARNNONE || save_NOWARN= 1106 ac_flags 0 errwarnall "-errwarn=%all" 1107 test 1 = $HAVE_CAN_ERRWARNALL && DOWARN="-errwarn=%all" 1108elif test $ct = hpcc; then 1109 save_NOWARN= 1110 DOWARN=+We 1111elif test $ct = mipspro; then 1112 save_NOWARN= 1113 DOWARN="-diag_error 1-10000" 1114elif test $ct = msc; then 1115 save_NOWARN="${ccpc}/w" 1116 DOWARN="${ccpc}/WX" 1117elif test $ct = dmc; then 1118 save_NOWARN="${ccpc}-w" 1119 DOWARN="${ccpc}-wx" 1120elif test $ct = bcc; then 1121 save_NOWARN="${ccpc}-w" 1122 DOWARN="${ccpc}-w!" 1123elif test $ct = dec; then 1124 : -msg_* flags not used yet, or is -w2 correct? 1125elif test $ct = xlc; then 1126 save_NOWARN=-qflag=i:e 1127 DOWARN=-qflag=i:i 1128elif test $ct = tendra; then 1129 save_NOWARN=-w 1130elif test $ct = ucode; then 1131 save_NOWARN= 1132 DOWARN=-w2 1133elif test $ct = watcom; then 1134 save_NOWARN= 1135 DOWARN=-Wc,-we 1136else 1137 test x"$save_NOWARN" = x"" && save_NOWARN=-Wno-error 1138 ac_flags 0 wnoerror "$save_NOWARN" 1139 test 1 = $HAVE_CAN_WNOERROR || save_NOWARN= 1140 ac_flags 0 werror -Werror 1141 test 1 = $HAVE_CAN_WERROR && DOWARN=-Werror 1142fi 1143 1144test $ct = icc && DOWARN="$DOWARN -wd1419" 1145NOWARN=$save_NOWARN 1146 1147# 1148# Compiler: extra flags (-O2 -f* -W* etc.) 1149# 1150i=`echo :"$orig_CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln` 1151# optimisation: only if orig_CFLAGS is empty 1152test x"$i" = x"" && if test $ct = sunpro; then 1153 cat >x <<-'EOF' 1154 int main(void) { return (0); } 1155 #define __IDSTRING_CONCAT(l,p) __LINTED__ ## l ## _ ## p 1156 #define __IDSTRING_EXPAND(l,p) __IDSTRING_CONCAT(l,p) 1157 #define pad void __IDSTRING_EXPAND(__LINE__,x)(void) { } 1158 EOF 1159 yes pad | head -n 256 >>x 1160 ac_flags - 1 otwo -xO2 <x 1161 rmf x 1162elif test $ct = hpcc; then 1163 phase=u 1164 ac_flags 1 otwo +O2 1165 phase=x 1166elif test $ct = xlc; then 1167 ac_flags 1 othree "-O3 -qstrict" 1168 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2 1169elif test $ct = tcc || test $ct = tendra; then 1170 : no special optimisation 1171else 1172 ac_flags 1 otwo -O2 1173 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O 1174fi 1175# other flags: just add them if they are supported 1176i=0 1177if test $ct = gcc; then 1178 # The following tests run with -Werror (gcc only) if possible 1179 NOWARN=$DOWARN; phase=u 1180 ac_flags 0 wnooverflow -Wno-overflow 1181 # mksh is not written in CFrustFrust! 1182 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables 1183 ac_flags 1 fnostrictaliasing -fno-strict-aliasing 1184 ac_flags 1 fstackprotectorall -fstack-protector-all 1185 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in 1186 *\ -fplugin=*dragonegg*) ;; 1187 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;; 1188 esac 1189 if test $cm = lto; then 1190 fv=0 1191 checks='1 2 3 4 5 6 7 8' 1192 elif test $cm = combine; then 1193 fv=0 1194 checks='7 8' 1195 else 1196 fv=1 1197 fi 1198 test $fv = 1 || for what in $checks; do 1199 test $fv = 1 && break 1200 case $what in 1201 1) t_cflags='-flto=jobserver' 1202 t_ldflags='-fuse-linker-plugin' 1203 t_use=1 t_name=fltojs_lp ;; 1204 2) t_cflags='-flto=jobserver' t_ldflags='' 1205 t_use=1 t_name=fltojs_nn ;; 1206 3) t_cflags='-flto=jobserver' 1207 t_ldflags='-fno-use-linker-plugin -fwhole-program' 1208 t_use=1 t_name=fltojs_np ;; 1209 4) t_cflags='-flto' 1210 t_ldflags='-fuse-linker-plugin' 1211 t_use=1 t_name=fltons_lp ;; 1212 5) t_cflags='-flto' t_ldflags='' 1213 t_use=1 t_name=fltons_nn ;; 1214 6) t_cflags='-flto' 1215 t_ldflags='-fno-use-linker-plugin -fwhole-program' 1216 t_use=1 t_name=fltons_np ;; 1217 7) t_cflags='-fwhole-program --combine' t_ldflags='' 1218 t_use=0 t_name=combine cm=combine ;; 1219 8) fv=1 cm=normal ;; 1220 esac 1221 test $fv = 1 && break 1222 ac_flags $t_use $t_name "$t_cflags" \ 1223 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags" 1224 done 1225 i=1 1226elif test $ct = icc; then 1227 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode 1228 ac_flags 1 fnostrictaliasing -fno-strict-aliasing 1229 ac_flags 1 fstacksecuritycheck -fstack-security-check 1230 i=1 1231elif test $ct = sunpro; then 1232 phase=u 1233 ac_flags 1 v -v 1234 ac_flags 1 ipo -xipo 'for cross-module optimisation' 1235 phase=x 1236elif test $ct = hpcc; then 1237 phase=u 1238 # probably not needed 1239 #ac_flags 1 agcc -Agcc 'for support of GCC extensions' 1240 phase=x 1241elif test $ct = dec; then 1242 ac_flags 0 verb -verbose 1243 ac_flags 1 rodata -readonly_strings 1244elif test $ct = dmc; then 1245 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks' 1246 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking' 1247elif test $ct = bcc; then 1248 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled' 1249elif test $ct = mipspro; then 1250 ac_flags 1 fullwarn -fullwarn 'for remark output support' 1251elif test $ct = msc; then 1252 ac_flags 1 strpool "${ccpc}/GF" 'if string pooling can be enabled' 1253 echo 'int main(void) { char test[64] = ""; return (*test); }' >x 1254 ac_flags - 1 stackon "${ccpc}/GZ" 'if stack checks can be enabled' <x 1255 ac_flags - 1 stckall "${ccpc}/Ge" 'stack checks for all functions' <x 1256 ac_flags - 1 secuchk "${ccpc}/GS" 'for compiler security checks' <x 1257 rmf x 1258 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings' 1259 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings' 1260elif test $ct = xlc; then 1261 ac_flags 1 rodata "-qro -qroconst -qroptr" 1262 ac_flags 1 rtcheck -qcheck=all 1263 #ac_flags 1 rtchkc -qextchk # reported broken 1264 ac_flags 1 wformat "-qformat=all -qformat=nozln" 1265 #ac_flags 1 wp64 -qwarn64 # too verbose for now 1266elif test $ct = tendra; then 1267 ac_flags 0 ysystem -Ysystem 1268 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS" 1269 ac_flags 1 extansi -Xa 1270elif test $ct = tcc; then 1271 : #broken# ac_flags 1 boundschk -b 1272elif test $ct = clang; then 1273 i=1 1274elif test $ct = nwcc; then 1275 i=1 1276 : #broken# ac_flags 1 ssp -stackprotect 1277fi 1278# flags common to a subset of compilers (run with -Werror on gcc) 1279if test 1 = $i; then 1280 ac_flags 1 wall -Wall 1281 ac_flags 1 fwrapv -fwrapv 1282fi 1283 1284phase=x 1285# The following tests run with -Werror or similar (all compilers) if possible 1286NOWARN=$DOWARN 1287test $ct = pcc && phase=u 1288 1289# 1290# Compiler: check for stuff that only generates warnings 1291# 1292ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF' 1293 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2)) 1294 /* force a failure: TenDRA and gcc 1.42 have false positive here */ 1295 int main(void) { return (thiswillneverbedefinedIhope()); } 1296 #else 1297 #include <string.h> 1298 #undef __attribute__ 1299 int xcopy(const void *, void *, size_t) 1300 __attribute__((__bounded__ (__buffer__, 1, 3))) 1301 __attribute__((__bounded__ (__buffer__, 2, 3))); 1302 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); } 1303 int xcopy(const void *s, void *d, size_t n) { 1304 /* 1305 * if memmove does not exist, we are not on a system 1306 * with GCC with __bounded__ attribute either so poo 1307 */ 1308 memmove(d, s, n); return ((int)n); 1309 } 1310 #endif 1311EOF 1312ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF' 1313 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2)) 1314 /* force a failure: TenDRA and gcc 1.42 have false positive here */ 1315 int main(void) { return (thiswillneverbedefinedIhope()); } 1316 #else 1317 #define fprintf printfoo 1318 #include <stdio.h> 1319 #undef __attribute__ 1320 #undef fprintf 1321 extern int fprintf(FILE *, const char *format, ...) 1322 __attribute__((__format__ (__printf__, 2, 3))); 1323 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); } 1324 #endif 1325EOF 1326ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF' 1327 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2)) 1328 /* force a failure: TenDRA and gcc 1.42 have false positive here */ 1329 int main(void) { return (thiswillneverbedefinedIhope()); } 1330 #else 1331 #include <stdlib.h> 1332 #undef __attribute__ 1333 void fnord(void) __attribute__((__noreturn__)); 1334 int main(void) { fnord(); } 1335 void fnord(void) { exit(0); } 1336 #endif 1337EOF 1338ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF' 1339 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2)) 1340 /* force a failure: TenDRA and gcc 1.42 have false positive here */ 1341 int main(void) { return (thiswillneverbedefinedIhope()); } 1342 #else 1343 int main(int ac __attribute__((__unused__)), char **av 1344 __attribute__((__unused__))) { return (0); } 1345 #endif 1346EOF 1347ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF' 1348 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2)) 1349 /* force a failure: TenDRA and gcc 1.42 have false positive here */ 1350 int main(void) { return (thiswillneverbedefinedIhope()); } 1351 #else 1352 static const char fnord[] __attribute__((__used__)) = "42"; 1353 int main(void) { return (0); } 1354 #endif 1355EOF 1356 1357# End of tests run with -Werror 1358NOWARN=$save_NOWARN 1359phase=x 1360 1361# 1362# mksh: flavours (full/small mksh, omit certain stuff) 1363# 1364if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \ 1365 "if a reduced-feature mksh is requested"; then 1366 : ${HAVE_NICE=0} 1367 : ${HAVE_PERSISTENT_HISTORY=0} 1368 check_categories="$check_categories smksh" 1369 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h 1370fi 1371ac_ifcpp 'ifdef MKSH_BINSHREDUCED' isset_MKSH_BINSHREDUCED '' \ 1372 "if a reduced-feature sh is requested" && \ 1373 check_categories="$check_categories binsh" 1374ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \ 1375 "if mksh will be built without job control" && \ 1376 check_categories="$check_categories arge" 1377ac_ifcpp 'ifdef MKSH_NOPROSPECTOFWORK' isset_MKSH_NOPROSPECTOFWORK '' \ 1378 "if mksh will be built without job signals" && \ 1379 check_categories="$check_categories arge nojsig" 1380ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \ 1381 'if the default UTF-8 mode is specified' && : ${HAVE_SETLOCALE_CTYPE=0} 1382ac_ifcpp 'ifdef MKSH_CONSERVATIVE_FDS' isset_MKSH_CONSERVATIVE_FDS '' \ 1383 'if traditional/conservative fd use is requested' && \ 1384 check_categories="$check_categories convfds" 1385#ac_ifcpp 'ifdef MKSH_DISABLE_DEPRECATED' isset_MKSH_DISABLE_DEPRECATED '' \ 1386# "if deprecated features are to be omitted" && \ 1387# check_categories="$check_categories nodeprecated" 1388#ac_ifcpp 'ifdef MKSH_DISABLE_EXPERIMENTAL' isset_MKSH_DISABLE_EXPERIMENTAL '' \ 1389# "if experimental features are to be omitted" && \ 1390# check_categories="$check_categories noexperimental" 1391ac_ifcpp 'ifdef MKSH_MIDNIGHTBSD01ASH_COMPAT' isset_MKSH_MIDNIGHTBSD01ASH_COMPAT '' \ 1392 'if the MidnightBSD 0.1 ash compatibility mode is requested' && \ 1393 check_categories="$check_categories mnbsdash" 1394 1395# 1396# Environment: headers 1397# 1398ac_header sys/time.h sys/types.h 1399ac_header time.h sys/types.h 1400test "11" = "$HAVE_SYS_TIME_H$HAVE_TIME_H" || HAVE_BOTH_TIME_H=0 1401ac_test both_time_h '' 'whether <sys/time.h> and <time.h> can both be included' <<-'EOF' 1402 #include <sys/types.h> 1403 #include <sys/time.h> 1404 #include <time.h> 1405 int main(void) { struct tm tm; return ((int)sizeof(tm)); } 1406EOF 1407ac_header sys/bsdtypes.h 1408ac_header sys/file.h sys/types.h 1409ac_header sys/mkdev.h sys/types.h 1410ac_header sys/mman.h sys/types.h 1411ac_header sys/param.h 1412ac_header sys/resource.h sys/types.h _time 1413ac_header sys/select.h sys/types.h 1414ac_header sys/sysmacros.h 1415ac_header bstring.h 1416ac_header grp.h sys/types.h 1417ac_header libgen.h 1418ac_header libutil.h sys/types.h 1419ac_header paths.h 1420ac_header stdint.h stdarg.h 1421# include strings.h only if compatible with string.h 1422ac_header strings.h sys/types.h string.h 1423ac_header termios.h 1424ac_header ulimit.h sys/types.h 1425ac_header values.h 1426 1427# 1428# Environment: definitions 1429# 1430echo '#include <sys/types.h> 1431/* check that off_t can represent 2^63-1 correctly, thx FSF */ 1432#define LARGE_OFF_T (((off_t)1 << 62) - 1 + ((off_t)1 << 62)) 1433int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && 1434 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; 1435int main(void) { return (0); }' >lft.c 1436ac_testn can_lfs '' "for large file support" <lft.c 1437save_CPPFLAGS=$CPPFLAGS 1438add_cppflags -D_FILE_OFFSET_BITS=64 1439ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c 1440if test 0 = $HAVE_CAN_LFS_SUS; then 1441 CPPFLAGS=$save_CPPFLAGS 1442 add_cppflags -D_LARGE_FILES=1 1443 ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c 1444 test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS 1445fi 1446rmf lft* # end of large file support test 1447 1448# 1449# Environment: types 1450# 1451ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF' 1452 #include <sys/types.h> 1453 #include <stddef.h> 1454 int main(int ac, char **av) { return ((uint32_t)(ptrdiff_t)*av + (int32_t)ac); } 1455EOF 1456ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF' 1457 #include <sys/types.h> 1458 #include <stddef.h> 1459 int main(int ac, char **av) { return ((u_int32_t)(ptrdiff_t)*av + (int32_t)ac); } 1460EOF 1461ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF' 1462 #include <sys/types.h> 1463 #include <stddef.h> 1464 int main(int ac, char **av) { return ((uint8_t)(ptrdiff_t)av[ac]); } 1465EOF 1466ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF' 1467 #include <sys/types.h> 1468 #include <stddef.h> 1469 int main(int ac, char **av) { return ((u_int8_t)(ptrdiff_t)av[ac]); } 1470EOF 1471 1472ac_test rlim_t <<-'EOF' 1473 #include <sys/types.h> 1474 #if HAVE_BOTH_TIME_H 1475 #include <sys/time.h> 1476 #include <time.h> 1477 #elif HAVE_SYS_TIME_H 1478 #include <sys/time.h> 1479 #elif HAVE_TIME_H 1480 #include <time.h> 1481 #endif 1482 #if HAVE_SYS_RESOURCE_H 1483 #include <sys/resource.h> 1484 #endif 1485 #include <unistd.h> 1486 int main(void) { return ((int)(rlim_t)0); } 1487EOF 1488 1489# only testn: added later below 1490ac_testn sig_t <<-'EOF' 1491 #include <sys/types.h> 1492 #include <signal.h> 1493 #include <stddef.h> 1494 int main(void) { return ((int)(ptrdiff_t)(sig_t)(ptrdiff_t)kill(0,0)); } 1495EOF 1496 1497ac_testn sighandler_t '!' sig_t 0 <<-'EOF' 1498 #include <sys/types.h> 1499 #include <signal.h> 1500 #include <stddef.h> 1501 int main(void) { return ((int)(ptrdiff_t)(sighandler_t)(ptrdiff_t)kill(0,0)); } 1502EOF 1503if test 1 = $HAVE_SIGHANDLER_T; then 1504 add_cppflags -Dsig_t=sighandler_t 1505 HAVE_SIG_T=1 1506fi 1507 1508ac_testn __sighandler_t '!' sig_t 0 <<-'EOF' 1509 #include <sys/types.h> 1510 #include <signal.h> 1511 #include <stddef.h> 1512 int main(void) { return ((int)(ptrdiff_t)(__sighandler_t)(ptrdiff_t)kill(0,0)); } 1513EOF 1514if test 1 = $HAVE___SIGHANDLER_T; then 1515 add_cppflags -Dsig_t=__sighandler_t 1516 HAVE_SIG_T=1 1517fi 1518 1519test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t 1520ac_cppflags SIG_T 1521 1522# 1523# check whether whatever we use for the final link will succeed 1524# 1525if test $cm = makefile; then 1526 : nothing to check 1527else 1528 HAVE_LINK_WORKS=x 1529 ac_testinit link_works '' 'checking if the final link command may succeed' 1530 fv=1 1531 cat >conftest.c <<-'EOF' 1532 #define EXTERN 1533 #define MKSH_INCLUDES_ONLY 1534 #include "sh.h" 1535 __RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.622 2013/02/19 18:45:15 tg Exp $"); 1536 int main(void) { printf("Hello, World!\n"); return (0); } 1537EOF 1538 case $cm in 1539 llvm) 1540 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0 1541 rmf $tfn.s 1542 test $fv = 0 || v "llvm-link -o - conftest.o | opt $optflags | llc -o $tfn.s" || fv=0 1543 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr" 1544 ;; 1545 dragonegg) 1546 v "$CC $CFLAGS $CPPFLAGS $NOWARN -S -flto conftest.c" || fv=0 1547 test $fv = 0 || v "mv conftest.s conftest.ll" 1548 test $fv = 0 || v "llvm-as conftest.ll" || fv=0 1549 rmf $tfn.s 1550 test $fv = 0 || v "llvm-link -o - conftest.bc | opt $optflags | llc -o $tfn.s" || fv=0 1551 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn $tfn.s $LIBS $ccpr" 1552 ;; 1553 combine) 1554 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr" 1555 ;; 1556 lto|normal) 1557 cm=normal 1558 v "$CC $CFLAGS $CPPFLAGS $NOWARN -c conftest.c" || fv=0 1559 test $fv = 0 || v "$CC $CFLAGS $LDFLAGS -o $tcfn conftest.o $LIBS $ccpr" 1560 ;; 1561 esac 1562 test -f $tcfn || fv=0 1563 ac_testdone 1564 test $fv = 1 || exit 1 1565fi 1566 1567# 1568# Environment: errors and signals 1569# 1570test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning. 1571 1572ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF' 1573 extern const int sys_nerr; 1574 extern const char * const sys_errlist[]; 1575 int main(void) { return (*sys_errlist[sys_nerr - 1]); } 1576EOF 1577ac_testn _sys_errlist '!' sys_errlist 0 "the _sys_errlist[] array and _sys_nerr" <<-'EOF' 1578 extern const int _sys_nerr; 1579 extern const char * const _sys_errlist[]; 1580 int main(void) { return (*_sys_errlist[_sys_nerr - 1]); } 1581EOF 1582if test 1 = "$HAVE__SYS_ERRLIST"; then 1583 add_cppflags -Dsys_nerr=_sys_nerr 1584 add_cppflags -Dsys_errlist=_sys_errlist 1585 HAVE_SYS_ERRLIST=1 1586fi 1587ac_cppflags SYS_ERRLIST 1588 1589for what in name list; do 1590 uwhat=`upper $what` 1591 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF 1592 extern const char * const sys_sig${what}[]; 1593 int main(void) { return (sys_sig${what}[0][0]); } 1594 EOF 1595 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF 1596 extern const char * const _sys_sig${what}[]; 1597 int main(void) { return (_sys_sig${what}[0][0]); } 1598 EOF 1599 eval uwhat_v=\$HAVE__SYS_SIG$uwhat 1600 if test 1 = "$uwhat_v"; then 1601 add_cppflags -Dsys_sig$what=_sys_sig$what 1602 eval HAVE_SYS_SIG$uwhat=1 1603 fi 1604 ac_cppflags SYS_SIG$uwhat 1605done 1606 1607# 1608# Environment: library functions 1609# 1610ac_test flock <<-'EOF' 1611 #include <sys/types.h> 1612 #include <fcntl.h> 1613 #undef flock 1614 #if HAVE_SYS_FILE_H 1615 #include <sys/file.h> 1616 #endif 1617 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); } 1618EOF 1619 1620ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF' 1621 #include <fcntl.h> 1622 #undef flock 1623 int main(void) { 1624 struct flock lks; 1625 lks.l_type = F_WRLCK | F_UNLCK; 1626 return (fcntl(0, F_SETLKW, &lks)); 1627 } 1628EOF 1629 1630ac_test getrusage <<-'EOF' 1631 #define MKSH_INCLUDES_ONLY 1632 #include "sh.h" 1633 int main(void) { 1634 struct rusage ru; 1635 return (getrusage(RUSAGE_SELF, &ru) + 1636 getrusage(RUSAGE_CHILDREN, &ru)); 1637 } 1638EOF 1639 1640ac_test gettimeofday <<-'EOF' 1641 #define MKSH_INCLUDES_ONLY 1642 #include "sh.h" 1643 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); } 1644EOF 1645 1646ac_test killpg <<-'EOF' 1647 #include <signal.h> 1648 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); } 1649EOF 1650 1651ac_test memmove <<-'EOF' 1652 #include <sys/types.h> 1653 #include <stddef.h> 1654 #include <string.h> 1655 #if HAVE_STRINGS_H 1656 #include <strings.h> 1657 #endif 1658 int main(int ac, char *av[]) { 1659 return (*(int *)(void *)memmove(av[0], av[1], ac)); 1660 } 1661EOF 1662 1663ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF' 1664 #define MKSH_INCLUDES_ONLY 1665 #include "sh.h" 1666 int main(int ac, char *av[]) { 1667 dev_t dv; 1668 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]); 1669 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) : 1670 (int)minor(dv)); 1671 } 1672EOF 1673 1674ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF' 1675 #include <sys/types.h> 1676 #if HAVE_SYS_FILE_H 1677 #include <sys/file.h> 1678 #endif 1679 #if HAVE_SYS_MMAN_H 1680 #include <sys/mman.h> 1681 #endif 1682 #include <stddef.h> 1683 #include <stdlib.h> 1684 int main(void) { return ((void *)mmap(NULL, (size_t)0, 1685 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 : 1686 munmap(NULL, 0)); } 1687EOF 1688 1689ac_test nice <<-'EOF' 1690 #include <unistd.h> 1691 int main(void) { return (nice(4)); } 1692EOF 1693 1694ac_test revoke <<-'EOF' 1695 #include <sys/types.h> 1696 #if HAVE_LIBUTIL_H 1697 #include <libutil.h> 1698 #endif 1699 #include <unistd.h> 1700 int main(int ac, char *av[]) { return (ac + revoke(av[0])); } 1701EOF 1702 1703ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF' 1704 #include <locale.h> 1705 #include <stddef.h> 1706 int main(void) { return ((int)(ptrdiff_t)(void *)setlocale(LC_CTYPE, "")); } 1707EOF 1708 1709ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF' 1710 #include <langinfo.h> 1711 #include <stddef.h> 1712 int main(void) { return ((int)(ptrdiff_t)(void *)nl_langinfo(CODESET)); } 1713EOF 1714 1715ac_test select <<-'EOF' 1716 #include <sys/types.h> 1717 #if HAVE_BOTH_TIME_H 1718 #include <sys/time.h> 1719 #include <time.h> 1720 #elif HAVE_SYS_TIME_H 1721 #include <sys/time.h> 1722 #elif HAVE_TIME_H 1723 #include <time.h> 1724 #endif 1725 #if HAVE_SYS_BSDTYPES_H 1726 #include <sys/bsdtypes.h> 1727 #endif 1728 #if HAVE_SYS_SELECT_H 1729 #include <sys/select.h> 1730 #endif 1731 #if HAVE_BSTRING_H 1732 #include <bstring.h> 1733 #endif 1734 #include <stddef.h> 1735 #include <stdlib.h> 1736 #include <string.h> 1737 #if HAVE_STRINGS_H 1738 #include <strings.h> 1739 #endif 1740 #include <unistd.h> 1741 int main(void) { 1742 struct timeval tv = { 1, 200000 }; 1743 fd_set fds; FD_ZERO(&fds); FD_SET(0, &fds); 1744 return (select(FD_SETSIZE, &fds, NULL, NULL, &tv)); 1745 } 1746EOF 1747 1748ac_test setresugid <<-'EOF' 1749 #include <sys/types.h> 1750 #include <unistd.h> 1751 int main(void) { setresuid(0,0,0); return (setresgid(0,0,0)); } 1752EOF 1753 1754ac_test setgroups setresugid 0 <<-'EOF' 1755 #include <sys/types.h> 1756 #if HAVE_GRP_H 1757 #include <grp.h> 1758 #endif 1759 #include <unistd.h> 1760 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); } 1761EOF 1762 1763if test x"$et" = x"klibc"; then 1764 1765 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF' 1766 #define MKSH_INCLUDES_ONLY 1767 #include "sh.h" 1768 extern int __rt_sigsuspend(const sigset_t *, size_t); 1769 int main(void) { return (__rt_sigsuspend(NULL, 0)); } 1770EOF 1771 1772 # no? damn! legacy crap ahead! 1773 1774 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \ 1775 'whether sigsuspend is usable (1/2)' <<-'EOF' 1776 #define MKSH_INCLUDES_ONLY 1777 #include "sh.h" 1778 extern int __sigsuspend_s(sigset_t); 1779 int main(void) { return (__sigsuspend_s(0)); } 1780EOF 1781 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \ 1782 'whether sigsuspend is usable (2/2)' <<-'EOF' 1783 #define MKSH_INCLUDES_ONLY 1784 #include "sh.h" 1785 extern int __sigsuspend_xxs(int, int, sigset_t); 1786 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); } 1787EOF 1788 1789 if test "000" = "$HAVE___RT_SIGSUSPEND$HAVE___SIGSUSPEND_S$HAVE___SIGSUSPEND_XXS"; then 1790 # no usable sigsuspend(), use pause() *ugh* 1791 add_cppflags -DMKSH_NO_SIGSUSPEND 1792 fi 1793fi 1794 1795ac_test strerror '!' sys_errlist 0 <<-'EOF' 1796 extern char *strerror(int); 1797 int main(int ac, char *av[]) { return (*strerror(*av[ac])); } 1798EOF 1799 1800ac_test strsignal '!' sys_siglist 0 <<-'EOF' 1801 #include <string.h> 1802 #include <signal.h> 1803 int main(void) { return (strsignal(1)[0]); } 1804EOF 1805 1806ac_test strlcpy <<-'EOF' 1807 #include <string.h> 1808 int main(int ac, char *av[]) { return (strlcpy(*av, av[1], 1809 (size_t)ac)); } 1810EOF 1811 1812# 1813# check headers for declarations 1814# 1815ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF' 1816 #define MKSH_INCLUDES_ONLY 1817 #include "sh.h" 1818 #if HAVE_SYS_FILE_H 1819 #include <sys/file.h> 1820 #endif 1821 int main(void) { return ((flock)(0, 0)); } 1822EOF 1823ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF' 1824 #define MKSH_INCLUDES_ONLY 1825 #include "sh.h" 1826 int main(void) { return ((revoke)("")); } 1827EOF 1828ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF' 1829 #define MKSH_INCLUDES_ONLY 1830 #include "sh.h" 1831 int main(void) { return (*sys_errlist[sys_nerr - 1]); } 1832EOF 1833ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF' 1834 #define MKSH_INCLUDES_ONLY 1835 #include "sh.h" 1836 int main(void) { return (sys_siglist[0][0]); } 1837EOF 1838 1839# 1840# other checks 1841# 1842fd='if to use persistent history' 1843ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in 184411*|101) fv=1 ;; 1845esac 1846test 1 = $fv || check_categories="$check_categories no-histfile" 1847ac_testdone 1848ac_cppflags 1849 1850save_CFLAGS=$CFLAGS 1851test x1 = x$HAVE_CAN_WNOOVERFLOW && CFLAGS="$CFLAGS -Wno-overflow" 1852ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF' 1853 #define MKSH_INCLUDES_ONLY 1854 #include "sh.h" 1855 #ifndef CHAR_BIT 1856 #define CHAR_BIT 8 /* defuse this test on really legacy systems */ 1857 #endif 1858 struct ctasserts { 1859 #define cta(name, assertion) char name[(assertion) ? 1 : -1] 1860/* this one should be defined by the standard */ 1861cta(char_is_1_char, (sizeof(char) == 1) && (sizeof(signed char) == 1) && 1862 (sizeof(unsigned char) == 1)); 1863cta(char_is_8_bits, ((CHAR_BIT) == 8) && ((int)(unsigned char)0xFF == 0xFF) && 1864 ((int)(unsigned char)0x100 == 0) && ((int)(unsigned char)(int)-1 == 0xFF)); 1865/* the next assertion is probably not really needed */ 1866cta(short_is_2_char, sizeof(short) == 2); 1867cta(short_size_no_matter_of_signedness, sizeof(short) == sizeof(unsigned short)); 1868/* the next assertion is probably not really needed */ 1869cta(int_is_4_char, sizeof(int) == 4); 1870cta(int_size_no_matter_of_signedness, sizeof(int) == sizeof(unsigned int)); 1871 1872cta(long_ge_int, sizeof(long) >= sizeof(int)); 1873cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long)); 1874 1875#ifndef MKSH_LEGACY_MODE 1876/* the next assertion is probably not really needed */ 1877cta(ari_is_4_char, sizeof(mksh_ari_t) == 4); 1878/* but the next two are; we REQUIRE signed integer wraparound */ 1879cta(ari_has_31_bit, 0 < (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1)); 1880#ifndef MKSH_GCC55009 1881cta(ari_sign_32_bit_and_wrap, 1882 (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 1) > 1883 (mksh_ari_t)(((((mksh_ari_t)1 << 15) << 15) - 1) * 2 + 2)); 1884#endif 1885/* the next assertion is probably not really needed */ 1886cta(uari_is_4_char, sizeof(mksh_uari_t) == 4); 1887/* but the next three are; we REQUIRE unsigned integer wraparound */ 1888cta(uari_has_31_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 2 + 1)); 1889cta(uari_has_32_bit, 0 < (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3)); 1890cta(uari_wrap_32_bit, 1891 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 3) > 1892 (mksh_uari_t)(((((mksh_uari_t)1 << 15) << 15) - 1) * 4 + 4)); 1893#endif 1894/* these are always required */ 1895cta(ari_is_signed, (mksh_ari_t)-1 < (mksh_ari_t)0); 1896cta(uari_is_unsigned, (mksh_uari_t)-1 > (mksh_uari_t)0); 1897 1898cta(sizet_size_no_matter_of_signedness, sizeof(ssize_t) == sizeof(size_t)); 1899cta(ptrdifft_sizet_same_size, sizeof(ptrdiff_t) == sizeof(size_t)); 1900cta(ptrdifft_voidptr_same_size, sizeof(ptrdiff_t) == sizeof(void *)); 1901cta(ptrdifft_funcptr_same_size, sizeof(ptrdiff_t) == sizeof(void (*)(void))); 1902/* our formatting routines assume this */ 1903cta(ptr_fits_in_long, sizeof(ptrdiff_t) <= sizeof(long)); 1904 }; 1905#ifndef MKSH_LEGACY_MODE 1906#ifndef MKSH_GCC55009 1907#define NUM 22 1908#else 1909#define NUM 21 1910#endif 1911#else 1912#define NUM 15 1913#endif 1914char ctasserts_dblcheck[sizeof(struct ctasserts) == NUM ? 1 : -1]; 1915 int main(void) { return (sizeof(ctasserts_dblcheck)); } 1916EOF 1917CFLAGS=$save_CFLAGS 1918eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1 1919 1920# 1921# extra checks for legacy mksh 1922# 1923if test $legacy = 1; then 1924 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF' 1925 #define MKSH_INCLUDES_ONLY 1926 #include "sh.h" 1927 #ifndef CHAR_BIT 1928 #define CHAR_BIT 0 1929 #endif 1930 struct ctasserts { 1931 #define cta(name, assertion) char name[(assertion) ? 1 : -1] 1932 cta(char_is_8_bits, (CHAR_BIT) == 8); 1933 cta(long_is_32_bits, sizeof(long) == 4); 1934 }; 1935 int main(void) { return (sizeof(struct ctasserts)); } 1936EOF 1937 1938 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF' 1939 #define MKSH_INCLUDES_ONLY 1940 #include "sh.h" 1941 #ifndef CHAR_BIT 1942 #define CHAR_BIT 0 1943 #endif 1944 struct ctasserts { 1945 #define cta(name, assertion) char name[(assertion) ? 1 : -1] 1946 cta(char_is_8_bits, (CHAR_BIT) == 8); 1947 cta(long_is_64_bits, sizeof(long) == 8); 1948 }; 1949 int main(void) { return (sizeof(struct ctasserts)); } 1950EOF 1951 1952 case $HAVE_LONG_32BIT$HAVE_LONG_64BIT in 1953 10) check_categories="$check_categories int:32" ;; 1954 01) check_categories="$check_categories int:64" ;; 1955 *) check_categories="$check_categories int:u" ;; 1956 esac 1957fi 1958 1959# 1960# runtime checks 1961# once this is more than one, check if we can do runtime 1962# checks (not cross-compiling) first to save on warnings 1963# 1964$e "${bi}run-time checks follow$ao, please ignore any weird errors" 1965 1966if ac_testnnd silent_idivwrapv '' '(run-time) whether signed integer division overflows wrap silently' <<-'EOF' 1967 #define MKSH_INCLUDES_ONLY 1968 #include "sh.h" 1969 #if !defined(MKSH_LEGACY_MODE) || HAVE_LONG_32BIT 1970 #define IDIVWRAPV_VL (mksh_uari_t)0x80000000UL 1971 #elif HAVE_LONG_64BIT 1972 #define IDIVWRAPV_VL (mksh_uari_t)0x8000000000000000UL 1973 #else 1974 # error "cannot check this" 1975 #endif 1976 #ifdef SIGFPE 1977 static void fpe_catcher(int) MKSH_A_NORETURN; 1978 #endif 1979 int main(int ac, char **av) { 1980 mksh_ari_t o1, o2, r1, r2; 1981 1982 #ifdef SIGFPE 1983 signal(SIGFPE, fpe_catcher); 1984 #endif 1985 o1 = (mksh_ari_t)IDIVWRAPV_VL; 1986 o2 = -ac; 1987 r1 = o1 / o2; 1988 r2 = o1 % o2; 1989 if (r1 == o1 && r2 == 0) { 1990 printf("si"); 1991 return (0); 1992 } 1993 printf("no %d %d %d %d %s", (int)o1, (int)o2, (int)r1, 1994 (int)r2, av[0]); 1995 return (1); 1996 } 1997 #ifdef SIGFPE 1998 static const char fpe_msg[] = "no, got SIGFPE, what were they smoking?"; 1999 #define fpe_msglen (sizeof(fpe_msg) - 1) 2000 static void fpe_catcher(int sig MKSH_A_UNUSED) { 2001 _exit(write(1, fpe_msg, fpe_msglen) == fpe_msglen ? 2 : 3); 2002 } 2003 #endif 2004EOF 2005then 2006 if test $fv = 0; then 2007 echo "| hrm, compiling this failed, but we will just failback" 2008 else 2009 echo "| running test programme; this will fail if cross-compiling" 2010 echo "| in which case we will gracefully degrade to the default" 2011 ./$tcfn >vv.out 2>&1 2012 rv=$? 2013 echo "| result: `cat vv.out`" 2014 fv=0 2015 test $rv = 0 && test x"`cat vv.out`" = x"si" && fv=1 2016 fi 2017 rmf conftest.c conftest.o ${tcfn}* vv.out 2018 ac_testdone 2019fi 2020ac_cppflags 2021 2022$e "${bi}end of run-time checks$ao" 2023 2024# 2025# Compiler: Praeprocessor (only if needed) 2026# 2027test 0 = $HAVE_SYS_SIGNAME && if ac_testinit cpp_dd '' \ 2028 'checking if the C Preprocessor supports -dD'; then 2029 echo '#define foo bar' >conftest.c 2030 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c >x" 2031 grep '#define foo bar' x >/dev/null 2>&1 && fv=1 2032 rmf conftest.c x vv.out 2033 ac_testdone 2034fi 2035 2036# 2037# End of mirtoconf checks 2038# 2039$e ... done. 2040 2041# Some operating systems have ancient versions of ed(1) writing 2042# the character count to standard output; cope for that 2043echo wq >x 2044ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \ 2045 check_categories="$check_categories $oldish_ed" 2046rmf x vv.out 2047 2048if test 0 = $HAVE_SYS_SIGNAME; then 2049 if test 1 = $HAVE_CPP_DD; then 2050 $e Generating list of signal names... 2051 else 2052 $e No list of signal names available via cpp. Falling back... 2053 fi 2054 sigseenone=: 2055 sigseentwo=: 2056 echo '#include <signal.h> 2057#ifndef NSIG 2058#if defined(_NSIG) 2059#define NSIG _NSIG 2060#elif defined(SIGMAX) 2061#define NSIG (SIGMAX+1) 2062#elif defined(_SIGMAX) 2063#define NSIG (_SIGMAX+1) 2064#endif 2065#endif 2066int 2067mksh_cfg= NSIG 2068;' >conftest.c 2069 # GNU sed 2.03 segfaults when optimising this to sed -n 2070 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \ 2071 grep '^ *mksh_cfg *=' | \ 2072 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'` 2073 case $NSIG in 2074 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;; 2075 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;; 2076 esac 2077 printf=printf 2078 (printf hallo) >/dev/null 2>&1 || printf=echo 2079 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo 2080 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null` 2081 $printf "NSIG=$NSIG ... " 2082 sigs="INT SEGV ABRT KILL ALRM BUS CHLD CLD CONT DIL EMT FPE HUP ILL" 2083 sigs="$sigs INFO IO IOT LOST PIPE PROF PWR QUIT RESV SAK STOP SYS TERM" 2084 sigs="$sigs TRAP TSTP TTIN TTOU URG USR1 USR2 VTALRM WINCH XCPU XFSZ" 2085 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \ 2086 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \ 2087 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \ 2088 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort` 2089 test $NSIG -gt 1 || sigs= 2090 for name in $sigs; do 2091 case $sigseenone in 2092 *:$name:*) continue ;; 2093 esac 2094 sigseenone=$sigseenone$name: 2095 echo '#include <signal.h>' >conftest.c 2096 echo int >>conftest.c 2097 echo mksh_cfg= SIG$name >>conftest.c 2098 echo ';' >>conftest.c 2099 # GNU sed 2.03 croaks on optimising this, too 2100 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \ 2101 grep '^ *mksh_cfg *=' | \ 2102 sed 's/^ *mksh_cfg *=[ ]*\([0-9][0-9x]*\).*$/:\1 '$name/ 2103 done | sed -n '/^:[^ ]/s/^://p' | while read nr name; do 2104 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null` 2105 test $nr -gt 0 && test $nr -le $NSIG || continue 2106 case $sigseentwo in 2107 *:$nr:*) ;; 2108 *) echo " { \"$name\", $nr }," 2109 sigseentwo=$sigseentwo$nr: 2110 $printf "$name=$nr " >&2 2111 ;; 2112 esac 2113 done 2>&1 >signames.inc 2114 rmf conftest.c 2115 $e done. 2116fi 2117 2118addsrcs -s '!' HAVE_STRLCPY strlcpy.c 2119addsrcs USE_PRINTF_BUILTIN printf.c 2120test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN 2121test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose" 2122test -n "$LDSTATIC" && add_cppflags -DMKSH_OPTSTATIC 2123add_cppflags -DMKSH_BUILD_R=431 2124 2125$e $bi$me: Finished configuration testing, now producing output.$ao 2126 2127files= 2128objs= 2129sp= 2130case $tcfn in 2131a.exe) mkshexe=$tfn.exe ;; 2132*) mkshexe=$tfn ;; 2133esac 2134case $curdir in 2135*\ *) mkshshebang="#!./$mkshexe" ;; 2136*) mkshshebang="#!$curdir/$mkshexe" ;; 2137esac 2138cat >test.sh <<-EOF 2139 $mkshshebang 2140 LC_ALL=C PATH='$PATH'; export LC_ALL PATH 2141 test -n "\$KSH_VERSION" || exit 1 2142 set -A check_categories -- $check_categories 2143 pflag='$curdir/$mkshexe' 2144 sflag='$srcdir/check.t' 2145 usee=0 Pflag=0 Sflag=0 uset=0 vflag=1 xflag=0 2146 while getopts "C:e:fPp:QSs:t:v" ch; do case \$ch { 2147 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;; 2148 (e) usee=1; eflag=\$OPTARG ;; 2149 (f) check_categories[\${#check_categories[*]}]=fastbox ;; 2150 (P) Pflag=1 ;; 2151 (+P) Pflag=0 ;; 2152 (p) pflag=\$OPTARG ;; 2153 (Q) vflag=0 ;; 2154 (+Q) vflag=1 ;; 2155 (S) Sflag=1 ;; 2156 (+S) Sflag=0 ;; 2157 (s) sflag=\$OPTARG ;; 2158 (t) uset=1; tflag=\$OPTARG ;; 2159 (v) vflag=1 ;; 2160 (+v) vflag=0 ;; 2161 (*) xflag=1 ;; 2162 } 2163 done 2164 shift \$((OPTIND - 1)) 2165 set -A args -- '$srcdir/check.pl' -p "\$pflag" 2166 x= 2167 for y in "\${check_categories[@]}"; do 2168 x=\$x,\$y 2169 done 2170 if [[ -n \$x ]]; then 2171 args[\${#args[*]}]=-C 2172 args[\${#args[*]}]=\${x#,} 2173 fi 2174 if (( usee )); then 2175 args[\${#args[*]}]=-e 2176 args[\${#args[*]}]=\$eflag 2177 fi 2178 (( Pflag )) && args[\${#args[*]}]=-P 2179 if (( uset )); then 2180 args[\${#args[*]}]=-t 2181 args[\${#args[*]}]=\$tflag 2182 fi 2183 (( vflag )) && args[\${#args[*]}]=-v 2184 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr 2185 print Testing mksh for conformance: 2186 fgrep -e MirOS: -e MIRBSD "\$sflag" 2187 print "This shell is actually:\\n\\t\$KSH_VERSION" 2188 print 'test.sh built for mksh $dstversion' 2189 cstr='\$os = defined \$^O ? \$^O : "unknown";' 2190 cstr="\$cstr"'print \$os . ", Perl version " . \$];' 2191 for perli in \$PERL perl5 perl no; do 2192 if [[ \$perli = no ]]; then 2193 print Cannot find a working Perl interpreter, aborting. 2194 exit 1 2195 fi 2196 print "Trying Perl interpreter '\$perli'..." 2197 perlos=\$(\$perli -e "\$cstr") 2198 rv=\$? 2199 print "Errorlevel \$rv, running on '\$perlos'" 2200 if (( rv )); then 2201 print "=> not using" 2202 continue 2203 fi 2204 if [[ -n \$perlos ]]; then 2205 print "=> using it" 2206 break 2207 fi 2208 done 2209 (( Sflag )) || echo + \$perli "\${args[@]}" -s "\$sflag" "\$@" 2210 (( Sflag )) || exec \$perli "\${args[@]}" -s "\$sflag" "\$@"$tsts 2211 # use of the -S option for check.t split into multiple chunks 2212 rv=0 2213 for s in "\$sflag".*; do 2214 echo + \$perli "\${args[@]}" -s "\$s" "\$@" 2215 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts 2216 rc=\$? 2217 (( rv = rv ? rv : rc )) 2218 done 2219 exit \$rv 2220EOF 2221chmod 755 test.sh 2222if test $cm = llvm; then 2223 emitbc="-emit-llvm -c" 2224elif test $cm = dragonegg; then 2225 emitbc="-S -flto" 2226else 2227 emitbc=-c 2228fi 2229echo ": # work around NeXTstep bug" >Rebuild.sh 2230echo set -x >>Rebuild.sh 2231for file in $SRCS; do 2232 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'` 2233 test -f $file || file=$srcdir/$file 2234 files="$files$sp$file" 2235 sp=' ' 2236 echo "$CC $CFLAGS $CPPFLAGS $emitbc $file || exit 1" >>Rebuild.sh 2237 if test $cm = dragonegg; then 2238 echo "mv ${op}s ${op}ll" >>Rebuild.sh 2239 echo "llvm-as ${op}ll || exit 1" >>Rebuild.sh 2240 objs="$objs$sp${op}bc" 2241 else 2242 objs="$objs$sp${op}o" 2243 fi 2244done 2245case $cm in 2246dragonegg|llvm) 2247 echo "rm -f $tfn.s" >>Rebuild.sh 2248 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh 2249 lobjs=$tfn.s 2250 ;; 2251*) 2252 lobjs=$objs 2253 ;; 2254esac 2255echo tcfn=$mkshexe >>Rebuild.sh 2256echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh 2257echo 'test -f $tcfn || exit 1; size $tcfn' >>Rebuild.sh 2258if test $cm = makefile; then 2259 extras='emacsfn.h sh.h sh_flags.h var_spec.h' 2260 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc" 2261 cat >Makefrag.inc <<EOF 2262# Makefile fragment for building mksh $dstversion 2263 2264PROG= $mkshexe 2265MAN= mksh.1 2266SRCS= $SRCS 2267SRCS_FP= $files 2268OBJS_BP= $objs 2269INDSRCS= $extras 2270NONSRCS_INST= dot.mkshrc \$(MAN) 2271NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh 2272CC= $CC 2273CFLAGS= $CFLAGS 2274CPPFLAGS= $CPPFLAGS 2275LDFLAGS= $LDFLAGS 2276LIBS= $LIBS 2277 2278# not BSD make only: 2279#VPATH= $srcdir 2280#all: \$(PROG) 2281#\$(PROG): \$(OBJS_BP) 2282# \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS) 2283#\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS) 2284#.c.o: 2285# \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$< 2286 2287# for all make variants: 2288#REGRESS_FLAGS= -f 2289#regress: 2290# ./test.sh \$(REGRESS_FLAGS) 2291check_categories=$check_categories 2292 2293# for BSD make only: 2294#.PATH: $srcdir 2295#.include <bsd.prog.mk> 2296EOF 2297 $e 2298 $e Generated Makefrag.inc successfully. 2299 exit 0 2300fi 2301if test $cm = combine; then 2302 objs="-o $mkshexe" 2303 for file in $SRCS; do 2304 test -f $file || file=$srcdir/$file 2305 objs="$objs $file" 2306 done 2307 emitbc="-fwhole-program --combine" 2308 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS $emitbc $objs $LIBS $ccpr" 2309elif test 1 = $pm; then 2310 for file in $SRCS; do 2311 test -f $file || file=$srcdir/$file 2312 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" & 2313 done 2314 wait 2315else 2316 for file in $SRCS; do 2317 test $cm = dragonegg && \ 2318 op=`echo x"$file" | sed 's/^x\(.*\)\.c$/\1./'` 2319 test -f $file || file=$srcdir/$file 2320 v "$CC $CFLAGS $CPPFLAGS $emitbc $file" || exit 1 2321 if test $cm = dragonegg; then 2322 v "mv ${op}s ${op}ll" 2323 v "llvm-as ${op}ll" || exit 1 2324 fi 2325 done 2326fi 2327case $cm in 2328dragonegg|llvm) 2329 rmf $tfn.s 2330 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" 2331 ;; 2332esac 2333tcfn=$mkshexe 2334test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr" 2335test -f $tcfn || exit 1 2336test 1 = $r || v "$NROFF -mdoc <'$srcdir/mksh.1' >$tfn.cat1" || \ 2337 rmf $tfn.cat1 2338test 0 = $eq && v size $tcfn 2339i=install 2340test -f /usr/ucb/$i && i=/usr/ucb/$i 2341test 1 = $eq && e=: 2342$e 2343$e Installing the shell: 2344$e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn" 2345$e "# grep -x /bin/$tfn /etc/shells >/dev/null || echo /bin/$tfn >>/etc/shells" 2346$e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/" 2347$e 2348$e Installing the manual: 2349if test -f $tfn.cat1; then 2350 $e "# $i -c -o root -g bin -m 444 $tfn.cat1" \ 2351 "/usr/share/man/cat1/$tfn.0" 2352 $e or 2353fi 2354$e "# $i -c -o root -g bin -m 444 mksh.1 /usr/share/man/man1/$tfn.1" 2355$e 2356$e Run the regression test suite: ./test.sh 2357$e Please also read the sample file dot.mkshrc and the fine manual. 2358exit 0 2359 2360: <<'EOD' 2361 2362=== Environment used === 2363 2364==== build environment ==== 2365AWK default: awk 2366CC default: cc 2367CFLAGS if empty, defaults to -xO2 or +O2 2368 or -O3 -qstrict or -O2, per compiler 2369CPPFLAGS default empty 2370LDFLAGS default empty; added before sources 2371LDSTATIC set this to '-static'; default unset 2372LIBS default empty; added after sources 2373 [Interix] default: -lcrypt (XXX still needed?) 2374NOWARN -Wno-error or similar 2375NROFF default: nroff 2376TARGET_OS default: $(uname -s || uname) 2377TARGET_OSREV [QNX] default: $(uname -r) 2378 2379==== feature selectors ==== 2380USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin 2381===== general format ===== 2382HAVE_STRLEN ac_test 2383HAVE_STRING_H ac_header 2384HAVE_CAN_FSTACKPROTECTORALL ac_flags 2385 2386==== cpp definitions ==== 2387DEBUG dont use in production, wants gcc, implies: 2388DEBUG_LEAKS enable freeing resources before exiting 2389MKSHRC_PATH "~/.mkshrc" (do not change) 2390MKSH_A4PB force use of arc4random_pushb 2391MKSH_ASSUME_UTF8 (0=disabled, 1=enabled; default: unset) 2392MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh 2393MKSH_CLRTOEOL_STRING "\033[K" 2394MKSH_CLS_STRING "\033[;H\033[J" 2395MKSH_CONSERVATIVE_FDS fd 0-9 for scripts, shell only up to 31 2396MKSH_DEFAULT_EXECSHELL "/bin/sh" (do not change) 2397MKSH_DEFAULT_PROFILEDIR "/etc" (do not change) 2398MKSH_DEFAULT_TMPDIR "/tmp" (do not change) 2399MKSH_DISABLE_DEPRECATED disable code paths scheduled for later removal 2400MKSH_DISABLE_EXPERIMENTAL disable code not yet comfy for (LTS) snapshots 2401MKSH_DISABLE_TTY_WARNING shut up warning about ctty if OS cant be fixed 2402MKSH_DONT_EMIT_IDSTRING omit RCS IDs from binary 2403MKSH_GCC55009 DANGER! see http://www.mirbsd.org/mksh.htm#p41 2404MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk 2405MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use) 2406MKSH_NOPWNAM skip PAM calls, for -static on eglibc, Solaris 2407MKSH_NO_CMDLINE_EDITING disable command line editing code entirely 2408MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run 2409MKSH_NO_EXTERNAL_CAT omit hack to skip cat builtin when flags passed 2410MKSH_NO_LIMITS omit ulimit code 2411MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available 2412MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend 2413MKSH_SMALL omit some code, optimise hard for size (slower) 2414MKSH_SMALL_BUT_FAST disable some hard-for-size optim. (modern sys.) 2415MKSH_S_NOVI=1 disable Vi editing mode (default if MKSH_SMALL) 2416MKSH_TYPEDEF_SIG_ATOMIC_T define to e.g. 'int' if sig_atomic_t is missing 2417MKSH_TYPEDEF_SSIZE_T define to e.g. 'long' if your OS has no ssize_t 2418MKSH_UNEMPLOYED disable job control (but not jobs/co-processes) 2419 2420=== generic installation instructions === 2421 2422Set CC and possibly CFLAGS, CPPFLAGS, LDFLAGS, LIBS. If cross-compiling, 2423also set TARGET_OS. To disable tests, set e.g. HAVE_STRLCPY=0; to enable 2424them, set to a value other than 0 or 1. Ensure /bin/ed is installed. For 2425MKSH_SMALL but with Vi mode, add -DMKSH_S_NOVI=0 to CPPFLAGS as well. 2426 2427Normally, the following command is what you want to run, then: 2428$ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log 2429 2430Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or 2431/bin; install the manpage, if omitting the -r flag a catmanpage is made 2432using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like 2433https://www.mirbsd.org/cvs.cgi/contrib/hosted/tg/deb/mksh/debian/.mkshrc?rev=HEAD 2434and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME. 2435 2436EOD 2437