M1 Macを始めたけれど、意外とx86_64でないと動かないライブラリやアプリがあって困る場合のメモ。この投稿を書く時点で、M1 Macに対応していないライブラリが結構あり、不便だったので手軽に環境を切り替えて実行できるようにした。
追記(2021/12/18)
最近はM1でもそんなに困ることがなくなってきたので、普通にHomebrewをインストールする方法で大丈夫です。
Pythonで各種動かないのは、pipではなくMiniforge3を使うことで回避できます。以下の投稿が役立ちます。
以下、M1Mac購入時の作業記録のメモ
ここでは以下のように、コマンドで環境(M1/Intel)を切り替える設定にする。
-
brew_m
... M1 Mac の Homebrew (arch -arm64e) -
brew_x
... Intel Mac の Homebrew (arch -x86_64)
同じように、よく使うコマンドでは、末尾にxをつけるとIntel Mac用のコマンドが実行できるようにする。
-
python3
pip3
... M1のPython3とpip3 -
python3x
pip3x
... Intel MacのPython3とpip3
時々しか使わないコマンドは、以下のようにして実行する。
arch -x86_64 (コマンド)
なお、現在実行しているシェルのアーキテクチャを確認するには以下のコマンドを実行する。
uname -a
バイナリファイルのアーキテクチャを確認するには、以下のコマンドを実行する。
lipo -archs (バイナリ)
file (バイナリ)
利用例:
$ file commandxxx
commandxxx : Mach-O 64-bit executable arm64
$ lipo -archs commandxxx
arm64
Rosetta
Rosettaをインストール。Intel Mac用のツールを動かす。たぶん、ちょっと何かすると自動で入る。
softwareupdate --install-rosetta --agree-to-license
Homebrew
まずは普通にHomebrewをインストール。
Homebrewのサイト(こちら)から一行コピーして、実行する。以下は執筆時のコマンド。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Intel版のHomebrewのインストール
次に、Intel版のHomebrewをインストール。
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
つまり、
arch -x86_64 (コマンド)
で、Intel版でコマンドを実行できる。
M1とIntel版ではインストール先が異なる
以下にも書いたけど、インストール先が異なる。
アーキテクチャ | パス |
---|---|
Intel Mac | /usr/local/Cellar/xxx |
M1 Mac | /opt/homebrew/Cellar/xxx |
PATHの設定
~/.zshrc
にパスを通す。GitでいろいろなOSで共通のシェル設定を使うので、macOS(darwin)判定を入れたもの。M1版のbrewになければIntel版のbrewを見るようにするもの。
if [[ `uname` == 'Darwin' ]]; then
if [[ `uname -m` == 'arm64' ]]; then
# m1とx86_64の共存設定
export PATH=/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/local/sbin:$PATH
export BREW_ROOT=/opt/homebrew
eval $(/usr/local/bin/brew shellenv)
eval $(/opt/homebrew/bin/brew shellenv)
else
# x86_64の設定
export BREW_ROOT=/usr/local
eval $(/usr/local/bin/brew shellenv)
fi
export PATH=$BREW_ROOT/bin:$PATH
export PATH=$BREW_ROOT/sbin:$PATH
fi
aliasを設定
x86_64版のHomebrewを使いたい時はbrew_x
で使えるようにする。
alias brew_x='arch -x86_64 /usr/local/bin/brew'
alias brew_m='arch -arm64e /opt/homebrew/bin/brew'
source ~/.zshrc
を実行して設定を読み直したら以下を試してみよう。
Homebrewを使い分けよう
例えば、Intel版にslコマンドをインストール。
brew_x install sl
~/.zshrc
でaliasを設定していれば、上記コマンドは、arch -x86_64 /usr/local/bin/brew install sl
を実行したのと同じ事になる。
インストールできたか確認しよう。
# インストールされているパッケージ一覧を見る
$ brew_x list
sl
Intel版のPython3をインストール
先ほど設定した HomebrewのIntel版(arch -x86_64)を利用して、Python3をインストール。
brew_x install python3
Homebrewの時と同様に、~/.zshrc
にエイリアスを設定すると便利。
alias python3x=`/usr/local/bin/python3`
alias pip3x=`/usr/local/bin/python3 -m pip`
source ~/.zshrc
で読み込んで試してみる。Intel版のPython3を実行しよう。
python3x (実行したいファイル)
pip3x instlal (パッケージ)
ワンライナーでアーキテクチャを確認しよう。
python3x -c 'import os;print(os.system("uname -a"))'