2016-04-25 33 views
0

假設一個普通configure.acm4_include不擴展其參數?

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擴展名?

回答

2

罪魁禍首是aclocal實用程序,而不是m4m4擴展工作得很好,但在m4被調用之前,aclocal爲依賴關係掃描configure.ac,並且它盲目地處理m4_include宏,就好像它總是用文字文件參數調用一樣。

有兩種解決方法:

  1. 使用內置宏include

    m4_builtin([include], foobar_m4) 
    

這將徹底規避的autoconf提供的m4_include宏,它可以防止重複夾雜物同一個文件。

  • 定義自己的宏調用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的這種行爲對於依賴關係跟蹤至關重要,因此以這種方式包含文件很可能因包含文件中使用未定義的宏而失敗(這也可參見here)。