荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: sdymhua.bbs@Zero.cn-bbs.org (零起点), 信区: Linux
标  题: autoconf(三)
发信站: 零起点_BBS (Fri Dec  3 10:04:21 2004)
转信站: SZU!news.szu.edu.cn!news.uestc.edu.cn!Zero

autoconf手册(三)

现有的测试
这些宏测试了包可能需要或者需要使用的特定的系统特征。如果你要测试这些宏所不能测试
的特征,可能你可以用适当的参数调用主测试宏来达到目的(参见编写测试)。

这些宏打印消息以告诉用户它们正在测试的特征,以及它们的测试结果。它们为未来运行的
configure 储存测试结果(参见缓存结果)。

在这些宏中,有的宏设置输出变量。关于如何获取它们的值,请参见Makefile中的替换。在
下面出现的术语“定义name”是“把C预处理符号name定义成1”的简称。关于如何把这些符
号的定义放入你的程序中,参见定义C预处理器符号。

对程序的选择
这些宏检查了特定程序的存在或者特定程序的特征。它们被用于在几个可以相互替代的程序
间进行选择,并且在决定选用某一个的时候作些什么。如果没有为你要使用的程序定义特定
的宏,并且你不需要检查它的任何特殊的特征,那么你就可以选用一个通用程序检查宏。

对特定程序的检查
这些宏检查特定的程序--它们是否存在,并且在某些情况下它们是否支持一些特征。
宏: AC_DECL_YYTEXT
如果yytext的类型是`char *'而不是`char []',就定义YYTEXT_POINTER。本宏还把输出变
量LEX_OUTPUT_ROOT设置由lex生成的文件名的基文件名;通常是`lex.yy',但有时是其他的
东西。它的结果依使用lex还是使用flex而定。
宏: AC_PROG_AWK
按顺序查找mawk、gawk、nawk和awk,并且把输出变量AWK 的值设置成第一个找到的程序名
。首先寻找mawk是因为据说它是最快的实现。
宏: AC_PROG_CC
确定C的编译器。如果在环境中没有设定CC,就查找gcc,如果没有找到,就使用cc。把输出
变量CC设置为找到的编译器的名字。

如果要使用GNU C编译器,把shell变量GCC设置为`yes',否则就设置成空。如果还没有设置
输出变量 CFLAGS,就为GNU C编译器把CFLAGS设置成`-g -O2'(在GCC不接受`-g' 的系统中
就设置成`-O2'),为其他编译器把CFLAGS设置成`-g'。

如果被使用的C编译器并不生成可以在configure运行的系统上运行的可执行文件,就把
shell变量 cross_compiling设置成`yes',否则设置成`no'。换句话说,它检查创建系统类
型是否与主机系统类型不同(目标系统与本测试无关)。关于对交叉编译的支持,参见手工
配置。

宏: AC_PROG_CC_C_O
对于不能同时接受`-c'和`-o'选项的C编译器,定义NO_MINUS_C_MINUS_O。
宏: AC_PROG_CPP
把输出变量CPP设置成运行C预处理器的命令。如果`$CC -E'不能工作,就使用`/lib/cpp'。
只有对以`.c'为扩展名的文件运行CPP才是可以移植的(portable)。

如果当前语言是C(参见对语言的选择),许多特定的测试宏通过调用AC_TRY_CPP、
AC_CHECK_HEADER、AC_EGREP_HEADER或者AC_EGREP_CPP,间接地使用了CPP的值。

宏: AC_PROG_CXX
确定C++编译器。检查环境变量CXX或者CCC(按照这个顺序)是否被设置了;如果设置了,
就把输出变量 CXX设置成它的值。否则就搜索类似名称(c++、g++、gcc、CC、 cxx和cc++
)的C++编译器。如果上述测试都失败了,最后的办法就是把CXX设置成 gcc。

如果使用GNU C++编译器,就把shell变量GXX设置成`yes',否则就设置成空。如果还没有设
置输出变量CXXFLAGS,就为GNU C++编译器把CXXFLAGS设置成`-g -O2' (在G++不接受`-g'
的系统上设置成`-O2'),或者为其他编译器把CXXFLAGS设置成 `-g'。 .

如果使用的C++编译器并不生成在configure运行的系统上运行的可执行文件,就把shell变
量cross_compiling 设置成`yes',否则就设置成`no'。换句话说,它检查创建系统类型是
否与主机系统类型不同(目标系统类型与本测试无关)。关于对交叉编译的支持,参见手工
配置。

宏: AC_PROG_CXXCPP
把输出变量CXXCPP设置成运行C++预处理器的命令。如果`$CXX -E'不能工作,使用
`/lib/cpp'。只有对以`.c'、`.C'或者`.cc'为扩展名的文件运行CPP才是可以移植的(
portable)。

如果当前语言是C++(参见对语言的选择),许多特定的测试宏通过调用 AC_TRY_CPP、
AC_CHECK_HEADER、AC_EGREP_HEADER或者AC_EGREP_CPP,间接地使用了CXXCPP的值。

宏: AC_PROG_F77
确定Fortran 77编译器。如果在环境中没有设置F77,就按顺序检查g77、f77和 f2c。把输
出变量F77设置成找到的编译器的名字。

如果使用g77(GNU Fortran 77编译器),那么AC_PROG_F77将把shell变量G77设置成
`yes',否则就设置成空。如果在环境中没有设置输出变量FFLAGS,那么就为g77 把FFLAGS
设置成`-g -02'(或者在g77不支持`-g'的时候设置成 `-O2')。否则,就为所有其它的
Fortran 77编译器把FFLAGS设置成`-g'。

宏: AC_PROG_F77_C_O
测试Fortran 77编译器是否能够同时接受选项`-c'和`-o',并且如果不能同时接受的话,就
定义F77_NO_MINUS_C_MINUS_O。
宏: AC_PROG_GCC_TRADITIONAL
如果在没有给出`-traditional'的情况下,用GNU C和ioctl不能正确地工作,就把
`-traditional'添加到输出变量CC中。这通常发生在旧系统上没有安装修正了的头文件的时
候。因为新版本的GNU C编译器在安装的时候自动地修正了头文件,它就不是一个普遍的问
题了。
宏: AC_PROG_INSTALL
如果在当前PATH中找到了一个与BSD兼容的install程序,就把输出变量INSTALL设置成到该
程序的路径。否则,就把INSTALL设置成`dir/install-sh -c',检查由
AC_CONFIG_AUX_DIR指明的目录(或者它的缺省目录)以确定dir(参见 创建输出文件)。
本宏还把变量INSTALL_PROGRAM和INSTALL_SCRIPT 设置成`${INSTALL}',并且把
INSTALL_DATA设置成`${INSTALL} -m 644'。

本宏忽略各种已经确认的不能工作的install程序。为了提高速度,它更希望找到一个C程序
而不是shell脚本。除了`install-sh',它还能够使用`install.sh',但因为有些make含有
一条在没有 `Makefile'的情况下,从`install.sh'创建`install'的规则,所以这个名字过
时了。

你可能使用的`install-sh'的一个副本来自于Autoconf。如果你使用AC_PROG_INSTALL,你
必须在你的发布版本中包含`install-sh'或者`install.sh',否则即使你所在的系统含有一
个好的install 程序,configure也将输出一条找不到它们的错误消息。

如果你因为你自己的安装程序提供了一些在标准install程序中没有的特征,而需要使用你
自己的安装程序,就没有必要使用AC_PROG_INSTALL;直接把你的程序的路径名放入你的
`Makefile.in'文件即可。

宏: AC_PROG_LEX
如果找到了flex,就把输出变量LEX设置成`flex',并且在flex库在标准位置的时候,把
LEXLIB设置成`-lfl'。否则,就把LEX设置成`lex'并且把 LEXLIB设置成`-ll'。
宏: AC_PROG_LN_S
如果`ln -s'能够在当前文件系统中工作(操作系统和文件系统支持符号连接),就把输出
变量 LN_S设置成`ln -s',否则就把它设置成`ln'。

如果连接出现在其他目录而不是在当前目录中,它的含义依赖于是使用了`ln',还是使用了
`ln -s'。为了用`$(LN_S)'安全地创建连接,既可以找到正在使用的形式并且调整参数,也
可以总是在创建连接的目录中调用ln。

换句话说,它不能像下面那样工作:

$(LN_S) foo /x/bar

而是要:

(cd /x && $(LN_S) foo bar)
宏: AC_PROG_RANLIB
如果找到了ranlib,就把输出变量RANLIB设置成`ranlib',否则就设置成 `:'(什么也不作
)。
宏: AC_PROG_YACC
如果找到了bison,就把输出变量YACC设置成`bison -y'。否则,如果找到了byacc。就把
YACC设置成`byacc'。否则,就把YACC设置成`yacc'。

对普通程序和文件的检查
这些宏用于寻找没有包含在特定程序测试宏中的程序。如果你除了需要确定程序是否存在,
还需要检测程序的行为,你就不得不为它编写你自己的测试了(参见编写测试)。在缺省情
况下,这些宏使用环境变量PATH。如果你需要检查可能不会出现在PATH中的程序,你可能要
按照下面的方式给出修改了的路径:

AC_PATH_PROG(INETD, inetd, /usr/libexec/inetd,
 $PATH:/usr/libexec:/usr/sbin:/usr/etc:etc)
宏: AC_CHECK_FILE (file [, action-if-found [, action-if-not-found]])
检查文件file是否出现在本地系统中。如果找到了,就执行action-if-found。否则,就在
给出了 action-if-not-found的时候执行action-if-not-found。
宏: AC_CHECK_FILES (files[, action-if-found [, action-if-not-found]])
为每个在files中给出的文件运行AC_CHECK_FILE。并且为每个找到的文件定义 `HAVEfile'
,定义成1。
宏: AC_CHECK_PROG (variable, prog-to-check-for, value-if-found [,
value-if-not-found [, path, [ reject ]]])
检查程序prog-to-check-for是否存在于PATH之中。如果找到了,就把变量 variable设置成
value-if-found,否则就在给出了value-if-not-found的时候把variable设置成它。即使首
先在搜索路径中找到reject(一个绝对文件名),本宏也会忽略它;在那种情况下,用找到
的prog-to-check-for,不同于reject的绝对文件名来设置variable。如果variable已经被
设置了,就什么也不作。为variable调用AC_SUBST。
宏: AC_CHECK_PROGS (variable, progs-to-check-for [, value-if-not-found [, path]
])
在PATH中寻找每个出现在以空格分隔的列表progs-to-check-for中的程序。如果找到了,就
把variable设置成那个程序的名字。否则,继续寻找列表中的下一个程序。如果列表中的任
何一个程序都没有被找到,就把variable设置成value-if-not-found;如果没有给出
value-if-not-found,variable的值就不会被改变。为variable调用 AC_SUBST。
宏: AC_CHECK_TOOL (variable, prog-to-check-for [, value-if-not-found [, path]])
除了把AC_CANONICAL_HOST确定的主机类型和破折号作为前缀之外,类似于AC_CHECK_PROG,
寻找prog-to-check-for(参见获取规范的系统类型)。例如,如果用户运行`configure
--host=i386-gnu',那么下列调用:
AC_CHECK_TOOL(RANLIB, ranlib, :)

当`i386-gnu-ranlib'在PATH中存在的时候,就把RANLIB设置成`i386-gnu-ranlib',或者当
`ranlib'在PATH中存在的时候,就把RANLIB设置成`ranlib',或者在上述两个程序都不存在
的时候,把RANLIB设置成`:'。

宏: AC_PATH_PROG (variable, prog-to-check-for [, value-if-not-found [, path]])
类似于AC_CHECK_PROG,但在找到prog-to-check-for的时候,把variable设置成
prog-to-check-for的完整路径。
宏: AC_PATH_PROGS (variable, progs-to-check-for [, value-if-not-found [, path]]
)
类似于AC_CHECK_PROGS,但在找到任何一个progs-to-check-for的时候,把variable 设置
成找到的程序的完整路径。

库文件
下列的宏检查某些C、C++或者Fortran 77库文件是否存在。
宏: AC_CHECK_LIB (library, function [, action-if-found [, action-if-not-found
[, other-libraries]]])
依赖于当前的语言(参见对语言的选择),试图通过检查一个测试程序是否可以和库
library进行连接以获取C、C++或者Fortran 77函数function,从而确认函数function 是可
以使用的。library是库的基本名字;例如,为了检查`-lmp',就把`mp'作为参数library。

action-if-found是一个在与库成功地进行了连接的时候运行的shell命令列表;
action-if-not-found是一个在与库的连接失败的时候运行的shell命令列表。如果没有给出
action-if-found,缺省的动作就是把`-llibrary'添加到 LIBS中,并且定义
`HAVE_LIBlibrary'(全部使用大写字母)。

如果与library的连接导致了未定义符号错误(unresolved symbols),而这些错误可以通
过与其他库的连接来解决,就把这些库用空格分隔,并作为other-libraries参数给出:
`-lXt -lX11'。否则,本宏对library是否存在的检测将会失败,这是因为对测试程序的连
接将总是因为含有未定义符号错误而失败。

宏: AC_HAVE_LIBRARY (library, [, action-if-found [, action-if-not-found [,
other-libraries]]])
本宏等价于function参数为main的,对AC_CHECK_LIB的调用。此外,library可以写作
`foo'、`-lfoo'或者`libfoo.a'。对于以上任一种形式,编译器都使用`-lfoo'。但是,
library不能是一个shell变量;它必须是一个文字名(literal name)。本宏是一个过时的
宏。
宏: AC_SEARCH_LIBS (function, search-libs [, action-if-found [,
action-if-not-found [, other-libraries]]])
如果function还不可用,就寻找一个定义了function的库。这等同于首先不带库调用
AC_TRY_LINK_FUNC,而后为每个在search-libs中列举的库调用AC_TRY_LINK_FUNC。

如果找到了函数,就运行action-if-found。否则运行action-if-not-found。

如果与库library的连接导致了未定义符号错误,而这些错误可以通过与附加的库进行连接
来解决,就把这些库用空格分隔,并作为other-libraries参数给出:`-lXt -lX11'。否则
,本宏对function 是否存在的检测将总是失败,这是因为对测试程序的连接将总是因为含
有未定义符号错误而失败。

宏: AC_SEARCH_LIBS (function, search-libs[, action-if-found [,
action-if-not-found]])
本宏等价于为每个在search-libs中列举的库调用一次AC_TRY_LINK_FUNC。为找到的第一个
含有 function的库,把`-llibrary'添加到LIBS中,并且执行 action-if-found。否则就执
行action-if-not-found。

库函数
以下的宏用于检测特定的C库函数。如果没有为你需要的函数定义特定的宏,而且你不需要
检查它的任何特殊性质,那么你可以使用一个通用函数检测宏。

对特定函数的检查
这些宏用于检测特定的C函数--它们是否存在,以及在某些情况下,当给出了特定的参数时
,它们是如何响应的。
宏: AC_FUNC_ALLOCA
检测如何获得alloca。本宏试图通过检查`alloca.h'或者预定义C预处理器宏 __GNUC__和
_AIX来获得alloca的内置(builtin)版本。如果本宏找到了`alloca.h',它就定义
HAVE_ALLOCA_H。

如果上述尝试失败了,本宏就在标准C库中寻找函数。如果下列任何方法成功了,本宏就定
义HAVE_ALLOCA。否则,它把输出变量ALLOCA设置成`alloca.o'并且定义C_ALLOCA (这样程
序就可以周期性地调用`alloca(0)'以进行垃圾的收集)。本变量是从LIBOBJS中分离出来的
,因此在只有一部分程序使用LIBOBJS中的代码时,多个程序就可以不必创建实际的库而共
享ALLOCA的值。

本宏并不试图从System V R3的`libPW'中,或者从System V R4的`libucb'中获取alloca,
这是因为这些库包含了一些造成麻烦的不兼容的函数。有些版本甚至不含有alloca或者含有
带bug的版本。如果你仍然需要使用它们的alloca,用ar把`alloca.o'从这些库中提取出来
,而不是编译`alloca.c'。

使用alloca的源文件应该以如下一段代码开头,以正确地声明它。在某些AIX版本中,对
alloca 的声明必须在除了注释和预处理指令之前的任何东西之前出现。#pragma指令被缩进
(indented),以便让预标准C编译器(pre-ANSI C compiler)忽略它,而不是导致错误(
choke on it)。

/* AIX requires this to be the first thing in the file. */
#ifndef __GNUC__
# if HAVE_ALLOCA_H
# include
# else
# ifdef _AIX
#pragma alloca
# else
#  ifndef alloca /* predefined by HP cc +Olibcalls */
char *alloca ();
#  endif
# endif
# endif
#endif
宏: AC_FUNC_CLOSEDIR_VOID
如果函数closedir不返回有意义的值,就定义CLOSEDIR_VOID。否则,调用者就应该把它的
返回值作为错误指示器来进行检查。
宏: AC_FUNC_FNMATCH
如果可以使用fnmatch函数,并且能够工作(不象SunOS 5.4中的fnmatch那样),就定义
HAVE_FNMATCH。
宏: AC_FUNC_GETLOADAVG
检查如何才能获得系统平均负载。如果系统含有getloadavg函数,本宏就定义
HAVE_GETLOADAVG,并且把为了获得该函数而需要的库添加到LIBS中。

否则,它就把`getloadavg.o'添加到输出变量LIBOBJS之中,并且可能定义几个其他的C预处
理器宏和输出变量:

如果在相应的系统中,就根据系统类型定义宏SVR4、DGUX、UMAX或者UMAX4_3。
如果它找到了`nlist.h',就定义NLIST_STRUCT。
如果结构`struct nlist'含有成员`n_un',就定义NLIST_NAME_UNION。
如果在编译`getloadavg.c'时定义了LDAV_PRIVILEGED,为了使getloadavg能够工作,程序
就必须特殊地安装在系统中,并且本宏定义GETLOADAVG_PRIVILEGED。
本宏设置输出变量NEED_SETGID。如果需要进行特别的安装,它的值就是`true',否则值就
是`false'。如果NEED_SETGID为`true',本宏把KMEM_GROUP 设置成将拥有被安装的程序的
组(group)的名字。

宏: AC_FUNC_GETMNTENT
为Irix 4、PTX和Unixware在库`sun'、`seq'和`gen'中分别查找getmntent函数。那么,如
果可以使用getmntent,就定义HAVE_GETMNTENT。
宏: AC_FUNC_GETPGRP
如果getpgrp不接受参数(POSIX.1版),就定义GETPGRP_VOID。否则,它就是一个把进程
ID作为参数的BSD版本。本宏根本不检查getpgrp是否存在;如果你需要检查它的存在性,就
首先为 getpgrp函数调用AC_CHECK_FUNC。
宏: AC_FUNC_MEMCMP
如果不能使用memcmp函数,或者不能处理8位数据(就像SunOS 4.1.3中的那样),就把
`memcmp.o' 添加到输出变量LIBOBJS中去。
宏: AC_FUNC_MMAP
如果函数mmap存在并且能够正确地工作,就定义HAVE_MMAP。只检查已经映射(
already-mapped)的内存的私有固定映射(private fixed mapping)。
宏: AC_FUNC_SELECT_ARGTYPES
确定函数select的每个参数的正确类型,并且把这些类型分别定义成SELECT_TYPE_ARG1、
SELECT_TYPE_ARG234和SELECT_TYPE_ARG5。SELECT_TYPE_ARG1的缺省值是`int',
SELECT_TYPE_ARG234的缺省值是`int *', SELECT_TYPE_ARG5的缺省值是`struct timeval
*'。
宏: AC_FUNC_SETPGRP
如果setpgrp不接受参数(POSIX.1版),就定义SETPGRP_VOID。否则,该函数就是一个把两
个进程ID作为参数的BSD版本。本宏并不检查函数setpgrp是否存在;如果你需要检查该函数
的存在性,就首先为setpgrp调用AC_CHECK_FUNC。
宏: AC_FUNC_SETVBUF_REVERSED
如果函数setvbuf的第二个参数是缓冲区的类型并且第三个参数是缓冲区指针,而不是其他
形式,就定义SETVBUF_REVERSED。这是在System V第3版以前的情况。
宏: AC_FUNC_STRCOLL
如果函数strcoll存在并且可以正确地工作,就定义HAVE_STRCOLL。由于有些系统包含了错
误定义的strcoll,这时就不应该使用strcoll,因此本宏要比`AC_CHECK_FUNCS(strcoll)'
多作一些检查。
宏: AC_FUNC_STRFTIME
对于SCO UNIX,在库`intl'中查找strftime。而后,如果可以使用strftime,就定义
HAVE_STRFTIME。
宏: AC_FUNC_UTIME_NULL
如果`utime(file, NULL)'把file的时间标记设置成现在,就定义 HAVE_UTIME_NULL。
宏: AC_FUNC_VFORK
如果找到了`vfork.h',就定义HAVE_VFORK_H。如果找不到可以工作的vfork,就把vfork定
义成fork。本宏检查一些已知的vfork实现中的错误并且认为如果vfork的实现含有任何一个
错误,系统就不含有可以工作的vfork。由于子进程很少改变它们的信号句柄(signal
handler),所以如果子进程的signal调用(invocation)修改了父进程的信号句柄,将不
会被当作实现的错误。
宏: AC_FUNC_VPRINTF
如果找到了vprintf,就定义HAVE_VPRINTF。否则,如果找到了_doprnt,就定义
HAVE_DOPRNT。(如果可以使用vprintf,你就可以假定也可以使用vfprintf 和vsprintf。

宏: AC_FUNC_WAIT3
如果找到了wait3并且该函数填充它的第三个参数的内容(`struct rusage *'),就定义
HAVE_WAIT3。在HP-UX中,该函数并不这样做。
--
※ 来源:.零起点 BBS Zero.cn-bbs.org.[FROM: 220.172.236.*]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店