如何在configure.ac中运行命令?跨编译场景适配方案问询
跨编译场景下Autoconf工具链特性检测的兼容实现方案
核心思路
针对跨编译场景无法直接运行目标程序的限制,通过编译生成目标文件 + 目标工具链辅助工具(如objdump)分析的方式替代运行检测;同时自定义兼容Autoconf 2.6x/2.7x的执行宏,满足重定向、管道支持、错误不中断、日志记录的需求,避开已废弃或无文档的AC_TRY_COMMAND/AC_TRY_RUN,以及跨编译不可用的AC_RUN_IFELSE。
关键实现步骤
1. 自定义兼容的命令执行宏
封装一个宏来处理命令执行,自动将诊断信息写入config.log,不中断configure流程,同时支持管道和重定向:
dnl 自定义宏:AC_RUN_SILENT_CMD(COMMAND, [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE]) dnl 功能:静默执行命令,错误信息写入config.log,支持管道/重定向,兼容2.6x/2.7x AC_DEFUN([AC_RUN_SILENT_CMD], [ AS_VAR_PUSHDEF([cmd_result], [ac_cv_run_cmd_result]) AS_RUN_LOG([$1 >&AS_MESSAGE_LOG_FD 2>&1]) cmd_result=$? if test "$cmd_result" = 0; then m4_ifvaln([$2], [$2]) else m4_ifvaln([$3], [$3]) fi AS_VAR_POPDEF([cmd_result]) ])
AS_RUN_LOG是Autoconf 2.6x及以上的标准宏,自动将命令输出写入config.log- 命令执行结果通过退出码判断,失败时configure继续运行,仅日志记录
2. 编译待分析的目标文件
通过$CC编译最小化程序,链接libgcc(不依赖标准库/启动文件)生成目标文件:
dnl 生成待反汇编的目标文件 AC_RUN_SILENT_CMD([$CC -c -o conftest.o conftest.c -nostdlib -nostartfiles], [], [AC_MSG_WARN([Failed to compile test object file])] ) AC_RUN_SILENT_CMD([$CC -o conftest conftest.o $($CC -print-libgcc-file-name) -nostdlib -nostartfiles], [], [AC_MSG_WARN([Failed to link test executable with libgcc])] )
- 注意
$($CC -print-libgcc-file-name)的引用,确保正确获取libgcc路径 - 编译/链接失败仅输出警告,不中断configure
3. 用objdump分析libgcc实现
调用目标工具链的objdump反汇编,通过管道过滤关键信息,检测目标特性:
dnl 检测libgcc中是否包含某个函数(例如__divdi3) AC_CHECK_PROG([TARGET_OBJDUMP], [target-objdump], [target-objdump], [objdump]) AC_RUN_SILENT_CMD([$TARGET_OBJDUMP -d conftest | grep "__divdi3"], [AC_DEFINE([HAVE_LIBGCC_DIVDI3], [1], [Define if libgcc implements __divdi3])], [AC_MSG_WARN([libgcc does not implement __divdi3])] )
- 先用
AC_CHECK_PROG兼容不同命名的objdump(如arm-linux-gnueabi-objdump) - 通过管道结合
grep过滤反汇编输出,判断目标特性是否存在
4. 清理临时文件
最后清理编译生成的临时文件:
dnl 清理临时文件 AC_RUN_SILENT_CMD([rm -f conftest.o conftest], [], [])
兼容注意事项
- 确保bootstrap流程中
aclocal能找到自定义宏(可将宏写入acinclude.m4) - 对于Autoconf 2.6x,
AS_RUN_LOG默认已支持,无需额外配置 - 跨编译时需确保目标工具链的辅助工具(如objdump)在系统PATH中,或通过
--with-target-tools等参数指定路径
内容的提问来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

