m4_include不扩展其论点?

时间:2016-04-25 11:07:01

标签: 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扩展文件名?

1 个答案:

答案 0 :(得分:2)

罪魁祸首是aclocal实用程序,而不是m4m4扩展工作正常,但在调用m4之前,aclocal扫描configure.ac依赖关系,并盲目处理m4_include宏,就像它是总是用文字文件参数调用。

有两种解决方法:

  1. 使用内置宏include

    m4_builtin([include], foobar_m4)
    
  2. 这将完全绕过autoconf提供的m4_include宏,以防止重复包含同一文件。

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

      m4_define([my_include], [m4_include][([$1])])dnl
      my_include(foobar_m4)
      
    2. 为什么奇怪的引用?我们必须在上面的定义中引用m4_include,以便在my_include的定义期间不引用它,但引用整个m4_include([$1])调用仍会在aclocal中同步aclocal问题的方式。

      据我所知,没有内置的方法来阻止m4_include专门处理aclocal宏。 {{1}}的这种行为对于依赖关系跟踪至关重要,因此,由于包含文件中使用了未定义的宏,以这种方式包含文件可能会失败(这也解释为here)。