用这个:
AC_ARG_VAR([AR], [AR command (default is gcc-ar)])
AC_CHECK_TOOL([AR], [gcc-ar])
AC_ARG_VAR([RANLIB], [RANLIB command (default is gcc-ranlib)])
AC_CHECK_TOOL([RANLIB], [gcc-ranlib])
AC_ARG_VAR
在调用./configure --help
.
AC_CHECK_TOOL
用于这些工具,而不是AC_CHECK_PROGS
,因此在交叉编译时使用正确的版本。
调用时AR
,您仍然可以覆盖。RANLIB
./configure
要回退到常规ar
和常规ranlib
,您可以AC_CHECK_TOOLS
改用:
AC_CHECK_TOOLS([AR], [gcc-ar ar])
可以将可选的第三个参数设置为类似的值,:
以便您可以测试是否找不到任何工具:
AC_CHECK_TOOLS([AR], [gcc-ar ar], [:])
AS_VAR_IF([AR], [:], AC_MSG_ERROR([could not find AR tool.]))
对于 Clang,它们遵循不同的命名约定:llvm-ar
、llvm-ranlib
、llvm-objcopy
等。我将使用两个辅助宏。
首先,我们MY_CHECK_TOOL_PREFIX
使用AX_COMPILER_VENDOR定义,这将尝试猜测使用什么工具前缀;它可以被TOOL_PREFIX
变量覆盖。它将测试当前语言的编译器(默认为 C);AC_LANG(C++)
如果需要,请务必提前致电。它被下一个宏使用,你不需要手动调用它。
AC_DEFUN([MY_CHECK_TOOL_PREFIX],
[
AC_REQUIRE([AX_COMPILER_VENDOR])
AC_ARG_VAR([TOOL_PREFIX], [tool prefix (gcc, llvm)])
AC_MSG_CHECKING([toolchain prefix])
# only convert vendor to prefix if not already set
AS_VAR_SET_IF([TOOL_PREFIX],
[],
[
AS_CASE([${ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor}],
[gnu], [TOOL_PREFIX="gcc"],
[clang], [TOOL_PREFIX="llvm"],
[TOOL_PREFIX="unknown"])
])
AC_MSG_RESULT([$TOOL_PREFIX])
])
然后是您将使用的宏:MY_CHECK_TOOL
. 如果未找到该工具的变体,则默认操作是中止。
dnl MY_CHECK_TOOL(TOOL, PROGRAM-TO-CHECK, [ACTION-IF-NOT-FOUND])
AC_DEFUN([MY_CHECK_TOOL],
[
AC_REQUIRE([MY_CHECK_TOOL_PREFIX])
AC_ARG_VAR($1, [$1 command (default is TOOL_PREFIX-$2, $2)])
AC_CHECK_TOOLS($1, [${TOOL_PREFIX}-$2 $2], [:])
AS_VAR_IF($1, [:],
[m4_ifblank($3,
[AC_MSG_ERROR([could not find $1])],
$3)])
])
如果您my_prefix_tools.m4
不想弄乱configure.ac
.
以下是您如何使用它configure.ac
:
AC_PROG_CXX
AC_LANG(C++)
MY_CHECK_TOOL([AR], [ar])
MY_CHECK_TOOL([RANLIB], [ranlib])
MY_CHECK_TOOL([OBJCOPY], [objcopy])
MY_CHECK_TOOL([NM], [nm])
当./configure
g++ 是默认的 C++ 编译器运行时,输出如下:
checking for C++ compiler vendor... gnu
checking toolchain prefix... gcc
checking for gcc-ar... gcc-ar
checking for gcc-ranlib... gcc-ranlib
checking for gcc-objcopy... no
checking for objcopy... objcopy
checking for gcc-nm... gcc-nm
运行时./configure CXX=clang++
,这是输出:
checking for C++ compiler vendor... clang
checking toolchain prefix... llvm
checking for llvm-ar... llvm-ar
checking for llvm-ranlib... llvm-ranlib
checking for llvm-objcopy... llvm-objcopy
checking for llvm-nm... llvm-nm