一般ルール

ルール

エイリアス

alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

alias ルールは、ルールの別名を作成します。

エイリアス設定は、「通常の」ターゲットに対してのみ機能します。特に、package_grouptest_suite はエイリアス設定できません。

エイリアス ルールには、独自の公開設定の宣言があります。その他の点では、参照するルールと同じように動作します(例: エイリアスの testonly は無視されます。参照されるルールの testonly-ness が使用されます)。

  • コマンドラインでエイリアスが指定されている場合、テストは実行されません。参照されるテストを実行するエイリアスを定義するには、tests 属性に単一のターゲットを指定した test_suite ルールを使用します。
  • 環境グループを定義するときに、environment ルールのエイリアスはサポートされません。--target_environment コマンドライン オプションでもサポートされていません。

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

引数

属性
name

Name; required

このターゲットの一意の名前。

actual

Label; required

このエイリアスが参照するターゲット。ルールである必要はなく、入力ファイルにすることもできます。

config_setting

config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

構成可能な属性をトリガーする目的で、想定される構成状態(ビルドフラグまたはプラットフォームの制約として表現)と一致します。このルールの使用方法については、select をご覧ください。一般的な機能の概要については、 構成可能な属性をご覧ください。

以下は、--compilation_mode=opt または -c opt を(コマンドラインで明示的に、または .bazelrc ファイルから暗黙的に)設定するビルドに一致します。

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

以下は、ARM をターゲットとし、カスタム定義 FOO=bar(例: bazel build --cpu=arm --define FOO=bar ...)を適用するビルドに一致します。

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

以下は、ユーザー定義フラグ --//custom_flags:foo=1 を(コマンドラインで明示的に、または .bazelrc ファイルから暗黙的に)設定するビルドに一致します。

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

以下は、//example:glibc_2_25 というラベルの constraint_value が存在すると仮定し、x86_64 アーキテクチャと glibc バージョン 2.25 のプラットフォームをターゲットとするすべてのビルドに一致します。なお、この 2 つ以外の追加の制約値を定義すると、プラットフォームは一致することに注意してください。

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
上記のいずれの場合も、ビルド内で構成が変更される可能性があります。たとえば、ターゲットをその依存関係とは異なるプラットフォーム用にビルドする必要がある場合などです。つまり、config_setting がトップレベルのコマンドライン フラグと一致しない場合でも、一部のビルド ターゲットには一致する場合があります。

メモ

  • 複数の config_setting が現在の構成状態と一致する場合の動作については、select をご覧ください。
  • 省略形をサポートしているフラグ(--compilation_mode-c など)の場合、values 定義には完全形式を使用する必要があります。これらは、いずれかの形式を使用した呼び出しと自動的に一致します。
  • フラグが複数の値を取る場合(--copt=-Da --copt=-Db やリスト型の Starlark フラグなど)、values = { "flag": "a" } は、"a" が実際のリストの任意の場所に存在する場合に一致します。

    values = { "myflag": "a,b" } も同じように機能します。つまり、--myflag=a --myflag=b--myflag=a --myflag=b --myflag=c--myflag=a,b--myflag=c,b,a と一致します。正確なセマンティクスは、フラグによって異なります。たとえば、--copt は、同じインスタンス内の複数の値をサポートしていません。--copt=a,b["a,b"] を生成し、--copt=a --copt=b["a", "b"] を生成します(そのため、values = { "copt": "a,b" } は前者と一致しますが、後者とは一致しません)。ただし、--ios_multi_cpus(Apple ルールの場合)は行います-ios_multi_cpus=a,bios_multi_cpus=a --ios_multi_cpus=b はどちらも ["a", "b"] を生成します。フラグの定義を確認し、条件を慎重にテストして、想定が正確であることを確認してください。

  • 組み込みのビルドフラグでモデル化されていない条件を定義する必要がある場合は、 Starlark 定義のフラグを使用します。--define を使用することもできますが、サポート力が弱いため、おすすめしません。詳しくは、こちらをご覧ください。
  • 異なるパッケージで同じ config_setting 定義を繰り返さないようにします。代わりに、正規パッケージで定義されている共通の config_setting を参照します。
  • valuesdefine_valuesconstraint_values は、同じ config_setting で任意の組み合わせで使用できますが、特定の config_setting に対して少なくとも 1 つを設定する必要があります。

引数

属性
name

Name; required

このターゲットの一意の名前。

constraint_values

List of labels; optional; nonconfigurable

この config_setting と照合するためにターゲット プラットフォームが指定する必要がある constraint_values の最小セット。(実行プラットフォームはここでは考慮しません)。プラットフォームに追加されている制約値は無視されます。詳細については、 構成可能なビルド属性をご覧ください。

2 つの config_setting が同じ select 内で一致する場合、この属性は、config_setting の一方が他方の専門性かどうかを判断するために考慮されません。つまり、ある config_setting と他のプラットフォームより厳密な一致は一致しません。

define_values

Dictionary: String -> String; optional; nonconfigurable

values と同じですが、--define フラグに関するものです。

--define は特殊です。構文(--define KEY=VAL)は、Bazel フラグの観点から KEY=VAL が値であることを意味するからです。

つまり、以下のようになります。

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

は機能しません。同じキー(define)が辞書に 2 回出現するためです。この属性を使用することで、このような問題を解決できます。

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

bazel build //foo --define a=1 --define b=2 と正しく一致します。

--define は、通常のフラグ構文で values に引き続き使用できます。また、辞書のキーが区別される限り、この属性と自由に組み合わせることができます。

flag_values

Dictionary: label -> String; optional; nonconfigurable

values と同じですが、 ユーザー定義のビルドフラグに関するものです。

ユーザー定義のフラグはラベルとして参照され、組み込みフラグは任意の文字列として参照されるため、これは別の属性です。

values

Dictionary: String -> String; optional; nonconfigurable

このルールに一致する構成値のセット(ビルドフラグで表現)

このルールは、select ステートメントでそれを参照する構成済みのターゲットの構成を継承します。辞書内のすべてのエントリについて、その構成がエントリの想定値と一致する場合、Bazel 呼び出しと「一致」しているとみなされます。たとえば、values = {"compilation_mode": "opt"} はターゲット構成ルールでの bazel build --compilation_mode=opt ...bazel build -c opt ... の呼び出しと一致します。

便宜上、構成値はビルドフラグとして指定します("--" は付けません)。ただし、この 2 つは同じではないので注意してください。これは、ターゲットを同じビルド内の複数の構成でビルドできるためです。たとえば、ホスト構成の「cpu」は、--cpu ではなく --host_cpu の値と一致します。したがって、同じ config_setting の異なるインスタンスは、それらを使用するルールの構成によって、同じ呼び出しと一致する可能性があります。

フラグがコマンドラインで明示的に設定されていない場合は、デフォルト値が使用されます。キーが辞書に複数回出現する場合は、最後のインスタンスのみが使用されます。コマンドラインで複数回設定できるフラグ(bazel build --copt=foo --copt=bar --copt=baz ... など)をキーが参照している場合、これらの設定のいずれかが一致すると一致が発生します。

ファイルグループ

filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

filegroup を使用して、ターゲットのコレクションにわかりやすい名前を付けます。これらは他のルールから参照できます。

ディレクトリを直接参照するのではなく、filegroup を使用することをおすすめします。後者は、ビルドシステムがディレクトリ下のすべてのファイルを完全には認識していないため、これらのファイルが変更されても再ビルドされない可能性があるため、適切ではありません。filegroupglob と組み合わせることで、すべてのファイルをビルドシステムに明示的に認識させることができます。

2 つのソースファイルで構成される filegroup を作成するには、次のようにします。

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

または、glob を使用して testdata ディレクトリを検索します。

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

これらの定義を使用するには、任意のルールのラベルで filegroup を参照します。

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

srcs

List of labels; optional

ファイル グループのメンバーであるターゲットのリスト。

srcs 属性の値に、glob 式の結果を使用するのが一般的です。

data

List of labels; optional

実行時にこのルールに必要なファイルのリスト。

data 属性で指定されたターゲットは、この filegroup ルールの runfiles に追加されます。filegroup が別のルールの data 属性で参照されると、その runfiles が依存するルールの runfiles に追加されます。データファイルへの依存と使用方法の詳細については、データ依存関係のセクションと data の一般的なドキュメントをご覧ください。

output_group

String; optional

ソースからアーティファクトを収集する出力グループ。この属性を指定すると、デフォルトの出力グループではなく、依存関係の指定された出力グループのアーティファクトがエクスポートされます。

「出力グループ」は、ルールの実装で指定された、ターゲットの出力アーティファクトのカテゴリです。

genquery

genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery() は、Blaze クエリ言語で指定されたクエリを実行し、結果をファイルにダンプします。

ビルドの整合性を維持するため、クエリでは scope 属性で指定されたターゲットの推移的クロージャにアクセスすることのみが許可されます。strict が未指定または true の場合、このルールに違反するクエリは実行中に失敗します(strict が false の場合、対象範囲外のターゲットは単に警告付きでスキップされます)。これを回避する最も簡単な方法は、クエリ式と同じスコープにラベルを指定することです。

ここで許可されるクエリとコマンドラインで使用できるクエリの唯一の違いは、ワイルドカードのターゲット指定を含むクエリ(//pkg:*//pkg:all など)はここでは使用できないことです。その理由は 2 つあります。1 つ目は、genquery はクエリの推移的クロージャの外側にあるターゲットが出力に影響を与えないようにスコープを指定する必要があることと、BUILD ファイルがワイルドカード依存関係をサポートしていないためです(たとえば、deps=["//a/..."] は使用できません)。

決定論的な出力を適用するために、genquery の出力は --order_output=full を使用して並べ替えられます。

出力ファイルの名前はルールの名前です。

この例では、指定されたターゲットの推移的クロージャにあるラベルのリストをファイルに書き込みます。

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

expression

String; required

実行されるクエリ。コマンドラインなどの BUILD ファイル内の場所とは対照的に、ここで説明するラベルはワークスペースのルート ディレクトリを基準として解決されます。たとえば、ファイル a/BUILD のこの属性のラベル :b は、ターゲット //:b を参照します。
opts

List of strings; optional

クエリエンジンに渡されるオプション。これらは、bazel query に渡すことができるコマンドライン オプションに対応しています。ここでは、一部のクエリ オプション(--keep_going--query_file--universe_scope--order_results--order_output)は使用できません。ここで指定されていないオプションには、bazel query のコマンドラインと同様に、デフォルト値が使用されます。
scope

null; required

クエリの範囲。これらのターゲットの推移的終了の外側にあるターゲットにクエリでアクセスすることはできません。
strict

Boolean; optional; default is True

true の場合、クエリがスコープの推移的終了をエスケープするターゲットはビルドに失敗します。false の場合、Bazel は警告を出力し、スコープ外のクエリパスをスキップして、残りのクエリを完了します。

genrule

genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

genrule は、ユーザー定義の Bash コマンドを使用して 1 つ以上のファイルを生成します。

genrules は、タスクに特定のルールがない場合に使用できる汎用のビルドルールです。たとえば、Bash のワンライナーを実行できます。ただし、C++ ファイルをコンパイルする必要がある場合は、既存の cc_* ルールに従ってください。手間のかかる作業はすべて自動的に完了しています。

テストの実行に genrule を使用しないでください。テストとテスト結果については、キャッシュ ポリシーや環境変数など、特別な要件があります。通常、テストはビルドの完了後にターゲット アーキテクチャで実行する必要がありますが、genrules はビルド中とホスト アーキテクチャで実行されます(この 2 つは異なる場合があります)。汎用のテストルールが必要な場合は、sh_test を使用します。

クロスコンパイルに関する考慮事項

クロスコンパイルの詳細については、ユーザー マニュアルをご覧ください。

genrules がビルド中に実行され、その出力がビルド後にデプロイまたはテストに使用されることがよくあります。マイクロコントローラ用に C コードをコンパイルする例を考えてみましょう。コンパイラは、C ソースファイルを受け取って、マイクロコントローラ上で実行するコードを生成します。生成されたコードは、明らかにビルドに使用された CPU では実行できませんが、C コンパイラ(ソースからコンパイルされた場合)自体は実行する必要があります。

ビルドシステムは、ホスト構成を使用してビルドを実行するマシンを記述し、ターゲット構成を使用してビルドの出力が実行されるマシンを記述します。これらを構成するオプションが用意されており、競合を回避するために、対応するファイルを別々のディレクトリに分離します。

genrules の場合、ビルドシステムは依存関係が適切にビルドされていることを確認します。srcs は(必要に応じて)ターゲット構成用にビルドされ、toolshost構成用にビルドされ、出力はターゲット構成用とみなされます。また、genrule コマンドが対応するツールに渡すことができる Make 変数も用意されています。

genrule では deps 属性を定義しません。他の組み込みルールは、ルール間で渡される言語依存メタ情報を使用して、依存ルールの処理方法を自動的に決定しますが、genrule ではこのレベルの自動化はできません。genrules は、純粋にファイルレベルとランファイル レベルで機能します。

特殊なケース

ホストホスト コンパイル: 場合によっては、ビルド中に出力も実行できるように、ビルドシステムで genrules を実行する必要があります。たとえば、genrule がカスタム コンパイラをビルドして、後で別の genrule が使用する場合、最初の genrule でコンパイラが実行されるため、ホスト構成用の出力を生成する必要があります。この場合、ビルドシステムは正しい処理を自動的に行います。ターゲット構成ではなく、ホスト構成の最初の genrule の srcsouts をビルドします。詳しくは、ユーザー マニュアルをご覧ください。

JDK および C++ ツール: JDK または C++ コンパイラ スイートのツールを使用するために、ビルドシステムは使用する変数のセットを提供します。詳しくは、Make 変数をご覧ください。

Genrule 環境

genrule コマンドは、set -e -o pipefail を使用して、コマンドまたはパイプラインが失敗した場合に失敗するように構成された Bash シェルによって実行されます。

ビルドツールは、PATHPWDTMPDIR などのコア変数のみを定義するサニタイズされたプロセス環境で Bash コマンドを実行します。ビルドの再現性を確保するため、ユーザーのシェル環境で定義されているほとんどの変数は、genrule のコマンドに渡されません。ただし、Bazel(ただし Blaze ではない)は、ユーザーの PATH 環境変数の値を渡します。 PATH の値が変更されると、Bazel は次のビルドでコマンドを再実行します。

genrule コマンドは、コマンド自体の子プロセスを接続する場合を除いて、ネットワークにアクセスすべきではありませんが、現在は適用されません。

ビルドシステムは、既存の出力ファイルを自動的に削除しますが、genrule を実行する前に必要な親ディレクトリを作成します。また、エラーが発生した場合は出力ファイルもすべて削除されます。

一般的なアドバイス

  • genrule で実行されるツールが確定的かつ密閉型であることを確認してください。出力にはタイムスタンプを書き込みません。また、セットとマップを安定した順序で書き込み、出力への相対ファイルパスのみを書き込む必要があります。絶対パスは書き込みません。このルールに従わないと、予期しないビルド動作が発生し(Bazel が genrule を再ビルドしないため)、キャッシュのパフォーマンスが低下します。
  • 出力、ツール、ソースについて、$(location) を広範囲に使用する。さまざまな構成に対して出力ファイルが分離されているため、genrules はハードコードされた絶対パスに依存できません。
  • 同じまたは非常に類似した genrules が複数の場所で使用されている場合に備えて、共通の Starlark マクロを作成してください。genrule が複雑な場合は、スクリプトまたは Starlark ルールとして実装することを検討してください。これにより、可読性とテスト性が向上します。
  • 終了コードが genrule の成功または失敗を正しく示していることを確認してください。
  • 情報メッセージを stdout または stderr に書き込まないでください。これはデバッグには役立ちますが、ノイズになりやすいため、genrule が成功しても通知は届かないはずです。一方、genrule が失敗した場合は、適切なエラー メッセージが出力されます。
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x).
  • シンボリック リンクとディレクトリは作成しないでください。Bazel は、genrules によって作成されたディレクトリ/symlink 構造をコピーせず、ディレクトリの依存関係チェックが正常に行われません。
  • 他のルールで genrule を参照する場合は、genrule のラベルまたは個々の出力ファイルのラベルを使用できます。一方のアプローチのほうが読みやすい場合もありますが、もう一方のアプローチのほうが読みやすい場合もあります。使用ルールの srcs で名前で出力を参照することで、genrule の他の出力を意図せず取得しないようにできます。ただし、genrule で多数の出力が生成された場合は面倒な作業になります。

この例では、foo.h が生成されます。このコマンドは入力を受け取らないため、ソースはありません。このコマンドによって実行される「バイナリ」は、genrule と同じパッケージ内の perl スクリプトです。

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

次の例は、filegroup の使用方法と別の genrule の出力を示しています。明示的な $(location) ディレクティブの代わりに $(SRCS) を使用することもできます。この例では、デモのために後者を使用しています。

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

引数

属性
name

Name; required

このターゲットの一意の名前。


このルールの名前は、他の BUILD ルールの srcs セクションまたは deps セクションで参照できます。ルールによってソースファイルが生成される場合は、srcs 属性を使用する必要があります。
srcs

List of labels; optional

このルールの入力のリスト(処理するソースファイルなど)。

この属性は、cmd によって実行されるツールを一覧表示するには適していません。代わりに tools 属性を使用してください。

ビルドシステムは、genrule コマンドを実行する前にこれらの前提条件を確実にビルドします。これらの前提条件は、元のビルド リクエストと同じ構成を使用してビルドされます。これらの前提条件のファイルの名前は、$(SRCS) のスペース区切りリストとしてコマンドで使用できます。または、個々の srcs ターゲット //x:y のパスは、$(location //x:y) を使用するか、$< を使用して取得できます(srcs に唯一のエントリがある場合)。

outs

List of filenames; required; nonconfigurable

このルールによって生成されたファイルのリスト。

出力ファイルはパッケージの境界を越えてはなりません。 出力ファイル名は、パッケージを基準とする相対名として解釈されます。

executable フラグが設定されている場合、outs にはラベルを 1 つだけ含める必要があります。

genrule コマンドは、所定の場所に各出力ファイルを作成することを想定しています。この場所は、genrule 固有の「Make」変数$@$(OUTS)$(@D) $(RULEDIR))または $(location) 置換を使用することで、cmd で使用できます。

cmd

String; optional

実行するコマンド。$(location) 「Make」変数の置換が適用されます。
  1. 最初の $(location) 置換が適用され、$(location label)$(locations label)(および関連する変数 execpathexecpathsrootpathrootpaths を使用する同様の構造)がすべて置き換えられます。
  2. 次に、「Make」変数が展開されます。事前定義変数 $(JAVA)$(JAVAC)$(JAVABASE)host 構成の配下で展開されるため、ビルドステップの一部として実行される Java 呼び出しは、共有ライブラリやその他の依存関係を正しく読み込むことができます。
  3. 最後に、結果のコマンドが Bash シェルを使用して実行されます。終了コードがゼロ以外の場合、コマンドは失敗したとみなされます。
これは、cmd_bashcmd_pscmd_bat のいずれも適用できない場合のフォールバックです。

コマンドラインの長さがプラットフォームの上限(Linux/macOS では 64 K、Windows では 8 K)を超えると、genrule はコマンドをスクリプトに書き込み、そのスクリプトを実行して回避します。これは、すべての cmd 属性(cmdcmd_bashcmd_pscmd_bat)に適用されます。

cmd_bash

String; optional

実行する Bash コマンド。

この属性は cmd よりも優先度が高くなります。このコマンドは展開され、cmd 属性とまったく同じ方法で実行されます。

cmd_bat

String; optional

Windows で実行する Batch コマンド。

この属性は、cmdcmd_bash よりも優先度が高くなります。このコマンドは cmd 属性と同様に実行されますが、次の点が異なります。

  • この属性は Windows にのみ適用されます。
  • このコマンドは、次のデフォルト引数を指定して cmd.exe /c で実行されます。
    • /S - 最初と最後の引用符を削除し、それ以外はそのまま実行します。
    • /E:ON - 拡張コマンドセットを有効にします。
    • /V:ON - 遅延変数展開を有効にします。
    • /D - AutoRun レジストリ エントリを無視します。
  • $(location)「Make」変数を置換すると、パスは Windows スタイルのパス(バックスラッシュ付き)に展開されます。
cmd_ps

String; optional

Windows で実行する Powershell コマンド。

この属性は、cmdcmd_bashcmd_bat よりも優先度が高くなります。このコマンドは cmd 属性と同様に実行されますが、次の点が異なります。

  • この属性は Windows にのみ適用されます。
  • このコマンドは powershell.exe /c で実行されます。

Powershell を使いやすくし、エラーが発生しないようにするため、genrule で Powershell コマンドを実行する前に、次のコマンドを実行して環境をセットアップします。

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - 署名のないスクリプトの実行を許可します。
  • $errorActionPreference='Stop' - ; で区切られた複数のコマンドがある場合、Powershell CmdLet が失敗するとアクションはすぐに終了しますが、外部コマンドでは機能しません
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - デフォルトのエンコードを utf-16 から utf-8 に変更します。
exec_tools

List of labels; optional

このルールの tool 依存関係のリスト。これは tools 属性とまったく同じように動作しますが、これらの依存関係は、ホスト構成ではなくルールの実行プラットフォーム用に構成されます。つまり、exec_tools の依存関係には、tools の依存関係と同じ制限は適用されません。特に、独自の推移的依存関係にホスト構成を使用する必要はありません。詳細については、tools をご覧ください。

Blaze チームは、tools の使用をすべて exec_tools セマンティクスを使用するように移行しています。問題が発生しなければ、tools よりも exec_tools を優先することをおすすめします。機能の移行が完了したら、exec_tools の名前を tools に変更できます。サポート終了になる前に、非推奨に関する警告と移行手順が表示されます。

executable

Boolean; optional; nonconfigurable; default is False

出力を実行可能として宣言します。

このフラグを True に設定すると、出力が実行可能ファイルであり、run コマンドを使用して実行できることを意味します。この場合、genrule は出力を 1 つだけ生成する必要があります。この属性が設定されている場合、run はファイルの内容に関係なくファイルの実行を試行します。

生成された実行可能ファイルのデータ依存関係を宣言することはできません。

local

Boolean; optional; default is False

True に設定すると、この genrule は強制的に「ローカル」戦略で実行されます。つまり、リモート実行、サンドボックス化、永続ワーカーは実行されません。

これは、local をタグ(tags=["local"])として指定した場合と同じです。

message

String; optional

進行状況のメッセージ。

このビルドステップが実行されるときに出力される進行状況メッセージ。デフォルトでは、メッセージは「出力の生成」(またはそれと同じくらい平凡なもの)になりますが、より具体的なメッセージを指定することもできます。cmd コマンドで、echo や他の print ステートメントの代わりにこの属性を使用します。この属性により、ビルドツールが進行状況メッセージを出力するかどうかを制御できます。

output_licenses

Licence type; optional

common attributes をご覧ください。
output_to_bindir

Boolean; optional; nonconfigurable; default is False

True に設定すると、出力ファイルは genfiles ディレクトリではなく bin ディレクトリに書き込まれます。

tools

List of labels; optional

このルールの tool 依存関係のリスト。詳細については、依存関係の定義をご覧ください。

ビルドシステムは、genrule コマンドを実行する前にこれらの前提条件を確実にビルドします。これらの前提条件は、host 構成を使用してビルドされます。これらのツールはビルドの一部として実行されるためです。個々の tools ターゲット //x:y のパスは、$(location //x:y) を使用して取得できます。

cmd で実行するすべての *_binary またはツールは、正しい構成でビルドされるように、srcs ではなくこのリストに存在する必要があります。

test_suite

test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

test_suite は、人間にとって「有用」と見なされる一連のテストを定義します。これにより、プロジェクトで「チェックイン前に実行する必要があるテスト」、「プロジェクトのストレステスト」、「すべての小規模なテスト」など、一連のテストを定義できます。blaze test コマンドは、この種の構成を尊重します。blaze test //some/test:suite のような呼び出しの場合、Blaze はまず //some/test:suite ターゲットによって推移的に含まれるすべてのテスト ターゲットを列挙(これを「test_suite 展開」と呼びます)し、それらのターゲットをビルドしてテストします。

現在のパッケージ内のすべての小規模なテストを実行するためのテストスイート。

test_suite(
    name = "small_tests",
    tags = ["small"],
)

指定されたテストセットを実行するテストスイート:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

現在のパッケージ内の不安定でないすべてのテストを実行するためのテストスイート。

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

tags

List of strings; optional; nonconfigurable

「small」、「database」、「-flaky」などのテキストタグのリスト。タグには任意の有効な文字列を指定できます。

「-」文字で始まるタグは、負のタグと見なされます。先行する「-」はタグの一部とはみなされないため、スイートタグ「-small」はテストの「small」サイズと一致します。その他のタグはすべて正のタグと見なされます。

正のタグをさらに明示的にするために、タグの先頭に「+」文字を付けることもできます。この場合、プラス記号はタグのテキストの一部として評価されません。単に、肯定的と否定的な区別がわかりやすくなるだけです。

テストスイートに含まれるのは、すべての陽性タグに一致し、陰性タグには一致しないテストルールのみです。これは、除外されたテストの依存関係の確認エラー チェックがスキップされるという意味ではありません。スキップされたテストの依存関係は、正当である必要がある(可視性の制約によってブロックされていないなど)必要があります。

manual タグキーワードは、ワイルドカード ターゲット パターンを含む呼び出しに対して blaze test コマンドによって実行される「test_suite 展開」によって、上記とは異なる方法で処理されます。「manual」とタグ付けされた test_suite ターゲットは除外されます(したがって拡張されません)。この動作は、blaze buildblaze test がワイルドカード ターゲット パターンを処理する一般的な方法と一致します。スイートは manual タグに関係なく常に tests クエリ関数によって展開されるため、これは blaze query 'tests(E)' の動作とは明示的に異なることに注意してください。

テストの size は、フィルタリングではタグと見なされます。

相互に排他的なタグを含むテスト(すべての小規模テストと中規模テストなど)を含む test_suite が必要な場合は、3 つの test_suite ルールを作成する必要があります。1 つはすべての小規模テスト、1 つはすべての中規模テスト、もう 1 つは前の 2 つを含むテストです。

tests

List of labels; optional; nonconfigurable

任意の言語のテストスイートとテスト ターゲットのリスト。

ここでは、言語に関係なく、すべての *_test を使用できます。ただし、たとえテストを実行した場合でも、*_binary ターゲットは受け入れられません。指定された tags によるフィルタリングは、この属性に直接リストされているテストに対してのみ行われます。この属性に test_suite が含まれている場合、それらの内部のテストは、この test_suite でフィルタされません(すでにフィルタリングされているとみなされます)。

tests 属性が指定されていないか空の場合、現在の BUILD ファイル内で manual としてタグ付けされていないすべてのテストルールがデフォルトで含まれます。これらのルールも tag フィルタリングの対象となります。