拡張機能の概要

問題を報告 ソースを表示

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

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

より高度なコンセプトを学習する前に、まず次のことを行ってください。

  • BUILD ファイルと .bzl ファイルの両方で使用される Starlark 言語について確認します。

  • 2 つの BUILD ファイル間で変数を共有する方法をご確認ください。

マクロとルール

マクロは、ルールをインスタンス化する関数です。一部のコードを再利用できるため、BUILD ファイルを繰り返し使用する場合や複雑すぎている場合に役立ちます。この関数は、BUILD ファイルが読み取られるとすぐに評価されます。BUILD ファイルを評価した後、Bazel にはマクロに関する情報がほとんどありません。マクロが genrule を生成すると、Bazel は genrule を書き込んだかのように動作します。そのため、bazel query は生成された genrule のみを一覧表示します。

ルールはマクロより強力です。Bazel の内部構造にアクセスでき、動作を完全に制御できます。たとえば、他のルールに情報を渡せます。

単純なロジックを再利用する場合は、マクロから始めます。マクロが複雑になった場合は、通常、マクロをルールにすることをおすすめします。通常、新しい言語のサポートはルールで行います。ルールは上級ユーザーを対象としており、ほとんどのユーザーはルールを記述する必要はありません。既存のルールを読み込んで呼び出すだけです。

評価モデル

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

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

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

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

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

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

拡張機能の作成

以下の 2 つのリンクは、独自の拡張機能を作成する際に非常に便利です。常に近くに置く:

さらに高度な活用方法

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