configure.ac 中的变量从哪里被替换?

From where are variables in configure.ac substituted?

我正在尝试了解 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]*\).*$//'`]
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 Autotools安装目录下指定的宏,XORG_MACROS_VERSION等是在X.org 包安装目录(我认为)。

我不明白的是,像$VERSION$PACKAGE_VERSION$LIBS这样的变量是从哪里得到它们的值的? configure.ac 不应该是 "top-level" 输入文件吗?

Isn't configure.ac supposed to be like, the "top-level" input file?

我当然会自己做出这种描述,但你和我的意思肯定不同,因为我看不出它与你的中心问题有什么关系:

What I don't understand is, from where will variables like $VERSION, $PACKAGE_VERSION and $LIBS get their values?

永远记住 Autoconf 是一个 代码生成器 。它使用 m4 宏处理器的自定义配置、内置宏库以及提供给它的任何其他宏,根据您提供给它的输入文件构建一个 shell 脚本。其中许多宏发出 shell 代码,导致 shell 变量在生成的 configure 脚本 运行 时被定义。这些变量属于configure;它们只是 Autoconf 本身的文本。 (一般。事实上,这方面有一个或两个问题。)

不同的变量设置 and/or 由不同宏生成的 shell 代码修改。例如,AC_INIT 发出定义 $PACKAGE_VERSION 的代码。我认为它也对 $VERSION 负责,但我没有找到记录。

另一方面,一些变量的初始值取自 configure 为 运行 的环境。 $LIBS 就是其中之一。在未在环境中设置的(通常)事件中,从普通的 shell 行为可以看出初始值实际上是空的。此特定变量由 the AC_CHECK_LIB and AC_SEARCH_LIBS macros 和可能其他人生成的代码更新。

回到 Autoconf 的本质,也许您的困惑是由于未能理解宏和函数之间的区别而引起的。 Autoconf 递归地扩展宏 以生成shell 脚本。结果脚本的语义是结果代码的任何内容。 Autoconf 宏不为结果脚本中出现的 shell 变量提供任何范围。