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

对特定程序的检查

这些宏检查特定的程序--它们是否存在,并且在某些情况下它们是否支持一些特征。

  • 宏: 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,否则就设置成:(什么也不作)。
    该宏的作用: 用于在 ​​configure 脚本​​ 中检测系统是否安装了 ranlib 工具,并设置 RANLIB 变量供后续使用。
    ranlib 是什么?ranlib 是一个 Unix/Linux 工具,用于​​生成静态库(.a 文件)的符号索引​​(即 __.SYMDEF 或 .SYM 文件)。它通常用于​​优化静态库的链接速度​​,使链接器(ld)能更快地查找库中的符号。在现代系统中,ar(归档工具)可能已经内置了 ranlib 的功能(如 ar -s),因此 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 设置成找到的程序的完整路径。