【macOS Big Sur】pyenv経由で古いpythonをインストールする

#概要
macOS Big Sur上で、pyenvで古いpython（今回は3.7以下)のインストールに失敗したので、解決のためにやったことをまとめました。
日本語では、3.7以下の古いバージョンのインストールに失敗するケースについてはあまり情報がなかったので、まとめてみました。


#環境
macOS Big Sur バージョン11.1
pyenv 1.2.22 (brewでインストール）

pyenvのバージョンの確認方法は下記

```shell
pyenv --version
```
#背景
macOS Big Sur上で、pyenvで古いpythonをインストールしようとすると下記のエラーがでて失敗しました。どうも3.8、3.9のインストールはできるのですが、3.7以下は失敗するようです。

```
% pyenv install 3.6.0
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.0...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 11.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/qz/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210207175025.47712
Results logged to /var/folders/qz/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210207175025.47712.log

Last 10 log lines:
./Modules/posixmodule.c:8146:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
./Modules/posixmodule.c:10340:5: warning: code will never be executed [-Wunreachable-code]
    Py_FatalError("abort() called from Python code didn't abort!");
    ^~~~~~~~~~~~~
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers   -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include -I/Users/jiro/.pyenv/versions/3.6.0/include  -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include -I/Users/jiro/.pyenv/versions/3.6.0/include   -DPy_BUILD_CORE  -c ./Modules/_sre.c -o Modules/_sre.o
1 warning and 1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
```

#解決方法
軽く検索してみると、macOS Big Surでpyenv installに失敗することはよく起こっているようで、その対策もいろいろ議論されていました。日本語だとxcodeコマンドラインツールを最新のものにする方法([macOS Big Sur で pyenv Python インストールできない場合](https://qiita.com/katafuchix/items/95abcf3a6e451a80aff4)など)がよく出てくるのですが、僕の環境ではそれでは解決しませんでした。

最終的に下記の投稿の方法で解決できました。
https://github.com/pyenv/pyenv/issues/1643#issuecomment-755067511

このissue自体はmacOS Big Surでpython3.8のビルドに失敗するという質問から始まっているのですが、途中で3.5がインストールできないという話が出てきて、最終的にリンク先のcommentでそれぞれのバージョンにおける方法が解決方法が示されます。コマンドを以下に引用します。

##ライブラリのインストール
(詳細は理解できていませんが、どうもこれらのライブラリが古いためにpythonのbuildができない可能性があるようです。)

```shell
brew install zlib
brew install sqlite
brew install bzip2
brew install libiconv
brew install libzip
```
##Pythonインストール
3.4, 3.5, 3.6のインストール

```shell
LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.4.10 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.5.10 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.12 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
```

3.7かそれ以上のインストール（僕の環境では3.8.6と3.9.0に関しては`pyenv install x.x.x`だけでインストールできました）

```shell
LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.7.9

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.8.6

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.9.0
```

#備考
上記のissueに辿り着く前にxcodeコマンドラインツールやpyenvの再インストールも試していました。ひょっとしたら上記で解決できたことに影響を与えているかもしれませんので一応記しておきます。

##xcodeコマンドラインツールの再インストール

```shell
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install 
```

##pyenvの再インストール
注：pyenv-virtualenvなどを使用している人はそれも合わせて再インストールしたほうがよいかもしれません。不安な方は自分でやり方を調べてから実行お願いします。

```shell
brew uninstall pyenv
brew install pyenv
```
#おわりに
macOS Big Surでpythonインストールに失敗する現象はどうもあるあるのようです（気軽にアップデートするんじゃなかった、、、）
日本語だと3.8とか3.9のインストールに失敗したという報告とその解決方法はいくつかでてきたのですが、古いバージョンのインストールについてはあまり情報がなく、英語のissueをあたってようやく解決できました。
本記事がなにかの役に立つと幸いです。