您的位置:首页 > 其它

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的后续的调用很有可能给出一个错误的结果。

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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息