Macros that are called by other macros are evaluated by m4
several times; each evaluation might require another layer of quotes to
prevent unwanted expansions of macros or m4
builtins, such as
`define' and `$1'. Quotes are also required around macro
arguments that contain commas, since commas separate the arguments from
each other. It's a good idea to quote any macro arguments that contain
newlines or calls to other macros, as well.
Autoconf changes the m4
quote characters
from the default ``' and `'' to `[' and `]', because
many of the macros use ``' and `'', mismatched. However, in a
few places the macros need to use brackets (usually in C program text or
regular expressions). In those places, they use the m4
builtin
command changequote
to temporarily change the quote characters to
`<<' and `>>'. (Sometimes, if they don't need to quote
anything, they disable quoting entirely instead by setting the quote
characters to empty strings.) Here is an example:
AC_TRY_LINK( changequote(<<, >>)dnl <<#include <time.h> #ifndef tzname /* For SGI. */ extern char *tzname[]; /* RS6000 and others reject char **tzname. */ #endif>>, changequote([, ])dnl [atoi(*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
When you create a configure
script using newly written macros,
examine it carefully to check whether you need to add more quotes in
your macros. If one or more words have disappeared in the m4
output, you need more quotes. When in doubt, quote.
However, it's also possible to put on too many layers of quotes. If
this happens, the resulting configure
script will contain
unexpanded macros. The autoconf
program checks for this problem
by doing `grep AC_ configure'.
Go to the first, previous, next, last section, table of contents.