M1発表からはや4年ですが、ターミナルもhomebrewもM1でたばかりの頃に設定したUniversal仕様のままになっていました。
かなり放置してしまっていたので全部arm64版に総とっかえしました。
背景
asdfでrubyのバージョンを3.3.1にアップデートしようとしたときエラーに遭遇しました
$ asdf install ruby 3.3.1 ruby-build: using openssl@3 from homebrew ==> Downloading ruby-3.3.1.tar.gz... -> curl -q -fL -o ruby-3.3.1.tar.gz https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.1.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 21.0M 100 21.0M 0 0 52.5M 0 --:--:-- --:--:-- --:--:-- 52.4M ==> Installing ruby-3.3.1... ruby-build: using libyaml from homebrew ruby-build: using gmp from homebrew -> ./configure "--prefix=$HOME/.asdf/installs/ruby/3.3.1" --with-openssl-dir=/usr/local/opt/openssl@3 --enable-shared --with-libyaml-dir=/usr/local/opt/libyaml --with-gmp-dir=/usr/local/opt/gmp --with-ext=openssl,psych,+ -> make -j 8 *** Following extensions are not compiled: openssl: Could not be configured. It will not be installed. /private/var/folders/qw/l2l472xn0g11tsst3f7kq1d40000gn/T/ruby-build.20240613122513.50553.Q7LxxR/ruby-3.3.1/ext/openssl/extconf.rb:122: OpenSSL library could not be found. You might want to use --with-openssl-dir=<dir> option to specify the prefix where OpenSSL is installed. Check /var/folders/qw/l2l472xn0g11tsst3f7kq1d40000gn/T/ruby-build.20240613122513.50553.Q7LxxR/ruby-3.3.1/ext/openssl/mkmf.log for more details. psych: Could not be configured. It will not be installed. Check /var/folders/qw/l2l472xn0g11tsst3f7kq1d40000gn/T/ruby-build.20240613122513.50553.Q7LxxR/ruby-3.3.1/ext/psych/mkmf.log for more details. BUILD FAILED (macOS 14.4 on arm64 using ruby-build 20240612) You can inspect the build directory at /var/folders/qw/l2l472xn0g11tsst3f7kq1d40000gn/T/ruby-build.20240613122513.50553.Q7LxxR See the full build log at /var/folders/qw/l2l472xn0g11tsst3f7kq1d40000gn/T/ruby-build.20240613122513.50553.log
openssl と psych のインストールができないとのこと 👀
ググってreshimなど試してみるもだめ。とりあえず brew doctor
をするとめっちゃwarningでた 😇
$ brew doctor Please note that these warnings are just used to help the Homebrew maintainers with debugging if you file an issue. If everything you use Homebrew for is working fine: please don't worry or file an issue; just ignore this. Thanks! Warning: Some installed casks are deprecated or disabled. You should find replacements for the following casks: adoptopenjdk Warning: Some installed formulae are deprecated or disabled. You should find replacements for the following formulae: openssl@1.1 Warning: You have the following deprecated, official taps tapped: Homebrew/homebrew-cask-versions Untap them with `brew untap`. Warning: Unbrewed dylibs were found in /usr/local/lib. If you didn't put them there on purpose they could cause problems when building Homebrew formulae and may need to be deleted. Unexpected dylibs: /usr/local/lib/libDellMonitorSdkLib.dylib Warning: Your Homebrew's prefix is not /opt/homebrew.
結果、x86_64版ではなくarm64版のhomebrewを使用するようにし、asdfもinstallしなおすことで解決しました 🎉
前提
arm64とかx86_64って何?
CPUアーキテクチャの種類です。(詳しくは参考記事参照)
- x86_64
- arm64
よく見るUniversalというのは、 x86_64バイナリ と arm64 バイナリの両方を含んでいることを示していて、Rosettaで開くことができるソフトウェアになります。
homebrewのinstall先の違い
homebrewはデフォルトのインストール先(prefix)にinstallしたときに限り、ソースからバイナリを作成します。こうすることでパッケージのビルド時間を短縮しています。
異なるアーキテクチャのバイナリが混在するのを防ぐため、homebrewのprefixはそれぞれ以下のように分けられています。
arm64版のzshになっているか確認
$ uname -m arm64
ターミナルをRosettaで開いていると x86_64
になります
arm64版のHomebrewを使えるようにする
はじめに、x86_64版のhomebrewを指していることを確認します
$ which brew /usr/local/bin/brew
documentの通りにinstallします
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
.zshrc
で 以下を修正します
# asdf - . /usr/local/opt/asdf/libexec/asdf.sh # intel x86_64 + . /opt/homebrew/opt/asdf/libexec/asdf.sh # silicon arm64 # PATH export PATH=~/.local/bin:$PATH + # homebrew + export PATH=/opt/homebrew/bin:$PATH
シェルを再起動し、再度brewの向き先を確認します
$ exec $SHELL -l # FYI: よく使うのでエイリアスに登録しておくと便利です $ which brew /opt/homebrew/bin/brew
/opt/homebrew
になっていれば arm版のhomebrewになっています!
brew doctor
も(当然ですが)解消されています。(不要なログは手動で消しました)
ここからは必要なpackageを brew install
していきましょう。
x86_64版のHomebrewを削除する
削除しなくてもarm版にないpackageはx86_64版にfallbackして参照してくれるものの、ややこしいのでx86_64版は削除しちゃいたいと思います。
homebrewがuninstall用のpackageを用意してくれています。
x86_64版だけを削除したいため、--path
に /usr/local
を指定します。
$ curl -fsSLO https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh
/bin/bash uninstall.sh --path /usr/local
https://github.com/Homebrew/install?tab=readme-ov-file#uninstall-homebrew
※ 念の為uninstall前に brew list
でinstallされたpackageを確認しておくのが吉です
余談
時の流れがはやすぎる