下列宏用于在configure的时候检查特定程序————是否存在, 或则特定情况下是否具有某些特征。
完整代码下载链接: http://download.youkuaiyun.com/detail/zlyong0018/6703171
----宏: AC_PROG_AWK
按循序探测gawk, mawk, nawk以及awk, 并将变量AWK设置为第一个被探测到上述程序。
echo "begin checking awk ..."
AC_PROG_AWK
echo "\$AWK = $AWK"
echo "\$ac_cv_prog_AWK = $ac_cv_prog_AWK"
AC_PATH_PROG([AWK], [$AWK])
echo "\$AWK = $AWK"
if test "x$AWK" = x
then
AC_MSG_ERROR(["I cannot find gawk/mawk/nawk/awk, make sure it is installed and in your PATH"])
fi
运行结果:
# ./configure
begin checking awk ...
checking for gawk... gawk
$AWK = gawk
$ac_cv_prog_AWK = gawk
checking for gawk... /usr/bin/gawk
$AWK = /usr/bin/gawk
configure: creating ./config.status
----宏:AC_PROG_GREP
寻找能够接受最长输入行且能接受-e操作符的grep或ggrep。 并将结果赋值给GREP变量。
----宏: AC_PROG_EGREP
检查$GREP -E是否正常, 否则寻找能够接受最长输入行的egrep或gegrep, 并将结果赋值给EGREP
----宏: AC_PROG_FGREP
检查$GREP -F是否正常, 否者寻找能够接受最长输入行的fgrep或gfgrep, 并将结果赋值给FGREP
# checking grep
echo "begin checking grep"
AC_PROG_GREP
echo "\$GREP = $GREP"
echo "\$ac_cv_path_GREP = $ac_cv_path_GREP"
AC_PATH_PROG([GREP], [$GREP])
echo "\$GREP = $GREP"
if test "x$GREP" = $GREP
then
AC_MSG_ERROR(["I cannot find grep/ggrep, make sure it is installed and in your PATH"])
fi
echo ""
# checking EGREP
echo "begin checking EGREP"
AC_PROG_EGREP
echo "\$EGREP = $EGREP"
echo "\$ac_cv_path_EGREP = $ac_cv_path_EGREP"
echo ""
# checking FGREP
echo "begin checking FGREP"
AC_PROG_FGREP
echo "\$FGREP = $FGREP"
echo "\$ac_cv_path_FGREP = $ac_cv_path_FGREP"echo ""
运行结果:
# ./configure
begin checking grep
checking for grep that handles long lines and -e... /bin/grep
$GREP = /bin/grep
$ac_cv_path_GREP = /bin/grep
checking for /bin/grep... (cached) /bin/grep
$GREP = /bin/grep
begin checking EGREP
checking for egrep... /bin/grep -E
$EGREP = /bin/grep -E
$ac_cv_path_EGREP = /bin/grep -E
begin checking FGREP
checking for fgrep... /bin/grep -F
$FGREP = /bin/grep -F
$ac_cv_path_FGREP = /bin/grep -F
configure: creating ./config.status
----宏: AC_PROG_INSTALL
如果在PATH中找到了BSD兼容的install程序, 则将该程序赋值给INSTALL(实际观察中INSTALL带了-c选项)。 否则将INSTALL赋值为“dir/install-sh -c”, 其中dir由AC_CONFIG_AUX_DIR指定或为默认目录。 同时将INSTALL_PROGRAM和INSTALL_SCRIPT设定为“${INSTALL}”, 将INSTALL_DATA设定为 “${INSTALL} -m 644”
“@INSTALL@”比较特殊, 随着不同的配置文件的不同, 他的值可能不同。
这个宏打印出install程序不能工作的情况。为了更高的效率, 它更倾向于寻找一个C程序, 而非shell脚本。 可以使用install.sh来替代install-sh, 但install.sh已经被淘汰了, 因为有些make程序在没有Makefile的情况下可以通过一套规则从install.sh中创建出一个install。 随后这个宏通过一个队install的简单调用将多个文件安装到目标目录。
Autoconf自带了一个你可以使用的install-sh的拷贝。 如果你使用了AC_PROG_INSTALL, 则你的发布版中必须包含install-sh或者install.sh。 否则configure会产生一条错误信息提示你找不到这些脚本(程序), 即使你使用的系统中包含了一个可用的install程序。 这是一个安全措施, 以避免你不小心遗失了install-sh/install.sh(这将导致你的程序包在没有BSD兼容的系统无法安装)。
echo "begin checking INSTALL ..."
AC_PROG_INSTALL
echo "\$INSTALL = $INSTALL"
echo "\$INSTALL_PROGRAM = $INSTALL_PROGRAM"
echo "\$INSTALL_SCRIPT = $INSTALL_SCRIPT"
echo "\$INSTALL_DATA = $INSTALL_DATA"
echo ""
运行结果:
# ./configure
begin checking INSTALL ...
$INSTALL = /usr/bin/install -c
$INSTALL_PROGRAM = ${INSTALL}
$INSTALL_SCRIPT = ${INSTALL}
$INSTALL_DATA = ${INSTALL} -m 644
configure: creating ./config.status
----宏: AC_PROG_MKDIR_P
寻找一个能够创建参数指定的目录及在指定目录的上层目录不存在的情况能同时创建上层目录的程序, 同时该程序在两个进程同时创建相同目录的时候不能发生竞态, 并把改程序赋值给MKDIR_P。
如果可能, 该宏将使用“mkdir -p”命令, 否则将退而使用install-sh并指定-d选项, 所以你的软件包里需要像AC_PROG_INSTALL里描述的一样包含install-sh。Autoconf 2.60或Automake 1.10前的install-sh在竞态条件下很脆弱。所以如果你需要在同一个目录里并行安装两个不同的程序包时, 你需要确保一个最新的install-sh。 特别的, 如果你的Automake在于1.10版本, 小心使用“autoreconf -if”。
不同的配置文件, “@MKDIR_P@”的值也可能不同。
echo "begin checking MKDIR_P"
AC_PROG_MKDIR_P
echo "\$MKDIR_P = $MKDIR_P"
echo "\$ac_cv_path_mkdir = $ac_cv_path_mkdir"
运行结果:
$ ./configure
begin checking MKDIR_P
$MKDIR_P = /bin/mkdir -p
$ac_cv_path_mkdir = /bin/mkdir
configure: creating ./config.status
----宏: AC_PROG_LEX
如果发现了flex, 则将变量LEX设置为发flex, 并且其库在标准位置则将LEXLIB设置为-lfl。否则如果lex和他的库被发现的话则将LEX和LEXLIB分别设为lex和-ll。如果flex和lex都没faxian, 则将LEX设置为“:”。 LEX_OUTPUT_ROOT也被设置为lexer产生的文件的名字,通常为lex.yy。
在configure运行的同时会删除配置目录下命名为lex.yy.c或lexyy.c的文件。
echo "begin checking LEX ..."
AC_PROG_LEX
echo "\$LEX = $LEX"
echo "\$ac_cv_prog_LEX = $ac_cv_prog_LEX"
echo "\$LEXLIB = $LEXLIB"
echo "\$LEX_OUTPUT_ROOT = $LEX_OUTPUT_ROOT"
AC_PATH_PROG([LEX], [$LEX])
echo "\$LEX = $LEX"
if test "x$LEX" = x
then
AC_MSG_ERROR(["I cannot find flex/lex, make sure it is installed and in your PATH"])
fi
运行结果:
$ ./configure
begin checking LEX ...
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... none
checking for flex... flex
checking lex output file root... lex.yy
checking lex library... -lfl
checking whether yytext is a pointer... yes
$LEX = flex
$ac_cv_prog_LEX = flex
$LEXLIB = -lfl
$LEX_OUTPUT_ROOT = lex.yy
checking for flex... /usr/bin/flex
$LEX = /usr/bin/flex
configure: creating ./config.status
config.status: executing depfiles commands
----宏:AC_PROG_LN_S
如果“ln -s”在当前系统中可以正常工作(当前系统支持符号链接), 则将LN_S赋值为“ln -s”。否则如果“ln”能正常工作的话, 则将LN_S赋值为“ln”。 在不然就赋值为“cp -pR”。
如果你创建链接的目录不是当前目录, 建议先进入到目标目录再进行ln(原因暂时我也不知道, 貌似ln或ln -s其中一个可能存在问题)。
----宏: AC_PROG_RANLIB
如果能找到ranlib, 则将RANLIB设置为“ranlib”, 否则设置为“:”
----宏: AC_PROG_SED
将SED赋值为一个符合POSIX且没有任意长度限制的sed实现。 如果没有合适的sed实现, 则报错。
----宏: AC_PROG_YACC
如果能找到bison, 则将YACC设置为“bison -y”。 否则如果能找到byacc, 则将YACC设置为“byacc”。 再不然就将YACC设置为“yacc”。
echo "begin checking LN_S ..."
AC_PROG_LN_S
echo "\$LN_S = $LN_S"
echo ""
echo "begin checking RANLIB ..."
AC_PROG_RANLIB
echo "\$RANLIB = $RANLIB"
AC_PATH_PROG([RANLIB], [$RANLIB])
echo "\$RANLIB = $RANLIB"
if test "x$RANLIB" = x
then
AC_MSG_ERROR(["I cannot find ranlib, make sure it is installed and in your PATH"])
fi
echo ""
echo "begin checking SED ..."
AC_PROG_SED
echo "\$SED = $SED"
echo "\$ac_cv_path_SED = $ac_cv_path_SED"
echo ""
echo "begin checking YACC ..."
AC_PROG_YACC
echo "\$YACC = $YACC"
echo "\$ac_cv_prog_YACC = $ac_cv_prog_YACC"
AC_PATH_PROG([YACC_PATH], [$YACC])
echo "\$YACC_PATH = $YACC"
if test "x$YACC_PATH" = x
then
AC_MSG_ERROR(["I cannot find bison/byacc/yacc, make sure it is installed and in your PATH"])
fi
运行结果:
$ ./configure
begin checking LN_S ...
checking whether ln -s works... yes
$LN_S = ln -s
begin checking RANLIB ...
checking for ranlib... ranlib
$RANLIB = ranlib
checking for ranlib... /usr/bin/ranlib
$RANLIB = /usr/bin/ranlib
begin checking SED ...
checking for a sed that does not truncate output... /bin/sed
$SED = /bin/sed
$ac_cv_path_SED = /bin/sed
begin checking YACC ...
checking for bison... bison -y
$YACC = bison -y
$ac_cv_prog_YACC = bison -y
checking for bison... /usr/bin/bison
$YACC_PATH = bison -y
configure: creating ./config.status
config.status: executing depfiles commands