macOS Big Sur(Version 11.2.1)でのPython 3.9をソースコードからビルドする手順です。
ビルド後にCLionでデバッグ実行を行い、ブレークポイントで止まることを確認します。
CPythonとは
CPythonとは本家Pythonのソースコードのことでpython/cpythonリポジトリにソースコードがあります。 また、ドキュメントはPython Developer’s Guideです。
Windows、macOS、Linuxでのビルド手順が用意されていますが、ここではmacOSで行った時のメモを書いています。
ソースコードの入手とビルド
ソースコードはgitで取得できます。 歴史あるプロジェクトなので、ソースコードの取得はそこそこ時間がかかります。
$ git clone --branch 3.9 [email protected]:python/cpython.git
ソースコードをcloneできたら、いくつか必要なツールをインストールします。
$ cd cpython
# macOSで開発している人はすでに実行済みの人も多いはず
$ xcode-select --install
# 標準ライブラリが使うlibzmaなどがないと拡張モジュールのビルドに失敗するのでそれを回避
$ brew install openssl xz zlib gdbm sqlite
# Makefileの作成
# ./configureをするとautoconfがCPythonが必要とするライブラリをシステム内で検索し、
# そのパスをmakefileにコピーする
# 3.7以上ならこっちでOK
$ ./configure --with-pydebug --with-openssl=$(brew --prefix openssl)
# 3.7未満の場合はこちら
$ CPPFLAGS="-I$(brew --prefix zlib)/include" \
LDFLAGS="-L$(brew --prefix zlib)/lib" \
./configure --with-openssl=$(brew --prefix openssl) \
--with-pydebug
ここまででビルドに必要なMakefileが生成できたので、あとはmake
を実行するだけです。
# -jNでN個までコアを使う。-sで実行するコマンドをechoしない
$ make -j4 -s
macOSの場合、デフォルトではpython.exe
という名前でPythonのバイナリが生成されます。
$ ./python.exe
Python 3.9.6+ (heads/3.9:21be6cb030, Jul 5 2021, 20:32:46)
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
cleanについて
Makefileには複数のクリーンタスクが用意されています。
- make clean
- 通常利用
- make clobber
- Makefileも含めた削除
- make distclean
- 生成したもの一式を完全に削除
CLionでの設定
わたしは普段PyCharmを使っているため、ここでは同じJetBrains製のCLionを使います。
以前のバージョンのCLionではCMakeLists.txt
が必要でしたが、2020.2以降はMakefileを使ったプロジェクトが簡単に利用できるようになりました。
ここでの設定ではMakefileが必要であるため、上述の手順で事前にPythonのビルドを実行しておく必要があります。
メニューのFile > Openからgit cloneしてきたディレクトリを選択します。 このとき、Clean用のタスクを聞かれるので、そのままOKを選択します。
メニューのRun > Edit Configurationsを選択して、左上の「+」から「Makefile Application」を下記の内容で追加します。
これでビルドができるようになりました。 メニューのRun > Run 'python-dev'またはウィンドウ上のRunボタンを押すとビルドが始まり、正常に完了するとPythonが起動します。
Pythonのコードジャンプの設定
Objects/listobject.c などを開いて適当なシンボルをCmdを押しながらクリックすると、定義元にジャンプできます。
ただし、 Lib/asyncio/base_events.py などPythonファイルを開くとimportしているPythonモジュールはエラーとなっています。
この場合は右上のConfigure Python Interpreterを選択して、下記のようにPythonインタプリタを設定するとPythonファイルも定義元へジャンプできるようになります。
また、Include/ 以下のヘッダーファイルへのジャンプが動いていないときは、 Tools > Makefile > Reload Makefile Project を実行するとジャンプできるようになりました。
デバッグ実行
メニューのRun > Debug 'python-dev'またはウィンドウ上のDebugボタンを押すとビルドが実行され、正常に完了するとデバッグモードでPythonが起動します。
このままでは先ほどと違いがわからないので、ブレークポイントを使ってみます。
Objects/listobject.c を開き、関数list_resize()
の38行目にブレークポイントをはってみました。(行番号の数字の少し右側をクリック)
この状態で a = [] を実行してリストを定義すると、ブレークポイントで処理が一時停止します。 各変数に入ってる値が確認できていますね。
これで設定は完了です。
ブレークポイントが使えるようになったので、Pythonについてより深く学んでいくことができそうです。