m4_include没有扩展其论点

  • 本文关键字:扩展 include m4 autoconf m4
  • 更新时间 :
  • 英文 :


>假设一个微不足道的configure.ac

AC_INIT([foobar], 1.0)
m4_define([foobar_m4], [foobar.m4])
m4_include(foobar_m4)

用一个微不足道的foobar.m4

AS_ECHO(["foobar.m4 was included"])

运行autoreconf产生:

aclocal: error: configure.ac:10: file 'foobar_m4' does not exist
autoreconf-2.69: aclocal failed with exit status: 1

如何在configure.ac中包含 m4 扩展的文件名?

罪魁祸首是aclocal效用,而不是m4m4扩展工作正常,但在调用m4之前,aclocal扫描configure.ac以获取依赖项,并且它会盲目地处理m4_include宏,就好像它总是使用文本文件参数调用一样。

有两种解决方法:

  1. 使用内置宏include

    m4_builtin([include], foobar_m4)
    

这将完全绕过 autoconf 提供的m4_include宏,该宏可防止重复包含同一文件。

  1. 定义自己的调用m4_include的宏:

    m4_define([my_include], [m4_include][([$1])])dnl
    my_include(foobar_m4)
    

为什么引用奇怪?我们必须在上面的定义中引用m4_include,以便在my_include的定义中不会扩展它,但是引用整个m4_include([$1])调用仍然会以与问题相同的方式绊倒aclocal

据我所知,没有内置的方法可以防止aclocal专门处理m4_include宏。这种aclocal行为对于依赖项跟踪至关重要,因此以这种方式包含文件可能会由于包含文件中使用了未定义的宏而失败(此处也对此进行了说明)。

相关内容

  • 没有找到相关文章

最新更新