変数を作成する

問題を報告 ソースを表示 夜間 7.4 をタップします。 7.3 7.2 7.1 7.0 6.5

「つくる」変数は、展開可能な文字列変数の特殊なクラスで、 "Subject to 'Make variable'置換」というテキストを使用します

たとえば、ユーザーが作成したビルドアクションに特定のツールチェーン パスを挿入するために使用できます。

Bazel には、すべてのターゲットで使用できる事前定義変数と、依存関係ターゲットで定義され、依存するターゲットでのみ使用できるカスタム変数の両方が用意されています。

「Make」という言葉を使う理由は、記述されています。つまり、Terraform の構文と これらの変数はもともと、GNU Make

使用

「Make 変数の置換の対象」としてマークされた属性は、次のように「Make」変数 FOO を参照できます。

my_attr = "prefix $(FOO) suffix"

つまり、$(FOO) に一致する部分文字列が展開されます。 FOO の値に設定されます。その値が "bar" の場合、最終的な文字列は次のようになります。

my_attr = "prefix bar suffix"

FOO が使用元のターゲットに知られている変数に対応していない場合、Bazel はエラーで失敗します。

「つくる」名前が文字以外の記号である変数(例: @ は、ドル記号のみを使用して参照することもできます。 あります。次に例を示します。

my_attr = "prefix $@ suffix"

$ を文字列リテラルとして記述する(つまり、変数が 拡張)、$$ と記述します。

事前定義された変数

事前定義の「Make」変数は、 "Make variable" の対象置換する」

特定のビルドオプションのセットのこれらの変数とその値のリストを表示するには、次のコマンドを実行します。

bazel info --show_make_env [build options]

大文字の出力行を確認します

事前定義された変数の例をご覧ください

ツールチェーン オプション変数

  • COMPILATION_MODE: fastbuilddbg、または opt。( 詳細

パス変数

  • BINDIR: ターゲット アーキテクチャ用に生成されたバイナリ ツリーのベース。

    クロスコンパイルをサポートするために、ホスト アーキテクチャでビルド中に実行されるプログラムに別のツリーが使用される場合があります。

    genrule 内からツールを実行する場合は、 パスを取得するために推奨される方法は $(execpath toolname) です。 ここで、toolnamegenruletools 属性。

  • GENDIR: ターゲット アーキテクチャ用に生成されたコードツリーのベース。

マシン アーキテクチャ変数

  • TARGET_CPU: ターゲット アーキテクチャの CPU(例:k8

事前定義された genrule 変数

以下は genrulecmd 属性で特別に使用でき、通常、その属性を機能させるために重要です。

事前定義された genrule 変数の例をご覧ください

  • OUTS: genruleouts リスト。出力ファイルが 1 つしかない場合は、$@ を使用することもできます。
  • SRCS: genrulesrcs リスト(またはそれ以上) 厳密に指定: バケット内のラベルに対応するファイルのパス名 srcs リスト)。 ソースファイルが 1 つしかない場合は、$< を使用することもできます。
  • <: 単一ファイルの場合は SRCS。その他のトリガー ビルドエラーになります。
  • @: OUTS(単一ファイルの場合)。それ以外の場合は、ビルドエラーがトリガーされます。
  • RULEDIR: ターゲットの出力ディレクトリ。つまり、genfiles ツリーまたは bin ツリーの下にターゲットを含むパッケージの名前に対応するディレクトリです。//my/pkg:my_genrule の場合、//my/pkg:my_genrule の出力がサブディレクトリにある場合でも、常に my/pkg で終わります。

  • @D: 出力ディレクトリ。outs に 1 つのエントリがある場合、そのファイルを含むディレクトリに展開されます。エントリが複数ある場合、すべての出力ファイルが同じサブディレクトリにある場合でもgenfiles ツリー内のパッケージのルート ディレクトリに展開されます。

    注: 次の理由により、@D ではなく RULEDIR を使用してください。 RULEDIR はより単純なセマンティクスで、同じように動作します。 出力ファイルの数に関係なく 同じ結果になります

    genrule が一時中間ファイルを生成する必要がある場合(コンパイラなどの他のツールを使用した結果など)、それらを一時ファイルとして @D に書き込み(/tmp にも書き込めます)、終了前に削除する必要があります。

    特に、入力を含むディレクトリへの書き込みは避けてください。読み取り専用ファイル システムに存在する場合があります。そうでなくても、ソースツリーが破棄されます。

事前定義されたソースパス変数と出力パス変数

事前定義変数 execpathexecpathsrootpathrootpathslocationlocations は、ラベル パラメータ($(execpath //foo:bar) など)を受け取り、そのラベルで表されるファイルパスを置き換えます。

ソースファイルの場合、これはワークスペースのルートからの相対パスです。ルールの出力であるファイルの場合、これはファイルの出力パスです。 (下記の出力ファイルの説明をご覧ください)。

事前定義されたパス変数の例をご覧ください

  • execpath: パスの下のパスを示します。 execroot Bazel はビルド アクションを実行します。

    上記の例では、Bazel はワークスペースのルートにある bazel-myproject シンボリック リンクによってリンクされたディレクトリですべてのビルドアクションを実行します。「 ソースファイル empty.source がパスでリンクされます。 bazel-myproject/testapp/empty.source。そのため、実行パス(ルートの下のサブパス)は testapp/empty.source です。これは、ビルドアクションがファイルを検索するために使用できるパスです。

    出力ファイルも同様にステージングされますが、先頭にサブパスが付加されます。 bazel-out/cpu-compilation_mode/bin(または ツール: bazel-out/cpu-opt-exec-hash/bin)。上記の例では、 //testapp:app はツールで、次の場所に表示されます: show_app_outputtools 属性。 そのため、出力ファイル appbazel-myproject/bazel-out/cpu-opt-exec-hash/bin/testapp/app。 したがって、exec パスは bazel-out/cpu-opt-exec-hash/bin/testapp/app になります。この追加の接頭辞は、 たとえば、2 つの異なる CPU に対して同じターゲットを 結果が相互に上書きされないようにします。

    この変数に渡されるラベルは、1 つのファイルのみを表す必要があります。ソースファイルを表すラベルの場合、これは自動的に true になります。ラベルの場合 ルールによって生成される出力は 1 つだけです。これが false またはラベルの形式が正しくない場合、ビルドはエラーで失敗します。

  • rootpath: ビルドされたバイナリが以下に使用できるパス 実行ファイルのサブディレクトリに対して相対的に、実行時に依存関係を検出する 対応するディレクトリに配置されます。 注: これは、--enable_runfiles が有効な場合にのみ機能します。これは、Windows ではデフォルトで有効になっていません。代わりに rlocationpath を使用する サポートしています。

    これは execpath に似ていますが、上記の構成接頭辞が削除されます。上の例では、これは両方の empty.sourceapp は純粋なワークスペース相対値を使用しています パス: testapp/empty.sourcetestapp/app

    外部リポジトリ内のファイルの rootpath repo../repo/ で始まり、 リポジトリ相対パス。

    これは、execpath と同じ「1 つの出力のみ」の要件があります。

  • rlocationpath: 依存関係を見つけるために、ビルドバイナリが runfiles ライブラリの Rlocation 関数に渡すパス runfiles ディレクトリにあるか(使用可能な場合)、 実行ファイル マニフェスト。

    これは、構成接頭辞が含まれていないという点で rootpath に似ていますが、常にリポジトリの名前で始まるという点で異なります。上記の例では、 empty.sourceapp の結果は次のようになります。 パス: myproject/testapp/empty.source myproject/testapp/app

    外部リポジトリ内のファイルの rlocationpath reporepo/ で始まり、 リポジトリ相対パス。

    ランタイムで依存関係を見つけるには、このパスをバイナリに渡し、runfiles ライブラリを使用してファイル システム パスに解決することをおすすめします。rootpath と比較して、すべてのプラットフォームで動作し、runfiles ディレクトリが使用できない場合でも動作するという利点があります。

    これは、execpath と同じ「1 つの出力のみ」の要件があります。

  • location: 展開される属性に応じて、execpath または rootpath のいずれかの類義語。これは、 Starlark 以前の動作です。よくわからない場合は、おすすめしません。 調整できます。#2475 を参照 をご覧ください。

execpathsrootpathsrlocationpathslocations は、それぞれ execpathrootpathrlocationpathslocation の複数形のバリエーションです。複数の出力を生成するラベルをサポートしています。この場合、各出力はスペースで区切って一覧表示されます。出力なしのルールと形式が正しくないラベルは、ビルドエラーを生成します。

参照されるすべてのラベルが使用ターゲットの srcs に含まれている必要があります。 出力ファイル、または deps です。それ以外の場合、ビルドは失敗します。C++ ターゲットは、data のラベルを参照することもできます。

ラベルを正規形式(foo:foo)にする必要はありません。 //somepkg:foo で問題はありません。

カスタム変数

カスタムの「Make」変数は、 "Make variable" の対象"" という文字列を指定する必要があります。ただし、 その変数を定義している他のターゲットに依存します。

ベスト プラクティスとして、適切なものがない限り、すべての変数はカスタムにする それらをコア Bazel に組み込む理由です。これにより、Bazel は、ターゲットが気にしない変数を供給するために、費用のかかる依存関係を読み込む必要がなくなります。

C++ ツールチェーン変数

以下は C++ ツールチェーン ルールで定義され、toolchains = ["@bazel_tools//tools/cpp:current_cc_toolchain"] を設定するすべてのルールで使用できます。java_binary などの一部のルールでは、ルール定義に C++ ツールチェーンが暗黙的に含まれます。これらの変数は 自動的に適用されます。

組み込みの C++ ルールは、「コンパイラを実行する」よりもはるかに高度です。*SAN、ThinLTO、 バイナリを慎重に最適化し、バイナリをモジュール有り/無しで 組み込みルールを使用して、複数のプラットフォームで 正しい入力、出力、コマンドライン フラグが設定されていることを確認するための長さ。 内部で生成される複数のアクションの それぞれに対して行われます

これらの変数は、言語の専門家が使う代替メカニズムです。 まれに発生する場合があります。これらの機能を使用する場合は、まず Bazel デベロッパーにお問い合わせください。

  • ABI: C++ ABI のバージョン。
  • AR: crosstool の「ar」コマンド。
  • C_COMPILER: C/C++ コンパイラ ID(llvm など)。
  • CC: C コンパイラ コマンドと C++ コンパイラ コマンド。

    常に CC_FLAGS を使用することを強くおすすめします。 CC との組み合わせ。ご自身の責任で行っていただく必要があります。

  • CC_FLAGS: C/C++ のフラグの最小セット genrules で使用できるようにします。特に、CC が複数のアーキテクチャをサポートしている場合に、正しいアーキテクチャを選択するためのフラグが含まれています。
  • NM: 「nm」実行してみましょう
  • OBJCOPY: C/C++ と同じスイートの objcopy コマンド あります。
  • STRIP: C/C++ コンパイラと同じスイートにある strip コマンド。

Java ツールチェーン変数

以下は、Java ツールチェーン ルールで定義されており、どのルールでも使用可能です。 toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"](または "@bazel_tools//tools/jdk:current_host_java_runtime" を参照してください)。

JDK のツールのほとんどは直接使用しないでください。組み込みの Java ルールでは、インターフェース JAR、ヘッダー インターフェース JAR、高度に最適化された JAR パッケージングとマージの実装など、アップストリーム ツールで表現できるものよりもはるかに高度なアプローチで Java のコンパイルとパッケージングが行われます。

これらの変数は、まれなケースで言語の専門家が使用するフォールバック メカニズムです。使用したいとお考えの場合は、まず Bazel 開発者に連絡してください。

  • JAVA: 「java」コマンド(Java 仮想マシン)。これを回避し、java_binary ルールを使用する 推奨されます。相対パスを指定できます。変更が必要な場合 java を呼び出す前にディレクトリに保存したい場合は、 作業ディレクトリに保存されていることを確認してください。
  • JAVABASE: ファイルを含むベース ディレクトリ Java ユーティリティ。相対パスを指定できます。「bin」サブディレクトリがあります。

Starlark で定義された変数

ルールとツールチェーンのライターは、 完全なカスタム変数を TemplateVariableInfo 接続します。toolchains 属性を介してこれらの値に依存するルールは、値を読み取ることができます。

Starlark で定義された変数の例をご覧ください。