2

当在 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.

4

1 回答 1

3

注意autoheader不“扫描” configure.ac。相反,它以跟踪模式运行configure.ac,以便捕获对(由 间接调用)和对(由 调用)m4的低级调用。所以因为一切都经历过,不予理睬。但是,它以宏实际接收参数的方式查看参数。AC_DEFINE_TRACE_LITERALAC_DEFINEAH_OUTPUTAC_CHECK_HEADERSm4autoheaderm4_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 永远不会触发任何宏。)

于 2012-09-26T08:23:31.560 回答