kokh log

主にフロントエンドの備忘録

Intel Homebrewと決別した

M1発表からはや4年ですが、ターミナルもhomebrewもM1でたばかりの頃に設定したUniversal仕様のままになっていました。

かなり放置してしまっていたので全部arm64版に総とっかえしました。

背景

asdfrubyのバージョンを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
    • 64bit
    • もともとはスマホなどの小型デバイスで使われていた。AppleSilicon(Appleバイスで使用されているプロセッサの総称、Mシリーズもその仲間)の設計に採用されている
    • Arm社製

よく見るUniversalというのは、 x86_64バイナリ と arm64 バイナリの両方を含んでいることを示していて、Rosettaで開くことができるソフトウェアになります。

homebrewのinstall先の違い

homebrewはデフォルトのインストール先(prefix)にinstallしたときに限り、ソースからバイナリを作成します。こうすることでパッケージのビルド時間を短縮しています。

異なるアーキテクチャのバイナリが混在するのを防ぐため、homebrewのprefixはそれぞれ以下のように分けられています。

  • x86_64 (intel) : /usr/local
  • arm64 (AppleSilicon) : /opt/homebrew

docs.brew.sh

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を確認しておくのが吉です

余談

時の流れがはやすぎる

参考にした記事