Hi folks,

I noticed today (using Autoconf 2.69, although the problem is still
present in Git) that when the first argument of AC_SUBST contains
macro names, the behaviour is very odd.  Consider the following:

% cat >configure.ac <<'EOF'
AC_INIT([test], [0])

m4_define([FOO], [baz])
AC_SUBST([FOO], [bar])

AC_CONFIG_FILES([test])
AC_OUTPUT
EOF

% cat >test.in <<'EOF'
@FOO@
EOF

This produces no error messages at autoconf time and none at configure
time.  Nevertheless, the substituted value of FOO is the empty string,
instead of bar, as expected.  Sure enough, in the output variables
section of config.log, we see FOO='' instead of FOO='bar'.  Looking
at the generated configure script, we see that AC_SUBST has produced
baz=bar in the output, instead of the expected FOO=bar.  But this is
the only place: everywhere else is still using FOO.

The Autoconf manual does not say anything about the (non-)expansion of
the first argument to AC_SUBST.  However, if we look at the definition
of AC_SUBST in autoconf/lib/autoconf/general.m4, the reason for the
problem seems clear.  The full definition is reproduced here:

  m4_define([AC_SUBST],
  [AS_IDENTIFIER_IF([$1], [],
    [m4_fatal([$0: `$1' is not a valid shell variable name])])]dnl
  [AC_SUBST_TRACE([$1])]dnl
  [m4_pattern_allow([^$1$])]dnl
  [m4_ifvaln([$2], [$1=$2])[]]dnl
  [m4_set_add([_AC_SUBST_VARS], [$1])])# AC_SUBST

Note that the second argument of m4_ifvaln will be expanded further
if it is substituted (i.e., if $2 is non-empty).  Further inspection
reveals that none of the other positions in which $1 appear have any
more expansion done on them.  Therefore, I believe the correct fix is
to add additional quoting to this argument, as in:

  [m4_ifvaln([$2], [[$1]=$2])[]]dnl

Making this change corrects the problem, and as expected, @FOO@ is
substituted with bar.

Cheers,
  Nick

Reply via email to