许多个人站长或技术爱好者在自己的高性能 Apple Silicon (M1/M2/M3) Mac 上尝试编译复杂的开源项目,例如 Android 开放源代码项目 (AOSP) 或自定义嵌入式工具链时,可能会遇到如下错误:
build/core/envsetup.mk:146: *** Unable to determine HOST_ARCH from uname -sm: Darwin arm64!. Stop
这个错误非常常见,它表明构建系统依赖的脚本(通常是较旧的 Makefile 或 Shell 脚本)无法识别 Darwin arm64 这个主机架构。构建环境期望看到的是 Darwin x86_64 (Intel Mac) 或 Linux x86_64 等传统架构标识符。
错误原因分析
AOSP 或许多大型交叉编译项目在设置编译环境时,会执行 uname -sm 命令来确定宿主机的操作系统和架构类型,并将结果写入 HOST_ARCH 变量。由于这些项目尚未完全更新以识别 Apple Silicon 的原生架构标识符,当它们读到 Darwin arm64 时,就会因为无法匹配预设的有效架构列表而停止构建。
解决方案:利用 Rosetta 2 兼容层
解决这个问题的最简单和最可靠的方法,就是利用 macOS 内置的 Rosetta 2 兼容层。Rosetta 2 允许 Apple Silicon 机器在 x86_64 模式下运行,这意味着在 Rosetta 2 环境下,uname -m 会返回 x86_64,从而成功欺骗构建系统,让其认为正在一台 Intel Mac 上运行。
步骤一:确保安装了 Rosetta 2
通常在您第一次运行 x86_64 应用程序时,系统会自动提示安装。如果您不确定,可以尝试运行任意 Intel-based 应用。
步骤二:强制 Shell 进入 x86_64 模式
您需要使用 arch -x86_64 命令来启动一个新的 Shell 会话,或者直接包装您的构建命令。
推荐方法:启动一个 x86_64 子 Shell
启动一个新的 zsh 或 bash 会话,所有后续操作都在这个模拟的 Intel 环境中完成。
# 启动一个运行在 x86_64 模式下的 zsh shell
arch -x86_64 zsh
# 提示:如果使用 bash,则使用:
# arch -x86_64 bash
# 检查是否成功,如果返回 x86_64 则表示成功
uname -m
# 预期输出: x86_64
步骤三:在 x86_64 环境中继续构建
一旦进入了 x86_64 子 Shell,您就可以继续您的标准编译流程,例如 AOSP 的环境设置和编译步骤:
# 在刚刚启动的 x86_64 shell 中执行
# 1. 设置环境 (AOSP 示例)
source build/envsetup.sh
# 2. 选择目标
lunch aosp_arm64-userdebug
# 3. 开始编译 (例如使用 16 线程)
make -j16
通过这种方式,即使您的机器是原生的 arm64 架构,构建脚本也会读取到它期望的 x86_64 标识符,从而顺利通过 envsetup.mk 中的架构检查,解决编译停止的问题。
替代方案:修改源文件(不推荐)
如果您无法使用 Rosetta 2(例如在某些容器环境中),理论上您可以修改出错的 envsetup.mk 文件。例如,在出错的行附近手动添加对 Darwin arm64 的识别。但这通常会导致后续的工具链或库链接出现新的错误,并且不是维护代码的最佳实践。推荐使用 Rosetta 2 兼容层。
汤不热吧