APPLE silicon 安装 homebrew 踩坑细节
我在写玩具项目是用到一些依赖库, 如 macdriver 出现编译报错。
不得不踩坑学习一下 silicon (m1 pro) 下 一些细节
关键点
- 一般来说, x86 程序可直接运行(Rosetta 自动介入)
- 可以右击应用,在应用详情里强制要求使用Rosetta 打开
- 通过
arch -x86_64
, 如arch -x86_64 go
强制要求命令行 app 使用 Rosetta- 当然,如果 terminal 是 x86 模式(Rosetta 已经介入), 不需要
arch -x86_64 zsh
- 当然,如果 terminal 是 x86 模式(Rosetta 已经介入), 不需要
- nodejs 和 golang 开发者都会遇到部分库在 arm 原生模式下不好用,建议同时安装两种 homebrew
Homebrew 现状
即使是现在(2021-12-09T05:53:31)不是所有工具链或者依赖库能正常的支持 m1 max arm 芯片架构
虽然自动 x86 模式大部分情况下运行完美, 一些比普通应用更复杂一些的编译工具,工具链的依赖链条里得保持一致的应用构建CPU架构.
我们大多习惯于用 homebrew 安装应用, 我们不得不再安装一个原生 x86 版本的 homebrew, 要不然我们只能安装 arm64 的工具.
友情提示:请确保在 x86 的 shell 里安装 x86 homebrew
1 | arch -x86_64 bash |
当前 termial 或者说 shell 会话里,你可以直接运行 homebrew 去安装 x86 的包
1 | brew install go |
正常安装的话,homebrew 应该安装在 /usr/local
下,而不是 /opt
.
从这里看两个版本不会有什么冲突,但是,显而易见,一般不建议同时安装两个版本,容易混乱。
单版本 hombrew 的话直接以 arch -x86_64
前置命令来运行也不会出问题
1 | arch -x86_64 brew install go |
双版本 homebrew 的话需要指定 homerew 完整路径
1 | arch -x86_64 /usr/local/bin/brew install go |
Tips 技巧,细节
Terminal Trick
直接复制 Terminal.app, 然后设置其中一个通过 Rosetta 打开,简单快捷不少
Thanks for the tip @tmc
Golang 交叉编译 cross compiling
虽然 arm64 版本的 Go 编译器也可以通过制定 GOARCH 交叉编译 x86_64 原生 app,但是 CGO 就复杂多了。
这也是为什么 GO 也需要安装两个版本。
应用 CPU 架构检查
通过 file
命令检查可执行程序(binary)的目标编译架构