欢迎光临
我们一直在努力

build/core/envsetup.mk:146: *** Unable to determine HOST_ARCH from uname -sm: Darwin arm64!. Stop

许多个人站长或技术爱好者在自己的高性能 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 兼容层。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » build/core/envsetup.mk:146: *** Unable to determine HOST_ARCH from uname -sm: Darwin arm64!. Stop
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址