M1 Mac にpyenvで環境構築してみたらBUILD FAILEDと怒られた件

# はじめに
研究室で新しい**M1 MacBook Air**を提供してもらったので、早速Python環境でも構築しようと思い作業に取り掛かった。
最初に[Homebrew](https://brew.sh/index_ja)を入れて、次に``$ brew install pyenv``でpyenv環境を作ろう、よしこれで後はver指定してインストールするだけだ！！
そしたら次のようなエラーに出会った
```sh
$ pyenv install 3.9.7
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.7.tar.xz...
-> https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz
Installing Python-3.9.7...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

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

Inspect or clean up the working tree at /var/folders/xn/nbx24y4j3c10xm79t69r6xpr0000gn/T/python-build.20220506153547.20932
Results logged to /var/folders/xn/nbx24y4j3c10xm79t69r6xpr0000gn/T/python-build.20220506153547.20932.log

Last 10 log lines:
checking for --with-cxx-main=<compiler>... no
checking for clang++... no
configure:

  By default, distutils will build C++ extension modules with "clang++".
  If this is not intended, then set CXX on the configure command line.
  
checking for the platform triplet based on compiler characteristics... darwin
configure: error: internal configure error for the platform triplet, please file a bug report
make: *** No targets specified and no makefile found.  Stop.
```
なんだこれ...初めて見た...
今回はmacにpyenvを使ってPython環境を構築する一通りの流れとこのエラーの対処方法、そしてPythonのversion変更でも詰まったところについて記事にまとめようと思う。

## 実機環境について
```:実機環境
MacOS  : Monterey 12.2.1
MacBook Air(M1, 2020)
チップ  : Apple M1
$SHELL : zsh
```
# さぁ、pyenvでPython環境を構築しよう！！
最初に、[Homebrew](https://brew.sh/index_ja)をインストールしましょう。
```sh
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
はい、これでbrewのインストール完了。
次にpyenvを入れてみよう
```sh
$ brew install pyenv
```
次にpyenvのPATH設定などを行おう
**※利用しているSHELLによって記述する場所が変わるため注意**
```sh
# これで利用シェルがわかる
$ echo $SHELL

# bashの場合
$ vim ~/.bashrc
# zshの場合
$ vim ~/.zshrc

# 以下の内容をcmd+c, cmd+v(コピペ)
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
```
後に記述するが、この作業にPythonのversion変更における罠(ミス)があった。

これでpyenvの環境も構築できた。Pythonをinstallしよう！！
冒頭のエラーに至る。。。

## 解決方法１
最初に``BUILD FAILED (OS X 12.2.1 using python-build 20180424)``について調べてみると[この記事](https://qiita.com/kzrashi/items/80ff82d4330d51a398dc)に出会った。
これによると``python-build: use zlib from xcode sdk``この箇所つまり、xcode sdk のzlibを使おうとしたがなかったからエラーが起きたというものである。この記事の通りに進めてみよう。
```sh
# zlibをinstall
$ brew install zlib

# 次にzlibの設定をzshrcに記述
$ echo 'export LDFLAGS="-L/usr/local/opt/zlib/lib"' >> ~/.zshrc
$ echo 'export CPPFLAGS="-I/usr/local/opt/zlib/include"' >> ~/.zshrc
$ echo 'export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"' >> ~/.zshrc

$ source ~/.zshrc

# bashの場合はbashrcに記述
$ echo 'export LDFLAGS="-L/usr/local/opt/zlib/lib"' >> ~/.bashrc
$ echo 'export CPPFLAGS="-I/usr/local/opt/zlib/include"' >> ~/.bashrc
$ echo 'export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"' >> ~/.bashrc

$ source ~/.bashrc
```
よし！これでもう一度``pyenv install 3.9.7``や！！
。。。
。。。
自分はうまくいきませんでした

## 解決方法2
次に同じ内容で調べているとよさそうな[issue](https://github.com/pyenv/pyenv/issues/2343)が見つかった。
それを読んでみると、``CommandLineTools``というやつが原因のようで、これをアンストして再度インストすると解決できると書いてあった。
よし！なんでも試してやる！最悪変になったらパソコンリセットや！
```sh
# 古いツールの削除
$ sudo rm -rf /Library/Developer/CommandLineTools
# 新しいCommandLineToolsのインストール
$ xcode-select --install
$ pyenv install 3.9.7
```
このCommandLineToolsの再インストールは環境によると思いますが、ちょっと時間がかかります。
結果。。。
だめだった。。。なんでぇ

でもこれ以上良さげな情報を見つけられなかったので3回ほど再インストールを繰り返した。。。
ダメだった。

じゃあ、xcodeも関連しているようだしxcodeとCommandLineToolsの両方を再インストールしたるか。
因みに両方の再インストールとなるとかなり時間かかります。結果は。。。
```sh
$ pyenv install 3.9.7
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.9.7.tar.xz...
-> https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz
Installing Python-3.9.7...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.9.7 to /Users/xxx/.pyenv/versions/3.9.7
```
できた！これでできた！！
なんで？

## 意外に罠だったPythonのversion変更
まぁインストールできたしversionを新しいのに変更しよう！
最初に現在のversionを確認
```sh
$ python -V
Python 2.7.18
``` 
これがデフォルトのものですね。
じゃあ、新しく3.9.7に更新しよう！！
```sh
$ pyenv global 3.9.7
$ python -V
Python 2.7.18
```
あれ？更新されない？あ、localの方を変えないとダメだっけ？？
```sh
$ pyenv local 3.9.7
$ python -V
Python 2.7.18
```
あれ？ちゃんとインストールできているはずだけど
```sh
$ pyenv versions
  system
* 3.9.7 (set by /Users/xxx/.pyenv/version)
```
ん？？
結論としてはzshrc(もしくはbashrc)に書き込んだpyenvの設定したpathが間違っているようでした。
今のpath設定はこれ``export PATH="$PYENV_ROOT/bin:$PATH"``
いつからかわからないけど、``$PYENV_ROOT/bin``ではなくて``$PYENV_ROOT/shims``を参照するように変更されていたようです。
4年前に構築した時はbinがデフォルトだったが変わったのか、マシン自体が変わったからか...
とにかく、zshrc(もしくはbashrc)に先ほど記述した内容を書き換えよう。
```sh
$ cat ~/.zshrc

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
export LDFLAGS="-L/opt/homebrew/opt/zlib/lib"
export CPPFLAGS="-I/opt/homebrew/opt/zlib/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/zlib/lib/pkgconfig"
```
zshrc(もしくはbashrc)の中身が解決方法1と2、そしてこの修正を経てこのようになっていれば良いです。
```sh
$ source ~/.zshrc
$ python -V
Python 3.9.7
```
できた！

# まとめ
今回のエラーの原因はxcodeとCommandLineToolsの両方にあるように思います。
ただ、zlibの作業をしなかったら上手くいっていない可能性も大いにあると思ったので一連の手順をまとめてみました。
個人の環境によって色々と状況は変わるため、この記事がその人にとっての最善な解決方法ではないと思いますが少しでも自分の調査結果が力になれることを祈っています。


# 参考文献
1. [[mac] pyenvを使った、pythonのinstall](https://zenn.dev/kenghaya/articles/9f07914156fab5)
2. [pyenvでインストール時に「BUILD FAILED (OS X 10.15.7 using python-build 20180424)」が発生した場合の対処法](https://qiita.com/kzrashi/items/80ff82d4330d51a398dc)
3. [BUILD FAILED (OS X 12.3.1 using python-build 20180424) #2343](https://github.com/pyenv/pyenv/issues/2343)
4. [pyenvでPythonのバージョンが切り替わらないときの対処方法【M1 Mac環境】](https://hitori-sekai.com/python/error-pyenv/)