diff --git a/Build.sh b/Build.sh index 8db7624..d5aa9d6 100644 --- a/Build.sh +++ b/Build.sh @@ -1,8 +1,9 @@ #!/bin/sh -# $MirOS: src/bin/mksh/Build.sh,v 1.122 2007/01/17 17:31:59 tg Exp $ +# $MirOS: src/bin/mksh/Build.sh,v 1.123 2007/01/17 17:42:22 tg Exp $ #- # Environment: CC, CFLAGS, CPP, CPPFLAGS, LDFLAGS, LIBS, NOWARN, NROFF # With -x (cross compile): TARGET_OS (default: uname -s) +# CPPFLAGS recognised: MKSH_SMALL MKSH_NOPWNAM v() { @@ -112,6 +113,7 @@ addsrcs() esac } + if test -d mksh; then echo "$0: Error: ./mksh is a directory!" >&2 exit 1 @@ -154,6 +156,7 @@ done SRCS="alloc.c edit.c eval.c exec.c expr.c funcs.c histrap.c" SRCS="$SRCS jobs.c lex.c main.c misc.c shf.c syn.c tree.c var.c" + test $x = 0 && TARGET_OS=`uname -s 2>/dev/null || uname` case $TARGET_OS in CYGWIN*) @@ -180,8 +183,16 @@ SunOS) esac CPPFLAGS="$CPPFLAGS -I'$curdir'" + + +# +# Begin of mirtoconf checks +# $e ${ao}Scanning for functions... please ignore any errors. +# +# Compiler: works as-is, with -Wno-error and -Werror +# test x"$NOWARN" = x"" && NOWARN=-Wno-error save_NOWARN=$NOWARN NOWARN= @@ -194,6 +205,9 @@ ac_flags 0 werror "-Werror" # The following tests are run with -Werror if possible test 1 = $HAVE_CAN_WERROR && NOWARN=-Werror +# +# Compiler: check for stuff that only generates warnings +# ac_test attribute '' 'if we have __attribute__((...)) at all' <<-'EOF' #include void fnord(void) __attribute__((noreturn)); @@ -220,13 +234,23 @@ EOF # End of tests run with -Werror NOWARN=$save_NOWARN +# +# Compiler: extra flags (-O2 -f* -W* etc.) +# i=`echo :"$CFLAGS" | sed 's/^://' | \ tr -c -d qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789-` test x"$i" = x"" && ac_flags 1 otwo "-O2" ac_flags 1 fnostrictaliasing "-fno-strict-aliasing" +ac_flags 1 fwholepgm "-fwhole-program --combine" ac_flags 1 fwrapv "-fwrapv" +# I'd use -std=c99 but this wrecks havoc on glibc and cygwin based +# systems (at least) because their system headers are so broken... +ac_flags 1 stdg99 "-std=gnu99" 'if -std=gnu99 (ISO C99) can be used' ac_flags 1 wall "-Wall" +# +# mksh: flavours (full/small mksh, omit certain stuff) +# ac_testn mksh_full '' "if we're building without MKSH_SMALL" <<-'EOF' #ifdef MKSH_SMALL #error OK, we are building an extra small mksh. @@ -234,6 +258,13 @@ ac_testn mksh_full '' "if we're building without MKSH_SMALL" <<-'EOF' int main(void) { return (0); } EOF +ac_testn mksh_nopam mksh_full 1 'if the user wants to omit getpwnam()' <<-'EOF' + #ifndef MKSH_NOPWNAM + #error No, the user wants to pull in getpwnam. + #endif + int main(void) { return (0); } +EOF + if test 0 = $HAVE_MKSH_FULL; then ac_flags 1 fnoinline "-fno-inline" @@ -241,17 +272,17 @@ if test 0 = $HAVE_MKSH_FULL; then check_categories=$check_categories,smksh fi -# I'd use -std=c99 but this wrecks havoc on glibc and cygwin based -# systems (at least) because their system headers are so broken... -ac_flags 1 stdg99 "-std=gnu99" 'if -std=gnu99 (ISO C99) can be used' - -ac_flags 1 fwholepgm "-fwhole-program --combine" - +# +# Environment: headers +# ac_test sys_param_h '' '' <<'EOF' #include int main(void) { return (0); } EOF +# +# Environment: signals +# ac_test mksh_signame '' 'our own list of signal names' <<-'EOF' #include /* for NULL */ #define MKSH_SIGNAMES_CHECK @@ -291,6 +322,9 @@ ac_test strsignal '!' _sys_siglist 0 <<-'EOF' int main(void) { return (strsignal(1)[0]); } EOF +# +# Environment: library functions +# ac_test arc4random <<-'EOF' #include int main(void) { return (arc4random()); } @@ -347,6 +381,9 @@ ac_test strlcpy <<-'EOF' int main(int ac, char *av[]) { return (strlcpy(*av, av[1], ac)); } EOF +# +# Compiler: Praeprocessor (only if needed) +# if test 1 = $NEED_MKSH_SIGNAME; then $e ... checking how to run the C Preprocessor rm -f x @@ -366,8 +403,12 @@ if test 1 = $NEED_MKSH_SIGNAME; then test x"$CPP" = x"false" && exit 1 fi +# +# End of mirtoconf checks +# $e ... done. + if test 1 = $NEED_MKSH_SIGNAME; then $e Generating list of signal names... sigseen=: @@ -405,7 +446,7 @@ addsrcs HAVE_STRLCPY strlfun.c CPPFLAGS="$CPPFLAGS -DHAVE_CONFIG_H -DCONFIG_H_FILENAME=\\\"sh.h\\\"" test x"@@" = x"$LDSTATIC" && LDSTATIC= -test x"@" = x"$LDSTATIC" && if test 0 = $HAVE_MKSH_FULL; then +test x"@" = x"$LDSTATIC" && if test 1 = $HAVE_MKSH_NOPAM; then LDSTATIC=-static else LDSTATIC= diff --git a/eval.c b/eval.c index d38dab2..ccfc5df 100644 --- a/eval.c +++ b/eval.c @@ -2,7 +2,7 @@ #include "sh.h" -__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.20 2007/01/11 00:32:30 tg Exp $"); +__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.21 2007/01/17 17:42:22 tg Exp $"); /* * string expansion @@ -1175,14 +1175,13 @@ tilde(char *cp) return dp; } -#ifndef MKSH_SMALL +#if !defined(MKSH_SMALL) && !defined(MKSH_NOPWNAM) /* * map userid to user's home directory. * note that 4.3's getpw adds more than 6K to the shell, * and the YP version probably adds much more. * we might consider our own version of getpwnam() to keep the size down. */ - static char * homedir(char *name) {