Rabbit Slide Show

Tokyo Debian Local Meeting - What is dh-bazel?

2026-11-21

Description

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を使ってビルド
できるようにする

Other slides

DebConf20 DebConf20
2020-08-25