autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] lib: use shorter way to test if variable is set


From: Eric Blake
Subject: [PATCH] lib: use shorter way to test if variable is set
Date: Wed, 15 Apr 2015 16:58:09 -0600

Based on an idea by Bernhard Reutner-Fischer.

We frequently used the idiom of 'test "${var+set}" = set' to
test if $var was set to a non-empty string, but this can portably
be trimmed to a more compact 'test ${var+y}' for a smaller
configure file.  Testing that a variable is not set can be done
with '${var+false} :' (although the value of $? is not reliably
1 when the variable is set).

The code for AS_VAR_TEST_SET already used the form '${var+:} false',
but it is slightly longer, and does not guarantee $? of 1.

Tested on coreutils, where the resulting configure file is about
1k smaller.

* doc/autoconf.texi (Shell Substitutions): Prefer shorter sequence
for testing if a variable is set.
(Limitations of Builtins) <test (strings)>: Document it.
* configure.ac: Use it.
* lib/autoconf/c.m4 (_AC_PROG_CC_G, _AC_PROG_CXX_G)
(_AC_PROG_OBJC_G, _AC_PROG_OBJCXX_G): Likewise.
* lib/autoconf/fortran.m4 (_AC_PROG_FC_G): Likewise.
* lib/autoconf/general.m4 (_AC_ENABLE_IF_ACTION, AC_CACHE_SAVE):
Likewise.
* lib/autoconf/lang.m4 (_AC_COMPILER_EXEEXT_DEFAULT): Likewise.
* lib/autoconf/programs.m4 (AC_PROG_INSTALL, AC_PROG_MKDIR_P)
(_AC_PROG_LEX_YYTEXT_DECL): Likewise.
* lib/autoconf/status.m4 (_AC_OUTPUT_MAIN_LOOP): Likewise.
* lib/autotest/general.m4 (AT_INIT): Likewise.
* tests/base.at (AC_CACHE_CHECK): Likewise.
* tests/m4sh.at (LINENO): Likewise.
* lib/m4sugar/m4sh.m4 (_AS_BOURNE_COMPATIBLE)
(_AS_DETECT_BETTER_SHELL, _AS_SHELL_SANITIZE)
(_AS_PATH_SEPARATOR_PREPARE): Likewise.
(AS_VAR_TEST_SET): Use shorter sequence.

Signed-off-by: Eric Blake <address@hidden>
---

Finally finding time to revisit this; here's what I will probably
push, if no negative review comments are raised in a couple days.

I'll probably also work on a second patch that scrubs obvious
uses of 'test -n "$var"' and 'test -z "$var"'; this patch just
touched ${var+set} instances, plus AS_VAR_TEST_SET.

 configure.ac             |  6 +++---
 doc/autoconf.texi        | 13 ++++++++-----
 lib/autoconf/c.m4        | 16 ++++++++--------
 lib/autoconf/fortran.m4  |  4 ++--
 lib/autoconf/general.m4  |  4 ++--
 lib/autoconf/lang.m4     |  2 +-
 lib/autoconf/programs.m4 |  6 +++---
 lib/autoconf/status.m4   |  8 ++++----
 lib/autotest/general.m4  |  4 ++--
 lib/m4sugar/m4sh.m4      | 14 +++++++-------
 tests/base.at            |  2 +-
 tests/m4sh.at            |  4 ++--
 12 files changed, 43 insertions(+), 40 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2709a0d..e7029eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,9 +61,9 @@ AC_CACHE_CHECK([whether /bin/sh -n is known to work], 
[ac_cv_sh_n_works],
 [if (
     unset BASH_VERSION ZSH_VERSION
     /bin/sh -c '
-      test -n "${BASH_VERSION+set}" || # Bash
-      test -n "${KSH_VERSION+set}" || # pdksh
-      test -n "${ZSH_VERSION+set}" || # zsh
+      test ${BASH_VERSION+y} || # Bash
+      test ${KSH_VERSION+y} || # pdksh
+      test ${ZSH_VERSION+y} || # zsh
       test -n "${.sh.version}" # ksh93; put this last since its syntax is dodgy
     '
   ) 2>/dev/null
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
index d9e833d..bab87ad 100644
--- a/doc/autoconf.texi
+++ b/doc/autoconf.texi
@@ -15977,7 +15977,7 @@ Shell Substitutions
 @address@hidden"$@@"@}} into @samp{"$@@"} by itself:

 @example
-test "address@hidden@}" = set && alias -g 'address@hidden"$@@"@}'='"$@@"'
+test address@hidden@} && alias -g 'address@hidden"$@@"@}'='"$@@"'
 @end example

 Zsh only recognizes this alias when a shell word matches it exactly;
@@ -16297,7 +16297,7 @@ Shell Substitutions
 use:

 @example
-test "address@hidden@}" = set || address@hidden@address@hidden
+test address@hidden@} || address@hidden@address@hidden
 @end example

 @item address@hidden@address@hidden
@@ -16547,7 +16547,7 @@ Assignments
 If the default value contains a closing brace, then use:

 @example
-test "address@hidden@}" = set || var="has a '@}'"
+test address@hidden@} || var="has a '@}'"
 @end example
 @end enumerate

@@ -18076,7 +18076,7 @@ Limitations of Builtins
 @command{/bin/sh} takes extremely long to parse large scripts.  Autoconf
 itself uses @command{sh -n} within its testsuite to check that correct
 scripts were generated, but only after first probing for other shell
-features (such as @code{test -n "address@hidden@}"}) that indicate
+features (such as @code{test address@hidden@}}) that indicate
 a reasonably fast and working implementation.

 @item @command{shift}
@@ -18172,7 +18172,10 @@ Limitations of Builtins
 Posix says that @samp{test "@var{string}"} succeeds if @var{string} is
 not null, but this usage is not portable to traditional platforms like
 Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and
address@hidden
address@hidden  However, it @emph{is} portable to test if a variable is set
+to a non-empty value, by using @samp{test address@hidden@}}, since all known
+implementations properly distinguish between no arguments and a
+known-safe string of @samp{y}.

 Posix also says that @samp{test ! "@var{string}"},
 @samp{test -n "@var{string}"} and
diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4
index 4c87d21..0d1918f 100644
--- a/lib/autoconf/c.m4
+++ b/lib/autoconf/c.m4
@@ -502,7 +502,7 @@ AC_LANG_POP(C)dnl
 # versions of a library), tasteless as that idea is.
 # Don't consider -g to work if it generates warnings when plain compiles don't.
 m4_define([_AC_PROG_CC_G],
-[ac_test_CFLAGS=${CFLAGS+set}
+[ac_test_CFLAGS=${CFLAGS+y}
 ac_save_CFLAGS=$CFLAGS
 AC_CACHE_CHECK(whether $CC accepts -g, ac_cv_prog_cc_g,
   [ac_save_c_werror_flag=$ac_c_werror_flag
@@ -519,7 +519,7 @@ AC_CACHE_CHECK(whether $CC accepts -g, ac_cv_prog_cc_g,
         _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
           [ac_cv_prog_cc_g=yes])])])
    ac_c_werror_flag=$ac_save_c_werror_flag])
-if test "$ac_test_CFLAGS" = set; then
+if test $ac_test_CFLAGS; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
   if test "$GCC" = yes; then
@@ -743,7 +743,7 @@ AC_LANG_POP(C++)dnl
 # normal versions of a library), tasteless as that idea is.
 # Don't consider -g to work if it generates warnings when plain compiles don't.
 m4_define([_AC_PROG_CXX_G],
-[ac_test_CXXFLAGS=${CXXFLAGS+set}
+[ac_test_CXXFLAGS=${CXXFLAGS+y}
 ac_save_CXXFLAGS=$CXXFLAGS
 AC_CACHE_CHECK(whether $CXX accepts -g, ac_cv_prog_cxx_g,
   [ac_save_cxx_werror_flag=$ac_cxx_werror_flag
@@ -760,7 +760,7 @@ AC_CACHE_CHECK(whether $CXX accepts -g, ac_cv_prog_cxx_g,
         _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
           [ac_cv_prog_cxx_g=yes])])])
    ac_cxx_werror_flag=$ac_save_cxx_werror_flag])
-if test "$ac_test_CXXFLAGS" = set; then
+if test $ac_test_CXXFLAGS; then
   CXXFLAGS=$ac_save_CXXFLAGS
 elif test $ac_cv_prog_cxx_g = yes; then
   if test "$GXX" = yes; then
@@ -913,7 +913,7 @@ AC_LANG_POP(Objective C)dnl
 # normal versions of a library), tasteless as that idea is.
 # Don't consider -g to work if it generates warnings when plain compiles don't.
 m4_define([_AC_PROG_OBJC_G],
-[ac_test_OBJCFLAGS=${OBJCFLAGS+set}
+[ac_test_OBJCFLAGS=${OBJCFLAGS+y}
 ac_save_OBJCFLAGS=$OBJCFLAGS
 AC_CACHE_CHECK(whether $OBJC accepts -g, ac_cv_prog_objc_g,
   [ac_save_objc_werror_flag=$ac_objc_werror_flag
@@ -930,7 +930,7 @@ AC_CACHE_CHECK(whether $OBJC accepts -g, ac_cv_prog_objc_g,
         _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
           [ac_cv_prog_objc_g=yes])])])
    ac_objc_werror_flag=$ac_save_objc_werror_flag])
-if test "$ac_test_OBJCFLAGS" = set; then
+if test $ac_test_OBJCFLAGS; then
   OBJCFLAGS=$ac_save_OBJCFLAGS
 elif test $ac_cv_prog_objc_g = yes; then
   if test "$GOBJC" = yes; then
@@ -1052,7 +1052,7 @@ AC_LANG_POP(Objective C++)dnl
 # normal versions of a library), tasteless as that idea is.
 # Don't consider -g to work if it generates warnings when plain compiles don't.
 m4_define([_AC_PROG_OBJCXX_G],
-[ac_test_OBJCXXFLAGS=${OBJCXXFLAGS+set}
+[ac_test_OBJCXXFLAGS=${OBJCXXFLAGS+y}
 ac_save_OBJCXXFLAGS=$OBJCXXFLAGS
 AC_CACHE_CHECK(whether $OBJCXX accepts -g, ac_cv_prog_objcxx_g,
   [ac_save_objcxx_werror_flag=$ac_objcxx_werror_flag
@@ -1069,7 +1069,7 @@ AC_CACHE_CHECK(whether $OBJCXX accepts -g, 
ac_cv_prog_objcxx_g,
         _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
           [ac_cv_prog_objcxx_g=yes])])])
    ac_objcxx_werror_flag=$ac_save_objcx_werror_flag])
-if test "$ac_test_OBJCXXFLAGS" = set; then
+if test $ac_test_OBJCXXFLAGS; then
   OBJCXXFLAGS=$ac_save_OBJCXXFLAGS
 elif test $ac_cv_prog_objcxx_g = yes; then
   if test "$GOBJCXX" = yes; then
diff --git a/lib/autoconf/fortran.m4 b/lib/autoconf/fortran.m4
index 7fd9191..fd3d5b1 100644
--- a/lib/autoconf/fortran.m4
+++ b/lib/autoconf/fortran.m4
@@ -398,7 +398,7 @@ AC_LANG_POP(Fortran)dnl
 # versions of a library), tasteless as that idea is.
 m4_define([_AC_PROG_FC_G],
 [_AC_FORTRAN_ASSERT()dnl
-ac_test_[]_AC_LANG_PREFIX[]FLAGS=${[]_AC_LANG_PREFIX[]FLAGS+set}
+ac_test_[]_AC_LANG_PREFIX[]FLAGS=${[]_AC_LANG_PREFIX[]FLAGS+y}
 ac_save_[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
 _AC_LANG_PREFIX[]FLAGS=
 AC_CACHE_CHECK(whether $[]_AC_FC[] accepts -g, 
ac_cv_prog_[]_AC_LANG_ABBREV[]_g,
@@ -407,7 +407,7 @@ _AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
 [ac_cv_prog_[]_AC_LANG_ABBREV[]_g=yes],
 [ac_cv_prog_[]_AC_LANG_ABBREV[]_g=no])
 ])
-if test "$ac_test_[]_AC_LANG_PREFIX[]FLAGS" = set; then
+if test $ac_test_[]_AC_LANG_PREFIX[]FLAGS; then
   _AC_LANG_PREFIX[]FLAGS=$ac_save_[]_AC_LANG_PREFIX[]FLAGS
 elif test $ac_cv_prog_[]_AC_LANG_ABBREV[]_g = yes; then
   if test "x$ac_cv_[]_AC_LANG_ABBREV[]_compiler_gnu" = xyes; then
diff --git a/lib/autoconf/general.m4 b/lib/autoconf/general.m4
index 2d1a291..49df536 100644
--- a/lib/autoconf/general.m4
+++ b/lib/autoconf/general.m4
@@ -1467,7 +1467,7 @@ _AC_ENABLE_IF_ACTION([$1], m4_translit([$2], [-+.], 
[___]), [$3], [$4])
 m4_define([_AC_ENABLE_IF_ACTION],
 [m4_append_uniq([_AC_USER_OPTS], [$1_$2], [
 ])dnl
-AS_IF([test "${$1_$2+set}" = set], [$1val=$$1_$2; $3], [$4])dnl
+AS_IF([test ${$1_$2+y}], [$1val=$$1_$2; $3], [$4])dnl
 ])

 # AC_ARG_ENABLE(FEATURE, HELP-STRING, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
@@ -2044,7 +2044,7 @@ _AC_CACHE_DUMP() |
      /^ac_cv_env_/b end
      t clear
      :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
      t end
      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
      :end'] >>confcache
diff --git a/lib/autoconf/lang.m4 b/lib/autoconf/lang.m4
index 2e30f50..80c395d 100644
--- a/lib/autoconf/lang.m4
+++ b/lib/autoconf/lang.m4
@@ -553,7 +553,7 @@ do
        # certainly right.
        break;;
     *.* )
-       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
        then :; else
           ac_cv_exeext=`expr "$ac_file" : ['[^.]*\(\..*\)']`
        fi
diff --git a/lib/autoconf/programs.m4 b/lib/autoconf/programs.m4
index ef35a79..1ed16cd 100644
--- a/lib/autoconf/programs.m4
+++ b/lib/autoconf/programs.m4
@@ -586,7 +586,7 @@ esac
 ])
 rm -rf conftest.one conftest.two conftest.dir
 ])dnl
-  if test "${ac_cv_path_install+set}" = set; then
+  if test ${ac_cv_path_install+y}; then
     INSTALL=$ac_cv_path_install
   else
     # As a last resort, use the slow shell script.  Don't cache a
@@ -680,7 +680,7 @@ if test -z "$MKDIR_P"; then
         done
        done])])
   test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
+  if test ${ac_cv_path_mkdir+y}; then
     MKDIR_P="$ac_cv_path_mkdir -p"
   else
     # As a last resort, use the slow shell script.  Don't cache a
@@ -750,7 +750,7 @@ else
 fi])
 AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root])dnl

-if test -z "${LEXLIB+set}"; then
+if ${LEXLIB+false} :; then
   AC_CACHE_CHECK([lex library], [ac_cv_lib_lex], [
     ac_save_LIBS=$LIBS
     ac_cv_lib_lex='none needed'
diff --git a/lib/autoconf/status.m4 b/lib/autoconf/status.m4
index ef9d521..7bda371 100644
--- a/lib/autoconf/status.m4
+++ b/lib/autoconf/status.m4
@@ -1604,16 +1604,16 @@ AC_DEFUN([_AC_OUTPUT_MAIN_LOOP],
 # bizarre bug on SunOS 4.1.3.
 if $ac_need_defaults; then
 m4_ifdef([_AC_SEEN_CONFIG(FILES)],
-[  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+[  test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
 ])dnl
 m4_ifdef([_AC_SEEN_CONFIG(HEADERS)],
-[  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+[  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
 ])dnl
 m4_ifdef([_AC_SEEN_CONFIG(LINKS)],
-[  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
+[  test ${CONFIG_LINKS+y} || CONFIG_LINKS=$config_links
 ])dnl
 m4_ifdef([_AC_SEEN_CONFIG(COMMANDS)],
-[  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+[  test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
 ])dnl
 fi

diff --git a/lib/autotest/general.m4 b/lib/autotest/general.m4
index e70e326..c809409 100644
--- a/lib/autotest/general.m4
+++ b/lib/autotest/general.m4
@@ -363,7 +363,7 @@ at_fn_create_debugging_script ()
 {
   {
     echo "#! /bin/sh" &&
-    echo 'test "${ZSH_VERSION+set}" = set dnl
+    echo 'test ${ZSH_VERSION+y} dnl
 && alias -g '\''${1+"address@hidden"}'\''='\''"address@hidden"'\''' &&
     AS_ECHO(["cd '$at_dir'"]) &&
     AS_ECHO(["exec \${CONFIG_SHELL-$SHELL} \"$at_myself\" -v -d ]dnl
@@ -1367,7 +1367,7 @@ dnl Unfortunately, ksh93 fork-bombs when we send TSTP, so 
send STOP
 dnl if this might be ksh (STOP prevents possible TSTP handlers inside
 dnl AT_CHECKs from running).  Then stop ourselves.
          at_sig=TSTP
-         test "${TMOUT+set}" = set && at_sig=STOP
+         test ${TMOUT+y} && at_sig=STOP
          kill -$at_sig $at_pids 2>/dev/null
        fi
        kill -STOP $$
diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4
index 603466f..5949e0a 100644
--- a/lib/m4sugar/m4sh.m4
+++ b/lib/m4sugar/m4sh.m4
@@ -100,7 +100,7 @@ _$0
 # This is the part of AS_BOURNE_COMPATIBLE which has to be repeated inside
 # each instance.
 m4_define([_AS_BOURNE_COMPATIBLE],
-[AS_IF([test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1],
+[AS_IF([test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1],
  [emulate sh
   NULLCMD=:
   [#] Pre-4.2 versions of Zsh do word splitting on ${1+"address@hidden"}, which
@@ -252,7 +252,7 @@ dnl Unfortunately, $as_me isn't available here.
     AS_IF([test x$as_have_required = xno],
       [AS_ECHO(["$[]0: This script requires a shell more modern than all"])
   AS_ECHO(["$[]0: the shells that I found on your system."])
-  if test x${ZSH_VERSION+set} = xset ; then
+  if test ${ZSH_VERSION+y} ; then
     AS_ECHO(["$[]0: In particular, zsh $ZSH_VERSION has bugs and should"])
     AS_ECHO(["$[]0: be upgraded to zsh 4.3.4 or later."])
   else
@@ -488,7 +488,7 @@ fi
 # suppresses any "Segmentation fault" message there.  '((' could
 # trigger a bug in pdksh 5.2.14.
 for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
+do eval test \${$as_var+y} \
   && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
 done
 PS1='$ '
@@ -1272,7 +1272,7 @@ fi
 # Compute the path separator.
 m4_defun([_AS_PATH_SEPARATOR_PREPARE],
 [# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
   PATH_SEPARATOR=:
   (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
     (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -2062,9 +2062,9 @@ m4_define([AS_VAR_SET_IF],
 # is set.  Polymorphic.
 m4_define([AS_VAR_TEST_SET],
 [AS_LITERAL_WORD_IF([$1],
-  [${$1+:} false],
-  [{ as_var=$1; eval \${$as_var+:} false; }],
-  [eval \${$1+:} false])])
+  [test ${$1+y}],
+  [{ as_var=$1; eval test \${$as_var+y}; }],
+  [eval test \${$1+y}])])


 ## -------------------- ##
diff --git a/tests/base.at b/tests/base.at
index 63bd36e..cbc5a59 100644
--- a/tests/base.at
+++ b/tests/base.at
@@ -342,7 +342,7 @@ my_cv_variable=true
 AC_MSG_RESULT([$my_cv_variable])

 # Ensure that the result is available at this point.
-if test ${my_cv_variable+set} != set; then
+if ${my_cv_variable+false} :; then
   AC_MSG_ERROR([AC@&@&address@hidden@_CACHE_VAL did not ensure that the cache 
variable was set])
 fi

diff --git a/tests/m4sh.at b/tests/m4sh.at
index df39ae7..32de374 100644
--- a/tests/m4sh.at
+++ b/tests/m4sh.at
@@ -214,7 +214,7 @@ AT_KEYWORDS([m4sh])
 # unsetting LINENO to compare its result when (i) LINENO is supported
 # and when (ii) it is not.
 # So just skip if the shell is ZSH.
-AT_CHECK([test -n "${ZSH_VERSION+set}" && exit 77], ignore)
+AT_CHECK([test ${ZSH_VERSION+y} && exit 77], ignore)

 # AT_DATA_LINENO(FILE-NAME,
 #                UNSET-LINENO = true | false, COUNTER, COUNTER-RE)
@@ -297,7 +297,7 @@ test $as_lineno = 9999 || AS_ERROR([bad as_lineno at depth 
2])
 AS_LINENO_POP
 test $as_lineno = 9999 || AS_ERROR([bad as_lineno at depth 1])
 AS_LINENO_POP
-test x${as_lineno+set} = xset && AS_ERROR([as_lineno set at depth 0])
+test ${as_lineno+y} && AS_ERROR([as_lineno set at depth 0])

 AS_EXIT([0])
 ]])
-- 
2.1.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]