64
SRCS="$SRCS alloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c"
189
SRCS="alloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c"
65
190
SRCS="$SRCS jobs.c lex.c main.c misc.c shf.c syn.c tree.c var.c"
67
test $x = 1 || case `uname -s 2>/dev/null || uname` in
192
test $r = 0 && echo | $NROFF -v 2>&1 | grep GNU >/dev/null 2>&1 && \
196
test x"$TARGET_OS" = x"" && TARGET_OS=`uname -s 2>/dev/null || uname`
71
CPPFLAGS="$CPPFLAGS -DNEED_COMPAT"
200
test def = $s && s=pam
76
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64"
203
test def = $s && s=pam
210
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
213
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
79
CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE -DNEED_COMPAT"
216
CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE"
82
SRCS="$SRCS compat.c strlfun.c"
83
CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=2 -D_BSD_SOURCE -D_GNU_SOURCE"
84
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -DNEED_COMPAT"
219
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
220
test def = $s && s=pam
224
CPPFLAGS="$CPPFLAGS -D_MINIX -D_POSIX_SOURCE"
225
warn=' and will currently not work'
226
# warn=" but might work with the GNU tools"
227
# warn="$warn$nl but not with ACK - /usr/bin/cc - yet)"
90
CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D_POSIX_C_SOURCE=200112L"
91
CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
92
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -DNEED_COMPAT"
236
CPPFLAGS="$CPPFLAGS -D_BSD_SOURCE -D__EXTENSIONS__"
237
test def = $s && s=pam
241
warn='; it may or may not work'
99
if test x"$sigseen" = x:; then
100
$e Generating list of signal names
101
NSIG=`printf %d "\`(echo '#include <signal.h>';echo mksh_cfg: NSIG) | \
102
$CC $CPPFLAGS -E - | grep mksh_cfg | sed 's/^mksh_cfg: //'\`" 2>&-`
245
if test -n "$warn"; then
246
echo "Warning: mksh has not yet been ported to or tested on your" >&2
247
echo "operating system '$TARGET_OS'$warn. If you can provide" >&2
248
echo "a shell account to the developer, this may improve; please" >&2
249
echo "drop us a success or failure notice or even send in diffs." >&2
252
CPPFLAGS="$CPPFLAGS -I'$curdir'"
256
# Begin of mirtoconf checks
258
rm -f scn.c a.out a.exe x no lft
259
$e ${ao}Scanning for functions... please ignore any errors.
262
# Compiler: works as-is, with -Wno-error and -Werror
264
test x"$NOWARN" = x"" && NOWARN=-Wno-error
267
ac_flags 0 compiler_works '' 'if the compiler works'
268
test 1 = $HAVE_CAN_COMPILER_WORKS || exit 1
269
ac_flags 0 wnoerror "$save_NOWARN"
270
test 1 = $HAVE_CAN_WNOERROR || save_NOWARN=
271
ac_flags 0 werror "-Werror"
273
# The following tests are run with -Werror if possible
274
test 1 = $HAVE_CAN_WERROR && NOWARN=-Werror
277
# Compiler: check for stuff that only generates warnings
279
ac_test attribute '' 'if we have __attribute__((...)) at all' <<-'EOF'
281
void fnord(void) __attribute__((noreturn));
282
int main(void) { fnord(); }
283
void fnord(void) { exit(0); }
286
ac_test attribute_bounded attribute 0 'for __attribute__((bounded))' <<-'EOF'
288
int xcopy(const void *, void *, size_t)
289
__attribute__((bounded (buffer, 1, 3)))
290
__attribute__((bounded (buffer, 2, 3)));
291
int main(int ac, char *av[]) { return (xcopy(av[0], av[--ac], 1)); }
292
int xcopy(const void *s, void *d, size_t n) {
293
memmove(d, s, n); return (n);
297
ac_test attribute_used attribute 0 'for __attribute__((used))' <<-'EOF'
298
static const char fnord[] __attribute__((used)) = "42";
299
int main(void) { return (0); }
302
# End of tests run with -Werror
306
# Compiler: extra flags (-O2 -f* -W* etc.)
308
i=`echo :"$CFLAGS" | sed 's/^://' | tr -c -d $alll$allu$alln-`
309
test x"$i" = x"" && ac_flags 1 otwo "-O2"
310
ac_flags 0 fnotreevrp "-fno-tree-vrp"
311
if test 1 = $HAVE_CAN_FNOTREEVRP; then
313
ac_testn need_fnotreevrp '' "if to use it to prevent a gcc bug" <<-'EOF'
314
typedef unsigned size_t;
315
char *strncpy(char *, const char *, size_t);
317
strncpy(char *d, const char *s, size_t n)
330
strncpy(a, (void *)0, 2);
335
if test -f $tcfn; then
336
./$tcfn >/dev/null 2>&1
341
rs="yes (assumed; cannot run ./$tcfn)"
343
test 1 = $rv && rs=yes
344
test 2 = $rv || CFLAGS="$CFLAGS -fno-tree-vrp"
345
$e "$bi==> $fd...$ao ${ui}$rs$ao"
348
ac_flags 1 fnostrictaliasing "-fno-strict-aliasing"
349
ac_flags 1 fstackprotectorall "-fstack-protector-all"
350
ac_flags 1 fwholepgm "-fwhole-program --combine"
351
ac_flags 1 fwrapv "-fwrapv"
352
# I'd use -std=c99 but this wrecks havoc on glibc and cygwin based
353
# systems (at least) because their system headers are so broken...
354
ac_flags 1 stdg99 "-std=gnu99" 'if -std=gnu99 (ISO C99) can be used'
355
ac_flags 1 wall "-Wall"
358
# mksh: flavours (full/small mksh, omit certain stuff)
360
ac_testn mksh_full '' "if we're building without MKSH_SMALL" <<-'EOF'
362
#error OK, we are building an extra small mksh.
364
int main(void) { return (0); }
367
ac_testn mksh_defutf8 '' "if we assume UTF-8 is enabled" <<-'EOF'
368
#ifndef MKSH_ASSUME_UTF8
369
#error Nope, we shall check with setlocale() and nl_langinfo(CODESET)
371
int main(void) { return (0); }
374
ac_testn mksh_need_mknod '!' mksh_full 1 'if we still want c_mknod()' <<-'EOF'
375
#ifndef MKSH_NEED_MKNOD
376
#error Nope, the user really wants it teensy.
378
int main(void) { return (0); }
381
ac_testn mksh_nopam mksh_full 1 'if the user wants to omit getpwnam()' <<-'EOF'
383
#error No, the user wants to pull in getpwnam.
385
int main(void) { return (0); }
388
if test 0 = $HAVE_MKSH_FULL; then
389
ac_flags 1 fnoinline "-fno-inline"
391
: ${HAVE_SETLOCALE_CTYPE=0}
392
check_categories=$check_categories,smksh
396
# Environment: headers
398
ac_header sys/param.h
399
ac_header sys/mkdev.h
400
ac_header sys/mman.h sys/types.h
401
ac_header sys/sysmacros.h
406
ac_header grp.h sys/types.h
411
# Environment: definitions
414
#include <sys/types.h>
415
/* check that off_t can represent 2^63-1 correctly, thx FSF */
416
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
417
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 &&
418
LARGE_OFF_T % 2147483647 == 1) ? 1 : -1];
419
int main(void) { return (0); }
421
ac_testn can_lfs '' "if we support large files" <lft.c
422
save_CPPFLAGS=$CPPFLAGS
423
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64"
424
ac_testn can_lfs_sus '!' can_lfs 0 "... with -D_FILE_OFFSET_BITS=64" <lft.c
425
if test 1 = $HAVE_CAN_LFS_SUS; then
428
CPPFLAGS=$save_CPPFLAGS
430
CPPFLAGS="$CPPFLAGS _LARGE_FILES=1"
431
ac_testn can_lfs_aix '!' can_lfs 0 "... with -D_LARGE_FILES=1" <lft.c
432
test 1 = $HAVE_CAN_LFS_AIX || CPPFLAGS=$save_CPPFLAGS
433
rm -f lft.c # end of large file support test
438
ac_test rlim_t <<-'EOF'
439
#include <sys/types.h>
440
#include <sys/time.h>
441
#include <sys/resource.h>
443
int main(void) { return ((int)(rlim_t)0); }
446
# only testn: added later below
447
ac_testn sig_t <<-'EOF'
448
#include <sys/types.h>
450
int main(void) { return ((int)(sig_t)0); }
453
ac_testn sighandler_t '!' sig_t 0 <<-'EOF'
454
#include <sys/types.h>
456
int main(void) { return ((int)(sighandler_t)0); }
458
if test 1 = $HAVE_SIGHANDLER_T; then
459
CPPFLAGS="$CPPFLAGS -Dsig_t=sighandler_t"
463
ac_testn __sighandler_t '!' sig_t 0 <<-'EOF'
464
#include <sys/types.h>
466
int main(void) { return ((int)(__sighandler_t)0); }
468
if test 1 = $HAVE___SIGHANDLER_T; then
469
CPPFLAGS="$CPPFLAGS -Dsig_t=__sighandler_t"
473
CPPFLAGS="$CPPFLAGS -DHAVE_SIG_T=$HAVE_SIG_T"
476
# Environment: signals
478
test x"NetBSD" = x"$TARGET_OS" && $e Ignore the compatibility warning.
480
ac_test mksh_signame '' 'our own list of signal names' <<-'EOF'
481
#include <stdlib.h> /* for NULL */
482
#define MKSH_SIGNAMES_CHECK
483
#include "signames.c"
484
int main(void) { return (mksh_sigpairs[0].nr); }
487
ac_test sys_signame '!' mksh_signame 0 'the sys_signame[] array' <<-'EOF'
488
extern const char *const sys_signame[];
489
int main(void) { return (sys_signame[0][0]); }
492
ac_test _sys_signame '!' sys_signame 0 'the _sys_signame[] array' <<-'EOF'
493
extern const char *const _sys_signame[];
494
int main(void) { return (_sys_signame[0][0]); }
497
if test 000 = $HAVE_SYS_SIGNAME$HAVE__SYS_SIGNAME$HAVE_MKSH_SIGNAME; then
503
# only testn: added later below
504
ac_testn sys_siglist '' 'the sys_siglist[] array' <<-'EOF'
505
extern const char *const sys_siglist[];
506
int main(void) { return (sys_siglist[0][0]); }
509
ac_testn _sys_siglist '!' sys_siglist 0 'the _sys_siglist[] array' <<-'EOF'
510
extern const char *const _sys_siglist[];
511
int main(void) { return (_sys_siglist[0][0]); }
513
if test 1 = $HAVE__SYS_SIGLIST; then
514
CPPFLAGS="$CPPFLAGS -Dsys_siglist=_sys_siglist"
517
CPPFLAGS="$CPPFLAGS -DHAVE_SYS_SIGLIST=$HAVE_SYS_SIGLIST"
519
ac_test strsignal '!' sys_siglist 0 <<-'EOF'
522
int main(void) { return (strsignal(1)[0]); }
526
# Environment: library functions
528
ac_test arc4random <<-'EOF'
530
int main(void) { return (arc4random()); }
533
ac_test arc4random_push arc4random 0 <<-'EOF'
535
int main(void) { arc4random_push(1); return (0); }
538
ac_test flock_ex '' 'flock and LOCK_EX' <<-'EOF'
539
#include <sys/types.h>
540
#include <sys/file.h>
542
int main(void) { return (flock(0, LOCK_EX)); }
545
ac_test setlocale_ctype '!' mksh_defutf8 0 'setlocale(LC_CTYPE, "")' <<-'EOF'
548
int main(void) { return ((ptrdiff_t)(void *)setlocale(LC_CTYPE, "")); }
551
ac_test langinfo_codeset setlocale_ctype 0 'nl_langinfo(CODESET)' <<-'EOF'
552
#include <langinfo.h>
554
int main(void) { return ((ptrdiff_t)(void *)nl_langinfo(CODESET)); }
557
ac_test revoke mksh_full 0 <<-'EOF'
559
int main(int ac, char *av[]) { return (ac + revoke(av[0])); }
562
ac_test setmode mksh_need_mknod 1 <<-'EOF'
563
#if defined(__MSVCRT__) || defined(__CYGWIN__)
564
#error Win32 setmode() is different from what we need
567
int main(int ac, char *av[]) { return (getmode(setmode(av[0]), ac)); }
570
ac_test setresugid <<-'EOF'
571
#include <sys/types.h>
573
int main(void) { setresuid(0,0,0); return (setresgid(0,0,0)); }
576
ac_test setgroups setresugid 0 <<-'EOF'
577
#include <sys/types.h>
582
int main(void) { gid_t gid = 0; return (setgroups(0, &gid)); }
585
ac_test strcasestr <<-'EOF'
588
int main(int ac, char *av[]) {
589
return ((ptrdiff_t)(void *)strcasestr(*av, av[ac]));
593
ac_test strlcpy <<-'EOF'
595
int main(int ac, char *av[]) { return (strlcpy(*av, av[1], ac)); }
601
ac_test persistent_history mksh_full 0 'if to use persistent history' <<-'EOF'
602
#if !HAVE_FLOCK_EX || defined(MKSH_SMALL)
603
#error No, some prerequisites are missing.
605
int main(void) { return (0); }
607
test 1 = $HAVE_PERSISTENT_HISTORY || \
608
check_categories=$check_categories,no-histfile
610
# Should be the _last_ one
611
ac_test multi_idstring '' 'if we can use __RCSID(x) multiple times' <<-'EOF'
612
#define HAVE_MULTI_IDSTRING 1
616
int main(void) { return (0); }
620
# Compiler: Praeprocessor (only if needed)
622
if test 1 = $NEED_MKSH_SIGNAME; then
623
$e ... checking how to run the C Preprocessor
625
for i in "$save_CPP" "$CC -E -" "cpp" "/usr/libexec/cpp" "/lib/cpp"; do
627
test x"$CPP" = x"false" && continue
628
eval '( ( echo "#if (23 * 2 - 2) == (fnord + 2)"
629
echo mksh_rules: fnord
631
) | v "$CPP $CPPFLAGS -Dfnord=42 >x" ) 2>&'$h | \
633
grep '^mksh_rules:.*42' x >/dev/null 2>&1 || CPP=false
635
test x"$CPP" = x"false" || break
637
$e "$bi==> checking how to run the C Preprocessor...$ao $ui$CPP$ao"
638
test x"$CPP" = x"false" && exit 1
642
# End of mirtoconf checks
646
# Some operating systems have ancient versions of ed(1) writing
647
# the character count to standard output; cope for that
649
ed x <x 2>/dev/null | grep 3 >/dev/null 2>&1 && \
650
check_categories=$check_categories,oldish-ed
653
if test 1 = $NEED_MKSH_SIGNAME; then
654
$e Generating list of signal names...
656
NSIG=`( echo '#include <signal.h>'; echo '#ifndef NSIG'; \
657
echo '#define NSIG _NSIG'; echo '#endif'; echo mksh_cfg: NSIG ) | \
658
vq "$CPP $CPPFLAGS" | grep mksh_cfg: | \
659
sed 's/^mksh_cfg: \([0-9x]*\).*$/\1/'`
660
NSIG=`printf %d "$NSIG" 2>/dev/null`
661
test $h = 1 && printf "NSIG=$NSIG ... "
103
662
test $NSIG -gt 1 || exit 1
104
echo '#include <signal.h>' | $CC $CPPFLAGS -E -dD - | \
663
echo '#include <signal.h>' | vq "$CPP $CPPFLAGS -dD" | \
105
664
grep '[ ]SIG[A-Z0-9]*[ ]' | \
106
665
sed 's/^\(.*[ ]SIG\)\([A-Z0-9]*\)\([ ].*\)$/\2/' | \
107
666
while read name; do
108
( echo '#include <signal.h>'; echo "mksh_cfg: SIG$name" ) | \
109
$CC $CPPFLAGS -E - | grep mksh_cfg: | \
110
sed 's/^mksh_cfg: \([0-9]*\).*$/\1:'$name/
667
( echo '#include <signal.h>'; echo mksh_cfg: SIG$name ) | \
668
vq "$CPP $CPPFLAGS" | grep mksh_cfg: | \
669
sed 's/^mksh_cfg: \([0-9x]*\).*$/\1:'$name/
111
670
done | grep -v '^:' | while IFS=: read nr name; do
112
nr=`printf %d "$nr" 2>&-`
113
test $nr -gt 0 && test $nr -lt $NSIG || continue
671
nr=`printf %d "$nr" 2>/dev/null`
672
test $nr -gt 0 && test $nr -le $NSIG || continue
116
675
*) echo " { $nr, \"$name\" },"
117
676
sigseen=$sigseen$nr:
677
test $h = 1 && printf "$nr " >&2
121
test -f signames.inc || exit 1
124
$e Scanning for functions...
126
test 0 = "$HAVE_ARC4RANDOM" || test 1 = "$HAVE_ARC4RANDOM" ||
131
int main() { arc4random(); return (0); }
133
$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN scn.c $LIBS
134
if test -f a.out || test -f a.exe; then
136
$e "==> arc4random... yes"
139
$e "==> arc4random... no"
141
rm -f scn.c a.out a.exe
144
test 0 = "$HAVE_ARC4RANDOM_PUSH" || test 1 = "$HAVE_ARC4RANDOM_PUSH" ||
145
if test 1 = "$HAVE_ARC4RANDOM"; then
146
$e ... arc4random_push
149
int main() { arc4random_push(1); return (0); }
151
$CC $CFLAGS $CPPFLAGS $LDFLAGS $NOWARN scn.c $LIBS
152
if test -f a.out || test -f a.exe; then
153
HAVE_ARC4RANDOM_PUSH=1
154
$e "==> arc4random_push... yes"
156
HAVE_ARC4RANDOM_PUSH=0
157
$e "==> arc4random_push... no"
159
rm -f scn.c a.out a.exe
161
HAVE_ARC4RANDOM_PUSH=0
165
addcppf HAVE_ARC4RANDOM HAVE_ARC4RANDOM_PUSH
167
(v "cd '$srcdir' && exec $CC $CFLAGS -I'$curdir' $CPPFLAGS" \
168
"$LDFLAGS $LDSTATIC -o '$curdir/mksh' $SRCS $LIBS") || exit 1
680
done 2>&1 >signames.inc
681
grep ', ' signames.inc >/dev/null 2>&1 || exit 1
685
addsrcs HAVE_SETMODE setmode.c
686
addsrcs HAVE_STRLCPY strlcpy.c
687
CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H -DCONFIG_H_FILENAME=\\\"sh.h\\\""
689
case $s:$HAVE_MKSH_NOPAM in
691
LDFLAGS="$LDFLAGS -static" ;;
693
(v "cd '$srcdir' && exec $CC $CFLAGS $CPPFLAGS" \
694
"$LDFLAGS -o '$curdir/mksh' $SRCS $LIBS") || exit 1
170
696
test -f mksh.exe && result=mksh.exe
171
697
test -f $result || exit 1
172
698
test $r = 1 || v "$NROFF -mdoc <'$srcdir/mksh.1' >mksh.cat1" || \
174
test $q = 1 || v size $result
175
echo "#!$curdir/mksh" >test.sh
700
test $h = 1 && v size $result
702
*\ *) echo "#!./mksh" >test.sh ;;
703
*) echo "#!$curdir/mksh" >test.sh ;;
176
705
echo "exec perl '$srcdir/check.pl' -s '$srcdir/check.t'" \
177
"-p '$curdir/mksh' -C pdksh \$*" >>test.sh
706
"-p '$curdir/mksh' -C $check_categories \$*" >>test.sh
178
707
chmod 755 test.sh
180
709
test -f /usr/ucb/$i && i=/usr/ucb/$i
182
711
$e Installing the shell:
183
712
$e "# $i -c -s -o root -g bin -m 555 mksh /bin/mksh"
184
$e "# grep -qx /bin/mksh /etc/shells || echo /bin/mksh >>/etc/shells"
713
$e "# grep -x /bin/mksh /etc/shells >/dev/null || echo /bin/mksh >>/etc/shells"
185
714
$e "# $i -c -o root -g bin -m 444 dot.mkshrc /usr/share/doc/mksh/examples/"
187
716
$e Installing the manual: