拡張機能の概要

問題を報告する ソースを表示

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

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

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

  • BUILD ファイルと .bzl ファイルの両方で使用される Starlark 言語を確認する。

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

マクロとルール

マクロは、ルールをインスタンス化する関数です。BUILD ファイルは、一部のコードの再利用が可能で、繰り返しが多すぎる場合や複雑すぎる場合に便利です。この関数は、BUILD ファイルが読み取られるとすぐに評価されます。BUILD ファイルの評価後、Bazel にマクロに関する情報はほとんどありません。マクロが genrule を生成した場合、Bazel は genrule を記述した場合と同様に動作します。その結果、bazel query は生成された genrule のみをリストします。

ルールはマクロよりも効果的です。Bazel の内部にアクセスして、処理を完全に制御できます。たとえば、他のルールに情報を渡す場合があります。

シンプルなロジックを再利用したい場合は、マクロから始めます。マクロが複雑な場合は、ルールを使用することをおすすめします。新しい言語のサポートは、通常はルールによって行われます。ルールは上級ユーザー向けです。ほとんどのユーザーは、ルールを記述する必要がなく、既存のルールの読み込みと呼び出しのみを行います。

評価モデル

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

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

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

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

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

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

広告表示オプションの作成

次の 2 つのリンクは、独自の拡張機能を作成する際に役立ちます。手が届く範囲に置いてください。

詳しく見る

マクロルールに加えて、アスペクトリポジトリ ルールも記述できます。