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