2

AC_CHECK_HEADERSがm4_foreach_w内で呼び出されると、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されます。したがって、すべてが通過するため、を無視しないでください。ただし、マクロが実際に受け取る方法で引数を確認します。m4AC_DEFINE_TRACE_LITERALAC_DEFINEAH_OUTPUTAC_CHECK_HEADERSm4autoheaderm4_foreach

AC_DEFINE:への呼び出しと:の呼び出しをトレースすることで、コードの問題を確認できAC_CHECK_HEADERSます。configure.ac

%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]、
        [] hdr [が利用可能な場合は1に定義])
     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:foo.hが使用可能な場合は1に定義します
configure.ac:3:AC_CHECK_HEADERS:hdr
configure.ac:3:AC_DEFINE:STDC_HEADERS:1:ANSI Cヘッダーファイルがある場合は、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に定義
configure.ac:3:AC_CHECK_HEADERS:hdr

したがって、これは引数としてAC_CHECK_HEADERS2回呼び出されることがわかります。hdrAC_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 に答える