当在m4_foreach_w中调用AC_CHECK_HEADERS时,autoheader(2.65)似乎生成了一个虚假的模板。例如:
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])]
)
导致config.h.in
(假设AC_CONFIG_HEADERS([config.h])
)拥有模板:
/* Define to 1 if you have the <hdr> header file.*/
#undef HAVE_HDR
有什么办法可以避免那个虚假的模板吗?请注意,m4_foreach_w
正在宏中调用,实际文本是m4_foreach_w([hdr],[$1],
,我想知道我是否有m4引用问题,但我怀疑问题更为根本。也就是说,我总是认为我错误地引用了m4 - 但这似乎不是问题所在。相反,autoheader
正在扫描文本而不尊重m4_foreach_w
。我不认为模板会导致任何问题,但在最终的config.h
中它看起来很奇怪。
答案 0 :(得分:3)
请注意,autoheader
不会“扫描”configure.ac
。相反,它在跟踪模式下运行configure.ac
到m4
,以便捕获对AC_DEFINE_TRACE_LITERAL
(由AC_DEFINE
间接调用)和{{1}的低级调用(由AH_OUTPUT
调用)。因此,因为一切都经过AC_CHECK_HEADERS
,m4
不会忽略autoheader
。然而,它看到了宏实际接收它们的方式。
您可以通过跟踪m4_foreach
中对AC_DEFINE
和AC_CHECK_HEADERS
的来电来查看代码中的问题:
% cat configure.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], [Define to 1 if ]hdr[ is available]) AC_CHECK_HEADERS([hdr]) ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT % autoconf -t AC_DEFINE -t AC_CHECK_HEADERS configure.ac:3:AC_DEFINE:HAVE_FOO_H:1:Define to 1 if foo.h is available configure.ac:3:AC_CHECK_HEADERS:hdr configure.ac:3:AC_DEFINE:STDC_HEADERS:1:Define to 1 if you have the ANSI C header files. 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:Define to 1 if bar.h is available configure.ac:3:AC_CHECK_HEADERS:hdr
因此,我们看到以configure.ac
为参数调用AC_CHECK_HEADERS
两次。在调用AC_DEFINE时,hdr
已正确扩展。这是因为在hdr
的通话中再次引用hdr
,阻止其扩展。
我会这样修理:
AC_CHECK_HEADERS
(但仍然假设名称foo.h和bar.h永远不会触发任何宏。)