[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: m4 macro whose name depends on a a variable
From: |
Eric Blake |
Subject: |
Re: m4 macro whose name depends on a a variable |
Date: |
Mon, 10 Nov 2008 06:18:26 -0700 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.17) Gecko/20080914 Thunderbird/2.0.0.17 Mnenhy/0.7.5.666 |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
According to Vincent Torri on 11/10/2008 12:47 AM:
Hello Vincent,
> I want to write a generic macro that check if different image library
> (libjpeg, libpng, etc...) are available.
> Is it possible to achieve what I want ?
Yes, it is possible.
> dnl use: EVAS_CHECK_IMAGE_LOADER(loader, want_loader)
> AC_DEFUN([EVAS_CHECK_IMAGE_LOADER],
> [
>
> pushdef([UP], translit([$1], [a-z], [A-Z]))dnl
Please use m4sugar names; while autoconf currently re-exports raw m4
names, this may trigger a warning in the future (as it is not namespace
clean). So this should be m4_pushdef, not pushdef.
> pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl
Underquoted - translit does not output its argument with quotes, so if $1
happens to match a macro name, it will be re-expanded. Also, you may want
to consider using m4_toupper/m4_tolower instead of directly calling
translit. As in:
pushdef([UP], m4_toupper([[$1]], [a-z], [A-Z]))
>
> have_evas_image_loader_[]DOWN="no"
>
> EVAS_CHECK_LOADER_DEP_[]UP(
Here's your problem. You are outputting the literal string
EVAS_CHECK_LOADER_DEP_ (which is not defined as a macro), then outputting
the expansion of UP(args) (which is also not defined as a macro). What
you really need is another layer of expansion that pastes together the two
strings, and expands the pasted result as a single macro name. There are
several possibilities, pick the one you think looks nicest (and recalling
that some of these macros weren't available/documented in older autoconf
versions):
m4_unquote(m4_join([], [EVAS_CHECK_LOADER_DEP_], m4_defn([UP])))(args)
m4_default([], [EVAS_CHECK_LOADER_DEP_]m4_defn([UP]))(args)
> [DOWN],
Possibly overquoted. You need to decide whether you want to pass the
lower-case name as the argument, rather than the name of a macro that
expands to the lower-case name (it depends on whether
EVAS_CHECK_LOADER_DEP_* use their $1 as a literal string in investigating
further macro names, or whether waiting until after the child macro is
expanded before converting to lower-case is acceptable).
> [have_evas_image_loader_[]DOWN="yes"],
> [have_evas_image_loader_[]DOWN="no"])
>
> popdef([UP])
> popdef([DOWN])
Again, use m4_popdef. And in newer autoconf, it is more efficient to pop
two definitions at once:
m4_popdef([UP], [DOWN])
- --
Don't work too hard, make some time for fun as well!
Eric Blake address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkkYNKIACgkQ84KuGfSFAYC/tQCfbgu7Fmk+b/KHrfNEn1lBUbwh
L6kAn1uyyUyGxASV/md2zTqSWbj+nGtV
=qgI9
-----END PGP SIGNATURE-----