>假设一个微不足道的configure.ac
:
AC_INIT([foobar], 1.0)
m4_define([foobar_m4], [foobar.m4])
m4_include(foobar_m4)
用一个微不足道的foobar.m4
:
AS_ECHO(["foobar.m4 was included"])
运行autoreconf
产生:
aclocal: error: configure.ac:10: file 'foobar_m4' does not exist
autoreconf-2.69: aclocal failed with exit status: 1
如何在configure.ac
中包含 m4 扩展的文件名?
罪魁祸首是aclocal
效用,而不是m4
。m4
扩展工作正常,但在调用m4
之前,aclocal
扫描configure.ac
以获取依赖项,并且它会盲目地处理m4_include
宏,就好像它总是使用文本文件参数调用一样。
有两种解决方法:
-
使用内置宏
include
:m4_builtin([include], foobar_m4)
这将完全绕过 autoconf 提供的m4_include
宏,该宏可防止重复包含同一文件。
-
定义自己的调用
m4_include
的宏:m4_define([my_include], [m4_include][([$1])])dnl my_include(foobar_m4)
为什么引用奇怪?我们必须在上面的定义中引用m4_include
,以便在my_include
的定义中不会扩展它,但是引用整个m4_include([$1])
调用仍然会以与问题相同的方式绊倒aclocal
。
据我所知,没有内置的方法可以防止aclocal
专门处理m4_include
宏。这种aclocal
行为对于依赖项跟踪至关重要,因此以这种方式包含文件可能会由于包含文件中使用了未定义的宏而失败(此处也对此进行了说明)。