autoconf通用程序探测宏
2013-12-13 16:28
246 查看
完整代码下载: 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的后续的调用很有可能给出一个错误的结果。
运行及结果:
----宏: 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在传入前就被赋值, 这个宏可能不能达到预期的效果。
运行结果:
----宏: AC_CHECK_TARGET_TOOL
在学习该宏前先提一个前提知识点:
--build=编译程序所在的主机系统
--host=编译出来程序运行的主机系统
--target=用你当前编译出来的工具所编译出来的程序运行的主机系统
首先查找以target类型作为前缀的prog-to-check-for, 如果没找到且target和build相同, 则查找没有前缀的程序。
运行结果:
----宏: AC_CHECK_TOOL(variable, prog-to-check-for, [value-if-not-found], [path = '$PATH'])
首先查找以host为前缀的prog-to-check-for, 如果没找到则查找没有前缀的程序(无条件)。
运行结果:
----宏: AC_PATH_PROG(variable, prog-to-check-for, [value-if-not-found], [path = '$PATH'])
类似宏AC_CHECK_PROG, 但该宏在查找到prog-to-check-for的时候将variable赋值为程序的绝对路径。
运行结果:
----宏: 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=:。
运行结果:
----宏: 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'])
上述五个宏参考前面几个宏的讲解, 应该不能理解, 这里不具体描述,直接上用例。
运行结果:
----宏: 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/gc b3ee c AC_PATH_TOOL([PATH_HOST], [gcc]) checking for arm-linux-gcc... no checking for gcc... /usr/bin/gcc $PATH_HOST = /usr/bin/gcc
相关文章推荐
- autoconf通用程序探测宏
- autoconf 个别特殊程序的探测
- 编写通用的asp防注入程序 选择自 ph4studio 的 Blog
- 编写通用的asp防注入程序
- 如何在Smartphone的Win32程序中使用Windows的通用菜单资源(MENU而不是SHMENUBAR)
- C#.NET通用权限管理在DB2数据库上运行的脚本参考 - 通过程序将数据导入到目标数据库中
- php开发通用采集程序
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- php通用防注入程序 推荐
- MTK通用DataAll教程,安卓设备尽享全盘程序安装空间,超越2.5G
- 性能测试培训:通用互联网服务端程序
- 一个通用的表单验证程序
- php通用防注入程序 推荐
- 由于下列原因,安装程序无法继续microsoft office 2016 需要通用CRT(KB2999226)
- 编写通用的asp防注入程序
- 简述Java程序语言通用组合算法的实现
- 解决问题的通用思路 - 关于线上运行的程序出错
- ASP.NET程序如何防止被注入(整站通用)
- 不错的linux下通用的java程序启动脚本
- C# ASP.NET 通用权限管理系统组件源码中WCF例子程序客户端运行详细配置参考