2023.05.26

arm64のmacosでx86_64用にバイナリをbuild

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で起動に変えている。

Alt text

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