假设一个微不足道的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扩展文件名?
答案 0 :(得分:2)
罪魁祸首是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
宏。 {{1}}的这种行为对于依赖关系跟踪至关重要,因此,由于包含文件中使用了未定义的宏,以这种方式包含文件可能会失败(这也解释为here)。