Bazelによる分割ビルド

2020/03/06

BAZEL C/C++ Googleサービス Linux RandomGrid Ubuntu 技術

t f B! P L

今回もガッツリDa★Boの独断偏見適当翻訳でGoogle先生のBazel導入ドキュメントを平易に纏めていきますよっと。

ご利用は計画的に

ちなみに今回の記事の記事の内容が、Bazel を選定するに当たってこれにしようと決めた切欠でもあります。

曰く
  • 分割ビルドの記述のしやすさ、わかりやすさ
  • 差分ビルドの速さ
この2点です。

これまでの記事で書いてきたとおり、(私にとって)Bazelのビルドルールは簡便で非常に組みやすいのです。
今回のBazelの使途は、CIサーバでテストバイナリとデプロイ用バイナリを同時に別々に出力する構成を作ることです。

そうなってくると、分割ビルドの組やすさは死活問題といっても過言ではありません。

そしてもう一つの差分ビルドの速さですが、これはもう言わずもがな、サーバで動作させるので可能な限り少ないCPU時間で処理してほしいという事情があります。

これらの条件に最も適合し、そして何よりドキュメントが読みやすいことから、BazelはCIサーバ構築にも最適だと言えるでしょう。

さて、ほんじゃ本編に入っていきましょうか。

Bazelのビルドをより良く使う 

小規模なプロジェクトであれば、単独のターゲットでのビルドでも十分に対応できます。
 また、Bazelは、プロジェクトの規模が大きくなるに連れてプロジェクト内を複数のターゲットやパッケージに分割したとしても、差分ビルドによって高速なビルドを実現することが出来ます。

複数のビルドターゲットを指定する 

実際に、2つのターゲットを用いたサンプルプロジェクトをビルドしてみましょう。
サンプルプロジェクトはstage2、必要な BUILD ファイルは cpp-tutorial/stage2/main に格納されています。

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
    ],
)

この BULD ファイルを用いると、Bazel はまず cc_library ルールによって、hello-greet ライブラリをビルドします。
その後、実行ファイルである hello-world をビルドします。
hello-world ターゲットにて指定されているdeps 属性が、hello-world ターゲットのビルドには hello-greet ライブラリが必要であることを Bazel に教示しています。  

それではこのプロジェクトを実際にビルドしてみましょう。
ビルドコマンドは stage1 をビルドしたものと同じです。
bazel build //main:hello-world

通常通りビルドが実行されることが確認できます。
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (13 packages loaded, 50 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 7.070s, Critical Path: 1.16s
INFO: 3 processes: 3 linux-sandbox.
INFO: Build completed successfully, 7 total actions

ビルドしたバイナリの実行方法も、stage1と同様です。
bazel-bin/main/hello-world

ここで依存関係グラフを出力して見ましょう。
ビルドコマンドも実行方法も全く一緒でしたが、ビルドしたバイナリの構造が異なっていることがわかります。
 stage1:


 stage2:


高速な差分ビルド

さて、最後に Bazel の差分ビルドの動作を確認していきましょう。
Bazel はプロジェクトの構成ファイルに変更があった場合、そのファイルのみを再コンパイルします。

今回私は hello-greet.cc に記載された挨拶の主語をRandom Gridと変更して保存を行いました。
そのうえで、リビルドを実行しています。
INFO: Analyzed target //main:hello-world (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 0.331s, Critical Path: 0.22s
INFO: 2 processes: 2 linux-sandbox.
INFO: Build completed successfully, 3 total actions

Elapsed time: Critical Path: の情報を比較するとわかりますが、 一回目のビルドと比較してビルドにかかった時間が20分の1程度まで短縮されています。
bazel-bin/main/hello-world
Hello Random Grid
Fri Mar  6 13:01:40 2020


バイナリの実行結果も変わっていますね。

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ