最近Pythonの勉強を始めようと思い、まずは環境構築をしていました。
今回インストールしたかったのは、Python 3.8.18です。
pyenvを使ってバージョンを管理しながら入れようとしていました。
「Pythonをインストールするだけだからすぐ終わるだろう。」
そう思っていたのですが、結果的に環境構築だけでかなり時間がかかりました。
でも、振り返ってみると今回一番勉強になったのはPythonではなく、自分のMacの開発環境だった気がします。
pyenvでPython 3.8.18をインストールしたらエラー
まず実行したのはこちら。
pyenv install 3.8.18
すると途中で、
configure: error: C compiler cannot create executables
See `config.log' for more details
make: *** No targets specified and no makefile found. Stop.
というエラーが出ました。
C compilerって何ーー。
エラーが出ると、いつも早く解決することばかり考えます。
早くインストールしたいのよ。
今までの私は、とりあえずコマンドを打っていた
ここで思い出したのが、今までの自分の環境構築です。
エラーが出たら検索する。
出てきた記事のコマンドをコピーする。
直らなかったら別の記事を見る。
そんなことを繰り返していました。
もちろん、それで解決したこともたくさんあります。
でも今思うと、「そのコマンドが何をしているのか」はほとんど理解していませんでした。
だから時間が経つと、
「なんでこれ入ってるんだっけ?」
というものがどんどん増えていきます。
Homebrewもある。
Anacondaもある。
pyenvもある。
Pythonも複数入っている。
でも、どれが今使われていて、何のために入れたのか、自分でもよく分からない状態でした。
今回はまず「今の状態」を確認してみた
今回は、いきなり何かを削除したり再インストールしたりする前に、
まず今の状態を確認してみることにしました。
clangのバージョンを確認
clang --version
結果は、
Apple clang version 11.0.3 (clang-1103.0.32.29)
clang自体は入っていました。
Command Line Toolsの場所を確認
xcode-select -p
結果は、
/Library/Developer/CommandLineTools
Command Line Toolsも認識されていました。
SDKが認識されているか確認
xcrun --show-sdk-path
結果は、
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
SDKも見つかっています。
clangで本当にコンパイルできないのか確認
「C compiler cannot create executables」と表示されているので、
clang自体が本当に動かないのか試しました。
echo 'int main(){return 0;}' > /tmp/test.c
clang /tmp/test.c -o /tmp/test
/tmp/test
echo $?
結果は、
0
0は正常終了という意味なので、clang自体は普通に動いていました。
「あれ?じゃあCコンパイラそのものが壊れているわけではないのかも」
ということが分かってきました。
config.logを見て本当の原因を探す
最初のエラーには、
See `config.log' for more details
と書かれていました。
今までだったら多分ここは見ていませんでした。
そこで、pyenvのビルド時に作られたconfig.logを探しました。
find /var/folders -name config.log 2>/dev/null | tail -1
見つかったconfig.logの中から、
「C compiler cannot create executables」の前後を確認しました。
grep -n -B 10 -A 20 "C compiler cannot create executables" /path/to/config.log
さらに、その少し前の内容を確認すると、
clang: error: invalid version number in 'MACOSX_DEPLOYMENT_TARGET=14.1'
というエラーが見つかりました。
原因は古いclangだった
macOSのバージョンも確認してみました。
sw_vers
結果は、
ProductName: macOS
ProductVersion: 14.1.1
macOS Sonoma 14.1.1を使っているのに、
clangは11.0.3でした。
つまり今回の原因は、
古いCommand Line Toolsに入っていたclangが、
macOS 14.1をビルド対象として正しく扱えなかったことでした。
最初に表示されていた
C compiler cannot create executables
だけを見ると「Cコンパイラが壊れているのかな?」と思ってしまいますが、
本当の原因はその少し前に出ていた別のエラーでした。
Command Line Toolsを入れ直す
原因が分かったので、Command Line Toolsを入れ直すことにしました。
古いCommand Line Toolsを削除して、
sudo rm -rf /Library/Developer/CommandLineTools
※注意
sudo rm -rf はファイルやフォルダを強制的に削除するコマンドです。
ネットの記事からそのままコピーするのではなく、削除対象のパスが
/Library/Developer/CommandLineTools
になっていることを確認してから実行しました。
そのあと、
xcode-select --install
を実行しました。
すると「Command Line Developer Toolsが必要です」というインストール画面が表示されたので、そのままインストール。
42時間って表示されて焦った
ここで今度は、インストールの残り時間が「42時間」と表示されました。
え、そんなにかかるの?
と一瞬焦りましたが、数分待っていると残り時間はどんどん減っていきました。
macOSの残り時間表示は、あまり信用しすぎない方が良さそうです(笑)
もう一度Python 3.8.18をインストール
Command Line Toolsのインストールが終わったあと、
もう一度、
pyenv install 3.8.18
を実行しました。
今度は無事にインストール完了。
最後に、
pyenv versions
で確認すると、Python 3.8.18がちゃんと追加されていました。
今回一番勉強になったこと
Python 3.8.18は無事にインストールできました。
でも、それ以上に勉強になったのは、
「環境構築でエラーが出たら、まず今の状態を確認すること」でした。
バージョンを確認する。
本当にそのツールが動いているのか確認する。
エラーメッセージだけではなく、その少し前に何が起きているのかを見る。
たったこれだけでも、闇雲にコマンドを打つよりずっと原因に近づけることが分かりました。
もちろん、全部のパッケージや仕組みを理解するのは無理です。
でもこれからは、新しいツールをインストールするときには、
「これは何をするものなんだろう?」
「今のバージョンは何だろう?」
「どこに入っているんだろう?」
くらいは確認しながら使っていきたいと思います。
そして、ネットで見つけたコマンドもすぐコピーして実行するのではなく、
何をするコマンドなのかを確認してから使う。
今までの自分には、これが一番必要だった気がします。
Pythonの勉強を始める前から環境構築でつまずきましたが、勉強になりました。