Bazel

Bazelは、ソフトウェアのビルドおよびテストの自動化に使用されるFOSSツールである。

Make、Apache Ant、Apache Mavenなどのビルドツールと同様に、Bazelはソースコードからルールに基づいてソフトウェアアプリケーションをビルドする。ルールとマクロは、Pythonの方言であるStarlark言語で記述される。組み込みルールは、Java、Kotlin、Scala、C言語、C++、Go、Python、Rust、JavaScript、Objective-C、bashスクリプトのビルドに対応している。BazelはAndroidおよびiOS向けに、デプロイ可能なソフトウェアアプリケーションパッケージを生成できる。

歴史
2006年、GoogleはBlazeというビルドツールの開発を開始した。その動機は、大規模なにおいてスピードと正確性を両立できるビルドシステムを開発することであった。

Bazelは、Blazeのオープンソース移植版として作成され、その名称にはBlazeのアナグラムが使われている。Bazelは2015年3月に最初のリリースが行われ、同年9月にはベータ版に移行した。バージョン1.0は2019年10月にリリースされた。

 根拠 
Bazelは「最初の公開されたクラウドビルドシステムの一つ」と評されている。Bazelは過去に実行されたコマンドの履歴を保存し、その結果を複数のユーザー間で共有することが可能である。このために、Bazelはビルドターゲットの入力と出力が完全に指定されていることを要求する。

 Starlark 
Bazelはプログラミング言語Starlarkによって拡張可能である。Starlarkは、構文がPythonの構文のサブセットである組み込み言語である。ただし、ファイルI/Oへのアクセス機能など、多くのPythonの言語機能は実装されていない。これは、ビルドシステム自体が認識できない副作用やビルド成果物を生じさせるような拡張を避けるためである。このような副作用は、ビルド依存グラフの誤った解析につながる可能性がある。

 対応言語 
Bazelはマルチ言語ビルドシステムとして設計されている。同一のリポジトリ内で複数のプログラミング言語を組み合わせたソフトウェアのビルドが可能である。

多くの一般的なビルドシステムは、特定のプログラミング言語を前提として設計されている。例えば、Java向けのAntやMaven、Clojure向けの、Scala向けのsbtなどが該当する。複数言語を含むリポジトリにおいては、これら個別のビルドシステムを組み合わせることや、前述のビルド速度と正確性の利点を実現することは困難かつ問題を生じやすい。

 他のビルドツールとの関係 
Bazelと最も類似したビルドシステムとしては、Pants、Buck、PleasePlease FAQ、Amazonが内部で使用しているBrazilビルドシステムがあるAmazon's Build System。PantsおよびBuckはいずれもBazelと類似の技術的設計目標を持ち、Pantsはグーグル内部で使用されていたBlazeビルドシステムに触発されている。

Bazel、Pants、Buck、Pleaseはいずれも、BUILDファイルの構文においてStarlarkをBUILDファイルパーサとして採用している。効率的な依存グラフ解析やビルド成果物の自動追跡といった用途において独自に開発されたビルドシステムには、tupのような例もある。

Sandbox
Bazelはコンパイル工程においてサンドボックスを使用している。Bazelが個別のコンパイルを実行する際には、新しいディレクトリを作成し、そのルールにおける明示的な入力依存関係へのシンボリックリンクで満たす。CやC++のような言語においては、ユーザーが依存関係を明示的に指定する必要があり、別のインクルードディレクトリにある同名のヘッダーファイルが予期せず含まれてしまうのを防ぐことができる。

このサンドボックス方式は一般的なビルドツールとの間で問題を引き起こし、さまざまなアーキテクチャでコードを正しくコンパイルするために多くの回避策が必要となる。たとえば、Mac/Darwinアーキテクチャ向けに個別コンパイルを行う際には、コンパイラがSOおよびOSOシンボルとして入力パスをMach-Oバイナリに書き込む。これはnm -a mybinary | grep SOのようなコマンドで確認できる。これらのパスはデバッグ中にシンボルを見つけるために必要である。その結果として、Bazelでのビルドでは、-fdebug-prefix-mapや-oso_prefixのようなフラグを用いて、サンドボックス構築に起因するパス関連の問題を修正するためにコンパイル済みオブジェクトを後処理する必要がある。なお、後者はXcode 11.0で使用可能になった。リンク工程でも同様の処理が必要であり、install_name_toolのようなコマンドで共有オブジェクトライブラリのrpath値を書き換える必要がある。

ロゴ
Bazelの初期リリース以来、ロゴは2枚の葉を持つバジルの茎の形をした緑色の小文字の "b" であった。2017年7月5日、「Bazel Blog」において新しいロゴが発表された。このロゴは、3つの緑の積み木がハートの形になるように配置されたものである。

採用状況
Bazelは企業で広く使用されている。著名なユーザーとしては、Google、スペースX、ストライプ、Tinder、Uberが挙げられるhttps://www.uber.com/en-DE/blog/go-monorepo-bazel/。

関連項目




脚注

外部リンク


Category:ビルド自動化
Category:Googleのソフトウェア
Category:Apache Licenseのソフトウェア