blob: be3f71173f824bf811120e19e8edc220acad2522 [file] [log] [blame]
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001#!/bin/sh
Elliott Hughes47086262019-03-26 12:34:31 -07002srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.734 2019/03/01 16:18:13 tg Exp $'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07003#-
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00004# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
Elliott Hughesa3c3f962017-04-12 16:52:30 -07005# 2011, 2012, 2013, 2014, 2015, 2016, 2017
Elliott Hughesfc0307d2016-02-02 15:26:47 -08006# mirabilos <m@mirbsd.org>
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07007#
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#
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +000026# Used environment documentation is at the end of this file.
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -070027
28LC_ALL=C
29export LC_ALL
30
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +000031case $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
Elliott Hughes737fdce2014-08-07 12:59:26 -070046nl='
47'
48safeIFS=' '
49safeIFS=" $safeIFS$nl"
50IFS=$safeIFS
51allu=QWERTYUIOPASDFGHJKLZXCVBNM
52alll=qwertyuiopasdfghjklzxcvbnm
53alln=0123456789
54alls=______________________________________________________________
55
Elliott Hughes23925bb2017-09-22 16:04:20 -070056case `echo a | tr '\201' X` in
57X)
58 # EBCDIC build system
59 lfcr='\n\r'
60 ;;
61*)
62 lfcr='\012\015'
63 ;;
64esac
65
Elliott Hughes737fdce2014-08-07 12:59:26 -070066genopt_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$//'`
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800113 o_hdr='/* +++ GENERATED FILE +++ DO NOT EDIT +++ */'
Elliott Hughes737fdce2014-08-07 12:59:26 -0700114 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:@@)
Elliott Hughes966dd552016-12-08 15:56:04 -0800133 # start of data block
Elliott Hughes737fdce2014-08-07 12:59:26 -0700134 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 ;;
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800142 0:/\*-|0:\ \**|0:)
143 o_hdr=$o_hdr$nl$line
144 ;;
Elliott Hughes737fdce2014-08-07 12:59:26 -0700145 0:@*|1:@*)
Elliott Hughes966dd552016-12-08 15:56:04 -0800146 # start of a definition block
Elliott Hughes737fdce2014-08-07 12:59:26 -0700147 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 | {
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800194 echo "$o_hdr"
Elliott Hughes737fdce2014-08-07 12:59:26 -0700195 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700217v() {
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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000236 case $_f in
Elliott Hughes737fdce2014-08-07 12:59:26 -0700237 Build.sh|check.pl|check.t|dot.mkshrc|*.1|*.c|*.h|*.ico|*.opt) ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000238 *) rm -f "$_f" ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700239 esac
240 done
241}
242
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700243tcfn=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=''
255 ui=''
256 ao=''
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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000320ac_testnnd() {
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700321 if test x"$1" = x"!"; then
322 fr=1
323 shift
324 else
325 fr=0
326 fi
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000327 ac_testinit "$@" || return 1
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700328 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
Elliott Hughes96b43632015-07-17 11:39:41 -0700332 test $tcfn = no && test -f conftest.exe && tcfn=conftest.exe
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700333 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000347 return 0
348}
349ac_testn() {
350 ac_testnnd "$@" || return
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700351 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
Elliott Hughes737fdce2014-08-07 12:59:26 -0700359 #include <unistd.h>
Thorsten Glaser811a5752013-07-25 14:24:45 +0000360 extern int thiswillneverbedefinedIhope(void);
Elliott Hughes737fdce2014-08-07 12:59:26 -0700361 int main(void) { return (isatty(0) +
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700362 #$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
Geremy Condra03ebf062011-10-12 18:17:24 -0700377add_cppflags() {
378 CPPFLAGS="$CPPFLAGS $*"
379}
380
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700381ac_cppflags() {
382 test x"$1" = x"" || fu=$1
383 fv=$2
384 test x"$2" = x"" && eval fv=\$HAVE_$fu
Geremy Condra03ebf062011-10-12 18:17:24 -0700385 add_cppflags -DHAVE_$fu=$fv
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700386}
387
388ac_test() {
389 ac_testn "$@"
390 ac_cppflags
391}
392
Geremy Condra03ebf062011-10-12 18:17:24 -0700393# ac_flags [-] add varname cflags [text] [ldflags]
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700394ac_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
Geremy Condra03ebf062011-10-12 18:17:24 -0700405 fl=$5
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700406 test x"$ft" = x"" && ft="if $f can be used"
407 save_CFLAGS=$CFLAGS
408 CFLAGS="$CFLAGS $f"
Geremy Condra03ebf062011-10-12 18:17:24 -0700409 if test -n "$fl"; then
410 save_LDFLAGS=$LDFLAGS
411 LDFLAGS="$LDFLAGS $fl"
412 fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700413 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 */
Elliott Hughes737fdce2014-08-07 12:59:26 -0700418 #include <unistd.h>
419 int main(void) { return (isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700420 EOF
Elliott Hughes47086262019-03-26 12:34:31 -0700421 #'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700422 fi
423 eval fv=\$HAVE_CAN_`upper $vn`
Geremy Condra03ebf062011-10-12 18:17:24 -0700424 if test -n "$fl"; then
425 test 11 = $fa$fv || LDFLAGS=$save_LDFLAGS
426 fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700427 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
Elliott Hughes23925bb2017-09-22 16:04:20 -0700439 hv=`echo "$hf" | tr -d "$lfcr" | tr -c $alll$allu$alln $alls`
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000440 echo "/* NeXTstep bug workaround */" >x
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700441 for i
442 do
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000443 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700458 done
459 echo "#include <$hf>" >>x
Elliott Hughes737fdce2014-08-07 12:59:26 -0700460 echo '#include <unistd.h>' >>x
461 echo 'int main(void) { return (isatty(0)); }' >>x
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700462 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
Elliott Hughes737fdce2014-08-07 12:59:26 -0700482curdir=`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"`
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000497add_cppflags -DMKSH_BUILDSH
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700498
499e=echo
500r=0
501eq=0
502pm=0
503cm=normal
504optflags=-std-compile-opts
Elliott Hughes737fdce2014-08-07 12:59:26 -0700505check_categories=
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700506last=
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000507tfn=
508legacy=0
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700509textmode=0
Elliott Hughes23925bb2017-09-22 16:04:20 -0700510ebcdic=false
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700511
512for i
513do
514 case $last:$i in
Geremy Condra03ebf062011-10-12 18:17:24 -0700515 c:combine|c:dragonegg|c:llvm|c:lto)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700516 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 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000527 t:*)
528 tfn=$i
529 last=
530 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700531 :-c)
532 last=c
533 ;;
Elliott Hughes23925bb2017-09-22 16:04:20 -0700534 :-E)
535 ebcdic=true
536 ;;
Elliott Hughes737fdce2014-08-07 12:59:26 -0700537 :-G)
538 echo "$me: Do not call me with '-G'!" >&2
539 exit 1
540 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700541 :-g)
542 # checker, debug, valgrind build
Geremy Condra03ebf062011-10-12 18:17:24 -0700543 add_cppflags -DDEBUG
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700544 CFLAGS="$CFLAGS -g3 -fno-builtin"
545 ;;
546 :-j)
547 pm=1
548 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000549 :-L)
550 legacy=1
551 ;;
552 :+L)
553 legacy=0
554 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700555 :-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 ;;
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700570 :-T)
571 textmode=1
572 ;;
573 :+T)
574 textmode=0
575 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000576 :-t)
577 last=t
578 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700579 :-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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000599test -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
Elliott Hughes96b43632015-07-17 11:39:41 -0700608rmf a.exe* a.out* conftest.c conftest.exe* *core core.* ${tfn}* *.bc *.dbg \
Elliott Hughes966dd552016-12-08 15:56:04 -0800609 *.ll *.o *.gen *.cat1 Rebuild.sh lft no signames.inc test.sh x vv.out
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000610
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700611SRCS="lalloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c jobs.c"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000612SRCS="$SRCS lex.c main.c misc.c shf.c syn.c tree.c var.c"
613
614if test $legacy = 0; then
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000615 check_categories="$check_categories shell:legacy-no int:32"
616else
617 check_categories="$check_categories shell:legacy-yes"
618 add_cppflags -DMKSH_LEGACY_MODE
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700619fi
620
Elliott Hughes23925bb2017-09-22 16:04:20 -0700621if $ebcdic; then
622 add_cppflags -DMKSH_EBCDIC
623fi
624
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700625if 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000630fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700631
632if test x"$srcdir" = x"."; then
633 CPPFLAGS="-I. $CPPFLAGS"
634else
635 CPPFLAGS="-I. -I'$srcdir' $CPPFLAGS"
636fi
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000637test -n "$LDSTATIC" && if test -n "$LDFLAGS"; then
638 LDFLAGS="$LDFLAGS $LDSTATIC"
639else
640 LDFLAGS=$LDSTATIC
641fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700642
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000643if 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
Geremy Condra03ebf062011-10-12 18:17:24 -0700648 echo "$me: Set TARGET_OS, your uname is broken!" >&2
649 exit 1
650fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700651oswarn=
652ccpc=-Wc,
653ccpl=-Wl,
654tsts=
Elliott Hughes737fdce2014-08-07 12:59:26 -0700655ccpr='|| 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'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700656
Geremy Condra03ebf062011-10-12 18:17:24 -0700657# Evil hack
658if test x"$TARGET_OS" = x"Android"; then
659 check_categories="$check_categories android"
660 TARGET_OS=Linux
661fi
662
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000663# 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700706# Configuration depending on OS revision, on OSes that need them
707case $TARGET_OS in
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000708NEXTSTEP)
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)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700714 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
715 ;;
716esac
717
718# Configuration depending on OS name
719case $TARGET_OS in
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000720386BSD)
Elliott Hughes96b43632015-07-17 11:39:41 -0700721 : "${HAVE_CAN_OTWO=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000722 add_cppflags -DMKSH_NO_SIGSETJMP
723 add_cppflags -DMKSH_TYPEDEF_SIG_ATOMIC_T=int
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000724 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700725AIX)
Geremy Condra03ebf062011-10-12 18:17:24 -0700726 add_cppflags -D_ALL_SOURCE
Elliott Hughes96b43632015-07-17 11:39:41 -0700727 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700728 ;;
729BeOS)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000730 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700744 ;;
745BSD/OS)
Elliott Hughes96b43632015-07-17 11:39:41 -0700746 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700747 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000748Coherent)
749 oswarn="; it has major issues"
750 add_cppflags -DMKSH__NO_SYMLINK
751 check_categories="$check_categories nosymlink"
752 add_cppflags -DMKSH__NO_SETEUGID
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000753 add_cppflags -DMKSH_DISABLE_TTY_WARNING
754 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700755CYGWIN*)
Elliott Hughes96b43632015-07-17 11:39:41 -0700756 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700757 ;;
758Darwin)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000759 add_cppflags -D_DARWIN_C_SOURCE
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700760 ;;
761DragonFly)
762 ;;
763FreeBSD)
764 ;;
Geremy Condra03ebf062011-10-12 18:17:24 -0700765FreeMiNT)
766 oswarn="; it has minor issues"
767 add_cppflags -D_GNU_SOURCE
Elliott Hughes96b43632015-07-17 11:39:41 -0700768 : "${HAVE_SETLOCALE_CTYPE=0}"
Geremy Condra03ebf062011-10-12 18:17:24 -0700769 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700770GNU)
Geremy Condra03ebf062011-10-12 18:17:24 -0700771 case $CC in
772 *tendracc*) ;;
773 *) add_cppflags -D_GNU_SOURCE ;;
774 esac
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800775 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000776 # define MKSH__NO_PATH_MAX to use Hurd-only functions
777 add_cppflags -DMKSH__NO_PATH_MAX
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700778 ;;
779GNU/kFreeBSD)
Geremy Condra03ebf062011-10-12 18:17:24 -0700780 case $CC in
781 *tendracc*) ;;
782 *) add_cppflags -D_GNU_SOURCE ;;
783 esac
Elliott Hughesfc0307d2016-02-02 15:26:47 -0800784 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700785 ;;
786Haiku)
Elliott Hughes23925bb2017-09-22 16:04:20 -0700787 add_cppflags -DMKSH_ASSUME_UTF8
788 HAVE_ISSET_MKSH_ASSUME_UTF8=1
789 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700790 ;;
Elliott Hughes966dd552016-12-08 15:56:04 -0800791Harvey)
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
Elliott Hughes23925bb2017-09-22 16:04:20 -0700797 add_cppflags -DMKSH_ASSUME_UTF8
798 HAVE_ISSET_MKSH_ASSUME_UTF8=1
799 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
Elliott Hughesdd4abe02018-02-05 15:55:19 -0800800 add_cppflags -DMKSH__NO_SYMLINK
801 check_categories="$check_categories nosymlink"
Elliott Hughes966dd552016-12-08 15:56:04 -0800802 add_cppflags -DMKSH_NO_CMDLINE_EDITING
803 add_cppflags -DMKSH__NO_SETEUGID
804 oswarn=' and will currently not work'
805 add_cppflags -DMKSH_UNEMPLOYED
Elliott Hughes23925bb2017-09-22 16:04:20 -0700806 add_cppflags -DMKSH_NOPROSPECTOFWORK
Elliott Hughes966dd552016-12-08 15:56:04 -0800807 # 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 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700813HP-UX)
814 ;;
815Interix)
816 ccpc='-X '
817 ccpl='-Y '
Geremy Condra03ebf062011-10-12 18:17:24 -0700818 add_cppflags -D_ALL_SOURCE
Elliott Hughes96b43632015-07-17 11:39:41 -0700819 : "${LIBS=-lcrypt}"
820 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700821 ;;
822IRIX*)
Elliott Hughes96b43632015-07-17 11:39:41 -0700823 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700824 ;;
Elliott Hughesdd4abe02018-02-05 15:55:19 -0800825Jehanne)
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 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700839Linux)
Geremy Condra03ebf062011-10-12 18:17:24 -0700840 case $CC in
841 *tendracc*) ;;
842 *) add_cppflags -D_GNU_SOURCE ;;
843 esac
844 add_cppflags -DSETUID_CAN_FAIL_WITH_EAGAIN
Elliott Hughes96b43632015-07-17 11:39:41 -0700845 : "${HAVE_REVOKE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700846 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000847LynxOS)
848 oswarn="; it has minor issues"
849 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700850MidnightBSD)
851 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000852Minix-vmd)
853 add_cppflags -DMKSH__NO_SETEUGID
854 add_cppflags -DMKSH_UNEMPLOYED
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000855 add_cppflags -D_MINIX_SOURCE
856 oldish_ed=no-stderr-ed # no /bin/ed, maybe see below
Elliott Hughes96b43632015-07-17 11:39:41 -0700857 : "${HAVE_SETLOCALE_CTYPE=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000858 ;;
859Minix3)
Geremy Condra03ebf062011-10-12 18:17:24 -0700860 add_cppflags -DMKSH_UNEMPLOYED
Geremy Condra03ebf062011-10-12 18:17:24 -0700861 add_cppflags -DMKSH_NO_LIMITS
862 add_cppflags -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 -D_MINIX
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700863 oldish_ed=no-stderr-ed # /usr/bin/ed(!) is broken
Elliott Hughes96b43632015-07-17 11:39:41 -0700864 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700865 ;;
866MirBSD)
867 ;;
Geremy Condra03ebf062011-10-12 18:17:24 -0700868MSYS_*)
Elliott Hughes23925bb2017-09-22 16:04:20 -0700869 add_cppflags -DMKSH_ASSUME_UTF8=0
870 HAVE_ISSET_MKSH_ASSUME_UTF8=1
871 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000872 # almost same as CYGWIN* (from RT|Chatzilla)
Elliott Hughes96b43632015-07-17 11:39:41 -0700873 : "${HAVE_SETLOCALE_CTYPE=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000874 # broken on this OE (from ir0nh34d)
Elliott Hughes96b43632015-07-17 11:39:41 -0700875 : "${HAVE_STDINT_H=0}"
Geremy Condra03ebf062011-10-12 18:17:24 -0700876 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700877NetBSD)
878 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000879NEXTSTEP)
880 add_cppflags -D_NEXT_SOURCE
881 add_cppflags -D_POSIX_SOURCE
Elliott Hughes96b43632015-07-17 11:39:41 -0700882 : "${AWK=gawk}"
883 : "${CC=cc -posix}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000884 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000893 ;;
894Ninix3)
895 # similar to Minix3
896 add_cppflags -DMKSH_UNEMPLOYED
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000897 add_cppflags -DMKSH_NO_LIMITS
898 # but no idea what else could be needed
899 oswarn="; it has unknown issues"
900 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700901OpenBSD)
Elliott Hughes96b43632015-07-17 11:39:41 -0700902 : "${HAVE_SETLOCALE_CTYPE=0}"
903 ;;
904OS/2)
Elliott Hughes23925bb2017-09-22 16:04:20 -0700905 add_cppflags -DMKSH_ASSUME_UTF8=0
906 HAVE_ISSET_MKSH_ASSUME_UTF8=1
907 HAVE_ISOFF_MKSH_ASSUME_UTF8=1
Elliott Hughes96b43632015-07-17 11:39:41 -0700908 HAVE_TERMIOS_H=0
909 HAVE_MKNOD=0 # setmode() incompatible
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700910 oswarn="; it is being ported"
Elliott Hughes96b43632015-07-17 11:39:41 -0700911 check_categories="$check_categories nosymlink"
912 : "${CC=gcc}"
913 : "${SIZE=: size}"
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700914 SRCS="$SRCS os2.c"
Elliott Hughes96b43632015-07-17 11:39:41 -0700915 add_cppflags -DMKSH_UNEMPLOYED
916 add_cppflags -DMKSH_NOPROSPECTOFWORK
Elliott Hughes966dd552016-12-08 15:56:04 -0800917 add_cppflags -DMKSH_NO_LIMITS
Elliott Hughesa3c3f962017-04-12 16:52:30 -0700918 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700940 ;;
Elliott Hughes23925bb2017-09-22 16:04:20 -0700941OS/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 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700951OSF1)
952 HAVE_SIG_T=0 # incompatible
Geremy Condra03ebf062011-10-12 18:17:24 -0700953 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
Elliott Hughes96b43632015-07-17 11:39:41 -0700957 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700958 ;;
959Plan9)
Geremy Condra03ebf062011-10-12 18:17:24 -0700960 add_cppflags -D_POSIX_SOURCE
961 add_cppflags -D_LIMITS_EXTENSION
962 add_cppflags -D_BSD_EXTENSION
963 add_cppflags -D_SUSV2_SOURCE
Elliott Hughes23925bb2017-09-22 16:04:20 -0700964 add_cppflags -DMKSH_ASSUME_UTF8
965 HAVE_ISSET_MKSH_ASSUME_UTF8=1
966 HAVE_ISOFF_MKSH_ASSUME_UTF8=0
Elliott Hughesdd4abe02018-02-05 15:55:19 -0800967 add_cppflags -DMKSH__NO_SYMLINK
968 check_categories="$check_categories nosymlink"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000969 add_cppflags -DMKSH_NO_CMDLINE_EDITING
Thorsten Glaser811a5752013-07-25 14:24:45 +0000970 add_cppflags -DMKSH__NO_SETEUGID
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700971 oswarn=' and will currently not work'
Geremy Condra03ebf062011-10-12 18:17:24 -0700972 add_cppflags -DMKSH_UNEMPLOYED
Thorsten Glaser811a5752013-07-25 14:24:45 +0000973 # this is for detecting kencc
974 add_cppflags -DMKSH_MAYBE_KENCC
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700975 ;;
976PW32*)
977 HAVE_SIG_T=0 # incompatible
978 oswarn=' and will currently not work'
Elliott Hughes96b43632015-07-17 11:39:41 -0700979 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700980 ;;
981QNX)
Geremy Condra03ebf062011-10-12 18:17:24 -0700982 add_cppflags -D__NO_EXT_QNX
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000983 add_cppflags -D__EXT_UNIX_MISC
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700984 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
Elliott Hughes96b43632015-07-17 11:39:41 -0700989 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -0700990 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +0000991SCO_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
Elliott Hughes96b43632015-07-17 11:39:41 -07001005 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001006 ;;
1007skyos)
1008 oswarn="; it has minor issues"
1009 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001010SunOS)
Geremy Condra03ebf062011-10-12 18:17:24 -07001011 add_cppflags -D_BSD_SOURCE
1012 add_cppflags -D__EXTENSIONS__
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001013 ;;
1014syllable)
Geremy Condra03ebf062011-10-12 18:17:24 -07001015 add_cppflags -D_GNU_SOURCE
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001016 add_cppflags -DMKSH_NO_SIGSUSPEND
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001017 oswarn=' and will currently not work'
1018 ;;
1019ULTRIX)
Elliott Hughes96b43632015-07-17 11:39:41 -07001020 : "${CC=cc -YPOSIX}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001021 add_cppflags -DMKSH_TYPEDEF_SSIZE_T=int
Elliott Hughes96b43632015-07-17 11:39:41 -07001022 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001023 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001024UnixWare|UNIX_SV)
1025 # SCO UnixWare
Elliott Hughes96b43632015-07-17 11:39:41 -07001026 : "${HAVE_SYS_SIGLIST=0}${HAVE__SYS_SIGLIST=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001027 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001028UWIN*)
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"
Elliott Hughes96b43632015-07-17 11:39:41 -07001034 : "${HAVE_SETLOCALE_CTYPE=0}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001035 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001036_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 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001042*)
1043 oswarn='; it may or may not work'
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001044 test x"$TARGET_OSREV" = x"" && TARGET_OSREV=`uname -r`
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001045 ;;
1046esac
1047
Elliott Hughes96b43632015-07-17 11:39:41 -07001048: "${HAVE_MKNOD=0}"
Geremy Condra03ebf062011-10-12 18:17:24 -07001049
Elliott Hughes96b43632015-07-17 11:39:41 -07001050: "${AWK=awk}${CC=cc}${NROFF=nroff}${SIZE=size}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001051test 0 = $r && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
Elliott Hughes96b43632015-07-17 11:39:41 -07001052 echo | $NROFF -c >/dev/null 2>&1 && NROFF="$NROFF -c"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001053
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
Geremy Condra03ebf062011-10-12 18:17:24 -07001057AIX)
1058 vv '|' "oslevel >&2"
1059 vv '|' "uname -a >&2"
1060 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001061Darwin)
1062 vv '|' "hwprefs machine_type os_type os_class >&2"
Elliott Hughes737fdce2014-08-07 12:59:26 -07001063 vv '|' "sw_vers >&2"
Elliott Hughes47086262019-03-26 12:34:31 -07001064 vv '|' "system_profiler -detailLevel mini SPSoftwareDataType SPHardwareDataType >&2"
Elliott Hughes737fdce2014-08-07 12:59:26 -07001065 vv '|' "/bin/sh --version >&2"
1066 vv '|' "xcodebuild -version >&2"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001067 vv '|' "uname -a >&2"
Elliott Hughes47086262019-03-26 12:34:31 -07001068 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001070 ;;
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 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001079SCO_SV|UnixWare|UNIX_SV)
1080 vv '|' "uname -a >&2"
1081 vv '|' "uname -X >&2"
1082 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001083*)
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"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001093$e "$bi$me: Building the MirBSD Korn Shell$ao $ui$dstversion$ao on $TARGET_OS ${TARGET_OSREV}..."
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001094
1095#
Elliott Hughes966dd552016-12-08 15:56:04 -08001096# Start of mirtoconf checks
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001097#
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"
Elliott Hughes23925bb2017-09-22 16:04:20 -07001109$e ... which compiler type seems to be used
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001110cat >conftest.c <<'EOF'
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001111const char *
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001112#if defined(__ICC) || defined(__INTEL_COMPILER)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001113ct="icc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001114#elif defined(__xlC__) || defined(__IBMC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001115ct="xlc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001116#elif defined(__SUNPRO_C)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001117ct="sunpro"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001118#elif defined(__ACK__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001119ct="ack"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001120#elif defined(__BORLANDC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001121ct="bcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001122#elif defined(__WATCOMC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001123ct="watcom"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001124#elif defined(__MWERKS__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001125ct="metrowerks"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001126#elif defined(__HP_cc)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001127ct="hpcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001128#elif defined(__DECC) || (defined(__osf__) && !defined(__GNUC__))
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001129ct="dec"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001130#elif defined(__PGI)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001131ct="pgi"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001132#elif defined(__DMC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001133ct="dmc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001134#elif defined(_MSC_VER)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001135ct="msc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001136#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001137ct="adsp"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001138#elif defined(__IAR_SYSTEMS_ICC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001139ct="iar"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001140#elif defined(SDCC)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001141ct="sdcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001142#elif defined(__PCC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001143ct="pcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001144#elif defined(__TenDRA__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001145ct="tendra"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001146#elif defined(__TINYC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001147ct="tcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001148#elif defined(__llvm__) && defined(__clang__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001149ct="clang"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001150#elif defined(__NWCC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001151ct="nwcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001152#elif defined(__GNUC__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001153ct="gcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001154#elif defined(_COMPILER_VERSION)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001155ct="mipspro"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001156#elif defined(__sgi)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001157ct="mipspro"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001158#elif defined(__hpux) || defined(__hpua)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001159ct="hpcc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001160#elif defined(__ultrix)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001161ct="ucode"
1162#elif defined(__USLC__)
1163ct="uslc"
1164#elif defined(__LCC__)
1165ct="lcc"
Thorsten Glaser811a5752013-07-25 14:24:45 +00001166#elif defined(MKSH_MAYBE_KENCC)
1167/* and none of the above matches */
1168ct="kencc"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001169#else
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001170ct="unknown"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001171#endif
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001172;
1173const char *
Elliott Hughes96b43632015-07-17 11:39:41 -07001174#if defined(__KLIBC__) && !defined(__OS2__)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001175et="klibc"
1176#else
1177et="unknown"
1178#endif
1179;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001180EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001181ct=untested
1182et=untested
1183vv ']' "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c | \
1184 sed -n '/^ *[ce]t *= */s/^ *\([ce]t\) *= */\1=/p' | tr -d \\\\015 >x"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001185sed 's/^/[ /' x
1186eval `cat x`
1187rmf x vv.out
Elliott Hughes737fdce2014-08-07 12:59:26 -07001188cat >conftest.c <<'EOF'
1189#include <unistd.h>
1190int main(void) { return (isatty(0)); }
1191EOF
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001192case $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"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001211 # one of these two works, for now
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001212 vv '|' "${CLANG-clang} -version"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001213 vv '|' "${CLANG-clang} --version"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001214 # 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
Elliott Hughes77740fc2016-08-12 15:06:53 -07001219 : "${HAVE_STRING_POOLING=i1}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001220 ;;
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`'
Elliott Hughes77740fc2016-08-12 15:06:53 -07001236 : "${HAVE_STRING_POOLING=i2}"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001237 ;;
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 ;;
Thorsten Glaser811a5752013-07-25 14:24:45 +00001250kencc)
1251 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1252 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001253lcc)
1254 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
1255 add_cppflags -D__inline__=__inline
1256 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001257metrowerks)
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 | \
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001309 grep -F -i -e version -e release"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001310 ;;
1311ucode)
1312 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -V"
1313 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -Wl,-V conftest.c $LIBS"
1314 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001315uslc)
1316 case $TARGET_OS:$TARGET_OSREV in
1317 SCO_SV:3.2*)
1318 # SCO OpenServer 5
1319 CFLAGS="$CFLAGS -g"
Elliott Hughes96b43632015-07-17 11:39:41 -07001320 : "${HAVE_CAN_OTWO=0}${HAVE_CAN_OPTIMISE=0}"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001321 ;;
1322 esac
1323 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -V conftest.c $LIBS"
1324 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001325watcom)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001326 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN -v conftest.c $LIBS"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001327 ;;
1328xlc)
Geremy Condra03ebf062011-10-12 18:17:24 -07001329 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001330 vv '|' "$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN $LIBS -qversion=verbose"
1331 vv '|' "ld -V"
1332 ;;
1333*)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001334 test x"$ct" = x"untested" && $e "!!! detecting preprocessor failed"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001335 ct=unknown
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001336 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001339 ;;
1340esac
1341case $cm in
1342dragonegg|llvm)
1343 vv '|' "llc -version"
1344 ;;
1345esac
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001346etd=" on $et"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001347case $et in
1348klibc)
1349 add_cppflags -DMKSH_NO_LIMITS
1350 ;;
1351unknown)
1352 # nothing special detected, don’t worry
Elliott Hughesfc0307d2016-02-02 15:26:47 -08001353 etd=
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001354 ;;
1355*)
1356 # huh?
1357 ;;
1358esac
Elliott Hughes23925bb2017-09-22 16:04:20 -07001359$e "$bi==> which compiler type seems to be used...$ao $ui$ct$etd$ao"
Elliott Hughes96b43632015-07-17 11:39:41 -07001360rmf conftest.c conftest.o conftest a.out* a.exe* conftest.exe* vv.out
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001361
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
Elliott Hughes96b43632015-07-17 11:39:41 -07001375 : "${HAVE_CAN_DELEXE=x}"
Thorsten Glaser811a5752013-07-25 14:24:45 +00001376 case $ct in
1377 dec)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001378 CFLAGS="$CFLAGS ${ccpl}-non_shared"
1379 ac_testn can_delexe compiler_fails 0 'for the -non_shared linker option' <<-EOF
Elliott Hughes737fdce2014-08-07 12:59:26 -07001380 #include <unistd.h>
1381 int main(void) { return (isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001382 EOF
Thorsten Glaser811a5752013-07-25 14:24:45 +00001383 ;;
1384 dmc)
1385 CFLAGS="$CFLAGS ${ccpl}/DELEXECUTABLE"
1386 ac_testn can_delexe compiler_fails 0 'for the /DELEXECUTABLE linker option' <<-EOF
Elliott Hughes737fdce2014-08-07 12:59:26 -07001387 #include <unistd.h>
1388 int main(void) { return (isatty(0)); }
Thorsten Glaser811a5752013-07-25 14:24:45 +00001389 EOF
1390 ;;
1391 *)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001392 exit 1
Thorsten Glaser811a5752013-07-25 14:24:45 +00001393 ;;
1394 esac
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001395 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__'
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001404 HAVE_COMPILER_KNOWN=1
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001405fi
1406
Thorsten Glaser811a5752013-07-25 14:24:45 +00001407case $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)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001436 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"
Thorsten Glaser811a5752013-07-25 14:24:45 +00001441 ;;
1442tendra)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001443 save_NOWARN=-w
Thorsten Glaser811a5752013-07-25 14:24:45 +00001444 ;;
1445ucode)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001446 save_NOWARN=
1447 DOWARN=-w2
Thorsten Glaser811a5752013-07-25 14:24:45 +00001448 ;;
1449watcom)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001450 save_NOWARN=
1451 DOWARN=-Wc,-we
Thorsten Glaser811a5752013-07-25 14:24:45 +00001452 ;;
1453xlc)
Elliott Hughes23925bb2017-09-22 16:04:20 -07001454 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
Thorsten Glaser811a5752013-07-25 14:24:45 +00001464 ;;
1465*)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001466 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
Thorsten Glaser811a5752013-07-25 14:24:45 +00001471 test $ct = icc && DOWARN="$DOWARN -wd1419"
1472 ;;
1473esac
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001474NOWARN=$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
Thorsten Glaser811a5752013-07-25 14:24:45 +00001481test 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)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001491 cat >x <<-'EOF'
Elliott Hughes737fdce2014-08-07 12:59:26 -07001492 #include <unistd.h>
1493 int main(void) { return (isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001494 #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
Thorsten Glaser811a5752013-07-25 14:24:45 +00001501 ;;
1502xlc)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001503 ac_flags 1 othree "-O3 -qstrict"
1504 test 1 = $HAVE_CAN_OTHREE || ac_flags 1 otwo -O2
Thorsten Glaser811a5752013-07-25 14:24:45 +00001505 ;;
1506*)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001507 ac_flags 1 otwo -O2
1508 test 1 = $HAVE_CAN_OTWO || ac_flags 1 optimise -O
Thorsten Glaser811a5752013-07-25 14:24:45 +00001509 ;;
1510esac
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001511# other flags: just add them if they are supported
1512i=0
Thorsten Glaser811a5752013-07-25 14:24:45 +00001513case $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)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001529 # The following tests run with -Werror (gcc only) if possible
1530 NOWARN=$DOWARN; phase=u
Thorsten Glaser811a5752013-07-25 14:24:45 +00001531 ac_flags 1 wnodeprecateddecls -Wno-deprecated-declarations
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001532 # mksh is not written in CFrustFrust!
1533 ac_flags 1 no_eh_frame -fno-asynchronous-unwind-tables
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001534 ac_flags 1 fnostrictaliasing -fno-strict-aliasing
Elliott Hughes737fdce2014-08-07 12:59:26 -07001535 ac_flags 1 fstackprotectorstrong -fstack-protector-strong
1536 test 1 = $HAVE_CAN_FSTACKPROTECTORSTRONG || \
1537 ac_flags 1 fstackprotectorall -fstack-protector-all
Geremy Condra03ebf062011-10-12 18:17:24 -07001538 test $cm = dragonegg && case " $CC $CFLAGS $LDFLAGS " in
1539 *\ -fplugin=*dragonegg*) ;;
1540 *) ac_flags 1 fplugin_dragonegg -fplugin=dragonegg ;;
1541 esac
Thorsten Glaser811a5752013-07-25 14:24:45 +00001542 case $cm in
1543 combine)
Geremy Condra03ebf062011-10-12 18:17:24 -07001544 fv=0
1545 checks='7 8'
Thorsten Glaser811a5752013-07-25 14:24:45 +00001546 ;;
1547 lto)
1548 fv=0
1549 checks='1 2 3 4 5 6 7 8'
1550 ;;
1551 *)
Geremy Condra03ebf062011-10-12 18:17:24 -07001552 fv=1
Thorsten Glaser811a5752013-07-25 14:24:45 +00001553 ;;
1554 esac
Geremy Condra03ebf062011-10-12 18:17:24 -07001555 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
Elliott Hughes966dd552016-12-08 15:56:04 -08001582 ac_flags 1 data_abi_align -malign-data=abi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001583 i=1
Thorsten Glaser811a5752013-07-25 14:24:45 +00001584 ;;
1585hpcc)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001586 phase=u
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001587 # probably not needed
1588 #ac_flags 1 agcc -Agcc 'for support of GCC extensions'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001589 phase=x
Thorsten Glaser811a5752013-07-25 14:24:45 +00001590 ;;
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)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001598 ac_flags 1 fullwarn -fullwarn 'for remark output support'
Thorsten Glaser811a5752013-07-25 14:24:45 +00001599 ;;
1600msc)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001601 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'
Thorsten Glaser811a5752013-07-25 14:24:45 +00001609 ;;
1610nwcc)
Thorsten Glaser811a5752013-07-25 14:24:45 +00001611 #broken# ac_flags 1 ssp -stackprotect
Elliott Hughes966dd552016-12-08 15:56:04 -08001612 i=1
1613 ;;
1614pcc)
1615 ac_flags 1 fstackprotectorall -fstack-protector-all
1616 i=1
Thorsten Glaser811a5752013-07-25 14:24:45 +00001617 ;;
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)
Elliott Hughes23925bb2017-09-22 16:04:20 -07001633 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001651 #ac_flags 1 wp64 -qwarn64 # too verbose for now
Thorsten Glaser811a5752013-07-25 14:24:45 +00001652 ;;
1653esac
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001654# flags common to a subset of compilers (run with -Werror on gcc)
1655if test 1 = $i; then
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001656 ac_flags 1 wall -Wall
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001657 ac_flags 1 fwrapv -fwrapv
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001658fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001659
Elliott Hughes77740fc2016-08-12 15:06:53 -07001660# “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
Geremy Condra03ebf062011-10-12 18:17:24 -07001670phase=x
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001671# 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#
Geremy Condra03ebf062011-10-12 18:17:24 -07001678ac_test attribute_bounded '' 'for __attribute__((__bounded__))' <<-'EOF'
1679 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
Thorsten Glaser811a5752013-07-25 14:24:45 +00001680 extern int thiswillneverbedefinedIhope(void);
Geremy Condra03ebf062011-10-12 18:17:24 -07001681 /* force a failure: TenDRA and gcc 1.42 have false positive here */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001682 int main(void) { return (thiswillneverbedefinedIhope()); }
1683 #else
1684 #include <string.h>
1685 #undef __attribute__
1686 int xcopy(const void *, void *, size_t)
Elliott Hughes737fdce2014-08-07 12:59:26 -07001687 __attribute__((__bounded__(__buffer__, 1, 3)))
1688 __attribute__((__bounded__(__buffer__, 2, 3)));
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001689 int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
1690 int xcopy(const void *s, void *d, size_t n) {
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001691 /*
1692 * if memmove does not exist, we are not on a system
1693 * with GCC with __bounded__ attribute either so poo
1694 */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001695 memmove(d, s, n); return ((int)n);
1696 }
1697 #endif
1698EOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001699ac_test attribute_format '' 'for __attribute__((__format__))' <<-'EOF'
1700 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
Thorsten Glaser811a5752013-07-25 14:24:45 +00001701 extern int thiswillneverbedefinedIhope(void);
Geremy Condra03ebf062011-10-12 18:17:24 -07001702 /* force a failure: TenDRA and gcc 1.42 have false positive here */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001703 int main(void) { return (thiswillneverbedefinedIhope()); }
1704 #else
Geremy Condra03ebf062011-10-12 18:17:24 -07001705 #define fprintf printfoo
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001706 #include <stdio.h>
1707 #undef __attribute__
Geremy Condra03ebf062011-10-12 18:17:24 -07001708 #undef fprintf
1709 extern int fprintf(FILE *, const char *format, ...)
Elliott Hughes737fdce2014-08-07 12:59:26 -07001710 __attribute__((__format__(__printf__, 2, 3)));
Geremy Condra03ebf062011-10-12 18:17:24 -07001711 int main(int ac, char **av) { return (fprintf(stderr, "%s%d", *av, ac)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001712 #endif
1713EOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001714ac_test attribute_noreturn '' 'for __attribute__((__noreturn__))' <<-'EOF'
1715 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
Thorsten Glaser811a5752013-07-25 14:24:45 +00001716 extern int thiswillneverbedefinedIhope(void);
Geremy Condra03ebf062011-10-12 18:17:24 -07001717 /* force a failure: TenDRA and gcc 1.42 have false positive here */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001718 int main(void) { return (thiswillneverbedefinedIhope()); }
1719 #else
1720 #include <stdlib.h>
1721 #undef __attribute__
Geremy Condra03ebf062011-10-12 18:17:24 -07001722 void fnord(void) __attribute__((__noreturn__));
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001723 int main(void) { fnord(); }
1724 void fnord(void) { exit(0); }
1725 #endif
1726EOF
Elliott Hughes737fdce2014-08-07 12:59:26 -07001727ac_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
Geremy Condra03ebf062011-10-12 18:17:24 -07001740ac_test attribute_unused '' 'for __attribute__((__unused__))' <<-'EOF'
1741 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
Thorsten Glaser811a5752013-07-25 14:24:45 +00001742 extern int thiswillneverbedefinedIhope(void);
Geremy Condra03ebf062011-10-12 18:17:24 -07001743 /* force a failure: TenDRA and gcc 1.42 have false positive here */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001744 int main(void) { return (thiswillneverbedefinedIhope()); }
1745 #else
Elliott Hughes737fdce2014-08-07 12:59:26 -07001746 #include <unistd.h>
1747 #undef __attribute__
Geremy Condra03ebf062011-10-12 18:17:24 -07001748 int main(int ac __attribute__((__unused__)), char **av
Elliott Hughes737fdce2014-08-07 12:59:26 -07001749 __attribute__((__unused__))) { return (isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001750 #endif
1751EOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001752ac_test attribute_used '' 'for __attribute__((__used__))' <<-'EOF'
1753 #if defined(__TenDRA__) || (defined(__GNUC__) && (__GNUC__ < 2))
Thorsten Glaser811a5752013-07-25 14:24:45 +00001754 extern int thiswillneverbedefinedIhope(void);
Geremy Condra03ebf062011-10-12 18:17:24 -07001755 /* force a failure: TenDRA and gcc 1.42 have false positive here */
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001756 int main(void) { return (thiswillneverbedefinedIhope()); }
1757 #else
Elliott Hughes737fdce2014-08-07 12:59:26 -07001758 #include <unistd.h>
1759 #undef __attribute__
Geremy Condra03ebf062011-10-12 18:17:24 -07001760 static const char fnord[] __attribute__((__used__)) = "42";
Elliott Hughes737fdce2014-08-07 12:59:26 -07001761 int main(void) { return (isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001762 #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
Elliott Hughes96b43632015-07-17 11:39:41 -07001774 : "${HAVE_NICE=0}"
1775 : "${HAVE_PERSISTENT_HISTORY=0}"
Geremy Condra03ebf062011-10-12 18:17:24 -07001776 check_categories="$check_categories smksh"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001777fi
Thorsten Glaser811a5752013-07-25 14:24:45 +00001778ac_ifcpp 'if defined(MKSH_BINSHPOSIX) || defined(MKSH_BINSHREDUCED)' \
1779 isset_MKSH_BINSH '' 'if invoking as sh should be handled specially' && \
Geremy Condra03ebf062011-10-12 18:17:24 -07001780 check_categories="$check_categories binsh"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001781ac_ifcpp 'ifdef MKSH_UNEMPLOYED' isset_MKSH_UNEMPLOYED '' \
1782 "if mksh will be built without job control" && \
Geremy Condra03ebf062011-10-12 18:17:24 -07001783 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001787ac_ifcpp 'ifdef MKSH_ASSUME_UTF8' isset_MKSH_ASSUME_UTF8 '' \
Elliott Hughes96b43632015-07-17 11:39:41 -07001788 'if the default UTF-8 mode is specified' && : "${HAVE_SETLOCALE_CTYPE=0}"
Elliott Hughes23925bb2017-09-22 16:04:20 -07001789ac_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"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001793#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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001802
1803#
1804# Environment: headers
1805#
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001806ac_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>
Elliott Hughes737fdce2014-08-07 12:59:26 -07001813 #include <unistd.h>
1814 int main(void) { struct tm tm; return ((int)sizeof(tm) + isatty(0)); }
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001815EOF
Geremy Condra03ebf062011-10-12 18:17:24 -07001816ac_header sys/bsdtypes.h
1817ac_header sys/file.h sys/types.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001818ac_header sys/mkdev.h sys/types.h
1819ac_header sys/mman.h sys/types.h
Geremy Condra03ebf062011-10-12 18:17:24 -07001820ac_header sys/param.h
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001821ac_header sys/resource.h sys/types.h _time
Geremy Condra03ebf062011-10-12 18:17:24 -07001822ac_header sys/select.h sys/types.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001823ac_header sys/sysmacros.h
Geremy Condra03ebf062011-10-12 18:17:24 -07001824ac_header bstring.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001825ac_header grp.h sys/types.h
Elliott Hughes96b43632015-07-17 11:39:41 -07001826ac_header io.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001827ac_header libgen.h
1828ac_header libutil.h sys/types.h
1829ac_header paths.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001830ac_header stdint.h stdarg.h
Geremy Condra03ebf062011-10-12 18:17:24 -07001831# include strings.h only if compatible with string.h
1832ac_header strings.h sys/types.h string.h
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001833ac_header termios.h
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001834ac_header ulimit.h sys/types.h
1835ac_header values.h
1836
1837#
1838# Environment: definitions
1839#
1840echo '#include <sys/types.h>
Elliott Hughes737fdce2014-08-07 12:59:26 -07001841#include <unistd.h>
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001842/* check that off_t can represent 2^63-1 correctly, thx FSF */
Elliott Hughes737fdce2014-08-07 12:59:26 -07001843#define LARGE_OFF_T ((((off_t)1 << 31) << 31) - 1 + (((off_t)1 << 31) << 31))
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001844int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
1845 LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
Elliott Hughes737fdce2014-08-07 12:59:26 -07001846int main(void) { return (isatty(0)); }' >lft.c
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001847ac_testn can_lfs '' "for large file support" <lft.c
1848save_CPPFLAGS=$CPPFLAGS
Geremy Condra03ebf062011-10-12 18:17:24 -07001849add_cppflags -D_FILE_OFFSET_BITS=64
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001850ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
1851if test 0 = $HAVE_CAN_LFS_SUS; then
Geremy Condra03ebf062011-10-12 18:17:24 -07001852 CPPFLAGS=$save_CPPFLAGS
1853 add_cppflags -D_LARGE_FILES=1
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001854 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
Elliott Hughesb27ce952015-04-21 13:39:18 -07001857rm -f lft.c
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001858rmf 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>
Elliott Hughes50012062015-03-10 22:22:24 -07001866 int main(int ac, char **av) { return ((uint32_t)(size_t)*av + (int32_t)ac); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001867EOF
1868ac_test can_ucbints '!' can_inttypes 1 "for UCB 32-bit integer types" <<-'EOF'
1869 #include <sys/types.h>
1870 #include <stddef.h>
Elliott Hughes50012062015-03-10 22:22:24 -07001871 int main(int ac, char **av) { return ((u_int32_t)(size_t)*av + (int32_t)ac); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001872EOF
1873ac_test can_int8type '!' stdint_h 1 "for standard 8-bit integer type" <<-'EOF'
1874 #include <sys/types.h>
1875 #include <stddef.h>
Elliott Hughes50012062015-03-10 22:22:24 -07001876 int main(int ac, char **av) { return ((uint8_t)(size_t)av[ac]); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001877EOF
1878ac_test can_ucbint8 '!' can_int8type 1 "for UCB 8-bit integer type" <<-'EOF'
1879 #include <sys/types.h>
1880 #include <stddef.h>
Elliott Hughes50012062015-03-10 22:22:24 -07001881 int main(int ac, char **av) { return ((u_int8_t)(size_t)av[ac]); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001882EOF
1883
1884ac_test rlim_t <<-'EOF'
1885 #include <sys/types.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001886 #if HAVE_BOTH_TIME_H
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001887 #include <sys/time.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001888 #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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001895 #include <sys/resource.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001896 #endif
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001897 #include <unistd.h>
Elliott Hughes737fdce2014-08-07 12:59:26 -07001898 int main(void) { return (((int)(rlim_t)0) + isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001899EOF
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>
Thorsten Glaser811a5752013-07-25 14:24:45 +00001906 volatile sig_t foo = (sig_t)0;
1907 int main(void) { return (foo == (sig_t)0); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001908EOF
1909
1910ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
1911 #include <sys/types.h>
1912 #include <signal.h>
1913 #include <stddef.h>
Thorsten Glaser811a5752013-07-25 14:24:45 +00001914 volatile sighandler_t foo = (sighandler_t)0;
1915 int main(void) { return (foo == (sighandler_t)0); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001916EOF
1917if test 1 = $HAVE_SIGHANDLER_T; then
Geremy Condra03ebf062011-10-12 18:17:24 -07001918 add_cppflags -Dsig_t=sighandler_t
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001919 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>
Thorsten Glaser811a5752013-07-25 14:24:45 +00001926 volatile __sighandler_t foo = (__sighandler_t)0;
1927 int main(void) { return (foo == (__sighandler_t)0); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001928EOF
1929if test 1 = $HAVE___SIGHANDLER_T; then
Geremy Condra03ebf062011-10-12 18:17:24 -07001930 add_cppflags -Dsig_t=__sighandler_t
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001931 HAVE_SIG_T=1
1932fi
1933
Geremy Condra03ebf062011-10-12 18:17:24 -07001934test 1 = $HAVE_SIG_T || add_cppflags -Dsig_t=nosig_t
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001935ac_cppflags SIG_T
1936
1937#
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001938# 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
Elliott Hughesb27ce952015-04-21 13:39:18 -07001946 cat >conftest.c <<-EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001947 #define EXTERN
1948 #define MKSH_INCLUDES_ONLY
1949 #include "sh.h"
Elliott Hughesb27ce952015-04-21 13:39:18 -07001950 __RCSID("$srcversion");
1951 int main(void) { printf("Hello, World!\\n"); return (isatty(0)); }
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001952EOF
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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07001984#
1985test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
1986
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001987ac_testn sys_errlist '' "the sys_errlist[] array and sys_nerr" <<-'EOF'
1988 extern const int sys_nerr;
1989 extern const char * const sys_errlist[];
Elliott Hughes737fdce2014-08-07 12:59:26 -07001990 extern int isatty(int);
1991 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001992EOF
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[];
Elliott Hughes737fdce2014-08-07 12:59:26 -07001996 extern int isatty(int);
1997 int main(void) { return (*_sys_errlist[_sys_nerr - 1] + isatty(0)); }
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00001998EOF
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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002006for what in name list; do
2007 uwhat=`upper $what`
2008 ac_testn sys_sig$what '' "the sys_sig${what}[] array" <<-EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002009 extern const char * const sys_sig${what}[];
Elliott Hughes737fdce2014-08-07 12:59:26 -07002010 extern int isatty(int);
2011 int main(void) { return (sys_sig${what}[0][0] + isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002012 EOF
2013 ac_testn _sys_sig$what '!' sys_sig$what 0 "the _sys_sig${what}[] array" <<-EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002014 extern const char * const _sys_sig${what}[];
Elliott Hughes737fdce2014-08-07 12:59:26 -07002015 extern int isatty(int);
2016 int main(void) { return (_sys_sig${what}[0][0] + isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002017 EOF
Geremy Condra03ebf062011-10-12 18:17:24 -07002018 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002022 fi
2023 ac_cppflags SYS_SIG$uwhat
2024done
2025
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002026#
2027# Environment: library functions
2028#
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002029ac_test flock <<-'EOF'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002030 #include <sys/types.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002031 #include <fcntl.h>
2032 #undef flock
Geremy Condra03ebf062011-10-12 18:17:24 -07002033 #if HAVE_SYS_FILE_H
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002034 #include <sys/file.h>
Geremy Condra03ebf062011-10-12 18:17:24 -07002035 #endif
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002036 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'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002040 #include <fcntl.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002041 #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 }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002047EOF
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
Elliott Hughes737fdce2014-08-07 12:59:26 -07002059ac_test getsid <<-'EOF'
2060 #include <unistd.h>
2061 int main(void) { return ((int)getsid(0)); }
2062EOF
2063
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002064ac_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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002070ac_test killpg <<-'EOF'
2071 #include <signal.h>
2072 int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
2073EOF
2074
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002075ac_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[]) {
Elliott Hughes737fdce2014-08-07 12:59:26 -07002083 return (*(int *)(void *)memmove(av[0], av[1], (size_t)ac));
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002084 }
2085EOF
2086
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002087ac_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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002098ac_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>
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002107 #include <stdlib.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002108 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)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002111EOF
2112
Elliott Hughes23925bb2017-09-22 16:04:20 -07002113ac_test ftruncate mmap 0 'for ftruncate' <<-'EOF'
2114 #include <unistd.h>
2115 int main(void) { return (ftruncate(0, 0)); }
2116EOF
2117
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002118ac_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>
Elliott Hughes50012062015-03-10 22:22:24 -07002135 int main(void) { return ((int)(size_t)(void *)setlocale(LC_CTYPE, "")); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002136EOF
2137
2138ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
2139 #include <langinfo.h>
2140 #include <stddef.h>
Elliott Hughes50012062015-03-10 22:22:24 -07002141 int main(void) { return ((int)(size_t)(void *)nl_langinfo(CODESET)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002142EOF
2143
Geremy Condra03ebf062011-10-12 18:17:24 -07002144ac_test select <<-'EOF'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002145 #include <sys/types.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002146 #if HAVE_BOTH_TIME_H
Geremy Condra03ebf062011-10-12 18:17:24 -07002147 #include <sys/time.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002148 #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
Geremy Condra03ebf062011-10-12 18:17:24 -07002154 #if HAVE_SYS_BSDTYPES_H
2155 #include <sys/bsdtypes.h>
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002156 #endif
Geremy Condra03ebf062011-10-12 18:17:24 -07002157 #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 }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002175EOF
2176
2177ac_test setresugid <<-'EOF'
2178 #include <sys/types.h>
2179 #include <unistd.h>
Thorsten Glaser811a5752013-07-25 14:24:45 +00002180 int main(void) { return (setresuid(0,0,0) + setresgid(0,0,0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002181EOF
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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002192if 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'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002230 #include <string.h>
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002231 #include <signal.h>
2232 int main(void) { return (strsignal(1)[0]); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002233EOF
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#
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002244ac_test flock_decl flock 1 'for declaration of flock()' <<-'EOF'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002245 #define MKSH_INCLUDES_ONLY
2246 #include "sh.h"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002247 #if HAVE_SYS_FILE_H
2248 #include <sys/file.h>
2249 #endif
2250 int main(void) { return ((flock)(0, 0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002251EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002252ac_test revoke_decl revoke 1 'for declaration of revoke()' <<-'EOF'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002253 #define MKSH_INCLUDES_ONLY
2254 #include "sh.h"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002255 int main(void) { return ((revoke)("")); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002256EOF
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002257ac_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"
Elliott Hughes737fdce2014-08-07 12:59:26 -07002260 int main(void) { return (*sys_errlist[sys_nerr - 1] + isatty(0)); }
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002261EOF
2262ac_test sys_siglist_decl sys_siglist 0 'for declaration of sys_siglist[]' <<-'EOF'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002263 #define MKSH_INCLUDES_ONLY
2264 #include "sh.h"
Elliott Hughes737fdce2014-08-07 12:59:26 -07002265 int main(void) { return (sys_siglist[0][0] + isatty(0)); }
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002266EOF
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002267
2268#
2269# other checks
2270#
2271fd='if to use persistent history'
Elliott Hughes23925bb2017-09-22 16:04:20 -07002272ac_cache PERSISTENT_HISTORY || case $HAVE_FTRUNCATE$HAVE_MMAP$HAVE_FLOCK$HAVE_LOCK_FCNTL in
2273111*|1101) fv=1 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002274esac
Geremy Condra03ebf062011-10-12 18:17:24 -07002275test 1 = $fv || check_categories="$check_categories no-histfile"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002276ac_testdone
2277ac_cppflags
2278
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002279#
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#
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002319# 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 && \
Geremy Condra03ebf062011-10-12 18:17:24 -07002339 check_categories="$check_categories $oldish_ed"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002340rmf 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002348 sigseenone=:
2349 sigseentwo=:
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002350 echo '#include <signal.h>
Elliott Hughes96b43632015-07-17 11:39:41 -07002351#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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002357#elif defined(SIGMAX)
Elliott Hughes96b43632015-07-17 11:39:41 -07002358#define cfg_NSIG (SIGMAX + 1)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002359#elif defined(_SIGMAX)
Elliott Hughes96b43632015-07-17 11:39:41 -07002360#define cfg_NSIG (_SIGMAX + 1)
Elliott Hughes737fdce2014-08-07 12:59:26 -07002361#else
Elliott Hughes96b43632015-07-17 11:39:41 -07002362/*XXX better error out, see sh.h */
2363#define cfg_NSIG 64
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002364#endif
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002365int
Elliott Hughes96b43632015-07-17 11:39:41 -07002366mksh_cfg= cfg_NSIG
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002367;' >conftest.c
2368 # GNU sed 2.03 segfaults when optimising this to sed -n
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002369 NSIG=`vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
Elliott Hughes50012062015-03-10 22:22:24 -07002370 grep -v '^#' | \
2371 sed '/mksh_cfg.*= *$/{
2372 N
2373 s/\n/ /
2374 }' | \
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002375 grep '^ *mksh_cfg *=' | \
2376 sed 's/^ *mksh_cfg *=[ ]*\([()0-9x+-][()0-9x+ -]*\).*$/\1/'`
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002377 case $NSIG in
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002378 *mksh_cfg*) $e "Error: NSIG='$NSIG'"; NSIG=0 ;;
2379 *[\ \(\)+-]*) NSIG=`"$AWK" "BEGIN { print $NSIG }" </dev/null` ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002380 esac
2381 printf=printf
2382 (printf hallo) >/dev/null 2>&1 || printf=echo
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002383 test $printf = echo || test "`printf %d 42`" = 42 || printf=echo
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002384 test $printf = echo || NSIG=`printf %d "$NSIG" 2>/dev/null`
2385 $printf "NSIG=$NSIG ... "
Elliott Hughes737fdce2014-08-07 12:59:26 -07002386 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"
Elliott Hughes96b43632015-07-17 11:39:41 -07002388 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002390 test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
2391 "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002392 grep '[ ]SIG[A-Z0-9][A-Z0-9]*[ ]' | \
2393 sed 's/^.*[ ]SIG\([A-Z0-9][A-Z0-9]*\)[ ].*$/\1/' | sort`
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002394 test $NSIG -gt 1 || sigs=
2395 for name in $sigs; do
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002396 case $sigseenone in
2397 *:$name:*) continue ;;
2398 esac
2399 sigseenone=$sigseenone$name:
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002400 echo '#include <signal.h>' >conftest.c
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002401 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002405 vq "$CPP $CFLAGS $CPPFLAGS $NOWARN conftest.c" | \
Elliott Hughes50012062015-03-10 22:22:24 -07002406 grep -v '^#' | \
2407 sed '/mksh_cfg.*= *$/{
2408 N
2409 s/\n/ /
2410 }' | \
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002411 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002414 test $printf = echo || nr=`printf %d "$nr" 2>/dev/null`
Elliott Hughes96b43632015-07-17 11:39:41 -07002415 test $nr -gt 0 && test $nr -lt $NSIG || continue
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002416 case $sigseentwo in
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002417 *:$nr:*) ;;
2418 *) echo " { \"$name\", $nr },"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002419 sigseentwo=$sigseentwo$nr:
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002420 $printf "$name=$nr " >&2
2421 ;;
2422 esac
2423 done 2>&1 >signames.inc
2424 rmf conftest.c
2425 $e done.
2426fi
2427
Elliott Hughes737fdce2014-08-07 12:59:26 -07002428addsrcs '!' HAVE_STRLCPY strlcpy.c
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002429addsrcs USE_PRINTF_BUILTIN printf.c
Geremy Condra03ebf062011-10-12 18:17:24 -07002430test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002431test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
Elliott Hughes47086262019-03-26 12:34:31 -07002432add_cppflags -DMKSH_BUILD_R=571
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002433
2434$e $bi$me: Finished configuration testing, now producing output.$ao
2435
2436files=
2437objs=
2438sp=
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002439case $tcfn in
Elliott Hughes96b43632015-07-17 11:39:41 -07002440a.exe|conftest.exe)
2441 mkshexe=$tfn.exe
2442 add_cppflags -DMKSH_EXE_EXT
2443 ;;
2444*)
2445 mkshexe=$tfn
2446 ;;
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002447esac
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002448case $curdir in
2449*\ *) mkshshebang="#!./$mkshexe" ;;
2450*) mkshshebang="#!$curdir/$mkshexe" ;;
2451esac
2452cat >test.sh <<-EOF
2453 $mkshshebang
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002454 LC_ALL=C PATH='$PATH'; export LC_ALL PATH
2455 test -n "\$KSH_VERSION" || exit 1
Geremy Condra03ebf062011-10-12 18:17:24 -07002456 set -A check_categories -- $check_categories
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002457 pflag='$curdir/$mkshexe'
Geremy Condra03ebf062011-10-12 18:17:24 -07002458 sflag='$srcdir/check.t'
Elliott Hughes23925bb2017-09-22 16:04:20 -07002459 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 {
Geremy Condra03ebf062011-10-12 18:17:24 -07002461 (C) check_categories[\${#check_categories[*]}]=\$OPTARG ;;
2462 (e) usee=1; eflag=\$OPTARG ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002463 (f) check_categories[\${#check_categories[*]}]=fastbox ;;
Geremy Condra03ebf062011-10-12 18:17:24 -07002464 (P) Pflag=1 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002465 (+P) Pflag=0 ;;
Geremy Condra03ebf062011-10-12 18:17:24 -07002466 (p) pflag=\$OPTARG ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002467 (Q) vflag=0 ;;
2468 (+Q) vflag=1 ;;
2469 (S) Sflag=1 ;;
2470 (+S) Sflag=0 ;;
Geremy Condra03ebf062011-10-12 18:17:24 -07002471 (s) sflag=\$OPTARG ;;
2472 (t) uset=1; tflag=\$OPTARG ;;
Elliott Hughes23925bb2017-09-22 16:04:20 -07002473 (U) useU=1; Uflag=\$OPTARG ;;
Geremy Condra03ebf062011-10-12 18:17:24 -07002474 (v) vflag=1 ;;
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002475 (+v) vflag=0 ;;
Geremy Condra03ebf062011-10-12 18:17:24 -07002476 (*) xflag=1 ;;
2477 }
2478 done
2479 shift \$((OPTIND - 1))
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002480 set -A args -- '$srcdir/check.pl' -p "\$pflag"
Elliott Hughes23925bb2017-09-22 16:04:20 -07002481 if $ebcdic; then
2482 args[\${#args[*]}]=-E
2483 fi
Geremy Condra03ebf062011-10-12 18:17:24 -07002484 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
Elliott Hughes23925bb2017-09-22 16:04:20 -07002501 if (( useU )); then
2502 args[\${#args[*]}]=-U
2503 args[\${#args[*]}]=\$Uflag
2504 fi
Geremy Condra03ebf062011-10-12 18:17:24 -07002505 (( vflag )) && args[\${#args[*]}]=-v
2506 (( xflag )) && args[\${#args[*]}]=-x # force usage by synerr
Elliott Hughes737fdce2014-08-07 12:59:26 -07002507 if [[ -n \$TMPDIR && -d \$TMPDIR/. ]]; then
2508 args[\${#args[*]}]=-T
2509 args[\${#args[*]}]=\$TMPDIR
2510 fi
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002511 print Testing mksh for conformance:
Elliott Hughesfc0307d2016-02-02 15:26:47 -08002512 grep -F -e Mir''OS: -e MIRBSD "\$sflag"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002513 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002518 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002534 done
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002535 (( 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002546EOF
2547chmod 755 test.sh
Thorsten Glaser811a5752013-07-25 14:24:45 +00002548case $cm in
2549dragonegg)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002550 emitbc="-S -flto"
Thorsten Glaser811a5752013-07-25 14:24:45 +00002551 ;;
2552llvm)
2553 emitbc="-emit-llvm -c"
2554 ;;
2555*)
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002556 emitbc=-c
Thorsten Glaser811a5752013-07-25 14:24:45 +00002557 ;;
2558esac
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002559echo ": # work around NeXTstep bug" >Rebuild.sh
Elliott Hughes50012062015-03-10 22:22:24 -07002560cd "$srcdir"
2561optfiles=`echo *.opt`
2562cd "$curdir"
2563for file in $optfiles; do
Elliott Hughes737fdce2014-08-07 12:59:26 -07002564 echo "echo + Running genopt on '$file'..."
Elliott Hughes50012062015-03-10 22:22:24 -07002565 echo "(srcfile='$srcdir/$file'; BUILDSH_RUN_GENOPT=1; . '$srcdir/Build.sh')"
Elliott Hughes737fdce2014-08-07 12:59:26 -07002566done >>Rebuild.sh
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002567echo set -x >>Rebuild.sh
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002568for 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)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002584 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002587 ;;
2588*)
2589 lobjs=$objs
2590 ;;
2591esac
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002592echo tcfn=$mkshexe >>Rebuild.sh
2593echo "$CC $CFLAGS $LDFLAGS -o \$tcfn $lobjs $LIBS $ccpr" >>Rebuild.sh
Thorsten Glaser811a5752013-07-25 14:24:45 +00002594echo "test -f \$tcfn || exit 1; $SIZE \$tcfn" >>Rebuild.sh
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002595if test $cm = makefile; then
Elliott Hughes77740fc2016-08-12 15:06:53 -07002596 extras='emacsfn.h exprtok.h rlimits.opt sh.h sh_flags.opt var_spec.h'
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002597 test 0 = $HAVE_SYS_SIGNAME && extras="$extras signames.inc"
Elliott Hughes737fdce2014-08-07 12:59:26 -07002598 gens= genq=
Elliott Hughes50012062015-03-10 22:22:24 -07002599 for file in $optfiles; do
Elliott Hughes737fdce2014-08-07 12:59:26 -07002600 genf=`basename "$file" | sed 's/.opt$/.gen/'`
2601 gens="$gens $genf"
Elliott Hughes50012062015-03-10 22:22:24 -07002602 genq="$genq$nl$genf: $srcdir/Build.sh $srcdir/$file
2603 srcfile=$srcdir/$file; BUILDSH_RUN_GENOPT=1; . $srcdir/Build.sh"
Elliott Hughes737fdce2014-08-07 12:59:26 -07002604 done
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002605 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
Elliott Hughes737fdce2014-08-07 12:59:26 -07002622.depend \$(OBJS_BP):$gens$genq
2623
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002624# 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:
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002634#REGRESS_FLAGS= -f
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002635#regress:
2636# ./test.sh \$(REGRESS_FLAGS)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002637check_categories=$check_categories
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002638
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
Elliott Hughes50012062015-03-10 22:22:24 -07002647for file in $optfiles; do
Elliott Hughes737fdce2014-08-07 12:59:26 -07002648 $e "+ Running genopt on '$file'..."
Elliott Hughes50012062015-03-10 22:22:24 -07002649 do_genopt "$srcdir/$file" || exit 1
Elliott Hughes737fdce2014-08-07 12:59:26 -07002650done
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002651if 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)
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002679 rmf $tfn.s
2680 v "llvm-link -o - $objs | opt $optflags | llc -o $tfn.s"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002681 ;;
2682esac
2683tcfn=$mkshexe
2684test $cm = combine || v "$CC $CFLAGS $LDFLAGS -o $tcfn $lobjs $LIBS $ccpr"
2685test -f $tcfn || exit 1
Elliott Hughes966dd552016-12-08 15:56:04 -08002686test 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
Thorsten Glaser811a5752013-07-25 14:24:45 +00002688test 0 = $eq && v $SIZE $tcfn
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002689i=install
2690test -f /usr/ucb/$i && i=/usr/ucb/$i
2691test 1 = $eq && e=:
2692$e
2693$e Installing the shell:
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002694$e "# $i -c -s -o root -g bin -m 555 $tfn /bin/$tfn"
Thorsten Glaser811a5752013-07-25 14:24:45 +00002695if 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
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002699$e
2700$e Installing the manual:
Elliott Hughes966dd552016-12-08 15:56:04 -08002701if 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"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002706 $e or
2707fi
Elliott Hughes966dd552016-12-08 15:56:04 -08002708$e "# $i -c -o root -g bin -m 444 lksh.1 mksh.1 /usr/share/man/man1/"
Jean-Baptiste Queru5155f1c2011-06-16 10:05:28 -07002709$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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002713
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)
Thorsten Glaser811a5752013-07-25 14:24:45 +00002746MKSH_BINSHPOSIX if */sh or */-sh, enable set -o posix
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002747MKSH_BINSHREDUCED if */sh or */-sh, enable set -o sh
Elliott Hughes23925bb2017-09-22 16:04:20 -07002748MKSH_CLS_STRING KSH_ESC_STRING "[;H" KSH_ESC_STRING "[J"
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002749MKSH_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
Elliott Hughesdd4abe02018-02-05 15:55:19 -08002756MKSH_EARLY_LOCALE_TRACKING track utf8-mode from POSIX locale, for SuSE
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002757MKSH_MIDNIGHTBSD01ASH_COMPAT set -o sh: additional compatibility quirk
2758MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
Elliott Hughes56b517d2014-10-06 11:30:44 -07002759MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002760MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
2761MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002762MKSH_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
Elliott Hughes56b517d2014-10-06 11:30:44 -07002785http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002786and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
2787
Elliott Hughes96b43632015-07-17 11:39:41 -07002788You 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
Thorsten Glaserc2dc5de2013-02-18 23:02:51 +00002791EOD