Bazelによるビルド調査 ながーい前置き

2020/03/05

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

t f B! P L

Bazel調査の前置き

はい、前置きです。

とりあえずこの記事ではBazelインストールしてC++のサンプルプロジェクトをビルドするところまで書きます。

ちなみに内容的にはBazelの公式マニュアルを私の独断と偏見によって独自に翻訳して纏め直した内容になりますので、間違っていることもあります(核心的事実)

要所要所に元ドキュメントへのリンクを貼っていますので、ご利用は計画的に

そもそもBazelって?

だいぶ前の記事でも同様のこと少し纏めました。

BAZEL
 Google社製ビルダー、GoogleTestとの親和性は最も高いと思われる最後発ビルダーだが発展途上のきらいも若干見え隠れする

売り文句は以下

ビルドとテストを高速化

Bazelは必要なものだけをリビルドします。高度なローカルおよび分散キャッシング、最適化、依存関係分析、および並列実行により、高速な差分ビルドを実現します。

1つのツール、複数の言語

Java、C ++、Android、iOS、Go、その他のさまざまな言語プラットフォームをビルドしてテストできます。Bazelは、Windows、macOS、およびLinuxでどうさします。

スケーラブル

Bazelは、構造化、コードベース、継続的インテグレーションシステムのスケーリングを助けます。複数のリポジトリまたは巨大なモノリポジトリまで、あらゆるサイズのコードベースを処理します。

柔軟にニーズを満たす拡張性

Bazelの拡張言語によって、新しい言語とプラットフォームへの対応を簡単に追加できます。共有、再利用可能な言語とルールが、Bazelコミュニティによって日々発展しています。


マニュアル見ると他にもたくさん売り文句が書いていますがまあいいやそんなBazelですが、新規プロジェクトの立ち上げにあたり、これまで部署のエンジニアが個別に走らせていた開発案件を、統合してテスタブルにしてしかもバージョン管理をしてC++で立てる新しい管理フレームワークに組み込みたいもはや何が何やらとのことから、従来のmakeを使ったビルドだとこれは辛いな、ということになり、今回調査導入することとしました。

実際に使っていく

インストール方法

curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel

サンプルプロジェクトのダウンロード

このページの手順に則ってまずはサンプルプロジェクトをダウンロードします。

といっても通常のGitクローンですが
git clone https://github.com/bazelbuild/examples

これを落としてくると、stage1〜3の3つのソースコード環境が落ちてきます。

examples
└── cpp-tutorial
    ├──stage1
    │  ├── main
    │  │   ├── BUILD
    │  │   └── hello-world.cc
    │  └── WORKSPACE
    ├──stage2
    │  ├── main
    │  │   ├── BUILD
    │  │   ├── hello-world.cc
    │  │   ├── hello-greet.cc
    │  │   └── hello-greet.h
    │  └── WORKSPACE
    └──stage3
       ├── main
       │   ├── BUILD
       │   ├── hello-world.cc
       │   ├── hello-greet.cc
       │   └── hello-greet.h
       ├── lib
       │   ├── BUILD
       │   ├── hello-time.cc
       │   └── hello-time.h
       └── WORKSPACE

上記はマニュアルからの転載ですが。

stage1〜3それぞれに典型的なプロジェクトの内容と、それぞれをビルドするためのBUILDファイルが格納されています。

stage1

非常にシンプルな例、単一ソースファイルからのコンパイルとバイナリ作成の例。

stage2

複数のソースファイル及びヘッダファイルから、ライブラリを作成し、リンクしてアプリケーション(バイナリ)を作成する例。

stage3

複数のビルドディレクトリとパッケージを作成し、それらをリンクしてメインアプリケーションを作成する例。

ビルドする前に

バジルではビルドを行う前に、ワークスペースとパッケージを作成する必要があります。
そして、Bazelの説明で使われる用語の意味は以下のとおりです。

ワークスペース

プロジェクトのソースコードやBazelを使ってビルドした成果物を出力するディレクトリのことです。ワークスペースルート(ワークスペースの一番上の階層)には内容が空のWORKSPACEファイルが配置されている必要があり、Bazelはこのファイルを使ってプロジェクトルートを認識します。

パッケージ

BUILDファイルを格納したひとまとまりのビルド単位ディレクトリのことをパッケージといいます。BUILDファイルはBazelを使用したビルド手順を定義するファイルで、Bazelに対してプロジェクト内のそれぞれのパーツをどのようにビルドするか指示します。

ビルドを実行してみる

まずはstage1のワークスペースに移動します。
cd cpp-tutorial/stage1


ビルドの実行は以下のコマンドを打つだけ。
bazel build //main:hello-world

ここでbazelコマンドのビルドターゲットについている//main:というラベルは、今回使用するBUILDファイルがプロジェクトルートのものであることを表します。
そして、hello-worldはBUILDファイル内で定義されたビルドターゲットの名称です。

ちなみに元のドキュメントでは
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
このような結果が例示されていますが、インストール後の初回起動時は以下のように少しメッセージが冒頭に増えます。bazelのサービスを起動するプロセスが入っているだけなので、特に違いはありません。

Extracting Bazel installation...
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (13 packages loaded, 47 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 20.325s, Critical Path: 0.48s
INFO: 2 processes: 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions

そして、ビルド成果物の実行は以下です。
bazel-bin/main/hello-world

実行することが出来れば以下のような表示が行われます。
Hello world
Thu Mar  5 11:26:30 2020

これが出来れば一通りの手順は成功です。

BUILDファイルの内容など、本筋に当たる部分は次回の記事にて。

Translate

ページビューの合計

注意書き

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

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

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

Featured Post

ボイドラDICEの攻略法

QooQ