拡張機能の概要

このページでは、マクロとルールを使用して BUILD 言語を拡張する方法について説明します。

Bazel 拡張機能は、.bzl で終わるファイルです。拡張機能からシンボルをインポートするには、 load ステートメントを使用します。

高度なコンセプトを学習する前に、まず次のことを行います。

  • Starlark 言語について学習します。この言語は、 BUILD ファイルと .bzl ファイルの両方で使用されます。

  • 2 つの BUILD ファイル間で 変数を共有する 方法について学習します。

マクロとルール

マクロは、ルールをインスタンス化する関数です。マクロには、 シンボリック マクロ(Bazel 8 で新しく追加)とレガシー マクロの 2 種類があります。2 種類のマクロは定義が異なりますが、ユーザーから見るとほぼ同じように動作します。マクロは、BUILD ファイルが繰り返しが多くなりすぎたり、複雑になりすぎたりした場合に、一部のコードを再利用できるため便利です。関数は、BUILD ファイルが読み込まれるとすぐに評価されます。BUILD ファイルの評価後、Bazel はマクロに関する情報をほとんど持っていません。マクロが genrule を生成する場合、Bazel は BUILD ファイルで genrule を宣言した場合とほぼ同じように動作します。 (唯一の 例外は、シンボリック マクロで宣言されたターゲットには特別な可視性 セマンティクスがあることです。シンボリック マクロは、パッケージの他の部分から内部 ターゲットを非表示にできます)。

ルールはマクロよりも強力です。Bazel の内部にアクセスして、何が起こっているかを完全に制御できます。たとえば、他のルールに情報を渡すことができます。

単純なロジックを再利用する場合は、マクロから始めます。古い Bazel バージョンをサポートする必要がない限り、シンボリック マクロをおすすめします。マクロが複雑になった場合は、ルールにすることをおすすめします。通常、新しい言語のサポートはルールを使用して行われます。ルールは上級ユーザー向けであり、ほとんどのユーザーはルールを作成する必要はありません。既存のルールを読み込んで呼び出すだけです。

評価モデル

ビルドは 3 つのフェーズで構成されます。

  • 読み込みフェーズ 。まず、ビルドに必要なすべての拡張機能とすべての BUILD ファイルを読み込んで評価します。BUILD ファイルの実行では、ルールがインスタンス化されます(ルールが呼び出されるたびに、グラフに追加されます)。ここでマクロが評価されます。

  • 分析フェーズ 。ルールのコード(implementation 関数)が実行され、アクションがインスタンス化されます。アクションは、一連の入力から一連の出力を生成する方法を記述します(例: hello.c で gcc を実行して hello.o を取得する)。実際のコマンドを実行する前に、生成されるファイルを明示的にリストする必要があります。つまり、分析フェーズでは、読み込みフェーズで生成されたグラフを受け取り、アクション グラフを生成します。

  • 実行フェーズ 。出力の少なくとも 1 つが必要な場合に、アクションが実行されます。ファイルが見つからない場合や、コマンドが出力を生成できない場合、ビルドは失敗します。このフェーズではテストも実行されます。

Bazel は並列処理を使用して、.bzl ファイルと BUILD ファイルを読み取り、解析して評価します。ファイルはビルドごとに最大 1 回読み取られ、評価の結果はキャッシュに保存されて再利用されます。ファイルは、すべての依存関係(load() ステートメント)が解決された場合にのみ評価されます。.bzl ファイルの読み込みには、目に見える副作用はありません。値と関数のみを定義します。

Bazel は、依存関係分析を使用して、読み込む必要があるファイル、分析する必要があるルール、実行する必要があるアクションを把握します。たとえば、現在のビルドに必要ないアクションをルールが生成した場合、それらのアクションは実行されません。

拡張機能を作成する

独自の拡張機能を作成する際に、次の 2 つのリンクが非常に役立ちます。すぐにアクセスできるようにしておきましょう。

さらに詳しく

マクロルールに加えて、アスペクトとリポジトリ ルールを作成することもできます。