cpythonのビルドとCLionの設定

Posted by rhoboro on 2021-07-05

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を選択します。

Load Project

メニューのRun > Edit Configurationsを選択して、左上の「+」から「Makefile Application」を下記の内容で追加します。

Edit Configurations

これでビルドができるようになりました。 メニューのRun > Run 'python-dev'またはウィンドウ上のRunボタンを押すとビルドが始まり、正常に完了するとPythonが起動します。

Run

Pythonのコードジャンプの設定

Objects/listobject.c などを開いて適当なシンボルをCmdを押しながらクリックすると、定義元にジャンプできます。

ただし、 Lib/asyncio/base_events.py などPythonファイルを開くとimportしているPythonモジュールはエラーとなっています。

No Interpreter

この場合は右上のConfigure Python Interpreterを選択して、下記のようにPythonインタプリタを設定するとPythonファイルも定義元へジャンプできるようになります。

Interpreter

また、Include/ 以下のヘッダーファイルへのジャンプが動いていないときは、 Tools > Makefile > Reload Makefile Project を実行するとジャンプできるようになりました。

デバッグ実行

メニューのRun > Debug 'python-dev'またはウィンドウ上のDebugボタンを押すとビルドが実行され、正常に完了するとデバッグモードでPythonが起動します。

Debug

このままでは先ほどと違いがわからないので、ブレークポイントを使ってみます。

Objects/listobject.c を開き、関数list_resize()の38行目にブレークポイントをはってみました。(行番号の数字の少し右側をクリック)

Breakpoint1

この状態で a = [] を実行してリストを定義すると、ブレークポイントで処理が一時停止します。 各変数に入ってる値が確認できていますね。

Breakpoint2

これで設定は完了です。
ブレークポイントが使えるようになったので、Pythonについてより深く学んでいくことができそうです。

tags: python