MacOS 11.4 Big Sur で pyenv install 3.9.6 でハマったときの備忘録

2021/8/7現在、Pythonの最新安定版は3.9.6のよう。
元々pyenvで3.8.3を入れていたが、これを一度uninstallしてinstallし直そうとしたら以下エラー。

```console
$ pyenv isntall 3.9.6
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.4 using python-build 2.0.4-8-gd209e061)
```

ググると Xcode Command Line Tools が最新のMacOS 11.4に対応していないことによるエラーっぽい。ただ`.bashrc`や`.bash_profile`のPATHを追記とか、個人的によくわかってない対策が多く戸惑ったので備忘録。

## 追記
色々調べているとPATHを通す関係は`.bash_profile`に書いている人がすごく多かったので、これ以降こっちに統一して書くようになった。

##ポイント

- 多くはM1（Apple Silicon, arm64)にHomebrewやPython, pyenvなどが対応してないことが原因っぽかった
- bashのPATHがきちんと通ってないことが多い
- M1に対応させるため`LDFLAGS`や`CPPFLAGS`などの個別のパス指定？も重要
- 一回Homebrewを再インストールしといた方がいいかな
- `brew doctor`のWarningはやはり無視しない方がいいっぽい
- pyenvでM1対応のバージョンは3.9.1からなので注意
- brew install するときは公式のGitHubのREADMEをみたがいい
- やっぱりbrewとは、bash_profileとは、$PATHとはみたいな「これはどういうもので、何をやっている記述なのか」を面倒でも理解しながら色々試すのが遠回りなようで近道な気がする

このteratailのquickquipさんの回答を先にみておくと理解が早いかも。

https://teratail.com/questions/313363

ググって上位に出てくる[このGitHub Issue](https://github.com/pyenv/pyenv/issues/1508)は「Ubuntuでの解決法」という前提条件がちゃんと書いてあるのでMacではお門違いなので注意。



## やったこと

### Xcode13 beta のインストールと Command Line Tools への適用
最新の Xcode13 beta を入れて、設定>Loacationsの Command Line Tools を最新にするとコンソールに出力されるラスト10行のエラー文が変わった。
![スクリーンショット 2021-08-07 20.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242610/af060026-9b0f-bc19-d631-93ca9506f228.png)

そして`pyenv install 3.9.6`したら、cpythonのImport時にsymbolが見つからないよ的なエラー。ただあとになって思えばこれは本質的な原因ではなかったと思う。

```
Last 10 log lines:
    from . import _common
  File "/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/Lib/importlib/_common.py", line 3, in <module>
    import zipfile
  File "/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/Lib/zipfile.py", line 6, in <module>
    import binascii
ImportError: dlopen(/private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so, 2): Symbol not found: _crc32
  Referenced from: /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so
  Expected in: flat namespace
 in /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210807200735.65636/Python-3.9.1/build/lib.macosx-11.4-arm64-3.9/binascii.cpython-39-darwin.so
make: *** [install] Error 1
```

### .bash_profile, .bashrc 

色々ググりながらbash_profileとbashrcをいじって最終的にこうなった。


```bash:.bash_profile
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

##
# Your previous /Users/takuya/.bash_profile file was backed up as /Users/takuya/.bash_profile.macports-saved_2019-06-24_at_17:30:49
##

# MacPorts Installer addition on 2019-06-24_at_17:30:49: adding an appropriate PATH variable for use with MacPorts.
# export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.

export PS1='\[\e[33m\]\u:\W\[\e[0m\]$ ';

export PATH="/usr/local/bin:$PATH"

# homebrew: mac os package manager
eval "$(/opt/homebrew/bin/brew shellenv)"

## readline
export LDFLAGS="-L/opt/homebrew/opt/readline/lib" # あとから追記したもの
export CPPFLAGS="-I/opt/homebrew/opt/readline/include" # あとから追記したもの
export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig" # あとから追記したもの

# nodebrew: node.js package manager
export PATH=$PATH:$HOME/.nodebrew/current/bin
```

```bash:.bash_rc
# rbenv
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"

# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"

# flutter
export PATH="$PATH:$HOME/flutter/bin"
```

そして`pyenv install 3.9.6`するとこういうエラーに行き着いた。

```console
Installing Python-3.9.6...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 11.4 using python-build 2.0.4-8-gd209e061)

Inspect or clean up the working tree at /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210808110538.61673
Results logged to /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/python-build.20210808110538.61673.log

Last 10 log lines:
			$ensurepip --root=/ ; \
	fi
Looking in links: /var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh
Processing /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh/setuptools-56.0.0-py3-none-any.whl
Processing /private/var/folders/j0/tj3vwrjs3nd_m_h3nfx1q_fm0000gn/T/tmp4vr3drqh/pip-21.1.3-py3-none-any.whl
Installing collected packages: setuptools, pip
  WARNING: The scripts pip3 and pip3.9 are installed in '/Users/takuya/.pyenv/versions/3.9.6/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  NOTE: The current PATH contains path(s) starting with `~`, which may not be expanded by all applications.
Successfully installed pip-21.1.3 setuptools-56.0.0
```

ラスト10行よりも上の方の`The Python readline extension was not compiled. Missing the GNU readline lib?`のWarningやErrorがまず気になった。


## brew install readline

間違って`brew install read-line`をしてしまって`No previously deleted formula found`というErrorがでたのでHomebrew自体の再インストールやエラー解消をまずやった（結果的に不要だったかも）。

### homebrewの再インストール

https://qiita.com/d_forest/items/43fbd0257dea712aa067

### brew doctor 時のWarning解消

https://qiita.com/6592sho/items/b24766e203fb7a48b056#%E8%BF%BD%E8%A8%98

そうではなく`brew install readline`としてやると上手く行ったようだが、以下のように「コンパイラがreadlineを見つけるようにするためには以下を設定しろ」との指示が。

```console
readline is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides BSD libedit.

For compilers to find readline you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/readline/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/readline/include"

For pkg-config to find readline you may need to set:
  export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig"

==> Summary
🍺  /opt/homebrew/Cellar/readline/8.1: 48 files, 1.7MB
```

> keg-only： Cellar だけにインストールされ、/usr/local にはリンクされていない formula のこと。
https://qiita.com/halo57/items/e7511f3befbcb9fedd6a

なので`.bash_profile`に上記export3つを追記した。（`source .bash_profile`が何故か効かないのでターミナルを再起動した）

## 成功！

その上で`pyenv install 3.9.6`したら成功した！

```
$ pyenv install 3.9.6
$ pyenv 3.9.6
$ pyenv global 3.9.6
``` 
pyenvのglobalの使い方ってこれであってるっけ。。？ちなみに3.9.1以降じゃないとpyenvがM1チップに対応してないらしくインストールは出来ないので注意。

## 最終的な環境
```
$ python -v
WARNING: Python 2.7 is not recommended. 
Python 2.7.16 (default, May  8 2021, 11:48:02) 

$ python3 -v
Python 3.9.6 (default, Jun 29 2021, 05:25:02)

$ pyenv -v
pyenv 2.0.4-8-gd209e061

$ pyenv versions
  system
  3.6.10 
  3.7.0
* 3.9.6 (set by /Users/takuya/.pyenv/version)

$ openssl version
OpenSSL 1.1.1k  25 Mar 2021

```


## 元々の .bash_profile, .bashrc

ぐちゃぐちゃでした。。

```bash:.bash_profile
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

##
# Your previous /Users/takuya/.bash_profile file was backed up as /Users/takuya/.bash_profile.macports-saved_2019-06-24_at_17:30:49
##

# MacPorts Installer addition on 2019-06-24_at_17:30:49: adding an appropriate PATH variable for use with MacPorts.
# export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
# Finished adapting your PATH environment variable for use with MacPorts.

export PS1='\[\e[33m\]\u:\W\[\e[0m\]$ ';

eval "$(rbenv init -)"

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"

# Setting PATH for Flutter
export PATH="$PATH:$HOME/flutter/bin"
```                                                                                                                                                                                                   

```bash:.bashrc
export PATH=$PATH:/Users/takuya/.nodebrew/current/bin

export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="/usr/local/bin:$PATH"
```
.bashrcやPATHを通すことへの理解はこちら

https://qiita.com/soarflat/items/d5015bec37f8a8254380

## 気になったこと

`WARNING: The scripts pip, pip3 and pip3.8 are installed in '(それぞれ任意のパス)' which is not on PATH.`というエラーが出ていたがいつの間にか出なくなっていた。

`source .bashrc`, `source .bash_profile`をやっても`echo $PATH`で出力されるPATHが変わらなかったり重複している。Cmd+Qでターミナルを再起動したらちゃんとなったけど。

「.bash_profileが（ターミナルに？）ログイン時に1回だけ呼ばれるのに対し、.bashrcは（新しいターミナルウィンドウを？）起動する度に呼ばれる」的なことが書いていたので、.bash_profileが上位ということで、なんとなくhomebrew系は.bash_profile
い、env系は.bashrcに書いてみました。

MacportsというのはHomebrewと並ぶMacOSパッケージ管理ソフトでHomebrewより古くからあるらしい。`PS1`というのはターミナルの`$`の左に出るユーザー名やPC名、パス名をカスタマイズしたものなので今回は関係ないです。`eval`というのはよくわからん。

## やってダメだったこと

```console

# CommandLineToolsを入れ直してもダメ
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install

# 11.4のpackageなんてねぇよと怒られた
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_11.4.pkg -target /
```

### これの対応方法②

https://child-programmer.com/pe-bs-2021/

### arch を x86_64 でインストール？
pyenvがM1 Mac（Appleシリコン）に対応してないのでx86_64でインストール？するも、`pyenv install`はやはりダメ

```
arch -arch x86_64 env PATH=${PATH/\/opt\/homebrew\/bin:/} pyenv install 3.8.7
```

https://qiita.com/tomtsutom0122/items/52487730001247fdc2c5

### zshrcにPATHの追記

```
export PATH="$HOME/.pyenv/bin:$PATH"
export PATH="/usr/local/bin:$PATH"

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip2/include"
```

https://qiita.com/hisa_shim/items/abb4936f1f676fe6a7b8

自分の場合は`echo $SHELL`で確認するとzshでなくbashを使っていたので、`.bashrc`に書いてみたがダメだった。。

### pyenvのこのIssue

https://github.com/pyenv/pyenv/issues/1508

`sudo yum install readline-devel`はEC2でのコマンドか？

## 余談
- M1 Macに移行した時に移行アシスタントでやったけどpyenvやrbenv、Homebrewなどは1からやったほうがよかったのかなぁ
- M1 Macからemacs入ってないのでVimのコマンド操作を覚えながらやったけどMac標準のCtrl+k/Ctrl+yとか使えない（Vimだとdd/p）のが辛かったけどそれ以上の魅力がやはりあるのかな

## 他に参考になりそうなサイト

pyenv common build problem on github
https://github.com/pyenv/pyenv/wiki/Common-build-problems

M1 Mac でのHomebrew管理
https://zenn.dev/junjunjunk/articles/4b230519d87de4

brew tap
https://qiita.com/saa/items/85ed5e914d424fbf9fd6

homebrew readline7
https://qiita.com/Cj-bc/items/34bc4ef139844d031f27