1 #!/bin/sh 2 srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.645 2013/08/10 13:44:25 tg Exp $' 3 #- 4 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 5 # 2011, 2012, 2013 6 # Thorsten Glaser <tg (at] 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 28 LC_ALL=C 29 export LC_ALL 30 31 echo "For the build logs, demonstrate that /dev/null and /dev/tty exist:" 32 ls -l /dev/null /dev/tty 33 34 case $ZSH_VERSION:$VERSION in 35 :zsh*) ZSH_VERSION=2 ;; 36 esac 37 38 if test -n "${ZSH_VERSION+x}" && (emulate sh) >/dev/null 2>&1; then 39 emulate sh 40 NULLCMD=: 41 fi 42 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 46 export PATH 47 fi 48 49 v() { 50 $e "$*" 51 eval "$@" 52 } 53 54 vv() { 55 _c=$1 56 shift 57 $e "\$ $*" 2>&1 58 eval "$@" >vv.out 2>&1 59 sed "s^${_c} " <vv.out 60 } 61 62 vq() { 63 eval "$@" 64 } 65 66 rmf() { 67 for _f in "$@"; do 68 case $_f in 69 Build.sh|check.pl|check.t|dot.mkshrc|*.c|*.h|*.ico|*.1) ;; 70 *) rm -f "$_f" ;; 71 esac 72 done 73 } 74 75 allu=QWERTYUIOPASDFGHJKLZXCVBNM 76 alll=qwertyuiopasdfghjklzxcvbnm 77 alln=0123456789 78 alls=______________________________________________________________ 79 nl=' 80 ' 81 tcfn=no 82 bi= 83 ui= 84 ao= 85 fx= 86 me=`basename "$0"` 87 orig_CFLAGS=$CFLAGS 88 phase=x 89 oldish_ed=stdout-ed,no-stderr-ed 90 91 if test -t 1; then 92 bi='[1m' 93 ui='[4m' 94 ao='[0m' 95 fi 96 97 upper() { 98 echo :"$@" | sed 's/^://' | tr $alll $allu 99 } 100 101 # clean up after ac_testrun() 102 ac_testdone() { 103 eval HAVE_$fu=$fv 104 fr=no 105 test 0 = $fv || fr=yes 106 $e "$bi==> $fd...$ao $ui$fr$ao$fx" 107 fx= 108 } 109 110 # ac_cache label: sets f, fu, fv?=0 111 ac_cache() { 112 f=$1 113 fu=`upper $f` 114 eval fv=\$HAVE_$fu 115 case $fv in 116 0|1) 117 fx=' (cached)' 118 return 0 119 ;; 120 esac 121 fv=0 122 return 1 123 } 124 125 # ac_testinit label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 126 # returns 1 if value was cached/implied, 0 otherwise: call ac_testdone 127 ac_testinit() { 128 if ac_cache $1; then 129 test x"$2" = x"!" && shift 130 test x"$2" = x"" || shift 131 fd=${3-$f} 132 ac_testdone 133 return 1 134 fi 135 fc=0 136 if test x"$2" = x""; then 137 ft=1 138 else 139 if test x"$2" = x"!"; then 140 fc=1 141 shift 142 fi 143 eval ft=\$HAVE_`upper $2` 144 shift 145 fi 146 fd=${3-$f} 147 if test $fc = "$ft"; then 148 fv=$2 149 fx=' (implied)' 150 ac_testdone 151 return 1 152 fi 153 $e ... $fd 154 return 0 155 } 156 157 # pipe .c | ac_test[n] [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 158 ac_testnnd() { 159 if test x"$1" = x"!"; then 160 fr=1 161 shift 162 else 163 fr=0 164 fi 165 ac_testinit "$@" || return 1 166 cat >conftest.c 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 172 test 1 = $fr || fv=1 173 else 174 test 0 = $fr || fv=1 175 fi 176 vscan= 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' 182 fi 183 test -n "$vscan" && grep $vscan vv.out >/dev/null 2>&1 && fv=$fr 184 return 0 185 } 186 ac_testn() { 187 ac_testnnd "$@" || return 188 rmf conftest.c conftest.o ${tcfn}* vv.out 189 ac_testdone 190 } 191 192 # ac_ifcpp cppexpr [!] label [!] checkif[!]0 [setlabelifcheckis[!]0] useroutput 193 ac_ifcpp() { 194 expr=$1; shift 195 ac_testn "$@" <<-EOF 196 extern int thiswillneverbedefinedIhope(void); 197 int main(void) { return ( 198 #$expr 199 0 200 #else 201 /* force a failure: expr is false */ 202 thiswillneverbedefinedIhope() 203 #endif 204 ); } 205 EOF 206 test x"$1" = x"!" && shift 207 f=$1 208 fu=`upper $f` 209 eval fv=\$HAVE_$fu 210 test x"$fv" = x"1" 211 } 212 213 add_cppflags() { 214 CPPFLAGS="$CPPFLAGS $*" 215 } 216 217 ac_cppflags() { 218 test x"$1" = x"" || fu=$1 219 fv=$2 220 test x"$2" = x"" && eval fv=\$HAVE_$fu 221 add_cppflags -DHAVE_$fu=$fv 222 } 223 224 ac_test() { 225 ac_testn "$@" 226 ac_cppflags 227 } 228 229 # ac_flags [-] add varname cflags [text] [ldflags] 230 ac_flags() { 231 if test x"$1" = x"-"; then 232 shift 233 hf=1 234 else 235 hf=0 236 fi 237 fa=$1 238 vn=$2 239 f=$3 240 ft=$4 241 fl=$5 242 test x"$ft" = x"" && ft="if $f can be used" 243 save_CFLAGS=$CFLAGS 244 CFLAGS="$CFLAGS $f" 245 if test -n "$fl"; then 246 save_LDFLAGS=$LDFLAGS 247 LDFLAGS="$LDFLAGS $fl" 248 fi 249 if test 1 = $hf; then 250 ac_testn can_$vn '' "$ft" 251 else 252 ac_testn can_$vn '' "$ft" <<-'EOF' 253 /* evil apo'stroph in comment test */ 254 int main(void) { return (0); } 255 EOF 256 fi 257 eval fv=\$HAVE_CAN_`upper $vn` 258 if test -n "$fl"; then 259 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS 260 fi 261 test 11 = $fa$fv || CFLAGS=$save_CFLAGS 262 } 263 264 # ac_header [!] header [prereq ...] 265 ac_header() { 266 if test x"$1" = x"!"; then 267 na=1 268 shift 269 else 270 na=0 271 fi 272 hf=$1; shift 273 hv=`echo "$hf" | tr -d '\012\015' | tr -c $alll$allu$alln $alls` 274 echo "/* NeXTstep bug workaround */" >x 275 for i 276 do 277 case $i in 278 _time) 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 286 echo '#endif' >>x 287 ;; 288 *) 289 echo "#include <$i>" >>x 290 ;; 291 esac 292 done 293 echo "#include <$hf>" >>x 294 echo 'int main(void) { return (0); }' >>x 295 ac_testn "$hv" "" "<$hf>" <x 296 rmf x 297 test 1 = $na || ac_cppflags 298 } 299 300 addsrcs() { 301 addsrcs_s=0 302 if test x"$1" = x"-s"; then 303 # optstatic 304 addsrcs_s=1 305 shift 306 fi 307 if test x"$1" = x"!"; then 308 fr=0 309 shift 310 else 311 fr=1 312 fi 313 eval i=\$$1 314 if test $addsrcs_s = 1; then 315 if test -f "$2" || test -f "$srcdir/$2"; then 316 # always add $2, since it exists 317 fr=1 318 i=1 319 fi 320 fi 321 test $fr = "$i" && case " $SRCS " in 322 *\ $2\ *) ;; 323 *) SRCS="$SRCS $2" ;; 324 esac 325 } 326 327 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 332 333 e=echo 334 r=0 335 eq=0 336 pm=0 337 cm=normal 338 optflags=-std-compile-opts 339 last= 340 tfn= 341 legacy=0 342 343 for i 344 do 345 case $last:$i in 346 c:combine|c:dragonegg|c:llvm|c:lto) 347 cm=$i 348 last= 349 ;; 350 c:*) 351 echo "$me: Unknown option -c '$i'!" >&2 352 exit 1 353 ;; 354 o:*) 355 optflags=$i 356 last= 357 ;; 358 t:*) 359 tfn=$i 360 last= 361 ;; 362 :-c) 363 last=c 364 ;; 365 :-g) 366 # checker, debug, valgrind build 367 add_cppflags -DDEBUG 368 CFLAGS="$CFLAGS -g3 -fno-builtin" 369 ;; 370 :-j) 371 pm=1 372 ;; 373 :-L) 374 legacy=1 375 ;; 376 :+L) 377 legacy=0 378 ;; 379 :-M) 380 cm=makefile 381 ;; 382 :-O) 383 optflags=-std-compile-opts 384 ;; 385 :-o) 386 last=o 387 ;; 388 :-Q) 389 eq=1 390 ;; 391 :-r) 392 r=1 393 ;; 394 :-t) 395 last=t 396 ;; 397 :-v) 398 echo "Build.sh $srcversion" 399 echo "for mksh $dstversion" 400 exit 0 401 ;; 402 :*) 403 echo "$me: Unknown option '$i'!" >&2 404 exit 1 405 ;; 406 *) 407 echo "$me: Unknown option -'$last' '$i'!" >&2 408 exit 1 409 ;; 410 esac 411 done 412 if test -n "$last"; then 413 echo "$me: Option -'$last' not followed by argument!" >&2 414 exit 1 415 fi 416 417 test -z "$tfn" && if test $legacy = 0; then 418 tfn=mksh 419 else 420 tfn=lksh 421 fi 422 if test -d $tfn || test -d $tfn.exe; then 423 echo "$me: Error: ./$tfn is a directory!" >&2 424 exit 1 425 fi 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 428 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" 431 432 if test $legacy = 0; then 433 SRCS="$SRCS edit.c" 434 check_categories="$check_categories shell:legacy-no int:32" 435 else 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 440 fi 441 442 if test x"$srcdir" = x"."; then 443 CPPFLAGS="-I. $CPPFLAGS" 444 else 445 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS" 446 fi 447 test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then 448 LDFLAGS="$LDFLAGS $LDSTATIC" 449 else 450 LDFLAGS=$LDSTATIC 451 fi 452 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 456 fi 457 if test -z "$TARGET_OS"; then 458 echo "$me: Set TARGET_OS, your uname is broken!" >&2 459 exit 1 460 fi 461 oswarn= 462 ccpc=-Wc, 463 ccpl=-Wl, 464 tsts= 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' 466 467 # Evil hack 468 if test x"$TARGET_OS" = x"Android"; then 469 check_categories="$check_categories android" 470 TARGET_OS=Linux 471 fi 472 473 # Evil OS 474 if test x"$TARGET_OS" = x"Minix"; then 475 echo >&2 " 476 WARNING: additional checks before running Build.sh required! 477 You can avoid these by calling Build.sh correctly, see below. 478 " 479 cat >conftest.c <<'EOF' 480 #include <sys/types.h> 481 const char * 482 #ifdef _NETBSD_SOURCE 483 ct="Ninix3" 484 #else 485 ct="Minix3" 486 #endif 487 ; 488 EOF 489 ct=unknown 490 vv ']' "${CC-cc} -E $CFLAGS $CPPFLAGS $NOWARN conftest.c | grep ct= | tr -d \\\\015 >x" 491 sed 's/^/[ /' x 492 eval `cat x` 493 rmf x vv.out 494 case $ct in 495 Minix3|Ninix3) 496 echo >&2 " 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 502 " 503 TARGET_OS=$ct 504 ;; 505 *) 506 echo >&2 " 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. 511 " 512 ;; 513 esac 514 fi 515 516 # Configuration depending on OS revision, on OSes that need them 517 case $TARGET_OS in 518 NEXTSTEP) 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/'` 522 ;; 523 QNX|SCO_SV) 524 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r` 525 ;; 526 esac 527 528 # Configuration depending on OS name 529 case $TARGET_OS in 530 386BSD) 531 : ${HAVE_CAN_OTWO=0} 532 add_cppflags -DMKSH_NO_SIGSETJMP 533 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int 534 add_cppflags -DMKSH_CONSERVATIVE_FDS 535 ;; 536 AIX) 537 add_cppflags -D_ALL_SOURCE 538 : ${HAVE_SETLOCALE_CTYPE=0} 539 ;; 540 BeOS) 541 case $KSH_VERSION in 542 *MIRBSD\ KSH*) 543 oswarn="; it has minor issues" 544 ;; 545 *) 546 oswarn="; you must recompile mksh with" 547 oswarn="$oswarn${nl}itself in a second stage" 548 ;; 549 esac 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 555 ;; 556 BSD/OS) 557 : ${HAVE_SETLOCALE_CTYPE=0} 558 ;; 559 Coherent) 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 566 ;; 567 CYGWIN*) 568 : ${HAVE_SETLOCALE_CTYPE=0} 569 ;; 570 Darwin) 571 add_cppflags -D_DARWIN_C_SOURCE 572 ;; 573 DragonFly) 574 ;; 575 FreeBSD) 576 ;; 577 FreeMiNT) 578 oswarn="; it has minor issues" 579 add_cppflags -D_GNU_SOURCE 580 add_cppflags -DMKSH_CONSERVATIVE_FDS 581 : ${HAVE_SETLOCALE_CTYPE=0} 582 ;; 583 GNU) 584 case $CC in 585 *tendracc*) ;; 586 *) add_cppflags -D_GNU_SOURCE ;; 587 esac 588 # define MKSH__NO_PATH_MAX to use Hurd-only functions 589 add_cppflags -DMKSH__NO_PATH_MAX 590 ;; 591 GNU/kFreeBSD) 592 case $CC in 593 *tendracc*) ;; 594 *) add_cppflags -D_GNU_SOURCE ;; 595 esac 596 ;; 597 Haiku) 598 add_cppflags -DMKSH_ASSUME_UTF8; HAVE_ISSET_MKSH_ASSUME_UTF8=1 599 ;; 600 HP-UX) 601 ;; 602 Interix) 603 ccpc='-X ' 604 ccpl='-Y ' 605 add_cppflags -D_ALL_SOURCE 606 : ${LIBS='-lcrypt'} 607 : ${HAVE_SETLOCALE_CTYPE=0} 608 ;; 609 IRIX*) 610 : ${HAVE_SETLOCALE_CTYPE=0} 611 ;; 612 Linux) 613 case $CC in 614 *tendracc*) ;; 615 *) add_cppflags -D_GNU_SOURCE ;; 616 esac 617 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN 618 : ${HAVE_REVOKE=0} 619 ;; 620 LynxOS) 621 oswarn="; it has minor issues" 622 ;; 623 MidnightBSD) 624 ;; 625 Minix-vmd) 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} 632 ;; 633 Minix3) 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} 640 ;; 641 MirBSD) 642 ;; 643 MSYS_*) 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) 648 : ${HAVE_STDINT_H=0} 649 ;; 650 NetBSD) 651 ;; 652 NEXTSTEP) 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 660 4.2*) 661 # OpenStep 4.2 is broken by default 662 oswarn="; it needs libposix.a" 663 ;; 664 esac 665 add_cppflags -DMKSH_CONSERVATIVE_FDS 666 ;; 667 Ninix3) 668 # similar to Minix3 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" 674 ;; 675 OpenBSD) 676 : ${HAVE_SETLOCALE_CTYPE=0} 677 ;; 678 OSF1) 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} 685 ;; 686 Plan9) 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 698 ;; 699 PW32*) 700 HAVE_SIG_T=0 # incompatible 701 oswarn=' and will currently not work' 702 : ${HAVE_SETLOCALE_CTYPE=0} 703 ;; 704 QNX) 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 710 ;; 711 esac 712 : ${HAVE_SETLOCALE_CTYPE=0} 713 ;; 714 SCO_SV) 715 case $TARGET_OSREV in 716 3.2*) 717 # SCO OpenServer 5 718 add_cppflags -DMKSH_UNEMPLOYED 719 ;; 720 5*) 721 # SCO OpenServer 6 722 ;; 723 *) 724 oswarn='; this is an unknown version of' 725 oswarn="$oswarn$nl$TARGET_OS ${TARGET_OSREV}, please tell me what to do" 726 ;; 727 esac 728 add_cppflags -DMKSH_CONSERVATIVE_FDS 729 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0} 730 ;; 731 skyos) 732 oswarn="; it has minor issues" 733 ;; 734 SunOS) 735 add_cppflags -D_BSD_SOURCE 736 add_cppflags -D__EXTENSIONS__ 737 ;; 738 syllable) 739 add_cppflags -D_GNU_SOURCE 740 add_cppflags -DMKSH_NO_SIGSUSPEND 741 oswarn=' and will currently not work' 742 ;; 743 ULTRIX) 744 : ${CC=cc -YPOSIX} 745 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int 746 add_cppflags -DMKSH_CONSERVATIVE_FDS 747 : ${HAVE_SETLOCALE_CTYPE=0} 748 ;; 749 UnixWare|UNIX_SV) 750 # SCO UnixWare 751 add_cppflags -DMKSH_CONSERVATIVE_FDS 752 : ${HAVE_SYS_SIGLIST=0} ${HAVE__SYS_SIGLIST=0} 753 ;; 754 UWIN*) 755 ccpc='-Yc,' 756 ccpl='-Yl,' 757 tsts=" 3<>/dev/tty" 758 oswarn="; it will compile, but the target" 759 oswarn="$oswarn${nl}platform itself is very flakey/unreliable" 760 : ${HAVE_SETLOCALE_CTYPE=0} 761 ;; 762 _svr4) 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` 767 ;; 768 *) 769 oswarn='; it may or may not work' 770 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r` 771 ;; 772 esac 773 774 : ${HAVE_MKNOD=0} 775 776 : ${AWK=awk} ${CC=cc} ${NROFF=nroff} ${SIZE=size} 777 test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \ 778 NROFF="$NROFF -c" 779 780 # this aids me in tracing FTBFSen without access to the buildd 781 $e "Hi from$ao $bi$srcversion$ao on:" 782 case $TARGET_OS in 783 AIX) 784 vv '|' "oslevel >&2" 785 vv '|' "uname -a >&2" 786 ;; 787 Darwin) 788 vv '|' "hwprefs machine_type os_type os_class >&2" 789 vv '|' "uname -a >&2" 790 ;; 791 IRIX*) 792 vv '|' "uname -a >&2" 793 vv '|' "hinv -v >&2" 794 ;; 795 OSF1) 796 vv '|' "uname -a >&2" 797 vv '|' "/usr/sbin/sizer -v >&2" 798 ;; 799 SCO_SV|UnixWare|UNIX_SV) 800 vv '|' "uname -a >&2" 801 vv '|' "uname -X >&2" 802 ;; 803 *) 804 vv '|' "uname -a >&2" 805 ;; 806 esac 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. 812 " 813 $e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..." 814 815 # 816 # Begin of mirtoconf checks 817 # 818 $e $bi$me: Scanning for functions... please ignore any errors.$ao 819 820 # 821 # Compiler: which one? 822 # 823 # notes: 824 # - ICC defines __GNUC__ too 825 # - GCC defines __hpux too 826 # - LLVM+clang defines __GNUC__ too 827 # - nwcc defines __GNUC__ too 828 CPP="$CC -E" 829 $e ... which compiler seems to be used 830 cat >conftest.c <<'EOF' 831 const char * 832 #if defined(__ICC) || defined(__INTEL_COMPILER) 833 ct="icc" 834 #elif defined(__xlC__) || defined(__IBMC__) 835 ct="xlc" 836 #elif defined(__SUNPRO_C) 837 ct="sunpro" 838 #elif defined(__ACK__) 839 ct="ack" 840 #elif defined(__BORLANDC__) 841 ct="bcc" 842 #elif defined(__WATCOMC__) 843 ct="watcom" 844 #elif defined(__MWERKS__) 845 ct="metrowerks" 846 #elif defined(__HP_cc) 847 ct="hpcc" 848 #elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__)) 849 ct="dec" 850 #elif defined(__PGI) 851 ct="pgi" 852 #elif defined(__DMC__) 853 ct="dmc" 854 #elif defined(_MSC_VER) 855 ct="msc" 856 #elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) 857 ct="adsp" 858 #elif defined(__IAR_SYSTEMS_ICC__) 859 ct="iar" 860 #elif defined(SDCC) 861 ct="sdcc" 862 #elif defined(__PCC__) 863 ct="pcc" 864 #elif defined(__TenDRA__) 865 ct="tendra" 866 #elif defined(__TINYC__) 867 ct="tcc" 868 #elif defined(__llvm__) && defined(__clang__) 869 ct="clang" 870 #elif defined(__NWCC__) 871 ct="nwcc" 872 #elif defined(__GNUC__) 873 ct="gcc" 874 #elif defined(_COMPILER_VERSION) 875 ct="mipspro" 876 #elif defined(__sgi) 877 ct="mipspro" 878 #elif defined(__hpux) || defined(__hpua) 879 ct="hpcc" 880 #elif defined(__ultrix) 881 ct="ucode" 882 #elif defined(__USLC__) 883 ct="uslc" 884 #elif defined(__LCC__) 885 ct="lcc" 886 #elif defined(MKSH_MAYBE_KENCC) 887 /* and none of the above matches */ 888 ct="kencc" 889 #else 890 ct="unknown" 891 #endif 892 ; 893 const char * 894 #if defined(__KLIBC__) 895 et="klibc" 896 #else 897 et="unknown" 898 #endif 899 ; 900 EOF 901 ct=untested 902 et=untested 903 vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \ 904 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x" 905 sed 's/^/[ /' x 906 eval `cat x` 907 rmf x vv.out 908 echo 'int main(void) { return (0); }' >conftest.c 909 case $ct in 910 ack) 911 # work around "the famous ACK const bug" 912 CPPFLAGS="-Dconst= $CPPFLAGS" 913 ;; 914 adsp) 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.' 919 ;; 920 bcc) 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." 924 ;; 925 clang) 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 933 :*) ;; 934 *:) CCC_LD=$CCC_CC; export CCC_LD ;; 935 esac 936 ;; 937 dec) 938 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 939 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS" 940 ;; 941 dmc) 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." 946 ;; 947 gcc) 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 \ 951 $LIBS -dumpversion`' 952 ;; 953 hpcc) 954 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 955 ;; 956 iar) 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.' 961 ;; 962 icc) 963 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 964 ;; 965 kencc) 966 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 967 ;; 968 lcc) 969 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 970 add_cppflags -D__inline__=__inline 971 ;; 972 metrowerks) 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.' 976 ;; 977 mipspro) 978 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version" 979 ;; 980 msc) 981 ccpr= # errorlevels are not reliable 982 case $TARGET_OS in 983 Interix) 984 if [[ -n $C89_COMPILER ]]; then 985 C89_COMPILER=`ntpath2posix -c "$C89_COMPILER"` 986 else 987 C89_COMPILER=CL.EXE 988 fi 989 if [[ -n $C89_LINKER ]]; then 990 C89_LINKER=`ntpath2posix -c "$C89_LINKER"` 991 else 992 C89_LINKER=LINK.EXE 993 fi 994 vv '|' "$C89_COMPILER /HELP >&2" 995 vv '|' "$C89_LINKER /LINK >&2" 996 ;; 997 esac 998 ;; 999 nwcc) 1000 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -version" 1001 ;; 1002 pcc) 1003 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v" 1004 ;; 1005 pgi) 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.' 1009 ;; 1010 sdcc) 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.' 1015 ;; 1016 sunpro) 1017 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1018 ;; 1019 tcc) 1020 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -v" 1021 ;; 1022 tendra) 1023 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V 2>&1 | \ 1024 fgrep -i -e version -e release" 1025 ;; 1026 ucode) 1027 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V" 1028 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS" 1029 ;; 1030 uslc) 1031 case $TARGET_OS:$TARGET_OSREV in 1032 SCO_SV:3.2*) 1033 # SCO OpenServer 5 1034 CFLAGS="$CFLAGS -g" 1035 : ${HAVE_CAN_OTWO=0} ${HAVE_CAN_OPTIMISE=0} 1036 ;; 1037 esac 1038 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1039 ;; 1040 watcom) 1041 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 1042 ;; 1043 xlc) 1044 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion" 1045 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose" 1046 vv '|' "ld -V" 1047 ;; 1048 *) 1049 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed" 1050 ct=unknown 1051 vv "$CC --version" 1052 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS" 1053 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS" 1054 ;; 1055 esac 1056 case $cm in 1057 dragonegg|llvm) 1058 vv '|' "llc -version" 1059 ;; 1060 esac 1061 case $et in 1062 klibc) 1063 add_cppflags -DMKSH_NO_LIMITS 1064 ;; 1065 unknown) 1066 # nothing special detected, dont worry 1067 unset et 1068 ;; 1069 *) 1070 # huh? 1071 ;; 1072 esac 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 1075 1076 # 1077 # Compiler: works as-is, with -Wno-error and -Werror 1078 # 1079 save_NOWARN=$NOWARN 1080 NOWARN= 1081 DOWARN= 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 1088 save_CFLAGS=$CFLAGS 1089 : ${HAVE_CAN_DELEXE=x} 1090 case $ct in 1091 dec) 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); } 1095 EOF 1096 ;; 1097 dmc) 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); } 1101 EOF 1102 ;; 1103 *) 1104 exit 1 1105 ;; 1106 esac 1107 test 1 = $HAVE_CAN_DELEXE || CFLAGS=$save_CFLAGS 1108 ac_testn compiler_still_fails '' 'if the compiler still does not fail correctly' <<-EOF 1109 EOF 1110 test 1 = $HAVE_COMPILER_STILL_FAILS && exit 1 1111 fi 1112 if ac_ifcpp 'ifdef __TINYC__' couldbe_tcc '!' compiler_known 0 \ 1113 'if this could be tcc'; then 1114 ct=tcc 1115 CPP='cpp -D__TINYC__' 1116 HAVE_COMPILER_KNOWN=1 1117 fi 1118 1119 case $ct in 1120 bcc) 1121 save_NOWARN="${ccpc}-w" 1122 DOWARN="${ccpc}-w!" 1123 ;; 1124 dec) 1125 # -msg_* flags not used yet, or is -w2 correct? 1126 ;; 1127 dmc) 1128 save_NOWARN="${ccpc}-w" 1129 DOWARN="${ccpc}-wx" 1130 ;; 1131 hpcc) 1132 save_NOWARN= 1133 DOWARN=+We 1134 ;; 1135 kencc) 1136 save_NOWARN= 1137 DOWARN= 1138 ;; 1139 mipspro) 1140 save_NOWARN= 1141 DOWARN="-diag_error 1-10000" 1142 ;; 1143 msc) 1144 save_NOWARN="${ccpc}/w" 1145 DOWARN="${ccpc}/WX" 1146 ;; 1147 sunpro) 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" 1153 ;; 1154 tendra) 1155 save_NOWARN=-w 1156 ;; 1157 ucode) 1158 save_NOWARN= 1159 DOWARN=-w2 1160 ;; 1161 watcom) 1162 save_NOWARN= 1163 DOWARN=-Wc,-we 1164 ;; 1165 xlc) 1166 save_NOWARN=-qflag=i:e 1167 DOWARN=-qflag=i:i 1168 ;; 1169 *) 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" 1176 ;; 1177 esac 1178 NOWARN=$save_NOWARN 1179 1180 # 1181 # Compiler: extra flags (-O2 -f* -W* etc.) 1182 # 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 1186 hpcc) 1187 phase=u 1188 ac_flags 1 otwo +O2 1189 phase=x 1190 ;; 1191 kencc|tcc|tendra) 1192 # no special optimisation 1193 ;; 1194 sunpro) 1195 cat >x <<-'EOF' 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) { } 1200 EOF 1201 yes pad | head -n 256 >>x 1202 ac_flags - 1 otwo -xO2 <x 1203 rmf x 1204 ;; 1205 xlc) 1206 ac_flags 1 othree "-O3 -qstrict" 1207 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2 1208 ;; 1209 *) 1210 ac_flags 1 otwo -O2 1211 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O 1212 ;; 1213 esac 1214 # other flags: just add them if they are supported 1215 i=0 1216 case $ct in 1217 bcc) 1218 ac_flags 1 strpool "${ccpc}-d" 'if string pooling can be enabled' 1219 ;; 1220 clang) 1221 i=1 1222 ;; 1223 dec) 1224 ac_flags 0 verb -verbose 1225 ac_flags 1 rodata -readonly_strings 1226 ;; 1227 dmc) 1228 ac_flags 1 decl "${ccpc}-r" 'for strict prototype checks' 1229 ac_flags 1 schk "${ccpc}-s" 'for stack overflow checking' 1230 ;; 1231 gcc) 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 ;; 1242 esac 1243 case $cm in 1244 combine) 1245 fv=0 1246 checks='7 8' 1247 ;; 1248 lto) 1249 fv=0 1250 checks='1 2 3 4 5 6 7 8' 1251 ;; 1252 *) 1253 fv=1 1254 ;; 1255 esac 1256 test $fv = 1 || for what in $checks; do 1257 test $fv = 1 && break 1258 case $what in 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 ;; 1267 4) t_cflags='-flto' 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 ;; 1272 6) t_cflags='-flto' 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 ;; 1278 esac 1279 test $fv = 1 && break 1280 ac_flags $t_use $t_name "$t_cflags" \ 1281 "if gcc supports $t_cflags $t_ldflags" "$t_ldflags" 1282 done 1283 i=1 1284 ;; 1285 hpcc) 1286 phase=u 1287 # probably not needed 1288 #ac_flags 1 agcc -Agcc 'for support of GCC extensions' 1289 phase=x 1290 ;; 1291 icc) 1292 ac_flags 1 fnobuiltinsetmode -fno-builtin-setmode 1293 ac_flags 1 fnostrictaliasing -fno-strict-aliasing 1294 ac_flags 1 fstacksecuritycheck -fstack-security-check 1295 i=1 1296 ;; 1297 mipspro) 1298 ac_flags 1 fullwarn -fullwarn 'for remark output support' 1299 ;; 1300 msc) 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 1306 rmf x 1307 ac_flags 1 wall "${ccpc}/Wall" 'to enable all warnings' 1308 ac_flags 1 wp64 "${ccpc}/Wp64" 'to enable 64-bit warnings' 1309 ;; 1310 nwcc) 1311 i=1 1312 #broken# ac_flags 1 ssp -stackprotect 1313 ;; 1314 sunpro) 1315 phase=u 1316 ac_flags 1 v -v 1317 ac_flags 1 ipo -xipo 'for cross-module optimisation' 1318 phase=x 1319 ;; 1320 tcc) 1321 : #broken# ac_flags 1 boundschk -b 1322 ;; 1323 tendra) 1324 ac_flags 0 ysystem -Ysystem 1325 test 1 = $HAVE_CAN_YSYSTEM && CPPFLAGS="-Ysystem $CPPFLAGS" 1326 ac_flags 1 extansi -Xa 1327 ;; 1328 xlc) 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 1334 ;; 1335 esac 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 1340 fi 1341 1342 phase=x 1343 # The following tests run with -Werror or similar (all compilers) if possible 1344 NOWARN=$DOWARN 1345 test $ct = pcc && phase=u 1346 1347 # 1348 # Compiler: check for stuff that only generates warnings 1349 # 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()); } 1355 #else 1356 #include <string.h> 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) { 1363 /* 1364 * if memmove does not exist, we are not on a system 1365 * with GCC with __bounded__ attribute either so poo 1366 */ 1367 memmove(d, s, n); return ((int)n); 1368 } 1369 #endif 1370 EOF 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()); } 1376 #else 1377 #define fprintf printfoo 1378 #include <stdio.h> 1379 #undef __attribute__ 1380 #undef fprintf 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)); } 1384 #endif 1385 EOF 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()); } 1391 #else 1392 #include <stdlib.h> 1393 #undef __attribute__ 1394 void fnord(void) __attribute__((__noreturn__)); 1395 int main(void) { fnord(); } 1396 void fnord(void) { exit(0); } 1397 #endif 1398 EOF 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()); } 1404 #else 1405 int main(int ac __attribute__((__unused__)), char **av 1406 __attribute__((__unused__))) { return (0); } 1407 #endif 1408 EOF 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()); } 1414 #else 1415 static const char fnord[] __attribute__((__used__)) = "42"; 1416 int main(void) { return (0); } 1417 #endif 1418 EOF 1419 1420 # End of tests run with -Werror 1421 NOWARN=$save_NOWARN 1422 phase=x 1423 1424 # 1425 # mksh: flavours (full/small mksh, omit certain stuff) 1426 # 1427 if ac_ifcpp 'ifdef MKSH_SMALL' isset_MKSH_SMALL '' \ 1428 "if a reduced-feature mksh is requested"; then 1429 : ${HAVE_NICE=0} 1430 : ${HAVE_PERSISTENT_HISTORY=0} 1431 check_categories="$check_categories smksh" 1432 HAVE_ISSET_MKSH_CONSERVATIVE_FDS=1 # from sh.h 1433 fi 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" 1457 1458 # 1459 # Environment: headers 1460 # 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> 1467 #include <time.h> 1468 int main(void) { struct tm tm; return ((int)sizeof(tm)); } 1469 EOF 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 1478 ac_header bstring.h 1479 ac_header grp.h sys/types.h 1480 ac_header libgen.h 1481 ac_header libutil.h sys/types.h 1482 ac_header paths.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 1486 ac_header termios.h 1487 ac_header ulimit.h sys/types.h 1488 ac_header values.h 1489 1490 # 1491 # Environment: definitions 1492 # 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 1508 fi 1509 rmf lft* # end of large file support test 1510 1511 # 1512 # Environment: types 1513 # 1514 ac_test can_inttypes '!' stdint_h 1 "for standard 32-bit integer types" <<-'EOF' 1515 #include <sys/types.h> 1516 #include <stddef.h> 1517 int main(int ac, char **av) { return ((uint32_t)(ptrdiff_t)*av + (int32_t)ac); } 1518 EOF 1519 ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF' 1520 #include <sys/types.h> 1521 #include <stddef.h> 1522 int main(int ac, char **av) { return ((u_int32_t)(ptrdiff_t)*av + (int32_t)ac); } 1523 EOF 1524 ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF' 1525 #include <sys/types.h> 1526 #include <stddef.h> 1527 int main(int ac, char **av) { return ((uint8_t)(ptrdiff_t)av[ac]); } 1528 EOF 1529 ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF' 1530 #include <sys/types.h> 1531 #include <stddef.h> 1532 int main(int ac, char **av) { return ((u_int8_t)(ptrdiff_t)av[ac]); } 1533 EOF 1534 1535 ac_test rlim_t <<-'EOF' 1536 #include <sys/types.h> 1537 #if HAVE_BOTH_TIME_H 1538 #include <sys/time.h> 1539 #include <time.h> 1540 #elif HAVE_SYS_TIME_H 1541 #include <sys/time.h> 1542 #elif HAVE_TIME_H 1543 #include <time.h> 1544 #endif 1545 #if HAVE_SYS_RESOURCE_H 1546 #include <sys/resource.h> 1547 #endif 1548 #include <unistd.h> 1549 int main(void) { return ((int)(rlim_t)0); } 1550 EOF 1551 1552 # only testn: added later below 1553 ac_testn sig_t <<-'EOF' 1554 #include <sys/types.h> 1555 #include <signal.h> 1556 #include <stddef.h> 1557 volatile sig_t foo = (sig_t)0; 1558 int main(void) { return (foo == (sig_t)0); } 1559 EOF 1560 1561 ac_testn sighandler_t '!' sig_t 0 <<-'EOF' 1562 #include <sys/types.h> 1563 #include <signal.h> 1564 #include <stddef.h> 1565 volatile sighandler_t foo = (sighandler_t)0; 1566 int main(void) { return (foo == (sighandler_t)0); } 1567 EOF 1568 if test 1 = $HAVE_SIGHANDLER_T; then 1569 add_cppflags -Dsig_t=sighandler_t 1570 HAVE_SIG_T=1 1571 fi 1572 1573 ac_testn __sighandler_t '!' sig_t 0 <<-'EOF' 1574 #include <sys/types.h> 1575 #include <signal.h> 1576 #include <stddef.h> 1577 volatile __sighandler_t foo = (__sighandler_t)0; 1578 int main(void) { return (foo == (__sighandler_t)0); } 1579 EOF 1580 if test 1 = $HAVE___SIGHANDLER_T; then 1581 add_cppflags -Dsig_t=__sighandler_t 1582 HAVE_SIG_T=1 1583 fi 1584 1585 test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t 1586 ac_cppflags SIG_T 1587 1588 # 1589 # check whether whatever we use for the final link will succeed 1590 # 1591 if test $cm = makefile; then 1592 : nothing to check 1593 else 1594 HAVE_LINK_WORKS=x 1595 ac_testinit link_works '' 'checking if the final link command may succeed' 1596 fv=1 1597 cat >conftest.c <<-'EOF' 1598 #define EXTERN 1599 #define MKSH_INCLUDES_ONLY 1600 #include "sh.h" 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); } 1603 EOF 1604 case $cm in 1605 llvm) 1606 v "$CC $CFLAGS $CPPFLAGS $NOWARN -emit-llvm -c conftest.c" || fv=0 1607 rmf $tfn.s 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" 1610 ;; 1611 dragonegg) 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 1615 rmf $tfn.s 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" 1618 ;; 1619 combine) 1620 v "$CC $CFLAGS $CPPFLAGS $LDFLAGS -fwhole-program --combine $NOWARN -o $tcfn conftest.c $LIBS $ccpr" 1621 ;; 1622 lto|normal) 1623 cm=normal 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" 1626 ;; 1627 esac 1628 test -f $tcfn || fv=0 1629 ac_testdone 1630 test $fv = 1 || exit 1 1631 fi 1632 1633 # 1634 # Environment: errors and signals 1635 # 1636 test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning. 1637 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]); } 1642 EOF 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]); } 1647 EOF 1648 if test 1 = "$HAVE__SYS_ERRLIST"; then 1649 add_cppflags -Dsys_nerr=_sys_nerr 1650 add_cppflags -Dsys_errlist=_sys_errlist 1651 HAVE_SYS_ERRLIST=1 1652 fi 1653 ac_cppflags SYS_ERRLIST 1654 1655 for what in name list; do 1656 uwhat=`upper $what` 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]); } 1660 EOF 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]); } 1664 EOF 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 1669 fi 1670 ac_cppflags SYS_SIG$uwhat 1671 done 1672 1673 # 1674 # Environment: library functions 1675 # 1676 ac_test flock <<-'EOF' 1677 #include <sys/types.h> 1678 #include <fcntl.h> 1679 #undef flock 1680 #if HAVE_SYS_FILE_H 1681 #include <sys/file.h> 1682 #endif 1683 int main(void) { return (flock(0, LOCK_EX | LOCK_UN)); } 1684 EOF 1685 1686 ac_test lock_fcntl '!' flock 1 'whether we can lock files with fcntl' <<-'EOF' 1687 #include <fcntl.h> 1688 #undef flock 1689 int main(void) { 1690 struct flock lks; 1691 lks.l_type = F_WRLCK | F_UNLCK; 1692 return (fcntl(0, F_SETLKW, &lks)); 1693 } 1694 EOF 1695 1696 ac_test getrusage <<-'EOF' 1697 #define MKSH_INCLUDES_ONLY 1698 #include "sh.h" 1699 int main(void) { 1700 struct rusage ru; 1701 return (getrusage(RUSAGE_SELF, &ru) + 1702 getrusage(RUSAGE_CHILDREN, &ru)); 1703 } 1704 EOF 1705 1706 ac_test gettimeofday <<-'EOF' 1707 #define MKSH_INCLUDES_ONLY 1708 #include "sh.h" 1709 int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); } 1710 EOF 1711 1712 ac_test killpg <<-'EOF' 1713 #include <signal.h> 1714 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); } 1715 EOF 1716 1717 ac_test memmove <<-'EOF' 1718 #include <sys/types.h> 1719 #include <stddef.h> 1720 #include <string.h> 1721 #if HAVE_STRINGS_H 1722 #include <strings.h> 1723 #endif 1724 int main(int ac, char *av[]) { 1725 return (*(int *)(void *)memmove(av[0], av[1], ac)); 1726 } 1727 EOF 1728 1729 ac_test mknod '' 'if to use mknod(), makedev() and friends' <<-'EOF' 1730 #define MKSH_INCLUDES_ONLY 1731 #include "sh.h" 1732 int main(int ac, char *av[]) { 1733 dev_t dv; 1734 dv = makedev((unsigned int)ac, (unsigned int)av[0][0]); 1735 return (mknod(av[0], (mode_t)0, dv) ? (int)major(dv) : 1736 (int)minor(dv)); 1737 } 1738 EOF 1739 1740 ac_test mmap lock_fcntl 0 'for mmap and munmap' <<-'EOF' 1741 #include <sys/types.h> 1742 #if HAVE_SYS_FILE_H 1743 #include <sys/file.h> 1744 #endif 1745 #if HAVE_SYS_MMAN_H 1746 #include <sys/mman.h> 1747 #endif 1748 #include <stddef.h> 1749 #include <stdlib.h> 1750 int main(void) { return ((void *)mmap(NULL, (size_t)0, 1751 PROT_READ, MAP_PRIVATE, 0, (off_t)0) == (void *)NULL ? 1 : 1752 munmap(NULL, 0)); } 1753 EOF 1754 1755 ac_test nice <<-'EOF' 1756 #include <unistd.h> 1757 int main(void) { return (nice(4)); } 1758 EOF 1759 1760 ac_test revoke <<-'EOF' 1761 #include <sys/types.h> 1762 #if HAVE_LIBUTIL_H 1763 #include <libutil.h> 1764 #endif 1765 #include <unistd.h> 1766 int main(int ac, char *av[]) { return (ac + revoke(av[0])); } 1767 EOF 1768 1769 ac_test setlocale_ctype '' 'setlocale(LC_CTYPE, "")' <<-'EOF' 1770 #include <locale.h> 1771 #include <stddef.h> 1772 int main(void) { return ((int)(ptrdiff_t)(void *)setlocale(LC_CTYPE, "")); } 1773 EOF 1774 1775 ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF' 1776 #include <langinfo.h> 1777 #include <stddef.h> 1778 int main(void) { return ((int)(ptrdiff_t)(void *)nl_langinfo(CODESET)); } 1779 EOF 1780 1781 ac_test select <<-'EOF' 1782 #include <sys/types.h> 1783 #if HAVE_BOTH_TIME_H 1784 #include <sys/time.h> 1785 #include <time.h> 1786 #elif HAVE_SYS_TIME_H 1787 #include <sys/time.h> 1788 #elif HAVE_TIME_H 1789 #include <time.h> 1790 #endif 1791 #if HAVE_SYS_BSDTYPES_H 1792 #include <sys/bsdtypes.h> 1793 #endif 1794 #if HAVE_SYS_SELECT_H 1795 #include <sys/select.h> 1796 #endif 1797 #if HAVE_BSTRING_H 1798 #include <bstring.h> 1799 #endif 1800 #include <stddef.h> 1801 #include <stdlib.h> 1802 #include <string.h> 1803 #if HAVE_STRINGS_H 1804 #include <strings.h> 1805 #endif 1806 #include <unistd.h> 1807 int main(void) { 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)); 1811 } 1812 EOF 1813 1814 ac_test setresugid <<-'EOF' 1815 #include <sys/types.h> 1816 #include <unistd.h> 1817 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); } 1818 EOF 1819 1820 ac_test setgroups setresugid 0 <<-'EOF' 1821 #include <sys/types.h> 1822 #if HAVE_GRP_H 1823 #include <grp.h> 1824 #endif 1825 #include <unistd.h> 1826 int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); } 1827 EOF 1828 1829 if test x"$et" = x"klibc"; then 1830 1831 ac_testn __rt_sigsuspend '' 'whether klibc uses RT signals' <<-'EOF' 1832 #define MKSH_INCLUDES_ONLY 1833 #include "sh.h" 1834 extern int __rt_sigsuspend(const sigset_t *, size_t); 1835 int main(void) { return (__rt_sigsuspend(NULL, 0)); } 1836 EOF 1837 1838 # no? damn! legacy crap ahead! 1839 1840 ac_testn __sigsuspend_s '!' __rt_sigsuspend 1 \ 1841 'whether sigsuspend is usable (1/2)' <<-'EOF' 1842 #define MKSH_INCLUDES_ONLY 1843 #include "sh.h" 1844 extern int __sigsuspend_s(sigset_t); 1845 int main(void) { return (__sigsuspend_s(0)); } 1846 EOF 1847 ac_testn __sigsuspend_xxs '!' __sigsuspend_s 1 \ 1848 'whether sigsuspend is usable (2/2)' <<-'EOF' 1849 #define MKSH_INCLUDES_ONLY 1850 #include "sh.h" 1851 extern int __sigsuspend_xxs(int, int, sigset_t); 1852 int main(void) { return (__sigsuspend_xxs(0, 0, 0)); } 1853 EOF 1854 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 1858 fi 1859 fi 1860 1861 ac_test strerror '!' sys_errlist 0 <<-'EOF' 1862 extern char *strerror(int); 1863 int main(int ac, char *av[]) { return (*strerror(*av[ac])); } 1864 EOF 1865 1866 ac_test strsignal '!' sys_siglist 0 <<-'EOF' 1867 #include <string.h> 1868 #include <signal.h> 1869 int main(void) { return (strsignal(1)[0]); } 1870 EOF 1871 1872 ac_test strlcpy <<-'EOF' 1873 #include <string.h> 1874 int main(int ac, char *av[]) { return (strlcpy(*av, av[1], 1875 (size_t)ac)); } 1876 EOF 1877 1878 # 1879 # check headers for declarations 1880 # 1881 ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF' 1882 #define MKSH_INCLUDES_ONLY 1883 #include "sh.h" 1884 #if HAVE_SYS_FILE_H 1885 #include <sys/file.h> 1886 #endif 1887 int main(void) { return ((flock)(0, 0)); } 1888 EOF 1889 ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF' 1890 #define MKSH_INCLUDES_ONLY 1891 #include "sh.h" 1892 int main(void) { return ((revoke)("")); } 1893 EOF 1894 ac_test sys_errlist_decl sys_errlist 0 "for declaration of sys_errlist[] and sys_nerr" <<-'EOF' 1895 #define MKSH_INCLUDES_ONLY 1896 #include "sh.h" 1897 int main(void) { return (*sys_errlist[sys_nerr - 1]); } 1898 EOF 1899 ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF' 1900 #define MKSH_INCLUDES_ONLY 1901 #include "sh.h" 1902 int main(void) { return (sys_siglist[0][0]); } 1903 EOF 1904 1905 # 1906 # other checks 1907 # 1908 fd='if to use persistent history' 1909 ac_cache PERSISTENT_HISTORY || case $HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in 1910 11*|101) fv=1 ;; 1911 esac 1912 test 1 = $fv || check_categories="$check_categories no-histfile" 1913 ac_testdone 1914 ac_cppflags 1915 1916 save_CFLAGS=$CFLAGS 1917 ac_testn compile_time_asserts_$$ '' 'whether compile-time assertions pass' <<-'EOF' 1918 #define MKSH_INCLUDES_ONLY 1919 #include "sh.h" 1920 #ifndef CHAR_BIT 1921 #define CHAR_BIT 8 /* defuse this test on really legacy systems */ 1922 #endif 1923 struct ctasserts { 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)); 1936 1937 cta(long_ge_int, sizeof(long) >= sizeof(int)); 1938 cta(long_size_no_matter_of_signedness, sizeof(long) == sizeof(unsigned long)); 1939 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); 1943 /* but this is */ 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)); 1953 #define NUM 22 1954 #else 1955 #define NUM 16 1956 #endif 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)); 1962 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]; 1971 }; 1972 char ctasserts_dblcheck[sizeof(struct ctasserts) == 64 ? 1 : -1]; 1973 int main(void) { return (sizeof(ctasserts_dblcheck)); } 1974 EOF 1975 CFLAGS=$save_CFLAGS 1976 eval test 1 = \$HAVE_COMPILE_TIME_ASSERTS_$$ || exit 1 1977 1978 # 1979 # extra checks for legacy mksh 1980 # 1981 if test $legacy = 1; then 1982 ac_test long_32bit '' 'whether long is 32 bit wide' <<-'EOF' 1983 #define MKSH_INCLUDES_ONLY 1984 #include "sh.h" 1985 #ifndef CHAR_BIT 1986 #define CHAR_BIT 0 1987 #endif 1988 struct ctasserts { 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); 1992 }; 1993 int main(void) { return (sizeof(struct ctasserts)); } 1994 EOF 1995 1996 ac_test long_64bit '!' long_32bit 0 'whether long is 64 bit wide' <<-'EOF' 1997 #define MKSH_INCLUDES_ONLY 1998 #include "sh.h" 1999 #ifndef CHAR_BIT 2000 #define CHAR_BIT 0 2001 #endif 2002 struct ctasserts { 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); 2006 }; 2007 int main(void) { return (sizeof(struct ctasserts)); } 2008 EOF 2009 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" ;; 2014 esac 2015 fi 2016 2017 # 2018 # Compiler: Praeprocessor (only if needed) 2019 # 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 2026 ac_testdone 2027 fi 2028 2029 # 2030 # End of mirtoconf checks 2031 # 2032 $e ... done. 2033 2034 # Some operating systems have ancient versions of ed(1) writing 2035 # the character count to standard output; cope for that 2036 echo wq >x 2037 ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \ 2038 check_categories="$check_categories $oldish_ed" 2039 rmf x vv.out 2040 2041 if test 0 = $HAVE_SYS_SIGNAME; then 2042 if test 1 = $HAVE_CPP_DD; then 2043 $e Generating list of signal names... 2044 else 2045 $e No list of signal names available via cpp. Falling back... 2046 fi 2047 sigseenone=: 2048 sigseentwo=: 2049 echo '#include <signal.h> 2050 #ifndef NSIG 2051 #if defined(_NSIG) 2052 #define NSIG _NSIG 2053 #elif defined(SIGMAX) 2054 #define NSIG (SIGMAX+1) 2055 #elif defined(_SIGMAX) 2056 #define NSIG (_SIGMAX+1) 2057 #endif 2058 #endif 2059 int 2060 mksh_cfg= NSIG 2061 ;' >conftest.c 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/'` 2066 case $NSIG in 2067 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;; 2068 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;; 2069 esac 2070 printf=printf 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 2084 case $sigseenone in 2085 *:$name:*) continue ;; 2086 esac 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 2099 case $sigseentwo in 2100 *:$nr:*) ;; 2101 *) echo " { \"$name\", $nr }," 2102 sigseentwo=$sigseentwo$nr: 2103 $printf "$name=$nr " >&2 2104 ;; 2105 esac 2106 done 2>&1 >signames.inc 2107 rmf conftest.c 2108 $e done. 2109 fi 2110 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 2117 2118 $e $bi$me: Finished configuration testing, now producing output.$ao 2119 2120 files= 2121 objs= 2122 sp= 2123 case $tcfn in 2124 a.exe) mkshexe=$tfn.exe ;; 2125 *) mkshexe=$tfn ;; 2126 esac 2127 case $curdir in 2128 *\ *) mkshshebang="#!./$mkshexe" ;; 2129 *) mkshshebang="#!$curdir/$mkshexe" ;; 2130 esac 2131 cat >test.sh <<-EOF 2132 $mkshshebang 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 ;; 2143 (P) Pflag=1 ;; 2144 (+P) Pflag=0 ;; 2145 (p) pflag=\$OPTARG ;; 2146 (Q) vflag=0 ;; 2147 (+Q) vflag=1 ;; 2148 (S) Sflag=1 ;; 2149 (+S) Sflag=0 ;; 2150 (s) sflag=\$OPTARG ;; 2151 (t) uset=1; tflag=\$OPTARG ;; 2152 (v) vflag=1 ;; 2153 (+v) vflag=0 ;; 2154 (*) xflag=1 ;; 2155 } 2156 done 2157 shift \$((OPTIND - 1)) 2158 set -A args -- '$srcdir/check.pl' -p "\$pflag" 2159 x= 2160 for y in "\${check_categories[@]}"; do 2161 x=\$x,\$y 2162 done 2163 if [[ -n \$x ]]; then 2164 args[\${#args[*]}]=-C 2165 args[\${#args[*]}]=\${x#,} 2166 fi 2167 if (( usee )); then 2168 args[\${#args[*]}]=-e 2169 args[\${#args[*]}]=\$eflag 2170 fi 2171 (( Pflag )) && args[\${#args[*]}]=-P 2172 if (( uset )); then 2173 args[\${#args[*]}]=-t 2174 args[\${#args[*]}]=\$tflag 2175 fi 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. 2187 exit 1 2188 fi 2189 print "Trying Perl interpreter '\$perli'..." 2190 perlos=\$(\$perli -e "\$cstr") 2191 rv=\$? 2192 print "Errorlevel \$rv, running on '\$perlos'" 2193 if (( rv )); then 2194 print "=> not using" 2195 continue 2196 fi 2197 if [[ -n \$perlos ]]; then 2198 print "=> using it" 2199 break 2200 fi 2201 done 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 2205 rv=0 2206 for s in "\$sflag".*; do 2207 echo + \$perli "\${args[@]}" -s "\$s" "\$@" 2208 \$perli "\${args[@]}" -s "\$s" "\$@"$tsts 2209 rc=\$? 2210 (( rv = rv ? rv : rc )) 2211 done 2212 exit \$rv 2213 EOF 2214 chmod 755 test.sh 2215 case $cm in 2216 dragonegg) 2217 emitbc="-S -flto" 2218 ;; 2219 llvm) 2220 emitbc="-emit-llvm -c" 2221 ;; 2222 *) 2223 emitbc=-c 2224 ;; 2225 esac 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" 2232 sp=' ' 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" 2238 else 2239 objs="$objs$sp${op}o" 2240 fi 2241 done 2242 case $cm in 2243 dragonegg|llvm) 2244 echo "rm -f $tfn.s" >>Rebuild.sh 2245 echo "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" >>Rebuild.sh 2246 lobjs=$tfn.s 2247 ;; 2248 *) 2249 lobjs=$objs 2250 ;; 2251 esac 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 2260 2261 PROG= $mkshexe 2262 MAN= mksh.1 2263 SRCS= $SRCS 2264 SRCS_FP= $files 2265 OBJS_BP= $objs 2266 INDSRCS= $extras 2267 NONSRCS_INST= dot.mkshrc \$(MAN) 2268 NONSRCS_NOINST= Build.sh Makefile Rebuild.sh check.pl check.t test.sh 2269 CC= $CC 2270 CFLAGS= $CFLAGS 2271 CPPFLAGS= $CPPFLAGS 2272 LDFLAGS= $LDFLAGS 2273 LIBS= $LIBS 2274 2275 # not BSD make only: 2276 #VPATH= $srcdir 2277 #all: \$(PROG) 2278 #\$(PROG): \$(OBJS_BP) 2279 # \$(CC) \$(CFLAGS) \$(LDFLAGS) -o \$@ \$(OBJS_BP) \$(LIBS) 2280 #\$(OBJS_BP): \$(SRCS_FP) \$(NONSRCS) 2281 #.c.o: 2282 # \$(CC) \$(CFLAGS) \$(CPPFLAGS) -c \$< 2283 2284 # for all make variants: 2285 #REGRESS_FLAGS= -f 2286 #regress: 2287 # ./test.sh \$(REGRESS_FLAGS) 2288 check_categories=$check_categories 2289 2290 # for BSD make only: 2291 #.PATH: $srcdir 2292 #.include <bsd.prog.mk> 2293 EOF 2294 $e 2295 $e Generated Makefrag.inc successfully. 2296 exit 0 2297 fi 2298 if test $cm = combine; then 2299 objs="-o $mkshexe" 2300 for file in $SRCS; do 2301 test -f $file || file=$srcdir/$file 2302 objs="$objs $file" 2303 done 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" & 2310 done 2311 wait 2312 else 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 2321 fi 2322 done 2323 fi 2324 case $cm in 2325 dragonegg|llvm) 2326 rmf $tfn.s 2327 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s" 2328 ;; 2329 esac 2330 tcfn=$mkshexe 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" || \ 2334 rmf $tfn.cat1 2335 test 0 = $eq && v $SIZE $tcfn 2336 i=install 2337 test -f /usr/ucb/$i && i=/usr/ucb/$i 2338 test 1 = $eq && e=: 2339 $e 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/" 2345 fi 2346 $e 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" 2351 $e or 2352 fi 2353 $e "# $i -c -o root -g bin -m 444 $tfn.1 /usr/share/man/man1/$tfn.1" 2354 $e 2355 $e Run the regression test suite: ./test.sh 2356 $e Please also read the sample file dot.mkshrc and the fine manual. 2357 exit 0 2358 2359 : <<'EOD' 2360 2361 === Environment used === 2362 2363 ==== build environment ==== 2364 AWK default: awk 2365 CC default: cc 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) 2377 2378 ==== feature selectors ==== 2379 USE_PRINTF_BUILTIN 1 to include (unsupported) printf(1) as builtin 2380 ===== general format ===== 2381 HAVE_STRLEN ac_test 2382 HAVE_STRING_H ac_header 2383 HAVE_CAN_FSTACKPROTECTORALL ac_flags 2384 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) 2418 2419 === generic installation instructions === 2420 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. 2425 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 2428 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. 2434 2435 EOD 2436