完整代码下载: http://download.csdn.net/detail/zlyong0018/6709923
----宏: AC_CHECK_PROG(variable, prog-to-check-for, value-if-found, [value-if-not-found], [path = '$PATH'], [reject])
检查prog-to-check-for是否存在path中。 如果找到, 则将variable设为value-if-found,否则设为value-if-not-found。 在检查的时候通常略过reject(绝对路径表示的程序路径),如果reject被略过且找到下一个符合的程序, 则将variable设置为该程序的绝对路径。 如果variable已经被赋值, 不做任何事情。 该宏还会为variable调用AC_SUBST。
注意: 不要对同一个variable多次调用AC_CHECK_PROG, 经验证, 同一个variable的后续的调用很有可能给出一个错误的结果。
- echo "[AC@&t@_CHECK_PROG([COMPILER], [gcc], [gcc], , [\$PATH], [/usr/bin/gcc])]"
- AC_CHECK_PROG([COMPILER], [gcc], [gcc], , [$PATH], [/usr/bin/gcc])
- echo "\$COMPILER = $COMPILER"
- echo "\$ac_cv_prog_COMPILER = $ac_cv_prog_COMPILER"
- echo ""
- echo "[AC@&t@_CHECK_PROG([COMPILER2], [gcc], [gcc], , [\$PATH], [/usr/local/bin/gcc])]"
- AC_CHECK_PROG([COMPILER2], [gcc], [gcc], , [$PATH], [/usr/local/bin/gcc])
- echo "\$COMPILER2 = $COMPILER2"
- echo "\$ac_cv_prog_COMPILER2 = $ac_cv_prog_COMPILER2"
- echo ""
- COMPILER=
- ac_cv_prog_COMPILER=
- echo "[AC@&t@_CHECK_PROG([COMPILER], [gdb], [gdb])]"
- AC_CHECK_PROG([COMPILER], [gdb], [gdb])
- echo "\$COMPILER = $COMPILER"
- echo "\$ac_cv_prog_COMPILER = $ac_cv_prog_COMPILER"
- echo ""
- echo "[AC@&t@_CHECK_PROG([DEBUGER], [gdb], [gdb])]"
- AC_CHECK_PROG([DEBUGER], [gdb], [gdb])
- echo "\$DEBUGER = $DEBUGER"
- echo "\$ac_cv_prog_DEBUGER = $ac_cv_prog_DEBUGER"
运行及结果:
- $ touch /usr/local/bin/gcc
- $ chmod +x /usr/local/bin/gcc
- $ ./configure
- AC_CHECK_PROG([COMPILER], [gcc], [gcc], , [$PATH], [/usr/bin/gcc])
- checking for gcc... gcc
- $COMPILER = gcc
- $ac_cv_prog_COMPILER = gcc
- AC_CHECK_PROG([COMPILER2], [gcc], [gcc], , [$PATH], [/usr/local/bin/gcc])
- checking for gcc... /usr/bin/gcc
- $COMPILER2 = /usr/bin/gcc
- $ac_cv_prog_COMPILER2 = /usr/bin/gcc
- AC_CHECK_PROG([COMPILER], [gdb], [gdb])
- checking for gdb... (cached) no
- $COMPILER =
- $ac_cv_prog_COMPILER =
- AC_CHECK_PROG([DEBUGER], [gdb], [gdb])
- checking for gdb... gdb
- $DEBUGER = gdb
- $ac_cv_prog_DEBUGER = gdb
----宏: 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。
注意: 如果variable在传入前就被赋值, 这个宏可能不能达到预期的效果。
- echo "[AC@&t@_CHECK_PROGS([PROG_LIST], [ggg gcc gdb vi gccc])]"
- AC_CHECK_PROGS([PROG_LIST], [ggg gcc gdb vi gccc])
- echo "\$PROG_LIST = $PROG_LIST"
运行结果:
- $ ./configure
- AC_CHECK_PROGS([PROG_LIST], [ggg gcc gdb vi gccc])
- checking for ggg... no
- checking for gcc... gcc
- $PROG_LIST = gcc
----宏: AC_CHECK_TARGET_TOOL
在学习该宏前先提一个前提知识点:
--build=编译程序所在的主机系统
--host=编译出来程序运行的主机系统
--target=用你当前编译出来的工具所编译出来的程序运行的主机系统
首先查找以target类型作为前缀的prog-to-check-for, 如果没找到且target和build相同, 则查找没有前缀的程序。
- echo "\$build = $build"
- echo "\$host = $host"
- echo "\$target = $target"
- echo "\$build_alias = $build_alias"
- echo "\$host_alias = $host_alias"
- echo "\$target_alias = $target_alias"
- echo "[AC@&t@_CHECK_TARGET_TOOL([COMPILER_TAR], [gcc])]"
- AC_CHECK_TARGET_TOOL([COMPILER_TAR], [gcc])
- echo "\$COMPILER_TAR = $COMPILER_TAR"
运行结果:
- $ ./configure --target=arm-linux --build=arm-linux
- $build = arm-unknown-linux-gnu
- $host = arm-unknown-linux-gnu
- $target = arm-unknown-linux-gnu
- $build_alias = arm-linux
- $host_alias =
- $target_alias = arm-linux
- AC_CHECK_TARGET_TOOL([COMPILER_TAR], [gcc])
- checking for arm-linux-gcc... no
- checking for gcc... gcc
- $COMPILER_TAR = gcc
----宏: AC_CHECK_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = '$PATH'])
首先查找以host为前缀的prog-to-check-for, 如果没找到则查找没有前缀的程序(无条件)。
- echo "[AC@&t@_CHECK_TOOL([COMPILER_HOST], [gcc])]"
- AC_CHECK_TOOL([COMPILER_HOST], [gcc])
- echo "\$COMPILER_HOST = $COMPILER_HOST"
运行结果:
- $ ./configure --host=arm-linux
- AC_CHECK_TOOL([COMPILER_HOST], [gcc])
- checking for arm-linux-gcc... no
- checking for gcc... gcc
- $COMPILER_HOST = gcc
----宏: AC_PATH_PROG(variable, prog-to-check-for, [value-if-not-found], [path = '$PATH'])
类似宏AC_CHECK_PROG, 但该宏在查找到prog-to-check-for的时候将variable赋值为程序的绝对路径。
- COMPILER=
- AC_PATH_PROG([COMPILER], [gcc])
- echo "\$COMPILER = $COMPILER"
运行结果:
- $ ./configure
- AC_PATH_PROG([COMPILER], [gcc])
- checking for gcc... /usr/bin/gcc
- $COMPILER = /usr/bin/gcc
----宏: AC_PATH_PROGS_FEATURE_CHECK(variable, progs-to-check-for, feature-test, [action-if-not-found], [path = '$PATH'])
该宏从Autoconf 2.62版本开始引进。 如果variable不为空, 则将其值赋值给ac_cv_path_variable。 否则检查progs-to-check-for中所列举的且能在path找到的没一个程序。 每找到一个程序, 则将其绝对路径赋值给ac_path_variable然后执行feature-test。 如果没有一次feature-test调用为ac_cv_path_variable赋值, 则执行action-if-not-found。 即使ac_cv_path_variable被赋值, feature-test也可以继续执行, 以便在后续程序中找到一个更合适的。 如果你准备接受当前找到的程序且忽略后续所有的检查, 你可以在feature-test中设置ac_path_variable_found=:。
- echo "using AC@&t@_PATH_PROGS_FEATURE_CHECK to find a prog which supports -v option from list ..."
- AC_PATH_PROGS_FEATURE_CHECK([FEATURE_CHECK], [ddd yes readelf gcc gdb],
- [echo "checking for $ac_path_FEATURE_CHECK ..."
- $ac_path_FEATURE_CHECK -v > /dev/null 2>&1
- test "x$?" = x0 \
- && ac_cv_path_FEATURE_CHECK=$ac_path_FEATURE_CHECK \
- FEATURE_CHECK=$ac_path_FEATURE_CHECK \
- ac_path_FEATURE_CHECK_found=:])
- echo "\$FEATURE_CHECK = $FEATURE_CHECK"
- echo "\$ac_cv_path_FEATURE_CHECK = $ac_cv_path_FEATURE_CHECK"
- echo ""
运行结果:
- $ ./configure
- using AC_PATH_PROGS_FEATURE_CHECK to find a prog which supports -v option from list ...
- checking for /usr/bin/yes ...
- checking for /usr/bin/readelf ...
- $FEATURE_CHECK = /usr/bin/readelf
- $ac_cv_path_FEATURE_CHECK = /usr/bin/readelf
----宏: AC_CHECK_TARGET_TOOLS(variable, progs-to-check-for, [value-if-not-found], [path = '$PATH'])
----宏: AC_CHECK_TOOLS(variable, progs-to-check-for, [value-if-not-found], [path = '$PATH'])
----宏: AC_PATH_PROGS(variable, progs-to-check-for, [value-if-not-found], [path = '$PATH'])
----宏: AC_PATH_TARGET_TOOL(variable, progs-to-check-for, [value-if-not-found], [path = '$PATH'])
----宏: AC_PATH_TOOL(variable, progs-to-check-for, [value-if-not-found], [path = '$PATH'])
上述五个宏参考前面几个宏的讲解, 应该不能理解, 这里不具体描述,直接上用例。
- echo "[AC@&t@_CHECK_TARGET_TOOLS([COMPILERS_TAR], [gccc gcc])]"
- AC_CHECK_TARGET_TOOLS([COMPILERS_TAR], [gccc gcc])
- echo "\$COMPILERS_TAR = $COMPILERS_TAR"
- echo ""
- echo "[AC@&t@_CHECK_TOOLS([COMPILERS_HOST], [gccc gcc])]"
- AC_CHECK_TOOLS([COMPILERS_HOST], [gccc gcc])
- echo "\$COMPILERS_HOST = $COMPILERS_HOST"
- echo ""
- echo "[AC@&t@_PATH_PROGS([PATH_PROGS], [ff dd gcc gdb])]"
- AC_PATH_PROGS([PATH_PROGS], [ff dd gcc gdb])
- echo "\$PATH_PROGS = $PATH_PROGS"
- echo "\$ac_cv_path_PATH_PROGS = $ac_cv_path_PATH_PROGS"
- echo ""
- echo "[AC@&t@_PATH_TARGET_TOOL([PATH_TAR], [gcc])]"
- AC_PATH_TARGET_TOOL([PATH_TAR], [gcc])
- echo "\$PATH_TAR = $PATH_TAR"
- echo ""
- echo "[AC@&t@_CHECK_PROG([DEBUGER], [gdb], [gdb])]"
- AC_PATH_TOOL([PATH_HOST], [gcc])
- echo "\$PATH_HOST = $PATH_HOST"
运行结果:
- $ ./configure --build=arm-linux --host=arm-linux --target=arm-linux
- AC_CHECK_TARGET_TOOLS([COMPILERS_TAR], [gccc gcc])
- checking for arm-linux-gccc... no
- checking for arm-linux-gcc... no
- checking for gccc... no
- checking for gcc... gcc
- $COMPILERS_TAR = gcc
- AC_CHECK_TOOLS([COMPILERS_HOST], [gccc gcc])
- checking for arm-linux-gccc... no
- checking for arm-linux-gcc... no
- checking for gccc... no
- checking for gcc... gcc
- $COMPILERS_HOST = gcc
- AC_PATH_PROGS([PATH_PROGS], [ff dd gcc gdb])
- checking for ff... no
- checking for dd... /bin/dd
- $PATH_PROGS = /bin/dd
- $ac_cv_path_PATH_PROGS = /bin/dd
- AC_PATH_TARGET_TOOL([PATH_TAR], [gcc])
- checking for arm-linux-gcc... no
- checking for gcc... /usr/bin/gcc
- $PATH_TAR = /usr/bin/gcc
- AC_PATH_TOOL([PATH_HOST], [gcc])
- checking for arm-linux-gcc... no
- checking for gcc... /usr/bin/gcc
- $PATH_HOST = /usr/bin/gcc
下列宏用于在configure的时候检查特定程序————是否存在, 或则特定情况下是否具有某些特征。
完整代码下载链接: http://download.csdn.net/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"<p>echo ""</p>
运行结果:
- # ./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