7.测试结果
本系列文章均翻译自Autoconf官方文档:Autoconf Manual,github同步项目:question
一旦configure确定了哪些功能存在,它能做什么来记录信息呢?
- 定义一个C处理器标识
- 在输出文件中设置一个变量
- 将configure运行的功能的结果保存在一个缓存文件中
- 打印信息让用户知道测试结果
7.1 定义C处理器标识
对有响应的功能测试的普通做法就是定义一个C处理器标识来说明测试结果。
默认情况下,AC_OUPUT
将这些宏定义的标识放在输出变量DEFS
中。但是,如果使用了AC_CONFIG_HEADERS
,将会代替创建DEFS
。
AC_DEFINE (variable, value, [description])
AC_DEFINE (variable)
通过定义C处理器的宏来定义variable为value,可选地带上括号参数列表以处理带参的C宏。如果宏的参数列表存在,使用逗号分隔,可能使用...
结束。
description只在使用AC_CONFIG_HEADERS
时有用,作为注释放在config.h.in中。
传参只有variable时,默认value为1
。
AC_DEFINE([PACKAGE_URL], ["https://www.winehq.org"], [Define to the home page for this package.]
AC_DEFINE_UNQUOTED (variable, value, [description])
AC_DEFINE_UNQUOTED (variable)
类似于AC_DEFINE
,但是可以使用:引用($)、调用(``)、反斜杠(\)。
AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
[getgroups return type.])
note:在其他宏或者shell代码调用这两个宏的时候,不要使用分号来分割AC_DEFINE
和AC_DEFINE_UNQUOTED
的语句,使用空格或者换行。
do this:
AC_CHECK_HEADER([elf.h],
[AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
or this:
AC_CHECK_HEADER([elf.h],
[AC_DEFINE([SVR4], [1], [System V Release 4])
LIBS="-lelf $LIBS"])
instead of this:
AC_CHECK_HEADER([elf.h],
[AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
7.2 设置输出变量
除了预置输出变量,还可以通过以下两个宏来设置输出变量。
AC_SUBST (variable, [value])
从shell变量创建输出变量。使AC_OUTPUT
替换变量variable的值到输出文件中(一般是Makefile文件)。意思就是AC_OUTPUT
使用shell变量variable的值替换输入文件(Makefile.in)的*@[email protected]*到输出文件(Makefile)。如果值是新行,考虑使用AM_SUBST_NOTMAKE
防止automake添加 variable = @[email protected] 到Makefile.in文件。
AC_SUBST([PACKAGE_RELEASE],
[m4_esyscmd([build-aux/pkg-version --release])])
configure对应的语句
PACKAGE_RELEASE=44.gitb50346e
AC_SUBST_FILE (variable)
让AC_OUTPUT
插入(没有替换)文件(shell变量variable)内容到输出文件。
configure.ac:
AC_SUBST_FILE([host_frag])
host_frag=$srcdir/conf/sun4.mh
and then a Makefile.in could contain:
@[email protected]
能够对输出结果造成影响的环境变量(比如CC),称作precious variable
,通过AC_ARG_VAR
声明。
AC_ARG_VAR (variable, description)
声明variable是precious variable,将它的描述放入变量的帮助文档部分./configure --help
。
precious variable意味着:
- 通过
AC_SUBST
替换variable - configure运行的时候variable的值被保存到缓存中,包括没有通过命令行而是通过环境指定的情况。注意:保存的是variable的初始化的值,而不是在执行configure的时候找到的值。
- 在运行两次configure的时候执行一致性检查。
- 在自动重新配置的时候保留变量,就好像作为命令行参数传入一样。包括没有使用缓存的情况。
7.4 缓存结果
为了避免在多个configure脚本中重复检查一个功能或者在一个脚本中重复运行,可选地将测试结果保存到一个cache file。
AC_CACHE_VAL (cache-id, commands-to-set-it)
确保cache-id标识的检查结果可用。如果检查结果再缓存文件中被读取了,打印结果被读取的信息;否则执行shell命令commands-to-set-it。
AC_CACHE_CHECK (message, cache-id, commands-to-set-it)
对AC_CACHE_VAL
封装,关心打印信息。它为message调用AC_MSG_CHECKING
,带参cache-id、commands调用AC_CACHE_VAL
,带参cache-id调用AC_MSG_RESULT
。
7.5 输出信息
AC_MSG_CHECKING (feature-description)
提示用户configure正在检查一个特定的功能。必须后跟AC_MSG_RESULT
打印检查结果和换行。--quiet
和--silent
选项不会打印。
AC_MSG_CHECKING($PYTHON_NAME module: $1)
"$THIS_MODULE_PYTHON" -c "import $1" 2>/dev/null
if test $? -eq 0;
then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
AC_MSG_RESULT (result-description)
提示用户检查的结果,result-description一般是*‘yes’, ‘no’, or a file name*。
AC_MSG_WARN (problem-description)
发出警告,打印信息到标准错误输出。
AC_MSG_WARN([pyflakes not found])
AC_MSG_ERROR (error-description, [exit-status = ‘$?/1’])
提示一个错误,终止configure。*$?*是默认的,除非0变为了1。???