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 の利用を検討してみることをオススメします。