注意autoheader
不“扫描” configure.ac
。相反,它以跟踪模式运行configure.ac
,以便捕获对(由 间接调用)和对(由 调用)m4
的低级调用。所以因为一切都经历过,不予理睬。但是,它以宏实际接收参数的方式查看参数。AC_DEFINE_TRACE_LITERAL
AC_DEFINE
AH_OUTPUT
AC_CHECK_HEADERS
m4
autoheader
m4_foreach
AC_DEFINE
您可以通过跟踪对您的调用和AC_CHECK_HEADERS
您的调用来查看代码中的问题configure.ac
:
% 猫配置.ac
AC_INIT(somelib.so,1.0,someone@somewhere.com)
m4_foreach_w([hdr],[[foo.h] [bar.h]], [
AC_DEFINE([HAVE_]m4_translit(m4_toupper(hdr),[/.],[__]),[1],
[如果 ]hdr[ 可用,则定义为 1])
AC_CHECK_HEADERS([hdr])
])
AC_CONFIG_HEADERS([config.h])
AC_OUTPUT
% 自动配置 -t AC_DEFINE -t AC_CHECK_HEADERS
configure.ac:3:AC_DEFINE:HAVE_FOO_H:1:如果 foo.h 可用,则定义为 1
配置.ac:3:AC_CHECK_HEADERS:hdr
如果您有 ANSI C 头文件,则 configure.ac:3:AC_DEFINE:STDC_HEADERS:1:Define 为 1。
configure.ac:3:AC_CHECK_HEADERS:sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h inttypes.h stdint.h unistd.h:::$ac_includes_default
configure.ac:3:AC_DEFINE:HAVE_BAR_H:1:如果 bar.h 可用,则定义为 1
配置.ac:3:AC_CHECK_HEADERS:hdr
所以我们看到它被作为参数AC_CHECK_HEADERS
调用了两次。hdr
在调用 AC_DEFINE 时,hdr
已正确展开。那是因为hdr
在您对 的调用中又被引用了一次AC_CHECK_HEADERS
,从而阻止了它的扩展。
我会这样修复它:
m4_foreach_w([hdr],[[foo.h] [bar.h]], [
AC_DEFINE([HAVE_]m4_translit(m4_toupper(hdr),[/.],[__]),[1],
[Define to 1 if ]hdr[ is available])
AC_CHECK_HEADERS(hdr)
])
(但这仍然假设名称 foo.h 和 bar.h 永远不会触发任何宏。)