现有的测试

优质
小牛编辑
121浏览
2023-12-01

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

这些宏打印消息以告诉用户它们正在测试的特征,以及它们的测试结果。它们为未来运行的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 <alloca.h># 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 3.4中的fnmatch那样), 就定义HAVE—FNMATCH。

宏: AC_FUNC_GETLOADAVG

检查如何才能获得系统平均负载。如果系统含有getloadavg函数,本宏就定义HAVE—GETLOADAVG, 并且把为了获得该函数而需要的库添加到LIBS中。

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

  1. 如果在相应的系统中,就根据系统类型定义宏SVR4、DGUX、UMAX或者UMAX4—3。

  2. 如果它找到了'nlist.h',就定义NLIST—STRUCT。

  3. 如果结构'struct nlist'含有成员'n—un',就定义NLIST—NAME—UNION。

  4. 如果在编译'getloadavg.c'时定义了LDAV—PRIVILEGED,为了使getloadavg能够 工作,程序就必须特殊地安装在系统中,并且本宏定义GETLOADAVG—PRIVILEGED。

3. 本宏设置输出变鼠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—ARGS。SELECT—TYPE—ARG1的缺省值 是'int',SELECT—TYPE—ARG234的缺省值

是'int *', SELECT—TYPE—ARGS的缺省值是'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中,该函数并不这样做。

对普通函数的检查

这些宏被用于寻找没有包括在特定函数测试宏中的函数。如果函数可能出现在除了缺省C库以外的库中,就 要首先为这些库调

用AC—CHECK—LIB。如果你除了需要检查函数是否存在之外,还要检查函数 的行为,你就不得不为此而编写你自己的测试(参见 编写测试 )。

宏: AC_CHECK_FUNC function, [action—if—found [, action—if—not—found]])

如果可以使用C函数function,就运行shell命令action—if—found,否则运行 action—if—not—found。如果你只希望在函数可用的时候定义一个符号,就考虑使用 AC—CHECK—FUNCS。由于C++比C更加标准化,即使在调用了AC—LANG—CPLUSPLUS 的时候,本宏仍然用C的连接方式对函数进行检查。(关于为测试选择语言的详情,请参见 对语言的选择 )

宏: AC_CHECK_FUNCS function... [, action—if—found [, action—if—not—found]])

对于每个在以空格分隔的函数列表function中出现的函数,如果可用,就定义HAVE—function (全部大写)。如果给出

了action—if—found,它就是在找到一个函数的时候执行的附加的shell代码。你可以给出 'break'以便在找到第一个匹配的时候跳出循环。如果给出了action—if—not—found,它就在找不到 某个函数的时候执行。

宏: AC_REPLACE_FUNCS function...)

本宏的功能就类似于以将'function.o'添加到输出变鼠LIBOBJS的shell 代码为参数action—if—not—found,调用AC—CHECK—FUNCS。你可以通过用 '#ifndef HAVE—function'包围你为函数提供的替代版本的原型来声明函数。 如果系统含

有该函数,它可能在一个你应该引入的头文件中进行声明,所以你不应该重新声明它,以避免声明冲突。

头文件

下列宏检查某些C头文件是否存在。如果没有为你需要检查的头文件定义特定的宏,而且你不需要检查它的任何特殊 属性,那么你就可以使用一个通用的头文件检查宏。

对特定头文件的检查

这些宏检查特定的系统头文件——它们是否存在,以及在某些情况下它们是否定义了特定的符号。

宏: AC_DECL_SYS_SIGLIST

如果在系统头文件,'signal.h'或者'unistd.h',中定义了变鼠sys—siglist, 就定义SYS—SIGLIST—DECLARED。

宏: AC_DIR_HEADER

类似于调用AC—HEADER—DIRENT和AC—FUNC—CLOSEDIR—VOID,但为了指明找到了 哪个头文件而定义了不同的一组C预处理器宏。本宏和它定义的名字是过时的。它定义的名字是:

'dirent.h'DIRENT'sys/ndir.h'SYSNDIR'sys/dir.h'SYSDIR'ndir.h'NDIR

此外,如果closedir不能返回一个有意义的值,就定义VOID—CLOSEDIR。

宏: AC_HEADER_DIRENT

对下列头文件进行检查,并且为第一个找到的头文件定义'DIR',以及列出的C预处理器宏:

'dirent.h'HAVE—DIRENT—H'sys/ndir.h'HAVE—SYS—NDIR—H'sys/dir.h'HAVE—SYS—DIR—H'ndir.h'HAVE—NDIR—H

源代码中的目录库声明应该以类似于下面的方式给出:

#if HAVE—DIRENT—H# include <dirent.h># define NAMLEN(dirent) strlen((dirent)->d—name)#else# define dirent direct# define NAMLEN(dirent) (dirent)->d—namlen# if HAVE—SYS—NDIR—H# include <sys/ndir.h># endif# if HAVE—SYS—DIR—H# include <sys/dir.h># endif# if HAVE—NDIR—H# include <ndir.h># endif#endif

使用上述声明,程序应该把变鼠定义成类型struct dirent,而不是struct direct,并且应该 通过把指向struct direct的指针传递给宏NAMLEN来获得目录项的名称的长度。

本宏还为SCO Xenix检查库'dir'和'x'。

宏: AC_HEADER_MAJOR

如果'sys/types.h'没有定义major、minor和makedev, 但'sys/mkdev.h'定义了它们,就定义MAJOR—IN—MKDEV 否则,如果'sys/sysmacros.h'定义了它们,就定义MAJOR—IN—SYSMACROS。

宏: AC_HEADER_STDC

如果含有标准C(ANSI C)头文件,就定义STDC—HEADERS。 特别地,本宏检

查'stdlib.h'、'stdarg.h'、'string.h'和'float.h' 如果系统含有这些头文件,它可能也含有其他的标准C头文件。本宏还检查'string.h'是否定义了memchr (并据此对其他mem函数做出假定),'stdlib.h'是否定义了free(并据此

对malloc和其他相关函数做出假定),以及'ctype.h'宏是否按照标准C的要求而可以 用于被设置了高位的字符。

因为许多含有GCC的系统并不含有标准C头文件,所以用STDC—HEADERS而不是——STDC—— 来决定系统是否含有服从标准(ANSI—compliant)的头文件(以及可能的C库函数)。

在没有标准C头文件的系统上,变种太多,以至于可能没有简单的方式对你所使用的函数进行定义以 使得它们与系统头文件声明的函数完全相同。某些系统包含了ANSI和BSD函数的混合 某些基本上是标准(ANSI) 的,但缺少'memmove' 有些系统

在'string.h'或者'strings.h'中以宏的方式 定义了BSD函数 有些系统除了含有'string.h'之外,只含有BSD函数 某些系统在'memory.h' 中定义内存函数,有些在'string.h'中定义 等等。对于一个字符串函数和一个内存函数的检查可能 就够了 如果库含有这些函数的标准版,那么它就可能含有其他大部分函数。如果你在'configure.in' 中安放了如下代码:

AC—HEADER—STDCAC—CHECK—FUNCS(strchr memcpy)

那么,在你的代码中,你就可以像下面那样放置声明:

#if STDC—HEADERS# include <string.h>#else# ifndef HAVE—STRCHR# define strchr index# define strrchr rindex# endifchar *strchr (), *strrchr ();# ifndef HAVE—MEMCPY# define memcpy(d, s, n) bcopy ((s), (d), (n))# define memmove(d, s, n) bcopy ((s), (d), (n))# endif#endif

如果你使用没有等价的BSD版的函数,诸如memchr、memset、strtok 或者strspn,那么仅仅使用宏就不够了 你必须为每个函数提供一个实现。以memchr为例, 一种仅仅在需要的时候(因为系统C库中的函数可能经过了手工优化)与你的实现协作的简单方式是把实现放入 'memchr.c'并且使用'AC—REPLACE—FUNCS(memchr)'。

宏: AC_HEADER_SYS_WAIT

如果'sys/wait.h'存在并且它和POSIX.1相兼容,就定义HAVE—SYS—WAIT—H。 如果'sys/wait.h'不存在,或者如果它使用老 式BSD union wait,而不是 int来储存状态值,就可能出现不兼容。如果'sys/wait.h'不与POSIX.1兼容, 那就不是引入该头文件,而是按照它们的常见解释定义POSIX.1宏。下面是一个例子:

#include <sys/types.h>#if HAVE—SYS—WAIT—H# include <sys/wait.h>#endif#ifndef WEXITSTATUS# define WEXITSTATUS(stat—val) ((unsigned)(stat—val) >> 8)#endif#ifndef WIFEXITED# define WIFEXITED(stat—val) (((stat—val) & 2SS) == 0)#endif

宏: AC_MEMORY_H

在'string.h'中,如果没有定义memcpy, memcmp等函数,并且'memory.h' 存在,就定义NEED—MEMORY—H。本宏已经过时 可以用AC—CHECK—HEADERS(memory.h)来代替。 参见为AC—HEADER—STDC提供的例子。

宏: AC_UNISTD_H

如果系统含有'unistd.h',就定义HAVE—UNISTD—H。本宏已经过时 可以用 'AC—CHECK—HEADERS(unistd.h)'来代替。

检查系统是否支持POSIX.1的方式是:

#if HAVE—UNISTD—H# include <sys/types.h># include <unistd.h>#endif#ifdef —POSIX—VERSION/* Code for POSIX.1 systems. */#endif

在POSIX.1系统中包含了'unistd.h'的时候定义—POSIX—VERSION。 如果系统中没有'unistd.h',那么该系统就一定不是POSIX.1系统。但是,有些非POSIX.1(non—POSIX.1) 系统也含有'unistd.h'。

宏: AC_USG

如果系统并不含有'strings.h'、rindex、bzero等头文件或函数,就定义USG。 定义USG就隐含地表明了系统含有'string.h'、strrchr、memset等头文件或函数。

符号USG已经过时了。作为本宏的替代,参见为AC—HEADER—STDC提供的例子。

对普通头文件的检查

这些宏被用于寻找没有包括在特定测试宏中的系统头文件。如果你除了检查头文件是否存在之外还要检查它的内容, 你就不得不为此而编写你自己的测试(参见 编写测试 )。

宏: AC_CHECK_HEADER header—file, [action—if—found [, action—if—not—found]])

如果系统头文件header—file存在,就执行shell命令action—if—found, 否则执行action—if—not—found。如果你只需要在可以使用头文件的时候定义一个符号,就考虑使用 AC—CHECK—HEADERS。

宏: AC_CHECK_HEADERS header—file... [, action—if—found [, action—if—not—found]])

对于每个在以空格分隔的参数列表header—file出现的头文件,如果存在,就定义 HAVE—header-file(全部大写)。如果给出

了action—if—found, 它就是在找到一个头文件的时候执行的附加shell代码。你可以把'break'作为它的值 以便在第一次匹配的时候跳出循环。如果给出了action—if—not—found,它就在找不到 某个头文件的时候被执行。

结构

以下的宏检查某些结构或者某些结构成员。为了检查没有在此给出的结构,使用AC—EGREP—CPP (参见 检验声明 )或者使用AC—TRY—COMPILE (参见 检验语法 )。

宏: AC_HEADER_STAT

如果在'sys/stat.h'中定义的S—ISDIR、S—ISREG等宏不能正确 地工作(返回错误的正数),就定义STAT—MACROS—BROKEN。这种情况出现在Tektronix UTekV、 Amdahl UTS和Motorola System V/88上。

宏: AC_HEADER_TIME

如果程序可能要同时引入'time.h'和'sys/time.h',就定义TIME—WITH—SYS—TIME。 在一些老式系统中,'sys/time.h'引入了'time.h',但'time.h'没有用多个包含保护 起来,所以程序不应该显式地同时包含这两个文件。例如,本宏在既使用struct timeval或 struct timezone,又使用struct tm程序中有用。它最好和 HAVE—SYS—TIME—H一起使用,该宏可以通过调

用AC—CHECK—HEADERS(sys/time.h)来检查。

#if TIME—WITH—SYS—TIME# include <sys/time.h># include <time.h>#else# if HAVE—SYS—TIME—H# include <sys/time.h># else# include <time.h># endif#endif

宏: AC_STRUCT_ST_BLKSIZE

如果struct stat包含一个st—blksize成员,就定义HAVE—ST—BLKSIZE。

宏: AC_STRUCT_ST_BLOCKS

如果struct stat包含一个st—blocks成员,就定义HAVE—ST—BLOCKS。 否则,就把'fileblocks.o'添加到输出变鼠LIBOBJS中。

宏: AC_STRUCT_ST_RDEV

如果struct stat包含一个st—rdev成员,就定义HAVE—ST—RDEV。

宏: AC_STRUCT_TM

如果'time.h'没有定义struct tm,就定义TM—IN—SYS—TIME,它意味着 引入'sys/time.h'将得到一个定义得更好的struct

tm。

宏: AC_STRUCT_TIMEZONE

确定如何获取当前的时区。如果struct tm有tm—zone成员,就定义HAVE—TM—ZONE。 否则,如果找到了外部数组tzname,就定义HAVE—TZNAME。

类型定义

以下的宏检查C typedefs。如果没有为你需要检查的typedef定义特定的宏,并且你不需要检查该类型 的任何特殊的特征,那么你可以使用一个普通的typedef检查宏。

对特定类型定义的检查

这些宏检查在'sys/types.h'和'stdlib.h'(如果它存在)中定义的特定的C typedef。 宏: AC_TYPE_GETGROUPS

把GETGROUPS—T定义成getgroups的数组参数的基类型gid—t或者int。

宏: AC_TYPE_MODE_T

如果没有定义mode—t,就把mode—t定义成int。

宏: AC_TYPE_OFF_T

如果没有定义off—t,就把off—t定义成long。

宏: AC_TYPE_PID_T

如果没有定义pid—t,就把pid—t定义成int。

宏: AC_TYPE_SIGNAL

如果'signal.h'把signal声明成一个指向返回值为void的函数的指针, 就把RETSIGTYPE定义成void 否则,就把它定义成int。

把信号处理器(signal handler)的返回值类型定义为RETSIGTYPE:

RETSIGTYPEhup—handler (){...}

宏: AC_TYPE_SIZE_T

如果没有定义size—t,就把size—t定义成unsigned。

宏: AC_TYPE_UID_T

如果没有定义uid—t,就把uid—t定义成int并且把 gid—t定义成int。

对普通类型定义的检查

本宏用于检查没有包括在特定类型测试宏中的typedef。

宏 : AC_CHECK_TYPE type, default)

如果'sys/types.h'或者'stdlib.h'或者'stddef.h'存在,而类型 type没有在它们之中被定义,就把type定义成C(或者C++)预定义类型 default 例如,'short'或者'unsigned'。

C编译器的特征

下列宏检查C编译器或者机器结构的特征。为了检查没有在此列出的特征,使用AC—TRY—COMPILE (参见 检验语法 )或者AC—TRY—RUN

(参见 检查运行时的特征 )

宏: AC_C_BIGENDIAN

如果字(word)按照最高位在前的方式储存(比如Motorola和SPARC,但不包括Intel和VAX,CPUS),就定义

WORDS—BIGENDIAN。

宏: AC_C_CONST

如果C编译器不能完全支持关键字const,就把const定义成空。有些编译器并不定义 ——STDC——,但支持const 有些编译器定 义——STDC——,但不能完全支持 const。程序可以假定所有C编译器都支持const,并直接使用它 对于那些不能完全 支持const的编译器,'Makefile'或者配置头文件将把const定义为空。

宏: AC_C_INLINE

如果C编译器支持关键字inline,就什么也不作。如果C编译器可以接受——inline——或者——inline,就把inline定义成可接受的关键字,否则就把inline定义为空。

宏: AC_C_CHAR_UNSIGNED

除非C编译器预定义了——CHAR—UNSIGNED——,如果C类型char是无符号的,就定义 ——CHAR—UNSIGNED——。

宏: AC_C_LONG_DOUBLE

如果C编译器支持long double类型,就定义HAVE—LONG—DOUBLE。 有些C编译器并不定义——STDC——但支持long double类型 有些编译器定义 ——STDC——但不支持long double。

宏: AC_C_STRINGIZE

如果C预处理器支持字符串化操作符(stringizing operator),就定义HAVE—STRINGIZE。字符串化操作符是 '#'并且它在宏定义中以如下方式出现:

#define x(y) #y

宏: AC_CHECK_SIZEOF type [, cross—size])

把SIZEOF—uctype定义为C(或C++)预定义类型type的,以字节为单位的大小, 例如'int' or 'char *'。如果编译器不能识 别'type',它就被定义为0。 uctype就是把type中所有小写字母转化为大写字母,空格转化成下划线,星号转化成'P' 而得到的名字。在交叉编译中,如果给出了cross—size,就使用它,否则configure就 生成一个错误并且退出。

例如,调用

AC—CHECK—SIZEOF(int *)

在DEC Alpha AXP系统中,把SIZEOF—INT—P定义为8。 宏: AC_INT_16_BITS

如果C类型int是16为宽,就定义INT—16—BITS。本宏已经过时 更常见的方式是用 'AC—CHECK—SIZEOF(int)'来代替。

宏: AC_LONG_64_BITS

如果C类型long int是64位宽,就定义LONG—64—BITS。 本宏已经过时 更常见的方式是用'AC—CHECK—SIZEOF(long)'来代替。

Fortran 77编译器的特征

下列的宏检查Fortran 77编译器的特征。为了检查没有在此列出的特征,使用AC—TRY—COMPILE (参见 检验语法 )或者AC—TRY—RUN (参见 检验运行时的特征 ),但首先必须确认当前语言被设置成 Fortran 77 AC—LANG—FORTRAN77(参见 对语言的选择 )。

宏: AC_F77_LIBRARY_LDFLAGS

为成功地连接Fotran 77或者共享库而必须的Fortran 77内置函数(intrinsic)和运行库确定连接选项 (例如,'-L'和'-l')。输出变鼠FLIBS被定义为这些选项。

本宏的目的是用于那些需要把C++和Fortran 77源代码混合到一个程序或者共享库中的情况 (参见GNU Automake中的 Mixing Fortran 77 With C and C++ 节)。

例如,如果来自C++和Fortran 77编译器的目标文件必须被连接到一起,那么必须用C++编译器/连接器来连接 (因为有些C++特定的任务要在连接时完成,这样的任务有调用全局构造函数、模板的实例化、启动例外 (exception)支持,等等)。

然而,Fortran 77内置函数和运行库也必须被连接,但C++编译器/连接器在缺省情况下不知道如何添加这些 Fortran 77库。因此,就创建AC—F77—LIBRARY—LDFLAGS宏以确认这些Fortran 77库。

系统服务

下列宏检查操作系统服务或者操作系统能力。 宏: AC_CYGWIN

检查Cygwin环境。如果存在,就把shell变鼠CYGWIN设置成'yes'。 如果不存在,就把CYGWIN设置成空字符串。

宏: AC_EXEEXT

根据编译器的输出,定义替换变鼠EXEEXT,但不包括.c、.o和.obj文件。 对于Unix来说典型的值为空,对Win32来说典型的值为'.exe'或者'.EXE'。

宏: AC_OBJEXT

根据编译器的输出,定义替换变鼠OBJEXT,但不包括.c文件。 对于Unix来说典型的值为'.o',对Win32来说典型的值为'.obj'。

宏: AC_MINGW32

检查MingW32编译环境。如果存在,就把shell变鼠MINGW32设置成'yes'。 如果不存在,就把MINGW32设置成空。

宏: AC_PATH_X

试图找到X Window系统的头文件和库文件。如果用户给出了命令行选项'--x-includes=dir'和 '--x-libraries=dir',就使用这些目录。如果没有给出任一个选项,或者都没有给出,就通过 运行xmkmf以处理一个测试'Imakefile',并且检查它所生成的'Makefile',来得到没有 给出的目录。如果这失败了(比如说,xmkmf不存在),就在它们通常存在的几个目录中寻找。如果任何一种 方法成功了,就把shell变鼠x—includes和x—libraries设置成相应的位置,除非这些目录就在 编译器搜索的缺省目录中。

如果两种方法都失败了,或者用户给出命令行选项'--without-x',就把shell变鼠no—x 设置成'yes' 否则就把它设置成空字符串。

宏: AC_PATH_XTRA

AC—PATH—X的增强版。它把X需要的C编译器选项添加到输出变鼠X—CFLAGS,并且把 X的连接选项添加到X—LIBS。如果不能使用X系统,就把'-DX—DISPLAY—MISSING' 设置成X—CFLAGS。

本宏还检查在某些系统中为了编译X程序而需要的特殊库。它把所有系统需要的库添加到输出变鼠X—EXTRA—LIBS。 并且它检查需要在'-lX11'之前被连接的特殊X11R6库,并且把找到的所有库添加到输出变鼠X—PRE—LIBS。

宏: AC_SYS_INTERPRETER

检查系统是否支持以形式为'#! /bin/csh'的行开头的脚本选择执行该脚本的解释器。 在运行本宏之后,configure.in中

的shell代码就可以检查shell变鼠interpval 如果系统支持'#!',interpval将被设置成'yes',如果不支持 就设置成'no'。

宏: AC_SYS_LONG_FILE_NAMES

如果系统支持长于14个字符的文件名,就定义HAVE—LONG—FILE—NAMES。

宏: AC_SYS_RESTARTABLE_SYSCALLS

如果系统自动地重新启动被信号所中断的系统调用,就定义HAVE—RESTARTABLE—SYSCALLS。

UNIX变种

下列宏检查对于有些程序来说需要特殊处理的一些操作系统,这是因为它们的头文件或库文件中含有特别 怪异的东西。这些宏不讨入喜欢 它们将根据它们所支持的函数或者它们提供的环境,被更加系统化的方法所代替。

宏: AC_AIX

如果在AIX系统中,就定义—ALL—SOURCE。允许使用一些BSD函数。应该在所有运行C编译器的宏之前 调用本宏。

宏: AC_DYNIX_SEQ

如果在Dynix/PTX Sequent UNIX)系统中,就把'-lseq'添加到输出变鼠LIBS中。 本宏已经过时 用AC—FUNC—GETMNTENT来代替。

宏: AC_IRIX_SUN

如果在IRIX Silicon Graphics UNIX)系统中,就把'-lsun'添加到输出变鼠LIBS中。 本宏已经过时。如果你用本宏来获取getmntent,就用AC—FUNC—GETMNTENT来代替。 如果你为了口令(password)和组函数的NIS版本而使用本宏,就用'AC—CHECK—LIB(sun, getpwnam)'来代替。

宏: AC_ISC_POSIX

如果在POSIX化(POSIXized) ISC UNIX系统中,就定义—POSIX—SOURCE,并且把'-posix' (对于GNU C编译器)或者'-Xp'(对于其他C编译器)添加到输出变鼠CC中。本宏允许使用 POSIX工具。必须在调用AC—PROG—CC之后,在调用其他任何运行C编译器的宏之前,调用本宏。

宏: AC_MINIX

如果在Minix系统中,就定义—MINIX和—POSIX—SOURCE,并且把—POSIX—1—SOURCE 定义成2。本宏允许使用POSIX工具。应该在所有运行C编译器的宏之前调用本宏。

宏: AC_SCO_INTL

如果在SCO UNIX系统中,就把'-lintl'添加到输出变鼠LIBS。本宏已经过时 用AC—FUNC—STRFTIME来代替。

宏: AC_XENIX_DIR

如果在Xenix系统中,就把'-lx'添加到输出变鼠LIBS。还有,如果使用了'dirent.h', 就把'-ldir'添加到LIBS。本宏已经过时 用AC—HEADER—DIRENT来代替。