禁止不必要的输出到config.h.in

时间:2012-09-24 18:04:23

标签: autotools autoconf m4

当在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中它看起来很奇怪。

1 个答案:

答案 0 :(得分:3)

请注意,autoheader不会“扫描”configure.ac。相反,它在跟踪模式下运行configure.acm4,以便捕获对AC_DEFINE_TRACE_LITERAL(由AC_DEFINE间接调用)和{{1}的低级调用(由AH_OUTPUT调用)。因此,因为一切都经过AC_CHECK_HEADERSm4不会忽略autoheader。然而,它看到了宏实际接收它们的方式。

您可以通过跟踪m4_foreach中对AC_DEFINEAC_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永远不会触发任何宏。)