M1 MacのHomebrewでIntel版のPythonを手軽に切り替えて使う方法

M1 Macを始めたけれど、意外とx86_64でないと動かないライブラリやアプリがあって困る場合のメモ。この投稿を書く時点で、M1 Macに対応していないライブラリが結構あり、不便だったので手軽に環境を切り替えて実行できるようにした。

# 追記(2021/12/18)

最近はM1でもそんなに困ることがなくなってきたので、普通にHomebrewをインストールする方法で大丈夫です。
Pythonで各種動かないのは、pipではなくMiniforge3を使うことで回避できます。以下の投稿が役立ちます。

- [→参考: M1 Mac環境構築ベストプラクティス](https://qiita.com/c60evaporator/items/aef6cc1581d2c4676504)
- [→参考: M1 MacでPythonはMiniforgeを使う](https://qiita.com/kujirahand/items/9bf1a1e7bd34bdb87da5)

# 以下、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のサイト(こちら)](https://brew.sh/index_ja)から一行コピーして、実行する。以下は執筆時のコマンド。

```
/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版ではインストール先が異なる

以下にも書いたけど、インストール先が異なる。

 - [マイナビPython連載/新型MacのM1 ProへPythonをインストールしてベンチマークしてみよう](https://news.mynavi.jp/article/zeropython-85/)


| アーキテクチャ | パス |
|----|-------------|
| Intel Mac |/usr/local/Cellar/xxx |
| M1 Mac | /opt/homebrew/Cellar/xxx |


# PATHの設定

`~/.zshrc`にパスを通す。GitでいろいろなOSで共通のシェル設定を使うので、macOS(darwin)判定を入れたもの。M1版のbrewになければIntel版のbrewを見るようにするもの。

```~/.zshrc
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`で使えるようにする。

```~/.zshrc
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`にエイリアスを設定すると便利。

```~/.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"))'
```

### 参考にしたサイト (感謝)

 - [Homebrew Apple M1 / Intel の共存](https://www.nire.com/2021/02/homebrew-coexist-m1-intel/)
 - [M1 Mac の Homebrew を 3.0 に移行する](https://note.com/ryugoo/n/nd1cf6fd824e3)