2017-10-15 116 views
0

我想了解configure.ac文件爲libXrender包:從configure.ac中的變量替換?

... 
AC_INIT(libXrender, [0.9.8], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXrender]) 
AC_CONFIG_SRCDIR([Makefile.am]) 
AC_CONFIG_HEADERS([config.h]) 

AM_INIT_AUTOMAKE([foreign dist-bzip2]) 
AC_PROG_LIBTOOL 

# Require X.Org macros 1.8 or later for AC_PROG_INSTALL 
m4_ifndef([XORG_MACROS_VERSION], [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) 
XORG_MACROS_VERSION(1.8) 
XORG_DEFAULT_OPTIONS 
XORG_CHECK_MALLOC_ZERO 

# Check render configuration, strip extra digits from package version to 
# find the required protocol version 
if test "$VERSION" = "" ; then 
     VERSION=$PACKAGE_VERSION; 
fi 
RENDER_VERSION=[`echo $VERSION | sed 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'`] 
AC_SUBST(RENDER_VERSION) 

# Obtain compiler/linker options for depedencies 
PKG_CHECK_MODULES(RENDER, x11 renderproto >= $RENDER_VERSION) 

# Check for _XEatDataWords function that may be patched into older Xlib release 
SAVE_LIBS="$LIBS" 
LIBS="$RENDER_LIBS" 
AC_CHECK_FUNCS([_XEatDataWords]) 
LIBS="$SAVE_LIBS" 

AC_CONFIG_FILES([Makefile 
     src/Makefile 
     xrender.pc]) 
AC_OUTPUT 

我明白AC_INITAM_INIT_AUTOMAKE等是在GNU自動安裝目錄中指定宏和XORG_MACROS_VERSION等被在X.org軟件包安裝目錄中指定(我認爲)。

我不明白的是,像$VERSION,$PACKAGE_VERSION$LIBS這樣的變量會從哪裏獲得它們的值?不是configure.ac應該是「頂級」輸入文件嗎?

回答

1

是不是configure.ac應該像「頂級」輸入文件?

我肯定會作出這樣的描述我自己,但你和我的意思是它必須有所不同,因爲我看不出它如何承擔你的核心問題:

我也不是什麼理解是從變量像$ VERSION, $ PACKAGE_VERSION和$ LIBS那裏得到它們的值?

記住總是Autoconf代碼生成。它使用宏處理器的自定義配置,內置的宏庫以及提供給它的任何其他宏,從您輸入的輸入文件構建一個shell腳本。這些宏中的很多會發出shell代碼,導致運行結果configure腳本時會定義shell變量。這些變量屬於configure;它們只是Autoconf本身的文本。 (一般來說,這裏有一兩個陷阱)

不同的變量是由不同的宏產生的shell代碼設置和/或修改的。例如,AC_INIT發出定義爲$PACKAGE_VERSION的代碼。我認爲它也是$VERSION的責任,但我沒有找到記錄。

另一方面,某些變量從運行環境configure獲取其初始值。 $LIBS就是其中之一。在環境中沒有設置的(通常)事件中,它遵循普通的shell行爲,初始值實際上是空的。此特定變量由the AC_CHECK_LIB and AC_SEARCH_LIBS macros生成的代碼更新,可能還有其他變量。回到Autoconf的本質,也許你的困惑源於未能理解宏和函數之間的區別。 Autoconf 以遞歸方式擴展宏以生成shell腳本。生成的腳本的語義可以從結果代碼中得到。 Autoconf宏不會爲出現在結果腳本中的shell變量提供任何範圍。

+0

謝謝您的詳細解答!我相信你指出了我的困惑。我從功能的角度思考,即從哪裏調用「configure」,以便可以傳入這些變量的值。現在我意識到它只是宏擴展 - autoconf只是擴展了所有的宏configure.ac使用在其他地方找到的定義,在這些定義中也會有一些變量定義,它們以「configure」結尾。正是在上面所示的configure.ac中引用了這些間接定義的變量。 –

+0

在configure.ac中對這些變量的引用也將以「configure」結尾,但在*之前*之前的宏的擴展版本(如AC_INIT)將包含這些變量的定義。 –