1 min read

libdatachannel-py を scikit-build-core に切り替えた

時雨堂では WebRTC ライブラリ libdatachannel の Python バインディング実装を OSS (Apache-2.0) で公開しています。この libdatachannel-py は今までは独自のビルドツールを採用していましたが、今回 scikit-build-core に切り替えました。

scikit-build-core

scikit-build-core は CMake を利用した Python 拡張向けのビルドバックエンドです。 CMake / Ninja を PyPI 経由で利用するため cmake も ninja をインストールする必要がありません。

[build-system]
requires = ["scikit-build-core>=0.11", "nanobind>=2.9"]
build-backend = "scikit_build_core.build"

あとは CMakeList.txt を頑張るだけです。

deps.json

これは独自の仕組みなんですが、依存ライブラリを JSON で書くようにしています。version と repository の二つを書くだけで良くしています。なぜ JSON なのかというと CMake が JSON に対応しているからです。

# JSON から依存関係のバージョンを読み込み
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/deps.json DEPS_JSON)

# MbedTLS の設定を解析
string(JSON MBEDTLS_VERSION GET ${DEPS_JSON} mbedtls version)
string(JSON MBEDTLS_GIT_REPOSITORY GET ${DEPS_JSON} mbedtls repository)
set(MBEDTLS_GIT_TAG "v${MBEDTLS_VERSION}")

# libdatachannel の設定を解析
string(JSON LIBDATACHANNEL_VERSION GET ${DEPS_JSON} libdatachannel version)
string(JSON LIBDATACHANNEL_GIT_REPOSITORY GET ${DEPS_JSON} libdatachannel repository)
set(LIBDATACHANNEL_GIT_TAG "v${LIBDATACHANNEL_VERSION}")

CMakeList.txt

{
  "mbedtls": {
    "version": "3.5.1",
    "repository": "https://github.com/Mbed-TLS/mbedtls.git"
  },
  "libdatachannel": {
    "version": "0.22.6",
    "repository": "https://github.com/paullouisageneau/libdatachannel.git"
  }
}

deps.json

設定ファイルは本当はコメントが書ける JSONC を使いたいのですが、残念ながら CMake が JSONC には対応していませんでした。deps.json は暫定で、pyproject.toml の cmake.define を使うというのも検討しています。


雑感

とても良いです、とにかく cmake を PyPI でインストールできるようにしたのは本当に画期的です。マルチプラットフォームに対応する場合は CMake 一択だと認識しており、scikit-build-core はとても使いやすいです。uv + scikit-build-core + nanobind の組み合わせは本当に最高です。

もし Python 拡張を作る場合は scikit-build-core の利用を検討してみることをオススメします。