Text
Page: 1
DebianでBazelを 利用したビルドを 楽にしたい dh-bazelというdebhelperによる汎用的な解決策の提案 Kentaro Hayashi ClearCode Inc. 2026年11月 東京エリア・関西合同Debian勉強会(オンライン開催)
Page: 2
スライドは Rabbit Slide Showにて公開済み DebianでBazelを利用したビルドを楽にしたい https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-dh-bazel-202611
Page: 3
今日の発表のまとめ dh-bazelを開発しました 🎉 Bazelに対応したdebhelperのbuildsystem 従来の課題: Bazelを採用したソフトウェアをDebianパッケージ化する際、既存の debhelperのビルドワークフローに乗せにくい 解決手法: dhのbuildsystemへBazelを統合し、dhを活用できるようにした メリット: Bazelを採用したパッケージをDebianに投入しやすくなる(かもしれ ない)
Page: 4
今日の発表内容 Bazelとは? DebianにおけるBazelの利用状況 なぜBazel対応が必要なのか? Bazelをdebhelperにどう組み込むか
Page: 5
Bazelとは? Googleが開発したオープンソースのビルド・テストツール 巨大なコードベースを持つプロジェクトで採用されている/いた TensorFlow Kubernetes(Bazel廃止済み) 再現性を重視したビルドツール 必要な依存ライブラリー等をダウンロードしてビルドする
Page: 6
DebianにおけるBazelの利用状況 採用パッケージはbazel-*系を除くとかなり限定的(codesearch.d.n調べ) mozc (3.33.6133+ds1-0.1から) android-cuttlefish (仮想Androidデバイス AVD) Bazelが問題になっている事例 tensorflowはfull版ではなくlite版(CMake)を採用
Page: 7
Bazel対応がDebianですすまないのはなぜ か? Bazel 7.7.1がDebian unstableで利用可能になったのは最近(2026/6月末 頃) 従来Bazel (bazel-bootstrap)は4.2.3までしかなかった より新しいBazelを必要とするソフトウェアはパッケージ化できない 😢
Page: 8
今日の発表の内容 Bazelとは? DebianにおけるBazelの状況 なぜBazel対応が必要なのか? Bazelをdebhelperにどう組み込むか
Page: 9
なぜBazel対応が必要なのか? より新しいMozcをDebianで採用できなかった MozcはGYPからBazelに移行済みでGYP維持することに先はない Bazelに追従できない場合、あえてGYPにとどまるか、2.29.5160.102に塩漬け する未来 どちらもメンテナンスコスト増大を招く。誰がそのコストを払えるのか?
Page: 10
DebianでMozcをBazel対応させる難しさ Mozcをメンテナンスするのに必要なこと Bazelに関する知見 Debianパッケージの知見 Bazelによる Debianパッケージ化の 実現・開発 Mozcをメンテナンス する動機
Page: 11
DebianでBazelを利用する場合の課題 Bazelは(基本的に)ビルド中のネットワークアクセス前提 debianパッケージのビルドでは禁止 Bazelのオフライン化はDebianポリシーになじまない 依存関係を事前にまるっと抱え込むということ いわゆるvendorライブラリーを使う方向性 debianでは推奨されない 結局どうするのか?
Page: 12
Debianでは無効化ハックが必要 依存情報の解決 Bazel Central Registry( https://registry.bazel.build/ )にアクセスさせない 使わないモジュールは無効化する 依存ライブラリーの解決 システムライブラリーをリンクするように改変
Page: 13
参考: Bazelの基本 (C/C++想定) モジュールの定義 MODULE.bazel 該当モジュールが何に依存しているのかを明示する BUILD.bazel 該当モジュールをどうやってビルドするのかを明示する 理屈の上では、モジュールを置き換えてしまえばビルドできるはず
Page: 14
参考: 他のディストリビューションの事例 Fedora Mozc 2.29.5111.102 GYPパッチを当てて維持 openSUSE Mozc 3.34.6239 bcr.tar.gz, dependencies.tarといった依存関係のメタデータを事前に抱え込みビ ルド時に静的リンク (Debianの)システムライブラリーをリンクさせる戦い方とは方針が異な る
Page: 15
Mozcの事例 (指定しているオプションの抜 粋) # Override module and repository to disable network access completely BAZEL_OPTIONS= \ --announce_rc \ --color=no \ --compilation_mode=opt \ --config=oss_linux \ --curses=no \ --features=-compiler_param_file \ --lockfile_mode=off \ --noenable_workspace \ --override_module=abseil-cpp=../debian/third_party/abseil-cpp \ --override_module=apple_support=../debian/third_party/apple_support \ --override_module=buildozer=../debian/third_party/buildozer \ --override_module=gazelle=../debian/third_party/gazelle \ --override_module=googletest=../debian/third_party/gtest \ --override_module=platforms=../debian/third_party/platforms \ --override_module=protobuf=../debian/third_party/protobuf \ --override_module=rules_android=../debian/third_party/rules_android \ --override_module=rules_android_ndk=../debian/third_party/rules_android_ndk \ --override_module=rules_apple=../debian/third_party/rules_apple \ --override_module=rules_go=../debian/third_party/rules_go \ --override_module=rules_pkg=/usr/share/bazel/rules/pkg \ --override_module=zlib=../debian/third_party/zlib \ --override_repository=_main~_repo_rules~ja_usage_dict=third_party/ja_usage_dict \ --override_repository=_main~_repo_rules~material_icon_dictionary_png=third_party/material_icon_dictionary_png \ --override_repository=_main~_repo_rules~material_icon_dictionary_svg=third_party/material_icon_dictionary_svg \ --override_repository=_main~_repo_rules~material_icon_properties_png=third_party/material_icon_properties_png \ --override_repository=_main~_repo_rules~material_icon_properties_svg=third_party/material_icon_properties_svg \ --override_repository=_main~_repo_rules~material_icon_tool_png=third_party/material_icon_tool_png \ --override_repository=_main~_repo_rules~material_icon_tool_svg=third_party/material_icon_tool_svg \ --override_repository=_main~_repo_rules~zip_code_jigyosyo=third_party/zip_code_jigyosyo \ --override_repository=_main~_repo_rules~zip_code_ken_all=third_party/zip_code_ken_all \ --repo_env=BAZEL_CXXOPTS=-std=c++20 \ --repository_disable_download \ --sandbox_add_mount_pair=/usr \ --strip=never \ --subcommands
Page: 16
Q. 依存関係を一部無効化する方法 A. 使っていないモジュールは --override_moduleで何もしないBUILD.bazelとMODULE.bazelを参照させ る e.g. --override_module=apple_support=../debian/third_party/apple_support ../debian/third_party/apple_support/BUILD.bazel は空のファイル > cat ../debian/third_party/apple_support/MODULE.bazel module( name = "apple_support", version = "system", )
Page: 17
Q. システムのライブラリーを 使わせる方法 A. bazel実行時に--override_moduleでシステムライブラリーを参照させる ようにする e.g. --override_module=zlib=../debian/third_party/zlib > cat debian/third_party/zlib/BUILD.bazel package(default_visibility = ["//visibility:public"]) cc_library( name = "zlib", linkopts = ["-lz"], ) > cat debian/third_party/zlib/MODULE.bazel module( name = "zlib", version = "system", )
Page: 18
Bazel利用時の面倒くささ Bazelの起動オプションと、ビルドオプションの調整 パッケージ固有の依存関係の調整 --override_moduleで使わないモジュールは無効化 --override_moduleでシステムライブラリーをリンク 🤔 前者に関して、各パッケージでばらばらに同じようなことをやるのは無 駄では?
Page: 19
Bazel利用時の ビルドシステムを改善したい そもそもdebhelperのサポートがないのがいけない 😡 なぜbazelコマンドをdebian/rulesで直打ち実行しないといけないのか
Page: 20
debhelperでサポートする方法 debhelperを拡張する方法 buildsystem dh_auto_*が裏で実行するコマンドを制御する --buildsystem=で指定するもの (e.g. cmake,meson,pybuild) addon ビルド途中に追加のdh_*フックを割り込ませる (e.g. autoreconf) dh-sequence-xxxをBuild-Dependsに追加して有効化 昔はdh --with=で指定していたやつ
Page: 21
debhelperでサポートする方法 debhelperを拡張する方法 buildsystem dh_auto_*が裏で実行するコマンドを制御する --buildsystem=で指定するもの (e.g. cmake,meson,pybuild) bazelでサポートすべきなのはこちら addon ビルド途中に追加のdh_*後処理を割り込ませる dh-sequence-xxxをBuild-Dependsに追加して有効化 昔はdh --with=で指定していたやつ
Page: 22
Debianのbuildsystemのしくみ 実装言語はPerl /usr/share/perl5/Debian/Debhelper/Buildsystem/にモジュールを配置す る Bazelサポートならbazel.pm を配置すればよい sub configure, sub build, sub clean等を実装する --buildsystem=bazelを指定するとdh_auto_*が上記を呼び出す
Page: 23
dh-bazelのコンセプト debhelperのbuildsystemの1つとしてBazel向けに提供 bazelコマンドをあまり意識しないで使えること よくある起動オプションやオプションは指定しなくてもいい感じに動作 すること
Page: 24
最終的な目標 debian/rulesを簡潔に記述できること! #!/usr/bin/make -f # -*- makefile -*- # %: dh $@ --buildsystem=bazel override_dh_auto_build: dh_auto_build -- //:hello
Page: 25
dh-bazelのコンセプトを実現するために 起動オプションとビルドオプションを整理 3つの機能を搭載 ダミーモジュール対応 pkgconf対応 Build-Dependsのfallback対応
Page: 26
dh-bazel ダミーモジュール対応 システムライブラリーを参照しやすいように定義ファイルを用意 debian/rulesでexport DH_BAZEL_OVERRIDE_MODULES=zlibするだけでいい dh-bazelのダミーモジュールを定義したファイル (MODULE.bazel,BUILD.bazel)を参照して勝手に解決 裏で--override_module=...定義に自動変換してbazelを実行する あらゆるライブラリーに対応するにはコストがかかりすぎる欠点
Page: 27
dh-bazel pkgconf対応 pkgconfを利用するパッケージ向けにdh-bazelが変換 debian/rulesでexport DH_BAZEL_PKGCONF_MODULES=lz4=liblz4するだけ でいい lz4=liblz4は必要なモジュールがlz4で、pkgconfがliblz4.pcを探すという意味 dh-bazelのダミーモジュールを定義したファイル (MODULE.bazel,BUILD.bazel)を自動生成して勝手に解決 裏で--override_module=...定義に自動変換してbazelを実行する C/C++に限定されるがより汎用的に対処可能
Page: 28
dh-bazel Build-Dependsのfallback対応 dh-bazelがBuild-Depends:をみて自動変換 DH_BAZEL_OVERRIDE_MODULESやDH_BAZEL_PKGCONF_MODULESが空振 りしたときの最終手段 debian/controlのBuild-Dependsから-devパッケージを探して、それに紐づい ている.pcからリンク対象等を見つけて勝手に解決(ただし精度は低いし、誤爆 もすることもある) 裏で--override_module=...定義に自動変換してbazelを実行する
Page: 29
現在の開発状況 https://salsa.debian.org/bazel-team/dh-bazel 元々は個人リポジトリで開発していたのをbazel-teamへ移行済み 依存しているbazel-buildtoolsをITP, dfsg-teamのレビュー待ち https://bugs.debian.org/1151519 PoCのため、まだDebian unstableにはアップロードしていない
Page: 30
DEMO DH_BAZEL_OVERRIDE_MODULES DH_BAZEL_PKGCONF_MODULES fallback
Page: 31
今日の発表のまとめ dh-bazelを開発しました 🎉 Bazelに対応したdebhelperのbuildsystem 従来の課題: Bazelを採用したソフトウェアをDebianパッケージ化する際、既存の debhelperのビルドワークフローに乗せにくい 解決手法: dhのbuildsystemへBazelを統合し、既存のワークフローを活用できる ようにした Bazelを採用したパッケージをDebianに投入しやすくなるメリット 次のステップ: dh-bazelをDebian入りさせてMozcをdh-bazelを使ってビルド できるようにする