[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: iterating over arguments
From: |
Eric Blake |
Subject: |
Re: iterating over arguments |
Date: |
Mon, 14 Sep 2009 18:09:32 +0000 (UTC) |
User-agent: |
Loom/3.14 (http://gmane.org/) |
Sam Steingold <sds <at> gnu.org> writes:
> thanks a lot for your clear explanations!
> (sorry about copying your whole message, I want to preserve it in my mail
> archives, it would be nice if you kept me in CC).
I wish I could - gmane is lousy at preserving cc.
>
> yes, now, with this patch:
> +test $cl_cv_clisp_]cl_feat[ = no && AC_MSG_ERROR([no ]CL_FEAT[ in CLISP])
> is converted to
>
> test $cl_cv_clisp_cl_feat = no && { { $as_echo "$as_me:$LINENO: error: no FFI
> in CLISP" >&5
Ah. This one is a case of underquotation - cl_feat was expanded too early.
(Both Ralf and I did say that our first attempts were untested, after all ;)
So, the next try is this.
m4_foreach_w([cl_feat], [$1],
[m4_pushdef([CL_FEAT], m4_toupper(cl_feat))dnl
AC_CACHE_CHECK([for CL_FEAT in CLISP], [cl_cv_clisp_]cl_feat,
[CLISP_SET([cl_cv_clisp_]cl_feat,
[[#+]]cl_feat[[ "yes" #-]]cl_feat[[ "no"]])])
test $cl_cv_clisp_[]cl_feat = no && AC_MSG_ERROR([no ]CL_FEAT[ in CLISP])
m4_popdef([CL_FEAT])])
See the difference? "$cl_cv_clisp_]cl_feat[" said to expand cl_feat prior to
the body of the m4_foreach_w (and cl_feat was not defined as a macro at that
point); whereas the new "$cl_cv_clisp_[]cl_feat" says that cl_feat is still
quoted as part of the m4_foreach_w body, but separated by empty quotes from the
rest of the text of the body so as to expand at the right point in time.
And if clisp ever comes up with a feature that resembles an m4 macro name, or
contains (), ',', [], or $, (for example, if you added a "dnl" feature to
clisp), then you should consider a more robust solution (again, untested, but
hopefully this time I've learned from the thread what needs to happen). If you
aren't willing to rely on m4_toupper having its quoting fix that I will be
adding in autoconf 2.65, you can use a raw m4_translit instead of m4_toupper
for safety across older autoconf:
m4_foreach_w([cl_feat], [$1],
[m4_pushdef([CL_FEAT], m4_translit(m4_dquote(m4_defn([cl_feat])),
[a-z], [A-Z]))dnl
AC_CACHE_CHECK([for m4_defn([CL_FEAT]) in CLISP],
[cl_cv_clisp_]m4_defn([cl_feat]),
[CLISP_SET([cl_cv_clisp_]m4_defn([cl_feat]),
[[#+]]m4_dquote(m4_defn([cl_feat]))[[ "yes" #-]]m4_dquote(
m4_defn([cl_feat]))[[ "no"]])])
test $cl_cv_clisp_[]m4_defn([cl_feat]) = no \
&& AC_MSG_ERROR([no ]m4_defn([CL_FEAT])[ in CLISP])
m4_popdef([CL_FEAT])])
See how hairy it gets with all the extra m4_defn for safety? Which is why I
like my m4_map_args_w interface better (using $1 instead of m4_defn([varname])
is less typing, and more efficient use of m4); too bad I wasn't developing
autoconf back in the 2.59 days ;)
--
Eric Blake
- Re: iterating over arguments, (continued)
- Re: iterating over arguments, Paolo Bonzini, 2009/09/14
- Re: iterating over arguments, Ralf Wildenhues, 2009/09/13
- Re: iterating over arguments, Sam Steingold, 2009/09/13
- Re: iterating over arguments, Ralf Wildenhues, 2009/09/13
- Re: iterating over arguments, Sam Steingold, 2009/09/13
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Sam Steingold, 2009/09/14
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Sam Steingold, 2009/09/14
- Re: iterating over arguments,
Eric Blake <=
- Re: iterating over arguments, Sam Steingold, 2009/09/14
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Sam Steingold, 2009/09/14
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Sam Steingold, 2009/09/14
- Re: iterating over arguments, Eric Blake, 2009/09/14
- Re: iterating over arguments, Sam Steingold, 2009/09/14