Bazel 入門 (1) - 事始め
1. Bazel
「Bazel」は、「Make」「Maven」「Gradle」に似たオープンソースのビルドツールです。人間が読める高レベルのビルド言語を使用します。
特徴は次の通りです。
・Java, C++, Android, iOS, Goなどさまざまな言語に対応
・Windows、macOS、Linuxのマルチプラットフォーム対応
・ローカルキャッシュや分散キャッシュ、依存性の最適化分析や並列実行などによる高速なビルド
・大きな組織が運用する大規模な単一リポジトリや分散リポジトリにも対応するスケーラビリティ
・柔軟な拡張性
2. Bazelの使い方
「Bazel」を使用してソースコードをビルドする手順は次の通りです。
(1)「Bazel」をダウンロードしてインストール。
(2)「WORKSPACE」ファイルを作成。
この設定ファイルは、「ワークスペース」のルートに配置し、外部の「ワークスペース」への依存関係を記述します。
(3)「BUILD」ファイルを作成。
この設定ファイルは、「パッケージ」に配置し、ビルド設定を記述します。
(4)コマンドラインのBazelコマンドでビルドを実行。
プロジェクトのフォルダ構成が以下の場合、「stage3」がワークスペース、「main」「lib」がパッケージになります。
└──stage3 ←ワークスペース
├── main ←パッケージ
│ ├── BUILD ←複数のターゲットのビルド設定を指定
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib ←パッケージ
│ ├── BUILD ←複数のターゲットのビルド設定を指定
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE ←外部ワークスペースへの依存関係を指定
3. macOSへのBazelのインストール
macOSへのBazelのインストールは、次の3つの方法があります。
・バイナリインストーラを使用する(推奨)
・Homebrewを使用
・ソースからBazelをコンパイル
今回は、バイナリインストーラを使用します。
(1) Xcodeコマンドラインツールのインストール
XcodeをApple Developer Siteからダウンロードしてインストールします。
Xcodeをインストールしたら、次のコマンドでユーザーのライセンス契約に同意します。
$ sudo xcodebuild -license accept
(2) Bazelインストーラーのダウンロード
BazelのGitHubリリースページからbazel-<version>-installer-darwin-x86_64.shをダウンロードします。
(3) インストーラーの実行
以下のコマンドでインストーラーを実行します。
--userフラグは、Bazelのインストール先を$HOME/bin、.bazelrcのパスを$HOME/.bazelrcに設定します。
$ chmod +x bazel-<version>-installer-darwin-x86_64.sh
$ ./bazel-<version>-installer-darwin-x86_64.sh --user
(4) 環境のセットアップ
Bazelが$HOME/binにインストールされているので、パスを通します。
「~/.bashrcor」や「~/.profile」に追加することもできます。
export PATH="$PATH:$HOME/bin"
(5) 動作確認
以下のコマンドでBazelのバージョンを確認できます。
$ bazel --version
※バージョン0.26.1では「$ bazel version」でした。
4. UbuntuへのBazelのインストール
サポートされているUbuntuのバージョンは以下の2つです。
・18.04(LTS)
・16.04(LTS)
UbuntuへのBazelのインストールは、次の3つの方法があります。
・バイナリインストーラーを使用する(推奨)
・カスタムAPTリポジトリを使用する
・ソースからBazelをコンパイル
今回は、バイナリインストーラを使用します。
(1) 前提条件となるパッケージのインストール
提条件となるパッケージ「pkg-config」「zip」「g++」「zlib1g-dev」「unzip」「python3」をインストールします。
$ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python3
(2) Bazelのダウンロード
BazelのGitHubリリースページからbazel-<version>-installer-linux-x86_64.shをダウンロードします。
(3) インストーラーの実行
以下のコマンドでインストーラーを実行します。
$ chmod +x bazel-<version>-installer-linux-x86_64.sh
$ ./bazel-<version>-installer-linux-x86_64.sh --user
--userフラグは、Bazelのインストール先を$HOME/bin、.bazelrcのパスを$HOME/.bazelrcに設定します。
(4) 環境のセットアップ
Bazelが$HOME/binにインストールされているので、パスを通します。
export PATH="$PATH:$HOME/bin"
「~/.bashrc」に追加することもできます。
(5) 動作確認
以下のコマンドでBazelのバージョンを確認できます。
$ bazel --version
5. HelloWorld
「Hello World!」と表示するC/C++のソースコードを作成し、Bazelでビルドしてみます。
(1) フォルダ構成
今回のプロジェクトは、以下のようなフォルダ構成になります。
└──helloworld
├── main
│ ├── BUILD
│ ├── helloworld.cpp
└── WORKSPACE
(2) WORKSPACEファイルを作成
「WORKSPACE」ファイルの中身は今回は必要ないので空とします。
(3)BUILDファイルを作成
「BUILD」ファイルには、ビルド設定を記述します。ビルド設定で最も重要なものが「ビルドルール」で、バイナリやライブラリなど、目的となる出力を指定します。「BUILD」ファイル内の「ビルドルール」の各インスタンスは「ターゲット」と呼ばれます。
【BUILD】
cc_binary (
name = "helloworld",
srcs = ["helloworld.cpp"],
)
ターゲット「helloworld」では組み込みビルドルール「cc_binary」をインスタンス化します。属性「name」にターゲット名、「srcs」にソースコードを指定します。
(4)ソースコードの作成
「helloworld.cpp」の中身は次のように記述します。
【helloworld.cpp】
#include <iostream>
int main(void)
{
std::cout << "Hello World!" << std::endl;
return 0;
}
(5) ビルド
プロジェクトのルートで以下のコマンドを入力します。
ビルド対象となるターゲットは「//<パッケージのパス>:<ターゲット名>」の書式で指定しています。
$ bazel build //main:helloworld
/.bazel-bin/main/helloworld/にビルド結果が出力されます。
(6) 実行
以下のコマンドで実行できます。
$ bazel run //main:helloworld
Hello World!
以下のように直接実行することもできます。
$ ./bazel-bin/main/helloworld
Hello World!
6. 依存関係の確認
以下のコマンドで、依存関係を確認することができます。
$ bazel query --nohost_deps --noimplicit_deps 'deps(//main:helloworld)' --output graph
digraph mygraph {
node [shape=box];
"//main:helloworld"
"//main:helloworld" -> "//main:helloworld.cpp"
"//main:helloworld.cpp"
}
次回
この記事が気に入ったらサポートをしてみませんか?