Bazel
From Wikipedia, the free encyclopedia
|
| |
| 開発元 | |
|---|---|
| 初版 | 2015年3月 |
| 最新版 | |
| リポジトリ | |
| プログラミング 言語 | Java[2] |
| 対応OS | クロスプラットフォーム |
| ライセンス | Apache License 2.0 |
| 公式サイト |
bazel |
Bazelは、ソフトウェアのビルドおよびテストの自動化に使用されるFOSSツールである[2]。
Make、Apache Ant、Apache Mavenなどのビルドツールと同様に、Bazelはソースコードからルールに基づいてソフトウェアアプリケーションをビルドする[2][3]。ルールとマクロは、Pythonの方言であるStarlark言語で記述される[4][3]。組み込みルールは、Java、Kotlin、Scala、C言語、C++、Go、Python、Rust、JavaScript、Objective-C、bashスクリプトのビルドに対応している[3][5]。BazelはAndroidおよびiOS向けに、デプロイ可能なソフトウェアアプリケーションパッケージを生成できる[6]。
根拠
Bazelは「最初の公開されたクラウドビルドシステムの一つ」と評されている。Bazelは過去に実行されたコマンドの履歴を保存し、その結果を複数のユーザー間で共有することが可能である[11]。このために、Bazelはビルドターゲットの入力と出力が完全に指定されていることを要求する。
Starlark
対応言語
他のビルドツールとの関係
Bazelと最も類似したビルドシステムとしては、Pants[13]、Buck[14]、Please[15]、Amazonが内部で使用しているBrazilビルドシステムがある[16]。PantsおよびBuckはいずれもBazelと類似の技術的設計目標を持ち、Pantsはグーグル内部で使用されていたBlazeビルドシステムに触発されている。
Bazel、Pants、Buck、Pleaseはいずれも、BUILDファイルの構文においてStarlarkをBUILDファイルパーサとして採用している。効率的な依存グラフ解析やビルド成果物の自動追跡といった用途において独自に開発されたビルドシステムには、tupのような例もある[17]。
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値を書き換える必要がある[18]。