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