apple sillicon(arm64)のmacosでx86_64向けのバイナリをbuildしたいとき。
Rosetta
まずRosettaがインストールされてなかったらインストール。 初めてx86_64向けのアプリを立ち上げたときに聞かれるらしい。If you need to install Rosetta on your Mac
コマンドでも以下でインストールできるぽい。
softwareupdate --install-rosetta
Terminal
x86_64用に切り替える。
arch -x86_64 zsh
毎回変えるの面倒なので、私はitermを使っているがアプリを複製してiTermRosettaを作りそちらをrosettaで起動に変えている。
homebrew
homebrew はx86_64用とarm64用で使い分ける。
M1 MAX MacbookのHomebrew管理 この辺を参考。
rosettaでx86_64版でターミナルを起動し
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
でhomebrewをインストール。それぞれインストールしたバイナリの場所が異なるので注意する。
Apple Sillicon arm64 homebrew
インストールしたバイナリに対するシンボリックリンクは
/opt/homebrew/bin
にある
x86_64 homebrew
/usr/local/bin/brew
x86用のHomebrewでインストールしたバイナリは、/usr/local/binに配置されるシンボリックリンクでアクセス出来る。 実際のバイナリは/usr/local/Cellarの各パッケージディレクトリにある。
なのでarm64でつかうバイナリは /usr/local/binに入れない運用になりそう。
.zprofile
ARCH=$(uname -m)
if [[ $ARCH == arm64 ]]; then
echo "Current Architecture: $ARCH"
eval $(/opt/homebrew/bin/brew shellenv)
elif [[ $ARCH == x86_64 ]]; then
echo "Current Architecture: $ARCH"
eval $(/usr/local/bin/brew shellenv)
fi
こんな感じ。
gcc, make
あとは普通にやる。
brew install gcc
brew install make
して
./configure CFLAGS="-arch x86_64" CXXFLAGS="-arch x86_64" LDFLAGS="-arch x86_64"
make
sudo make install
OK