From: Akim Demaille Date: Wed, 24 May 2000 13:00:34 +0000 (+0000) Subject: * doc/autoconf.texi (Limitations of Builtins): Document `unset'. X-Git-Tag: autoconf-2.50~876 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d3d0c48fc27b11d4fc2116f82b48906de5b2e03;p=thirdparty%2Fautoconf.git * doc/autoconf.texi (Limitations of Builtins): Document `unset'. (Special Shell Variables): Adjust. (Shellology): New section. Introduce bash and zsh. (Special Shell Variables): Some data on NULLCMD. (Quotation Thumb Rule): Rename as (Quotation Rule of Thumb): this. * acgeneral.m4 (AC_SHELL_UNSET): Remove. (AC_SHELL_UNSETENV): Rename as... (AC_SHELL_UNSET): this. (_AC_INIT_PREPARE_ENVIRONMENT): Prepare bash and zsh. Adjust to AC_SHELL_UNSET. --- diff --git a/ChangeLog b/ChangeLog index 5163553f1..c20673f96 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2000-05-24 Akim Demaille + + * doc/autoconf.texi (Limitations of Builtins): Document `unset'. + (Special Shell Variables): Adjust. + (Shellology): New section. Introduce bash and zsh. + (Special Shell Variables): Some data on NULLCMD. + (Quotation Thumb Rule): Rename as + (Quotation Rule of Thumb): this. + * acgeneral.m4 (AC_SHELL_UNSET): Remove. + (AC_SHELL_UNSETENV): Rename as... + (AC_SHELL_UNSET): this. + (_AC_INIT_PREPARE_ENVIRONMENT): Prepare bash and zsh. + Adjust to AC_SHELL_UNSET. + 2000-05-24 Akim Demaille The options --build etc. used to set `$build'. *If* diff --git a/acgeneral.m4 b/acgeneral.m4 index 1f1f8f865..409518268 100644 --- a/acgeneral.m4 +++ b/acgeneral.m4 @@ -473,19 +473,11 @@ $debug || ])# _AC_SHELL_TMPDIR -# AC_SHELL_UNSET(VAR, [VALUE-IF-UNSET-NOT-SUPPORTED = `']) -# -------------------------------------------------------- -# Try to unset the env VAR, otherwise set it to -# VALUE-IF-UNSET-NOT-SUPPORTED. `ac_unset' must have been computed. -define([AC_SHELL_UNSET], -[$ac_unset $1 || test "${$1+set}" != set || $1=$2]) - - # AC_SHELL_UNSETENV(VAR, [VALUE-IF-UNSET-NOT-SUPPORTED = `']) -# -------------------------------------------------------- +# ----------------------------------------------------------- # Try to unset the env VAR, otherwise set it to # VALUE-IF-UNSET-NOT-SUPPORTED. `ac_unset' must have been computed. -define([AC_SHELL_UNSETENV], +define([AC_SHELL_UNSET], [$ac_unset $1 || test "${$1+set}" != set || $1=$2 && export $1]) @@ -1466,19 +1458,28 @@ fi])dnl # _AC_INIT_PREPARE_ENVIRONMENT # ---------------------------- -# Tune the envvar we depend upon: IFS, NLS. +# Tune the behavior of the shell. define([_AC_INIT_PREPARE_ENVIRONMENT], -[if (unset FOO) >/dev/null 2>&1; then +[# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (unset FOO) >/dev/null 2>&1; then ac_unset=unset else ac_unset=false fi # NLS nuisances. -AC_SHELL_UNSETENV([LANG], [C]) -AC_SHELL_UNSETENV([LC_ALL], [C]) -AC_SHELL_UNSETENV([LC_CTYPE], [C]) -AC_SHELL_UNSETENV([LC_MESSAGES], [C]) +AC_SHELL_UNSET([LANG], [C]) +AC_SHELL_UNSET([LC_ALL], [C]) +AC_SHELL_UNSET([LC_CTYPE], [C]) +AC_SHELL_UNSET([LC_MESSAGES], [C]) # IFS # We need space, tab and new line, in precisely that order. @@ -1487,7 +1488,7 @@ ac_nl=' IFS=" $ac_nl" # CDPATH. -AC_SHELL_UNSETENV([CDPATH], [:]) +AC_SHELL_UNSET([CDPATH], [:]) ]) diff --git a/aclocal.m4 b/aclocal.m4 index dddb35e0d..61d205c26 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -2,3 +2,4 @@ m4_include([m4/init.m4]) m4_include([m4/missing.m4]) m4_include([m4/sanity.m4]) m4_include([m4/atconfig.m4]) +m4_include([m4/m4.m4]) diff --git a/configure b/configure index 9285dd3fa..1b3f9ef24 100755 --- a/configure +++ b/configure @@ -111,9 +111,9 @@ do bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) - ac_prev=build ;; + ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build=$ac_optarg ;; + build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) @@ -175,10 +175,10 @@ do -host | --host | --hos | --ho) cross_compiling=yes - ac_prev=host ;; + ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) cross_compiling=yes - host=$ac_optarg ;; + host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) @@ -314,9 +314,9 @@ do sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; + ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target=$ac_optarg ;; + target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; @@ -383,7 +383,7 @@ Try \`configure --help' for more information." >&2; exit 1; } *[^-a-zA-Z0-9.]*) echo "configure: WARNING: invalid host type: $ac_option" >&2;; esac echo "configure: WARNING: you should use --build, --host, --target" >&2 - : ${build=$ac_option} ${host=$ac_option} ${target=$ac_option} + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -407,6 +407,12 @@ do esac done +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes @@ -546,6 +552,15 @@ gives unlimited permission to copy, distribute and modify it. EOF exit 0 fi +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. if (unset FOO) >/dev/null 2>&1; then ac_unset=unset else @@ -694,7 +709,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. -echo "configure:610: checking for a BSD compatible install" >&5 +echo "configure:623: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then @@ -741,7 +756,7 @@ fi INSTALL=$ac_install_sh fi fi -echo "configure:656: result: $INSTALL" >&5 +echo "configure:669: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. @@ -752,7 +767,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -echo "configure:663: checking whether build environment is sane" >&5 +echo "configure:676: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 @@ -789,7 +804,7 @@ else Check your system clock" >&2; exit 1; } fi rm -f conftest* -echo "configure:698: result: yes" >&5 +echo "configure:711: result: yes" >&5 echo "${ECHO_T}yes" >&6 if test "$program_transform_name" = s,x,x,; then program_transform_name= @@ -810,7 +825,7 @@ test "$program_suffix" != NONE && # sed with no file args requires a program. test -z "$program_transform_name" && program_transform_name="s,x,x," -echo "configure:717: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:730: checking whether ${MAKE-make} sets \${MAKE}" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then @@ -830,11 +845,11 @@ fi rm -f conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "configure:737: result: yes" >&5 + echo "configure:750: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else - echo "configure:741: result: no" >&5 + echo "configure:754: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi @@ -856,78 +871,78 @@ cat >>confdefs.h <&5 +echo "configure:770: checking for working aclocal" >&5 echo $ECHO_N "checking for working aclocal... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (aclocal --version) < /dev/null > /dev/null 2>&1; then ACLOCAL=aclocal - echo "configure:764: result: found" >&5 + echo "configure:777: result: found" >&5 echo "${ECHO_T}found" >&6 else ACLOCAL="$missing_dir/missing aclocal" - echo "configure:768: result: missing" >&5 + echo "configure:781: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi -echo "configure:771: checking for working autoconf" >&5 +echo "configure:784: checking for working autoconf" >&5 echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoconf --version) < /dev/null > /dev/null 2>&1; then AUTOCONF=autoconf - echo "configure:778: result: found" >&5 + echo "configure:791: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOCONF="$missing_dir/missing autoconf" - echo "configure:782: result: missing" >&5 + echo "configure:795: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi -echo "configure:785: checking for working automake" >&5 +echo "configure:798: checking for working automake" >&5 echo $ECHO_N "checking for working automake... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (automake --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake - echo "configure:792: result: found" >&5 + echo "configure:805: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOMAKE="$missing_dir/missing automake" - echo "configure:796: result: missing" >&5 + echo "configure:809: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi -echo "configure:799: checking for working autoheader" >&5 +echo "configure:812: checking for working autoheader" >&5 echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoheader --version) < /dev/null > /dev/null 2>&1; then AUTOHEADER=autoheader - echo "configure:806: result: found" >&5 + echo "configure:819: result: found" >&5 echo "${ECHO_T}found" >&6 else AUTOHEADER="$missing_dir/missing autoheader" - echo "configure:810: result: missing" >&5 + echo "configure:823: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi -echo "configure:813: checking for working makeinfo" >&5 +echo "configure:826: checking for working makeinfo" >&5 echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (makeinfo --version) < /dev/null > /dev/null 2>&1; then MAKEINFO=makeinfo - echo "configure:820: result: found" >&5 + echo "configure:833: result: found" >&5 echo "${ECHO_T}found" >&6 else MAKEINFO="$missing_dir/missing makeinfo" - echo "configure:824: result: missing" >&5 + echo "configure:837: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi @@ -942,7 +957,7 @@ for ac_prog in gm4 gnum4 m4 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "configure:837: checking for $ac_word" >&5 +echo "configure:850: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_M4+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -967,10 +982,10 @@ esac fi M4=$ac_cv_path_M4 if test -n "$M4"; then - echo "configure:862: result: $M4" >&5 + echo "configure:875: result: $M4" >&5 echo "${ECHO_T}$M4" >&6 else - echo "configure:865: result: no" >&5 + echo "configure:878: result: no" >&5 echo "${ECHO_T}no" >&6 fi @@ -978,7 +993,7 @@ test -n "$M4" && break done test -n "$M4" || M4="m4" -echo "configure:871: checking whether m4 supports frozen files" >&5 +echo "configure:884: checking whether m4 supports frozen files" >&5 echo $ECHO_N "checking whether m4 supports frozen files... $ECHO_C" >&6 if test "${ac_cv_prog_gnu_m4+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -990,7 +1005,7 @@ if test x"$M4" != x; then esac fi fi -echo "configure:883: result: $ac_cv_prog_gnu_m4" >&5 +echo "configure:896: result: $ac_cv_prog_gnu_m4" >&5 echo "${ECHO_T}$ac_cv_prog_gnu_m4" >&6 if test x"$ac_cv_prog_gnu_m4" != xyes; then { echo "configure: error: GNU m4 1.4 is required" >&2; exit 1; } @@ -1003,7 +1018,7 @@ for ac_prog in mawk gawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -echo "configure:895: checking for $ac_word" >&5 +echo "configure:908: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -1028,10 +1043,10 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - echo "configure:920: result: $AWK" >&5 + echo "configure:933: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else - echo "configure:923: result: no" >&5 + echo "configure:936: result: no" >&5 echo "${ECHO_T}no" >&6 fi @@ -1039,25 +1054,25 @@ test -n "$AWK" && break done # Generating man pages. -echo "configure:929: checking for working help2man" >&5 +echo "configure:942: checking for working help2man" >&5 echo $ECHO_N "checking for working help2man... $ECHO_C" >&6 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (help2man --version) < /dev/null > /dev/null 2>&1; then HELP2MAN=help2man - echo "configure:936: result: found" >&5 + echo "configure:949: result: found" >&5 echo "${ECHO_T}found" >&6 else HELP2MAN="\${SHELL} \${top_srcdir}/missing help2man" - echo "configure:940: result: missing" >&5 + echo "configure:953: result: missing" >&5 echo "${ECHO_T}missing" >&6 fi # We use a path for perl so the #! line in autoscan will work. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 -echo "configure:946: checking for $ac_word" >&5 +echo "configure:959: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PERL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 @@ -1083,10 +1098,10 @@ esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then - echo "configure:972: result: $PERL" >&5 + echo "configure:985: result: $PERL" >&5 echo "${ECHO_T}$PERL" >&6 else - echo "configure:975: result: no" >&5 + echo "configure:988: result: no" >&5 echo "${ECHO_T}no" >&6 fi @@ -1107,7 +1122,7 @@ fi # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. -echo "configure:994: checking for a BSD compatible install" >&5 +echo "configure:1007: checking for a BSD compatible install" >&5 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then @@ -1154,7 +1169,7 @@ fi INSTALL=$ac_install_sh fi fi -echo "configure:1040: result: $INSTALL" >&5 +echo "configure:1053: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 750b62430..0321a540d 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -253,6 +253,7 @@ Checking Run Time Behavior Portable Shell Programming +* Shellology:: A zoology of shells * Special Shell Variables:: Variables you should not change * Shell Substitutions:: Test and assign * Limitations of Builtins:: Portable use of not so portable /bin/sh @@ -283,7 +284,7 @@ Quoting * Active Characters:: Characters that change the behavior of m4 * One Macro Call:: Quotation and one macro call * Quotation and Nested Macros:: Macros calling macros -* Quotation Thumb Rule:: One parenthesis, one quote +* Quotation Rule Of Thumb:: One parenthesis, one quote Dependencies Between Macros @@ -668,7 +669,7 @@ AC_MSG_WARN([[AC_DC stinks --Iron Maiden]]) @end example You are now able to understand one of the constructs of Autoconf which -has continuously been misunderstood... The thumb rule is that +has continuously been misunderstood... The rule of thumb is that @emph{whenever you expect macro expansion, expect quote expansion}, i.e., expect one level of quotes to be lost. For instance @@ -4524,23 +4525,54 @@ restriction allows users to start out with a fairly small set of programs and build the rest, avoiding too many interdependencies between packages. -Some of these external utilities have a portable subset of features, as -well; for example, don't rely on @code{ln} having a @samp{-f} option or -@code{cat} having any options. +Some of these external utilities have a portable subset of features, see +@ref{Limitations of Usual Tools}. @menu +* Shellology:: A zoology of shells * Special Shell Variables:: Variables you should not change * Shell Substitutions:: Test and assign * Limitations of Builtins:: Portable use of not so portable /bin/sh * Limitations of Usual Tools:: Portable use of portable tools @end menu -@node Special Shell Variables, Shell Substitutions, Portable Shell, Portable Shell +@node Shellology, Special Shell Variables, Portable Shell, Portable Shell +@subsection Shellology + +There are several families of shells, most prominently the Bourne +family and the C shell family which are deeply incompatible. If you +want to write portable shell scripts, avoid members of the C shell +family. + +Below we describe some of the members of the Bourne shell family. + +@table @asis +@item @command{bash} +@cindex @command{bash} +To detect whether you are running @command{bash}, test if +@code{BASH_VERSION} is set. To disable its extensions and require +@sc{posix} compatibility, run @samp{set -o posix}. @xref{Bash POSIX +Mode,, Bash @sc{posix} Mode, bash, The GNU Bash Reference Manual}, for +details. + +@item @command{zsh} +@cindex @command{zsh} +To detect whether you are running @command{zsh}, test if +@code{ZSH_VERSION} is set. By default @command{zsh} is @emph{not} +compatible with the Bourne shell: you have to run @samp{emulate sh} and +set @code{NULLCMD} to @samp{:}. @xref{Compatibility,, Compatibility, +zsh, The Z Shell Manual}, for details. +@end table + + +@node Special Shell Variables, Shell Substitutions, Shellology, Portable Shell @subsection Special Shell Variables -Some shell variables shall not be used. Since currently Autoconf does -not use @code{unset}, there are some variables which need some specific -values to disable the features they control. +Some shell variables shall not be used or have a deep influence on the +behavior of the shell. In order to recover a sane behavior from the +shell, some variables should be unset, but @command{unset} is not +portable (@pxref{Limitations of Builtins}) and a fall back value is +needed. We list these values below. @c Alphabetical order, case insensitive, `A' before `a'. @table @code @@ -4577,7 +4609,9 @@ bash-2.02 % (CDPATH=.: cd foo) @end example Therefore a portable solution to neutralize @samp{CDPATH} is -@samp{CDPATH=$@{ZSH_VERSION+.@}:}. +@samp{CDPATH=$@{ZSH_VERSION+.@}:}. Note that since @command{zsh} +support @command{unset}, you may unset @samp{CDPATH} using @samp{:} as a +fall back, see @ref{Limitations of Builtins}. @item LANG @itemx LC_ALL @@ -4600,6 +4634,14 @@ test "$@{LC_CTYPE+set@}" = set && LC_CTYPE=C && export LC_CTYPE test "$@{LC_MESSAGES+set@}" = set && LC_MESSAGES=C && export LC_MESSAGES @end example +@item NULLCMD +@evindex NULLCMD +When executing the command @samp{>foo}, @command{zsh} executes +@samp{$NULLCMD >foo}. The Bourne shell considers @code{NULLCMD} is +@samp{:}, while @command{zsh}, even in Bourne shell compatibility mode, +sets @code{NULLCMD} to @samp{cat}. If you forgot to set @code{NULLCMD}, +your script might be suspended waiting for data on its standard input. + @item status @evindex status This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6), @@ -4806,6 +4848,27 @@ case $ac_feature in *[^-a-zA-Z0-9_]*) @var{action};; esac @end example + +@item @command{unset} +@cindex @command{unset} +You cannot assume the support of @command{unset}, nevertheless, because +it is extremely useful to disable embarrassing variables such as +@code{CDPATH} or @code{LANG}, you can test for its existence, and use +it @emph{provided} you give a neutralizing value when @command{unset} is +not supported: + +@example +if (unset FOO) >/dev/null 2>&1; then + unset=unset +else + unset=false +fi +$unset CDPATH || CDPATH=: +@end example + +@xref{Special Shell Variables}, for some neutralizing values. Also, see +@ref{Limitations of Builtins}, documentation of @command{export}, for +the case of environment variables. @end table @node Limitations of Usual Tools, , Limitations of Builtins, Portable Shell @@ -4815,6 +4878,10 @@ The small set of tools you can expect to find on any machine can still find some limitations you should be aware of. @table @asis +@item @command{cat} +@cindex @command{cat} +Don't rely on any option. + @item @command{egrep} @cindex @command{egrep} The empty alternative is not portable, use @samp{?} instead. For @@ -4845,6 +4912,10 @@ honor the last pattern (eg., IRIX 6.5 and Solaris 2.5.1). Anyway, Stardent Vistra SVR4 @code{grep} lacks @samp{-e}... Instead, use alternation and @code{egrep}. +@item @command{ln} +@cindex @command{ln} +Don't rely on @code{ln} having a @samp{-f} option. + @item @command{sed} @cindex @command{sed} @code{sed} scripts should not use branch labels longer than 8 characters @@ -5472,14 +5543,14 @@ macro does. For example, @code{AC_PATH_X} has internal macros The most common brokenness of existing macros is an improper quotation. This section, which users of Autoconf can skip, but which macro writers @emph{must} read, first justifies the quotation scheme which was chosen -for Autoconf, and ends with the thumb rules. Understanding the former +for Autoconf, and ends with the rule of thumb. Understanding the former helps following the latter. @menu * Active Characters:: Characters that change the behavior of m4 * One Macro Call:: Quotation and one macro call * Quotation and Nested Macros:: Macros calling macros -* Quotation Thumb Rule:: One parenthesis, one quote +* Quotation Rule Of Thumb:: One parenthesis, one quote @end menu @node Active Characters, One Macro Call, Quoting, Quoting @@ -5609,7 +5680,7 @@ With this in mind, we can explore the cases where macros invoke macros... -@node Quotation and Nested Macros, Quotation Thumb Rule, One Macro Call, Quoting +@node Quotation and Nested Macros, Quotation Rule Of Thumb, One Macro Call, Quoting @subsection Quotation and Nested Macros The examples below use the following macros: @@ -5737,10 +5808,10 @@ its users to leave their macro calls unquoted, which is dangerous. Also, because it behaves differently from the other macro, it's an exception, which we are avoiding in Autoconf. -@node Quotation Thumb Rule, , Quotation and Nested Macros, Quoting -@subsection Quotation Thumb Rule +@node Quotation Rule Of Thumb, , Quotation and Nested Macros, Quoting +@subsection Quotation Rule Of Thumb -To conclude, the quotation thumb rules are: +To conclude, the quotation rule of thumb is: @center @emph{One pair of quotes per pair of parentheses.} diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4 index 1f1f8f865..409518268 100644 --- a/lib/autoconf/general.m4 +++ b/lib/autoconf/general.m4 @@ -473,19 +473,11 @@ $debug || ])# _AC_SHELL_TMPDIR -# AC_SHELL_UNSET(VAR, [VALUE-IF-UNSET-NOT-SUPPORTED = `']) -# -------------------------------------------------------- -# Try to unset the env VAR, otherwise set it to -# VALUE-IF-UNSET-NOT-SUPPORTED. `ac_unset' must have been computed. -define([AC_SHELL_UNSET], -[$ac_unset $1 || test "${$1+set}" != set || $1=$2]) - - # AC_SHELL_UNSETENV(VAR, [VALUE-IF-UNSET-NOT-SUPPORTED = `']) -# -------------------------------------------------------- +# ----------------------------------------------------------- # Try to unset the env VAR, otherwise set it to # VALUE-IF-UNSET-NOT-SUPPORTED. `ac_unset' must have been computed. -define([AC_SHELL_UNSETENV], +define([AC_SHELL_UNSET], [$ac_unset $1 || test "${$1+set}" != set || $1=$2 && export $1]) @@ -1466,19 +1458,28 @@ fi])dnl # _AC_INIT_PREPARE_ENVIRONMENT # ---------------------------- -# Tune the envvar we depend upon: IFS, NLS. +# Tune the behavior of the shell. define([_AC_INIT_PREPARE_ENVIRONMENT], -[if (unset FOO) >/dev/null 2>&1; then +[# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (unset FOO) >/dev/null 2>&1; then ac_unset=unset else ac_unset=false fi # NLS nuisances. -AC_SHELL_UNSETENV([LANG], [C]) -AC_SHELL_UNSETENV([LC_ALL], [C]) -AC_SHELL_UNSETENV([LC_CTYPE], [C]) -AC_SHELL_UNSETENV([LC_MESSAGES], [C]) +AC_SHELL_UNSET([LANG], [C]) +AC_SHELL_UNSET([LC_ALL], [C]) +AC_SHELL_UNSET([LC_CTYPE], [C]) +AC_SHELL_UNSET([LC_MESSAGES], [C]) # IFS # We need space, tab and new line, in precisely that order. @@ -1487,7 +1488,7 @@ ac_nl=' IFS=" $ac_nl" # CDPATH. -AC_SHELL_UNSETENV([CDPATH], [:]) +AC_SHELL_UNSET([CDPATH], [:]) ])