コマンドとオプション

問題を報告 ソースを表示

このページでは、bazel buildbazel runbazel test など、さまざまな Bazel コマンドで使用できるオプションについて説明します。このページは、Bazel を使用したビルドの Bazel のコマンドの一覧に関連しています。

ターゲットの構文

buildtest などの一部のコマンドは、ターゲットのリストを操作できます。ラベルよりも柔軟な構文が使用されます。ラベルの詳細については、ビルドするターゲットの指定をご覧ください。

オプション

以下のセクションでは、ビルド中に使用できるオプションについて説明します。ヘルプコマンドで --long を使用すると、オンライン ヘルプ メッセージに、各オプションの意味、タイプ、デフォルト値に関する概要情報が表示されます。

ほとんどのオプションは 1 回しか指定できません。複数回指定すると、最後のインスタンスが優先します。複数回指定できるオプションは、オンライン ヘルプで「場合によっては複数回使用できる」というテキストで識別されます。

パッケージの場所

--package_path

このオプションでは、特定のパッケージの BUILD ファイルを見つけるために検索するディレクトリのセットを指定します。

Bazel は、パッケージパスを検索してパッケージを見つけます。これは、bazel ディレクトリをコロンで区切った順序付きリストで、それぞれが部分的なソースツリーのルートです。

--package_path オプションを使用してカスタム パッケージ パスを指定するには:

  % bazel build --package_path %workspace%:/some/other/root

パッケージパスの要素は、次の 3 つの形式で指定できます。

  1. 最初の文字が / の場合、パスは絶対パスです。
  2. パスが %workspace% で始まる場合、最も近い bazel ディレクトリからの相対パスが使用されます。たとえば、作業ディレクトリが /home/bob/clients/bob_client/bazel/foo の場合、package-path の文字列 %workspace%/home/bob/clients/bob_client/bazel に展開されます。
  3. それ以外は、作業ディレクトリを基準とした相対パスになります。通常、これは意図した動作ではなく、Bazel ワークスペースの下のディレクトリから Bazel を使用すると、予期しない動作をする可能性があります。たとえば、package-path 要素 . を使用してから cd でディレクトリ /home/bob/clients/bob_client/bazel/foo に移動すると、パッケージは /home/bob/clients/bob_client/bazel/foo ディレクトリから解決されます。

デフォルト以外のパッケージパスを使用する場合は、便宜上、Bazel 構成ファイルで指定します。

Bazel では、現在のディレクトリにパッケージが存在する必要はありません。そのため、必要なすべてのパッケージがパッケージパスのどこかに見つかれば、空の bazel ワークスペースからビルドできます。

例: 空のクライアントからのビルド

  % mkdir -p foo/bazel
  % cd foo/bazel
  % touch WORKSPACE
  % bazel build --package_path /some/other/path //foo

--deleted_packages

このオプションは、Bazel が削除済みと見なし、パッケージパスのどのディレクトリからも読み込まないパッケージのカンマ区切りリストを指定します。これにより、パッケージを実際に削除することなく、パッケージの削除をシミュレートできます。このオプションは複数回渡すことができます。その場合、個々のリストが連結されます。

エラーの確認

これらのオプションは、Bazel のエラーチェックや警告を制御します。

--[no]check_visibility

このオプションを false に設定した場合、公開設定チェックは警告に降格されます。 このオプションのデフォルト値は true であるため、デフォルトで可視性のチェックが実行されます。

--output_filter=regex

--output_filter オプションを指定すると、正規表現に一致するターゲットについてのみ、ビルドとコンパイルの警告が表示されます。ターゲットが指定された正規表現と一致せず、その実行が成功すると、標準出力と標準エラーが破棄されます。

このオプションの一般的な値は次のとおりです。

`--output_filter='^//(first/project|second/project):'` 指定したパッケージの出力を表示します。
`--output_filter='^//((?!(first/bad_project|second/bad_project):).)*$'` 指定したパッケージの出力を表示しません。
`--output_filter=` すべてを表示。
`--output_filter=DONT_MATCH_ANYTHING` 何も表示しない。

ツールフラグ

これらのオプションは、Bazel が他のツールに渡すオプションを制御します。

--copt=cc-option

このオプションは、コンパイラに渡す引数を取ります。 この引数は、C、C++、アセンブラ コードの前処理、コンパイル、アセンブルのためにコンパイラが呼び出されるたびに渡されます。リンク時には渡されません。

このオプションは複数回使用できます。次に例を示します。

  % bazel build --copt="-g0" --copt="-fpic" //foo

デバッグ テーブルを使用せずに foo ライブラリをコンパイルし、位置に依存しないコードを生成します。

--host_copt=cc-option

このオプションは、exec 構成でコンパイルされたソースファイルのコンパイラに渡す引数を受け取ります。これは --copt オプションに似ていますが、exec 構成にのみ適用されます。

--host_conlyopt=cc-option

このオプションは、exec 構成でコンパイルされた C ソースファイルのコンパイラに渡す引数を受け取ります。これは --conlyopt オプションに似ていますが、exec 構成にのみ適用されます。

--host_cxxopt=cc-option

このオプションは、exec 構成でコンパイルされた C++ ソースファイルのコンパイラに渡す引数を受け取ります。これは --cxxopt オプションに似ていますが、exec 構成にのみ適用されます。

--host_linkopt=linker-option

このオプションは、exec 構成でコンパイルされたソースファイルのリンカーに渡す引数を受け取ります。これは --linkopt オプションに似ていますが、exec 構成にのみ適用されます。

--conlyopt=cc-option

このオプションは、C ソースファイルのコンパイル時にコンパイラに渡す引数を取ります。

これは --copt に似ていますが、C コンパイルにのみ適用され、C++ コンパイルまたはリンクには適用されません。そのため、--conlyopt を使用して C 固有のオプション(-Wno-pointer-sign など)を渡すことができます。

--cxxopt=cc-option

このオプションは、C++ ソースファイルのコンパイル時にコンパイラに渡す引数を受け取ります。

これは --copt と似ていますが、C++ コンパイルにのみ適用され、C コンパイルとリンクには適用されません。そのため、--cxxopt を使用して C++ 固有のオプション(-fpermissive-fno-implicit-templates など)を渡すことができます。

次に例を示します。

  % bazel build --cxxopt="-fpermissive" --cxxopt="-Wno-error" //foo/cruddy_code

--linkopt=linker-option

このオプションは、リンク時にコンパイラに渡す引数を取ります。

これは --copt と似ていますが、リンクにのみ適用され、コンパイルには適用されません。そのため、--linkopt を使用して、リンク時にのみ意味のあるコンパイラ オプション(-lssp-Wl,--wrap,abort など)を渡すことができます。次に例を示します。

  % bazel build --copt="-fmudflap" --linkopt="-lmudflap" //foo/buggy_code

ビルドルールでは、属性にリンク オプションを指定することもできます。このオプションの設定が常に優先されます。cc_library.linkopts もご覧ください。

--strip (always|never|sometimes)

このオプションは、-Wl,--strip-debug オプションを指定してリンカーを呼び出すことで、Bazel がすべてのバイナリと共有ライブラリからデバッグ情報を削除するかどうかを決定します。--strip=always は、デバッグ情報を常に削除することを意味します。--strip=never は、デバッグ情報を削除しないことを意味します。--compilation_modefastbuild の場合、デフォルト値の --strip=sometimes はストリップを意味します。

  % bazel build --strip=always //foo:bar

生成されたすべてのバイナリからデバッグ情報を削除しながら、ターゲットをコンパイルします。

Bazel の --strip オプションは、ld の --strip-debug オプションに対応しています。デバッグ情報を削除するだけです。なんらかの理由で、デバッグ シンボルだけでなくすべてのシンボルを削除する場合は、ld の --strip-all オプションを使用する必要があります。これは、--linkopt=-Wl,--strip-all を Bazel に渡します。また、Bazel の --strip フラグを設定すると --linkopt=-Wl,--strip-all がオーバーライドされるため、どちらか一方のみを設定する必要があります。

ビルドするバイナリが 1 つだけで、すべてのシンボルを削除したい場合は、--stripopt=--strip-all を渡して、ターゲットの //foo:bar.stripped バージョンを明示的にビルドすることもできます。--stripopt のセクションで説明されているように、これにより、ビルドのすべてのリンク アクションに削除を含めず、最終バイナリがリンクされた後に削除アクションが適用されます。

--stripopt=strip-option

これは、*.stripped バイナリの生成時に strip コマンドに渡す追加のオプションです。デフォルトは -S -p です。このオプションは複数回使用できます。

--fdo_instrument=profile-output-dir

--fdo_instrument オプションを使用すると、ビルドされた C/C++ バイナリの実行時に FDO(フィードバック付き最適化)プロファイル出力を生成できます。GCC の場合、指定された引数は、各 .o ファイルのプロファイル情報を含む .gcda ファイルのオブジェクトごとのファイル ディレクトリ ツリーのディレクトリ接頭辞として使用されます。

プロファイル データツリーが生成されたら、そのプロファイル ツリーを圧縮して --fdo_optimize=profile-zip Bazel オプションに提供し、FDO に最適化されたコンパイルを有効にします。

LLVM コンパイラの場合、引数は未加工の LLVM プロファイル データ ファイルがダンプされるディレクトリでもあります。例: --fdo_instrument=/path/to/rawprof/dir/

--fdo_instrument オプションと --fdo_optimize オプションを同時に使用することはできません。

--fdo_optimize=profile-zip

--fdo_optimize オプションを使用すると、コンパイル時にオブジェクトごとのファイル プロファイル情報を使用して、FDO(フィードバック有向最適化)最適化を実行できます。GCC の場合、提供される引数は、各 .o ファイルのプロファイル情報を含む .gcda ファイルの以前に生成されたファイルツリーを含む zip ファイルです。

指定した引数を、拡張子 .afdo で識別される自動プロファイルを指すこともできます。

LLVM コンパイラの場合、指定する引数は、llvm-profdata ツールによって準備されたインデックス付き LLVM プロファイル出力ファイルを指す必要があります。また、拡張子は .profdata である必要があります。

--fdo_instrument オプションと --fdo_optimize オプションを同時に使用することはできません。

--java_language_version=version

このオプションでは、Java ソースのバージョンを指定します。次に例を示します。

  % bazel build --java_language_version=8 java/com/example/common/foo:all

Java 8 仕様と互換性のある構造のみが許可されます。デフォルト値は 11 です。--> 有効な値は 8、9、10、11、14、15 です。default_java_toolchain を使用してカスタム Java ツールチェーンを登録することで拡張できます。

--tool_java_language_version=version

ビルド中で実行されるツールのビルドに使用する Java 言語バージョン。デフォルト値は 11 です。

--java_runtime_version=version

このオプションでは、コードの実行とテストの実行に使用する JVM のバージョンを指定します。次に例を示します。

  % bazel run --java_runtime_version=remotejdk_11 java/com/example/common/foo:java_application

リモート リポジトリから JDK 11 をダウンロードし、それを使用して Java アプリケーションを実行します。

デフォルト値は local_jdk です。有効な値は local_jdklocal_jdk_versionremotejdk_11remotejdk_17 です。local_java_repository または remote_java_repository リポジトリ ルールを使用してカスタム JVM を登録することで、値を拡張できます。

--tool_java_runtime_version=version

ビルド中に必要なツールを実行するために使用される JVM のバージョン。デフォルト値は remotejdk_11 です。

--jvmopt=jvm-option

このオプションを使用すると、オプション引数を Java VM に渡すことができます。1 つの大きな引数とともに使用することも、個々の引数とともに複数回使用することもできます。次に例を示します。

  % bazel build --jvmopt="-server -Xms256m" java/com/example/common/foo:all

サーバー VM を使用してすべての Java バイナリを起動し、VM の起動ヒープサイズを 256 MB に設定します。

--javacopt=javac-option

このオプションを使用すると、オプションの引数を javac に渡すことができます。1 つの大きな引数とともに使用することも、個々の引数とともに複数回使用することもできます。次に例を示します。

  % bazel build --javacopt="-g:source,lines" //myprojects:prog

(bazel のデフォルトではなく)javac のデフォルトのデバッグ情報で java_binary が再ビルドされます。

このオプションは、javac の Bazel 組み込みデフォルト オプションの後、ルールごとのオプションの前に javac に渡されます。javac のオプションを最後に指定した方法が優先されます。javac のデフォルトのオプションは次のとおりです。

  -source 8 -target 8 -encoding UTF-8

--strict_java_deps (default|strict|off|warn|error)

このオプションは、不足している直接的な依存関係を javac がチェックするかどうかを制御します。Java ターゲットでは、直接使用されるすべてのターゲットを依存関係として明示的に宣言する必要があります。このフラグは、各 java ファイルの型チェックに実際に使用された jar を特定し、現在のターゲットの直接的な依存関係の出力でない場合は警告/エラーを示すように javac に指示します。

  • off は、チェックが無効であることを示します。
  • warn は、直接的な依存関係が欠落している場合に javac が [strict] 型の標準 Java 警告を生成することを意味します。
  • defaultstricterror の場合、警告ではなく javac がエラーを生成するため、直接的な依存関係が欠けている場合、現在のターゲットはビルドに失敗します。これは、フラグが指定されていない場合のデフォルトの動作でもあります。

セマンティクスを構築する

これらのオプションは、ビルドコマンドや出力ファイルの内容に影響します。

--compilation_mode (fastbuild|opt|dbg)(-c)

--compilation_mode オプション(多くの場合、-c と短縮されます。特に -c opt と省略されます)は、fastbuilddbg、または opt の引数を取り、最適化レベルやデバッグ テーブルの完全性など、さまざまな C/C++ コード生成オプションに影響します。Bazel では、コンパイル モードごとに異なる出力ディレクトリが使用されるため、毎回完全な再ビルドを行わなくても、モードを切り替えることができます。

  • fastbuild は、最小限のデバッグ情報(-gmlt -Wl,-S)を生成し、最適化は行わず、可能な限り迅速にビルドすることを意味します。これがデフォルトです。注: -DNDEBUG は設定されません
  • dbg は、デバッグを有効にしてビルドする(-g)ことを意味します。これにより、gdb(または別のデバッガ)を使用できます。
  • opt は、最適化を有効にして assert() 呼び出しを無効にしたビルド(-O2 -DNDEBUG)を意味します。opt モードでは、--copt -g も渡さない限り、デバッグ情報は生成されません。

--cpu=cpu

このオプションでは、ビルド中のバイナリのコンパイルに使用されるターゲット CPU アーキテクチャを指定します。

--action_env=VAR=VALUE

すべてのアクションの実行中に使用できる環境変数のセットを指定します。変数は、名前(呼び出し環境から値を取得する)か、呼び出し環境とは独立して値を設定する name=value ペアで指定できます。

この --action_env フラグは複数回指定できます。複数の --action_env フラグで同じ変数に値が割り当てられている場合は、最新の割り当てが優先されます。

--experimental_action_listener=label

experimental_action_listener オプションは、label で指定された action_listener ルールの詳細を使用して extra_actions をビルドグラフに挿入するように Bazel に指示します。

--[no]experimental_extra_action_top_level_only

このオプションを true に設定した場合、 --experimental_action_listener コマンドライン オプションで指定された追加のアクションは、トップレベル ターゲットに対してのみスケジュールされます。

--experimental_extra_action_filter=regex

experimental_extra_action_filter オプションは、extra_actions をスケジュールするターゲットのセットをフィルタするように Bazel に指示します。

このフラグは、--experimental_action_listener フラグとの組み合わせでのみ使用できます。

デフォルトでは、リクエストされたビルドターゲットの推移的クロージャ内のすべての extra_actions が、実行スケジュールが設定されます。--experimental_extra_action_filter は、オーナーのラベルが指定された正規表現と一致する extra_actions にスケジューリングを制限します。

次の例では、extra_actions のスケジュール設定を、所有者のラベルに「/bar/」が含まれるアクションにのみ適用するように制限します。

% bazel build --experimental_action_listener=//test:al //foo/... \
  --experimental_extra_action_filter=.*/bar/.*

--host_cpu=cpu

このオプションでは、ホストツールのビルドに使用する CPU アーキテクチャの名前を指定します。

--android_platforms=platform[,platform]*

android_binary ルールの推移的 deps をビルドするプラットフォーム(特に C++ などのネイティブ依存関係の場合)。たとえば、cc_libraryandroid_binary ルールの推移的 deps に表示される場合、android_binary ルールの --android_platforms で指定されたプラットフォームごとに 1 回ビルドされ、最終的な出力に含まれます。

このフラグにはデフォルト値はありません。カスタム Android プラットフォームを定義して使用する必要があります。

--android_platforms で指定されたプラットフォームごとに 1 つの .so ファイルが作成され、APK にパッケージ化されます。.so ファイルの名前は、android_binary ルールの名前の先頭に「lib」を付けます。たとえば、android_binary の名前が「foo」の場合、ファイルは libfoo.so です。

--per_file_copt=[+-]regex[,[+-]regex]...@option[,option]...

C++ ファイルが存在する場合、包含正規表現の式のいずれかに一致し、除外式のいずれにも一致しないラベルまたは実行パスを持つ C++ ファイルは、指定されたオプションでビルドされます。ラベルの照合では、正規形式のラベル(//package:label_name など)を使用します。

実行パスは、C++ ファイルのベース名(拡張子を含む)を含むワークスペース ディレクトリへの相対パスです。また、プラットフォームに依存するプレフィックスも含まれます。

生成されたファイル(genrule 出力など)と照合するために、Bazel では実行パスのみを使用できます。この場合、実行パスと一致しないため、正規表現を「//」で始めることはできません。パッケージ名は --per_file_copt=base/.*\.pb\.cc@-g0 のように使用できます。これは、base というディレクトリ内のすべての .pb.cc ファイルと一致します。

このオプションは複数回使用できます。

このオプションは、使用するコンパイル モードに関係なく適用されます。たとえば、--compilation_mode=opt を指定してコンパイルし、より強力な最適化をオンにしたり、最適化を無効にして、一部のファイルを選択的にコンパイルしたりできます。

注意点: 一部のファイルがデバッグ シンボルを使用して選択的にコンパイルされると、リンク中にシンボルが削除される可能性があります。この問題は、--strip=never を設定することで回避できます。

構文: [+-]regex[,[+-]regex]...@option[,option]...。ここで、regex は正規表現を表します。この正規表現には、+ を先頭に付けて包含パターンを識別し、- を付けると除外パターンを識別します。option は C++ コンパイラに渡される任意のオプションを表します。オプションに , が含まれる場合は、\, のように引用符で囲む必要があります。最初の @ のみが正規表現とオプションの分離に使用されるため、オプションには @ を含めることもできます。

: --per_file_copt=//foo:.*\.cc,-//foo:file\.cc@-O0,-fprofile-arcs は、//foo/ 内のすべての .cc ファイル(file.cc を除く)について、C++ コンパイラのコマンドラインに -O0 オプションと -fprofile-arcs オプションを追加します。

--dynamic_mode=mode

ビルドルールの linkstatic 属性を使用して、C++ バイナリを動的にリンクするかどうかを決定します。

モード:

  • auto: プラットフォーム依存モードに変換されます。Linux の場合は default、cygwin の場合は off です。
  • default: 動的にリンクするかどうかを Bazel が選択できるようにします。詳しくは、linkstatic をご覧ください。
  • fully: すべてのターゲットを動的にリンクします。これにより、リンク時間が短縮され、生成されるバイナリのサイズが小さくなります。
  • off: すべてのターゲットをほぼ静的モードでリンクします。-static が linkopt に設定されている場合、ターゲットは完全に静的に変更されます。

--fission (yes|no|[dbg][,opt][,fastbuild])

Fission を有効にします。Fission は C++ デバッグ情報を .o ファイルではなく専用の .dwo ファイルに書き込みます。これにより、リンクへの入力サイズが大幅に削減され、リンク時間を短縮できます。

[dbg][,opt][,fastbuild](例: --fission=dbg,fastbuild)に設定すると、指定した一連のコンパイル モードに対してのみ Fission が有効になります。これは bazelrc の設定に役立ちます。yes に設定すると、Fission がユニバーサルに有効になります。no に設定すると、Fission が完全に無効になります。デフォルトは no です。

--force_ignore_dash_static

このフラグを設定した場合、cc_* ルールの BUILD ファイルの linkopt にある -static オプションは無視されます。これは、C++ ビルドを強化する回避策としてのみ想定されています。

--[no]force_pic

有効にすると、すべての C++ コンパイルで位置独立コード(「-fPIC」)が生成され、リンクでは非 PIC ライブラリよりも PIC ビルド済みライブラリが優先され、リンクでは位置独立実行ファイル(「-pie」)が生成されます。デフォルトは無効になっています。

--android_resource_shrinking

android_binary ルールに対してリソース圧縮を実行するかどうかを選択します。android_binary ルールの shrink_resources 属性のデフォルトを設定します。詳しくは、該当するルールのドキュメントをご覧ください。デフォルトはオフです。

--custom_malloc=malloc-library-target

指定すると、常に特定の malloc 実装が使用され、デフォルトを使用するターゲットを含むすべての malloc="target" 属性がオーバーライドされます(malloc を指定しません)。

--crosstool_top=label

このオプションは、ビルド中のすべての C++ コンパイルに使用されるクロスツール コンパイラ スイートの場所を指定します。Bazel は、その場所で CROSSTOOL ファイルを探し、それを使用して --compiler の設定を自動的に決定します。

--host_crosstool_top=label

指定しない場合、Bazel は --crosstool_top の値を使用して、ビルド中に実行されるツールなど、実行構成のコードをコンパイルします。このフラグの主な目的は、クロスコンパイルを有効にすることです。

--apple_crosstool_top=label

objc*、ios*、apple* ルールの推移的 deps で C/C++ ルールをコンパイルするために使用するクロスツール。これらのターゲットの場合、このフラグは --crosstool_top を上書きします。

--android_crosstool_top=label

android_binary ルールの推移的 deps 内の C/C++ ルールをコンパイルするために使用するクロスツール。これは、ビルド内の他のターゲットが別のクロスツールを必要とする場合に便利です。デフォルトでは、WORKSPACE ファイルの android_ndk_repository ルールによって生成されたクロスツールが使用されます。関連情報: --android_platforms.

--compiler=version

このオプションは、ビルド中のバイナリのコンパイルに使用する C/C++ コンパイラ バージョン(gcc-4.1.0 など)を指定します。カスタム クロスツールでビルドする場合は、このフラグを指定する代わりに、CROSSTOOL ファイルを使用する必要があります。

--android_sdk=label

非推奨です。直接指定しないでください。

このオプションでは、Android 関連のルールのビルドに使用される Android SDK/プラットフォーム ツールチェーンと Android ランタイム ライブラリを指定します。

WORKSPACE ファイルで android_sdk_repository ルールが定義されている場合、Android SDK は自動的に選択されます。

--java_toolchain=label

このオプションでは、Java ソースファイルのコンパイルに使用する java_ツールチェーンのラベルを指定します。

--host_java_toolchain=label

指定しない場合、bazel は --java_toolchain の値を使用して、ビルド中に実行されるツールなど、実行構成のコードをコンパイルします。このフラグの主な目的は、クロスコンパイルを有効にすることです。

--javabase=(label)

このオプションは、bazel runbazel テスト、および java_binary ルールと java_test ルールによってビルドされた Java バイナリに使用する、ベース Java インストールのラベルを設定します。JAVABASEJAVA「Make」変数は、このオプションから派生します。

--host_javabase=label

このオプションでは、exec 構成で使用する Java のベース インストールのラベルを設定します(JavaBuilder や Singlejar などのホストビルドツールなど)。

Java ソースファイルのコンパイルに使用する Java コンパイラは選択されません。コンパイラを選択するには、--java_toolchain オプションを設定します。

実行戦略

これらのオプションは、Bazel によるビルドの実行方法に影響します。 ビルドによって生成された出力ファイルに大きな影響を与えないようにする必要があります。通常、その主な効果はビルドの速度です。

--spawn_strategy=strategy

このオプションは、コマンドが実行される場所と方法を制御します。

  • standalone は、コマンドをローカル サブプロセスとして実行します。この値は非推奨になりました。代わりに local を使用してください。
  • sandboxed を指定すると、コマンドがローカルマシンのサンドボックス内で実行されます。そのためには、すべての入力ファイル、データの依存関係、ツールが、srcsdatatools 属性の直接の依存関係としてリストされている必要があります。Bazel は、サンドボックス実行をサポートするシステムでは、ローカル サンドボックス化をデフォルトで有効にします。
  • local は、コマンドをローカル サブプロセスとして実行します。
  • worker では、使用可能な場合は永続ワーカーを使用してコマンドを実行します。
  • docker を指定すると、ローカルマシンの Docker サンドボックス内でコマンドが実行されます。Docker がインストールされている必要があります。
  • remote を指定すると、コマンドがリモートで実行されます。これは、リモート エグゼキュータが個別に構成されている場合にのみ使用できます。

--strategy mnemonic=strategy

このオプションは、コマンドの実行場所と方法を制御します。これは、--spawn_strategy(および --genrule_strategy をニーモニック Genrule でオーバーライド)をニーモニックごとにオーバーライドします。サポートされている戦略とその効果については、--spawn_strategy をご覧ください。

--strategy_regexp=<filter,filter,...>=<strategy>

このオプションでは、特定の regex_filter に一致する説明を持つコマンドを実行する際に使用する戦略を指定します。regex_filter の一致の詳細については、--per_file_copt をご覧ください。サポートされている戦略とその効果については、--spawn_strategy をご覧ください。

説明と一致する最後の regex_filter が使用されます。このオプションは、戦略を指定する他のフラグをオーバーライドします。

  • 例: --strategy_regexp=//foo.*\\.cc,-//foo/bar=local は、説明が //foo.*.cc に一致するが //foo/bar には一致しない場合に、local 戦略を使用してアクションを実行することを意味します。
  • 例: --strategy_regexp='Compiling.*/bar=local' --strategy_regexp=Compiling=sandboxedsandboxed 戦略で「Compiling //foo/bar/baz」を実行しますが、順序を逆にすると local で実行されます。
  • 例: --strategy_regexp='Compiling.*/bar=local,sandboxed'local 戦略を使用して「Compiling //foo/bar/baz」を実行し、失敗した場合は sandboxed にフォールバックします。

--genrule_strategy=strategy

これは非推奨の --strategy=Genrule=strategy の省略形です。

--jobs=n(-j)

このオプションは整数の引数を取り、ビルドの実行フェーズで同時に実行するジョブ数の上限を指定します。

--progress_report_interval=n

Bazel は、まだ完了していないジョブ(長時間実行テストなど)に関する進行状況レポートを定期的に出力します。このオプションではレポート頻度を設定します。進行状況は n 秒ごとに出力されます。

デフォルトは 0 です。これは増分アルゴリズムであることを意味します。最初のレポートは 10 秒後、30 秒後に出力され、その後は 1 分ごとに 1 回進捗状況が報告されます。

Bazel が --curses で指定されたカーソル制御を使用している場合、進行状況は 1 秒ごとに報告されます。

--local_{ram,cpu}_resources resources or resource expression

これらのオプションでは、ローカルで実行するビルドとテストのアクティビティをスケジュールする際に Bazel で考慮できるローカル リソースの量(RAM 単位の RAM と CPU 論理コアの数)を指定します。整数またはキーワード(HOST_RAM または HOST_CPUS)で指定し、必要に応じてその後に [-|*float](例: --local_cpu_resources=2--local_ram_resources=HOST_RAM*.5--local_cpu_resources=HOST_CPUS-1)を指定します。フラグは独立しています。一方または両方を設定できます。デフォルトでは、Bazel はローカル システムの構成から RAM の量と CPU コアの数を直接推定します。

このオプション(デフォルトで有効)は、テストとバイナリのランファイル シンボリック リンクを出力ディレクトリにビルドする必要があるかどうかを指定します。--nobuild_runfile_links を使用すると、runfile ツリーのビルドのオーバーヘッドを発生させることなく、すべてのターゲットをコンパイルできるかどうかを検証できます。

テスト(またはアプリ)が実行されると、それらのランタイム データの依存関係が 1 か所に集約されます。通常、Bazel の出力ツリー内では、この「runfiles」ツリーの root は、対応するバイナリやテストの兄弟ノードになります。 テスト実行中、runfile には $TEST_SRCDIR/workspace/packagename/filename 形式のパスを使用してアクセスできます。runfiles ツリーにより、テストは依存関係が宣言されているすべてのファイルにアクセスできるようになります。runfiles ツリーはデフォルトで、必要なファイルへのシンボリック リンクのセットを構築することによって実装されます。リンクのセットが大きくなると、このオペレーションのコストも増加します。大規模なビルドでは、特に個々のテスト(またはアプリケーション)に独自の runfile ツリーが必要になるため、ビルド時間全体に著しく影響する可能性があります。

--[no]build_runfile_manifests

このオプションは、デフォルトで有効になっており、実行ファイル マニフェストを出力ツリーに書き込むかどうかを指定します。無効にすると、--nobuild_runfile_links を指定したことになります。

実行ファイル ツリーはメモリ内マニフェストからリモートで作成されるため、リモートでテストを実行する場合は無効にできます。

--[no]discard_analysis_cache

このオプションを有効にすると、Bazel は実行が開始される直前に分析キャッシュを破棄し、追加のメモリ(約 10%)を実行フェーズ用に解放します。デメリットは、それ以上の増分ビルドは遅くなることです。メモリ節約モードもご覧ください。

--[no]keep_going(-k)

GNU Make と同様に、最初のエラーが発生するとビルドの実行フェーズは停止します。エラーが発生した場合でも、できるだけ多くのビルドを試みると便利なことがあります。このオプションを使用すると、そのような動作が可能になります。指定すると、前提条件が正常にビルドされたすべてのターゲットのビルドが試行されますが、エラーは無視されます。

このオプションは通常、ビルドの実行フェーズに関連付けられますが、分析フェーズにも影響します。ビルドコマンドで複数のターゲットを指定しても、その一部しか分析できない場合、--keep_going を指定しない限り、ビルドはエラーで停止します。この場合、ビルドは実行フェーズに進みますが、分析に成功したターゲットのみです。

--[no]use_ijars

このオプションは、Bazel による java_library ターゲットのコンパイル方法を変更します。Bazel は、java_library の出力を使用して依存する java_library ターゲットをコンパイルする代わりに、非公開ではないメンバー(public、Protected、デフォルト(パッケージ)のアクセス メソッドとフィールド)の署名のみを含むインターフェース JAR を作成し、そのインターフェース JAR を使用して依存ターゲットをコンパイルします。これにより、メソッド本体やクラスのプライベート メンバーのみに変更が加えられた場合に、再コンパイルを回避できます。

--[no]interface_shared_objects

このオプションを使用すると、インターフェース共有オブジェクトが有効になり、バイナリやその他の共有ライブラリは、共有オブジェクトの実装ではなくインターフェースに依存します。実装のみを変更した場合、Bazel は、変更された共有ライブラリに依存するターゲットを不必要に再ビルドすることを回避します。

出力の選択

これらのオプションにより、ビルドまたはテストする対象が決まります。

--[no]build

このオプションを使用すると、ビルドの実行フェーズが発生します(デフォルトで有効になっています)。これをオフにすると、実行フェーズはスキップされ、最初の 2 つのフェーズ(読み込みと分析)のみが発生します。

このオプションは、実際に何もビルドせずに、BUILD ファイルを検証し、入力のエラーを検出する場合に便利です。

--[no]build_tests_only

指定した場合、Bazel はサイズタイムアウトタグ、または言語によって除外されなかった *_test ルールと test_suite ルールの実行に必要なものだけをビルドします。指定した場合、Bazel はコマンドラインで指定された他のターゲットを無視します。 このオプションはデフォルトでは無効になっており、Bazel は、テストから除外された *_test ルールや test_suite ルールなど、リクエストされたすべてのものをビルドします。bazel test --build_tests_only foo/... を実行しても foo ツリー内のすべてのビルドの問題が検出されるとは限らないため、これは便利です。

--[no]check_up_to_date

このオプションを使用すると、Bazel はビルドを実行せず、指定されたすべてのターゲットが最新かどうかをチェックするだけです。その場合、ビルドは通常どおり正常に完了します。ただし、古いファイルがある場合は、ビルドされずにエラーが報告され、ビルドは失敗します。このオプションは、ビルドのコストを発生させることなく、ビルドがソース編集(送信前チェックなど)よりも最近実行されたかどうかを判断するのに役立ちます。

--check_tests_up_to_date もご覧ください。

--[no]compile_one_dependency

引数ファイルの単一の依存関係をコンパイルします。これは、IDE でソースファイルの構文チェックを行う場合に便利です。たとえば、ソースファイルに依存する単一のターゲットを再ビルドして、編集、ビルド、テストのサイクルのできるだけ早い段階でエラーを検出します。この引数は、フラグ以外のすべての引数の解釈方法に影響します。各引数は、現在の作業ディレクトリを基準とするファイル ターゲット ラベルまたはプレーンなファイル名にする必要があります。また、各ソースファイル名に依存する 1 つのルールが作成されます。ソースが C++ と Java の場合、同じ言語空間のルールが優先して選択されます。同じ優先度のルールが複数ある場合は、BUILD ファイルで最初に出現するルールが選択されます。ソースファイルを参照しない明示的に指定されたターゲット パターンは、エラーになります。

--save_temps

--save_temps オプションを使用すると、コンパイラからの一時的な出力が保存されます。これには、.s ファイル(アセンブラ コード)、.i(前処理された C)、.ii(前処理された C++)ファイルが含まれます。多くの場合、これらの出力はデバッグに役立ちます。一時は、コマンドラインで指定されたターゲットのセットに対してのみ生成されます。

現在、--save_temps フラグは cc_* ルールに対してのみ機能します。

Bazel が追加の出力ファイルの場所を出力できるようにするには、--show_result n の設定が十分に大きいことを確認します。

--build_tag_filters=tag[,tag]*

指定すると、Bazel は必須タグが 1 つ以上あり(指定されている場合)、除外タグがないターゲットのみをビルドします。ビルドタグ フィルタは、タグキーワードのカンマ区切りリストとして指定します。必要に応じて、除外タグを示すために使用される「-」記号を前に付けます。必須タグの前に「+」記号を付けることもできます。

テストの実行時に、Bazel はテスト ターゲットの --build_tag_filters を無視します。テスト ターゲットはこのフィルタと一致しなくてもビルドされ、実行されます。テスト ターゲットをビルドしないようにするには、--test_tag_filters を使用するか、明示的に除外して、テスト ターゲットをフィルタします。

--test_size_filters=size[,size]*

指定した場合、Bazel は指定されたサイズのターゲットのみをテストします(--build_tests_only も指定されている場合はビルドします)。テストサイズ フィルタは、許可するテストサイズ値(小、中、大、巨大)のカンマ区切りリストとして指定します。除外テストサイズを示す場合は、先頭に「-」記号を付けます。たとえば、

  % bazel test --test_size_filters=small,medium //foo:all

および

  % bazel test --test_size_filters=-large,-enormous //foo:all

//foo 内の小規模および中規模のテストのみをテストします。

デフォルトでは、テストサイズ フィルタリングは適用されません。

--test_timeout_filters=timeout[,timeout]*

指定した場合、Bazel は指定のタイムアウトでターゲットのみをテスト(--build_tests_only も指定されている場合はビルド)します。テスト タイムアウト フィルタは、許可するテスト タイムアウト値(short、moderate、long、eternal)のカンマ区切りリストとして指定します。除外されるテスト タイムアウトを示すために、先頭に「-」記号を付けることもできます。構文の例については、--test_size_filters をご覧ください。

デフォルトでは、テスト タイムアウト フィルタリングは適用されません。

--test_tag_filters=tag[,tag]*

指定すると、Bazel は必須タグ(指定されている場合)が 1 つ以上あり、除外タグがないターゲットのみをテスト(--build_tests_only も指定している場合はビルド)します。テストタグ フィルタは、タグキーワードのカンマ区切りのリストとして指定します。必要に応じて、除外タグを示す「-」記号を先頭に付けます。必須タグの前に「+」記号を付けることもできます。

たとえば、

  % bazel test --test_tag_filters=performance,stress,-flaky //myproject:all

performance または stress タグでタグ付けされているが、flaky タグでタグ付けされていないターゲットをテストします。

デフォルトでは、テストタグのフィルタリングは適用されません。この方法でテストの size タグと local タグでフィルタすることもできます。

--test_lang_filters=string[,string]*

テストルール クラスの名前を参照する文字列のカンマ区切りリストを指定します。ルールクラス foo_test を参照するには、文字列「foo」を使用します。Bazel は、参照されるルールクラスのターゲットのみをテスト(--build_tests_only も指定されている場合はビルド)します。このようなターゲットを除外するには、文字列「-foo」を使用します。たとえば、

  % bazel test --test_lang_filters=foo,bar //baz/...

//baz/... 内の foo_test または bar_test のインスタンスであるターゲットのみがテストされますが、

  % bazel test --test_lang_filters=-foo,-bar //baz/...

foo_test インスタンスと bar_test インスタンスを除く //baz/... のすべてのターゲットをテストします。

--test_filter=filter-expression

実行するテストのサブセットを選択するためにテストランナーが使用するフィルタを指定します。呼び出し時に指定されたすべてのターゲットがビルドされますが、式によっては一部のターゲットしか実行されません。場合によっては、特定のテストメソッドのみが実行されます。

filter-expression の特定の解釈は、テストを実行するテスト フレームワークによって異なります。glob、substring、regexp のいずれかです。--test_filter は、さまざまな --test_arg フィルタ引数を渡すより便利ですが、すべてのフレームワークがサポートしているわけではありません。

読み上げの詳細設定

これらのオプションにより、ターミナルや追加のログファイルへの Bazel 出力の詳細度を制御できます。

--explain=logfile

このオプションではファイル名引数が必要です。これにより、bazel build の実行フェーズの依存関係チェッカーが、各ビルドステップについて、実行されている理由、または最新のバージョンであることを通知します。説明は logfile に書き込まれます。

予期しない再ビルドが発生した場合は、このオプションを使用して理由を把握できます。これを .bazelrc に追加して後続のすべてのビルドでロギングが行われるようにし、実行ステップが予期せず実行された場合はログを調べます。このオプションを使用すると、パフォーマンスがわずかに低下する可能性があるため、不要になったら削除することをおすすめします。

--verbose_explanations

このオプションを使用すると、--explain オプションが有効になったときに生成される説明の詳細度が向上します。

特に、詳細説明が有効で、ビルドに使用されたコマンドが変更されたために出力ファイルが再ビルドされた場合、説明ファイルの出力には新しいコマンドの詳細がすべて(少なくともほとんどのコマンドで)含まれます。

このオプションを使用すると、生成される説明ファイルの長さが大幅に長くなり、--explain を使用するとパフォーマンスが低下する可能性があります。

--explain が有効になっていない場合、--verbose_explanations は効果がありません。

--profile=file

このオプションはファイル名引数を取り、Bazel はプロファイリング データをファイルに書き込みます。その後、bazel analyze-profile コマンドを使用してデータを分析または解析できます。ビルド プロファイルは、Bazel の build コマンドで処理に時間がかかっている場所を把握するのに役立ちます。

--[no]show_loading_progress

このオプションを使用すると、Bazel はパッケージ読み込みの進行状況メッセージが出力されます。無効になっている場合、メッセージは表示されません。

--[no]show_progress

このオプションを使用すると、進行状況メッセージが表示されます。デフォルトでは有効になっています。無効にすると、進行状況メッセージが抑制されます。

--show_progress_rate_limit=n

このオプションを使用すると、Bazel は n 秒間に最大 1 つの進行状況メッセージを表示します。ここで、n は実数です。 このオプションのデフォルト値は 0.02 です。つまり、bazel は進行状況メッセージを 0.02 秒ごとに 1 つに制限します。

--show_result=n

このオプションは、bazel build コマンドの最後に結果情報を出力するかどうかを制御します。デフォルトでは、1 つのビルド ターゲットが指定されている場合、Bazel はターゲットが正常に更新されたかどうかを示すメッセージと、そうであればターゲットが作成した出力ファイルのリストを出力します。複数のターゲットが指定されている場合、結果情報は表示されません。

結果情報は、1 つのターゲットまたは少数のターゲットのビルドには有用ですが、大規模なビルド(トップレベルのプロジェクト ツリー全体など)では、この情報が圧倒され注意をそらす可能性があります。このオプションを使用すると、制御が可能になります。--show_result は整数の引数を取ります。これは、完全な結果情報を出力するターゲットの最大数です。デフォルト値は 1 です。このしきい値を超えると、個々のターゲットの結果情報が表示されません。したがって、ゼロを指定すると結果情報が常に抑制され、値が非常に大きい場合は結果が常に出力されます。

小さなターゲット グループ(コンパイル、編集、テスト サイクルなど)と大規模なターゲット グループ(新しいワークスペースを確立するときや回帰テストを実行するときなど)を交互に繰り返す場合、ユーザーはその間の値を選択することを希望する可能性があります。前者の場合、結果の情報は非常に有用ですが、後者の場合はそれほど有用ではありません。他のオプションと同様に、.bazelrc ファイルで暗黙的に指定できます。

ファイルは、ビルドされた実行可能ファイルを実行するときにファイル名を簡単にコピーしてシェルに貼り付けられるように、出力されます。各ターゲットの「最新」または「失敗」のメッセージは、ビルドを実行するスクリプトで簡単に解析できます。

--sandbox_debug

このオプションを使用すると、サンドボックス化を使用してアクションを実行するときに、Bazel は追加のデバッグ情報を出力します。このオプションではサンドボックス ディレクトリも保持されるため、実行中にアクションに表示されるファイルを調べることができます。

--subcommands-s

このオプションを使用すると、Bazel の実行フェーズでは、コマンドを実行する前に各コマンドの完全なコマンドラインが出力されます。

  >>>>> # //examples/cpp:hello-world [action 'Linking examples/cpp/hello-world']
  (cd /home/johndoe/.cache/bazel/_bazel_johndoe/4c084335afceb392cfbe7c31afee3a9f/bazel && \
    exec env - \
    /usr/bin/gcc -o bazel-out/local-fastbuild/bin/examples/cpp/hello-world -B/usr/bin/ -Wl,-z,relro,-z,now -no-canonical-prefixes -pass-exit-codes -Wl,-S -Wl,@bazel-out/local_linux-fastbuild/bin/examples/cpp/hello-world-2.params)

可能であれば、コマンドは Bourne シェルと互換性のある構文で出力されるため、シェルのコマンド プロンプトに簡単にコピーして貼り付けることができます。(cdexec の呼び出しからシェルを保護するために、括弧が囲まれていますので、必ずコピーしてください)。 ただし、シンボリック リンク ツリーの作成など、一部のコマンドは Bazel 内に内部的に実装されています。これらについては、表示するコマンドラインはありません。

--subcommands=pretty_print を渡して、コマンドの引数を 1 行ではなくリストとして出力できます。これにより、長いコマンドラインが読みやすくなる場合があります。

以下の --verbose_failures の失敗もご覧ください。

ツールに適した形式でファイルにロギングするサブコマンドについては、--execution_log_json_file--execution_log_binary_file をご覧ください。

--verbose_failures

このオプションを使用すると、Bazel の実行フェーズで、失敗したコマンドの完全なコマンドラインが出力されます。これは、失敗したビルドのデバッグに非常に役立ちます。

失敗したコマンドは、Bourne シェルと互換性のある構文で出力されます。これは、シェル プロンプトにコピー&ペーストするのに適しています。

ワークスペースのステータス

これらのオプションを使用して、Bazel でビルドされたバイナリに「スタンプ」を付けると、ソース管理リビジョンやその他のワークスペース関連情報などの追加情報をバイナリに埋め込むことができます。このメカニズムは、genrulecc_binary など、stamp 属性をサポートするルールで使用できます。

--workspace_status_command=program

このフラグを使用すると、各ビルドの前に Bazel が実行するバイナリを指定できます。プログラムは、現在のソース管理リビジョンなど、ワークスペースのステータスに関する情報を報告できます。

フラグの値には、ネイティブ プログラムへのパスを指定する必要があります。Linux/macOS では、任意の実行可能ファイルを指定できます。Windows ではネイティブ・バイナリ(通常は「.exe」、「.bat」、または「.cmd」ファイル)にする必要があります。

プログラムは、0 個以上の Key-Value ペアを標準出力に出力します(各行に 1 エントリずつ)。その後、ゼロで終了します(そうでなければビルドは失敗します)。鍵の名前には任意の名前を使用できますが、大文字とアンダースコアのみ使用できます。キー名の後の最初のスペースで、キー名と値が区別されます。値は行の残り(追加の空白文字を含む)です。キーも値も複数行にまたがってはいけません。鍵を複製しないでください。

Bazel は、キーを「stable」と「volatile」の 2 つのバケットに分割します。(「stable」と「volatile」は直感に反するので、あまり考えないでください)。

その後、Bazel は Key-Value ペアを 2 つのファイルに書き込みます。

  • bazel-out/stable-status.txt には、キーの名前が STABLE_ で始まるすべてのキーと値が含まれます。
  • bazel-out/volatile-status.txt には、残りのキーとその値が含まれます。

契約は次のとおりです。

  • 「安定版」のキーの値は、可能な限り、ほとんど変更しないようにします。bazel-out/stable-status.txt の内容が変更されると、Bazel はこれに依存するアクションを無効にします。つまり、安定したキーの値が変更されると、Bazel はスタンプ付きアクションを再実行します。したがって、安定したステータスにはタイムスタンプなどが含まれないようにしてください。タイムスタンプなどは常に変更され、ビルドごとに Bazel がスタンプ付きアクションを再実行するためです。

    Bazel は常に次の安定版キーを出力します。

    • BUILD_EMBED_LABEL: --embed_label の値
    • BUILD_HOST: Bazel が実行されているホストマシンの名前
    • BUILD_USER: Bazel が実行されているユーザーの名前
  • 「volatile」キーの値は頻繁に変更される場合があります。Bazel は、タイムスタンプと同様に常に変更されることを想定し、bazel-out/volatile-status.txt ファイルを正式に更新します。ただし、スタンプ付きアクションを常に再実行しないように、Bazel は揮発性ファイルが決して変更されていないふりをします。つまり、内容が変更されたファイルが揮発性ステータス ファイルのみである場合、Bazel はそれに依存するアクションを無効にしません。アクションの他の入力が変更されている場合、Bazel はそのアクションを再実行します。更新された volatile ステータスがアクションに表示されますが、volatile ステータスが変更されただけでは、アクションが無効になることはありません。

    Bazel は常に次の揮発性キーを出力します。

    • BUILD_TIMESTAMP: Unix エポックからの経過秒数(System.currentTimeMillis() の値を 1,000 で割った値)
    • FORMATTED_DATE: ビルドの時刻。UTC で yyyy MMM d HH mm ss EEE と表記されます(例: 2023 Jun 2 01 44 29 Fri)。

Linux/macOS では、--workspace_status_command=/bin/true を渡してワークスペースのステータスの取得を無効にできます。これは、true は何も実行せず(ゼロで終了し)、出力を表示しないためです。Windows では、MSYS の true.exe のパスを渡せば、同じ効果が得られます。

なんらかの理由でワークスペース ステータス コマンドが失敗する(ゼロ以外の値で終了する)と、ビルドは失敗します。

Git を使用した Linux でのプログラム例:

#!/bin/bash
echo "CURRENT_TIME $(date +%s)"
echo "RANDOM_HASH $(cat /proc/sys/kernel/random/uuid)"
echo "STABLE_GIT_COMMIT $(git rev-parse HEAD)"
echo "STABLE_USER_NAME $USER"

このプログラムのパスを --workspace_status_command で渡すと、安定版のステータス ファイルに STABLE 行が含まれ、揮発性ステータス ファイルには残りの行が含まれます。

--[no]stamp

このオプションは、stamp ルール属性と組み合わせて使用することで、バイナリにビルド情報を埋め込むかどうかを制御します。

スタンプは、stamp 属性を使用して、ルールごとに明示的に有効または無効にできます。詳細については、Build エンサイクロペディアをご覧ください。ルールで stamp = -1*_binary ルールのデフォルト)が設定されている場合、このオプションによってスタンプが有効かどうかが決定されます。

このオプションや stamp 属性に関係なく、Bazel は exec 構成用にビルドされたバイナリをスタンプしません。stamp = 0*_test ルールのデフォルト)を設定するルールの場合、--[no]stamp に関係なくスタンプが無効になります。--stamp を指定しても、依存関係が変更されていない場合、ターゲットの再作成は強制されません。

一般に、ビルドのパフォーマンスを高めるには、--nostamp を設定することをおすすめします。入力の変動が軽減され、ビルド キャッシュが最大化されます。

プラットフォーム

これらのオプションを使用して、ビルドの動作を構成するホスト プラットフォームとターゲット プラットフォームを制御し、Bazel ルールで使用可能な実行プラットフォームとツールチェーンを制御します。

プラットフォームツールチェーンの背景情報をご覧ください。

--platforms=labels

現在のコマンドのターゲット プラットフォームを記述するプラットフォーム ルールのラベル。

--host_platform=label

ホストシステムを記述するプラットフォーム ルールのラベル。

--extra_execution_platforms=labels

アクションを実行する実行プラットフォームとして利用できるプラットフォーム。プラットフォームは正確なターゲットで、またはターゲット パターンとして指定できます。これらのプラットフォームは、register_execution_platforms() によって WORKSPACE ファイルで宣言されたプラットフォームより先に検討されます。このオプションには、優先度の高い順のプラットフォームのカンマ区切りリストを指定できます。フラグが複数回渡された場合は、最新のオーバーライドが適用されます。

--extra_toolchains=labels

ツールチェーンの解決時に考慮されるツールチェーン ルール。ツールチェーンは、正確なターゲットで、またはターゲット パターンとして指定できます。これらのツールチェーンは、register_toolchains() によって WORKSPACE ファイルで宣言されたものの前に考慮されます。

--toolchain_resolution_debug=regex

ツールチェーン タイプが正規表現と一致する場合、ツールチェーンを検索する際にデバッグ情報を出力します。複数の正規表現はカンマで区切ることができます。先頭に - を使用すると、この正規表現を否定できます。これは、ツールチェーンの欠落が原因でデバッグが失敗する Bazel ルールまたは Starlark ルールのデベロッパーに役立ちます。

その他

--flag_alias=alias_name=target_path

長い Starlark ビルド設定を短い名前にバインドするために使用されるコンビニエンス フラグ。詳細については、Starlark の構成をご覧ください。

生成されたコンビニエンス シンボリック リンクの接頭辞を変更します。シンボリック リンク プレフィックスのデフォルト値は bazel- です。これにより、シンボリック リンク bazel-binbazel-testlogsbazel-genfiles が作成されます。

なんらかの理由でシンボリック リンクを作成できない場合、警告は発行されますが、ビルドは成功とみなされます。特に、読み取り専用ディレクトリや書き込み権限がないディレクトリにビルドできます。ビルドの完了時に情報メッセージに出力されたパスは、シンボリック リンクが想定された場所を指している場合のみ、シンボリック リンク相対短縮形を使用します。つまり、作成されるシンボリック リンクに依存できない場合でも、これらのパスの正確性を信頼できます。

このオプションの一般的な値は次のとおりです。

  • シンボリック リンクの作成を抑制する: --symlink_prefix=/ に設定すると、Bazel は bazel-outbazel-<workspace> などのシンボリック リンクを作成または更新しなくなります。このオプションを使用すると、シンボリック リンクの作成を完全に抑制できます。

  • 不要な要素を減らす: --symlink_prefix=.bazel/ を使用すると、Bazel は非表示のディレクトリ .bazel 内に bin などと呼ばれるシンボリック リンクを作成します。

--platform_suffix=string

構成の略称に接尾辞を追加します。これは出力ディレクトリの決定に使用されます。このオプションを異なる値に設定すると、ファイルが別々のディレクトリに配置されます。たとえば、出力ファイルが互いが上書きされてしまうビルドのキャッシュ ヒット率を改善したり、比較のために出力ファイルを保持したりできます。

--default_visibility=(private|public)

bazel のデフォルトの公開設定の変更をテストするための一時的なフラグ。一般的な用途を意図したものではありませんが、完全性のために文書化しています。

--starlark_cpu_profile=_file_

このフラグの値はファイル名であり、Bazel はすべての Starlark スレッドによる CPU 使用率に関する統計情報を収集し、プロファイルを pprof 形式で名前付きファイルに書き込みます。

このオプションを使用すると、過剰な計算が原因で読み込みと分析が遅くなる Starlark 関数を特定できます。次に例を示します。

$ bazel build --nobuild --starlark_cpu_profile=/tmp/pprof.gz my/project/...
$ pprof /tmp/pprof.gz
(pprof) top
Type: CPU
Time: Feb 6, 2020 at 12:06pm (PST)
Duration: 5.26s, Total samples = 3.34s (63.55%)
Showing nodes accounting for 3.34s, 100% of 3.34s total
      flat  flat%   sum%        cum   cum%
     1.86s 55.69% 55.69%      1.86s 55.69%  sort_source_files
     1.02s 30.54% 86.23%      1.02s 30.54%  expand_all_combinations
     0.44s 13.17% 99.40%      0.44s 13.17%  range
     0.02s   0.6%   100%      3.34s   100%  sorted
         0     0%   100%      1.38s 41.32%  my/project/main/BUILD
         0     0%   100%      1.96s 58.68%  my/project/library.bzl
         0     0%   100%      3.34s   100%  main

同じデータに対して別のビューを表示するには、pprof コマンド svgweblist を試してください。

リリースでの Bazel の使用

Bazel は、開発サイクル中にソフトウェア エンジニアが、本番環境にデプロイするバイナリを準備する際にリリース エンジニアが使用します。このセクションでは、Bazel を使用するリリース エンジニア向けのヒントを紹介します。

重要なオプション

リリースビルドに Bazel を使用すると、ビルドを実行する他のスクリプトと同じ問題が発生します。詳しくは、スクリプトから Bazel を呼び出すをご覧ください。特に、次のオプションを使用することを強くおすすめします。

これらのオプションも重要です。

  • --package_path
  • --symlink_prefix: 複数の構成のビルドを管理する場合は、「64 ビット」と「32 ビット」などの個別の識別子で各ビルドを区別した方が便利です。このオプションは、bazel-bin などのシンボリック リンクを区別します。

テストの実行

bazel でテストをビルドして実行するには、「bazel test」に続けてテスト ターゲットの名前を入力します。

デフォルトでは、このコマンドはビルドとテスト アクティビティを同時に実行し、前提条件が構築されるとすぐに、指定されたすべてのターゲット(コマンドラインで指定されたテスト以外のターゲットを含む)をビルドし、*_test ターゲットと test_suite ターゲットをテストします。つまり、テスト実行がビルドにインターリーブされます。こうすると、通常は速度が大幅に向上します。

bazel test」のオプション

--cache_test_results=(yes|no|auto)-t

このオプションを「auto」(デフォルト)に設定した場合、Bazel は次のいずれかの条件に当てはまる場合にのみテストを再実行します。

  • Bazel がテストまたはその依存関係の変更を検出する
  • テストは external とマークされます。
  • --runs_per_test で複数のテスト実行がリクエストされました
  • テストが失敗しました。

「no」の場合、すべてのテストが無条件に実行されます。

「はい」の場合のキャッシュ動作は自動の場合と同じですが、テストの失敗とテスト実行を --runs_per_test でキャッシュに保存できる点が異なります。

.bazelrc ファイルでこのオプションをデフォルトで有効にしているユーザーは、-t(オン)または -t-(オフ)という略語を使用すると、特定の実行でデフォルトをオーバーライドするのに便利です。

--check_tests_up_to_date

このオプションは、テストを実行せず、キャッシュされたテスト結果の確認と報告のみを行うように Bazel に指示します。まだビルドおよび実行されていないテストがある場合、またはテスト結果が古くなっているテストがある場合(たとえば、ソースコードやビルド オプションが変更されたため)、Bazel はエラー メッセージ(「テスト結果が最新ではありません」)を報告し、テストのステータスを「NO STATUS」(赤色、カラー出力が有効になっている場合)として記録し、ゼロ以外のコードを返します。

このオプションは、[--check_up_to_date](#check-up-to-date) の動作も暗黙的に示唆します。

このオプションは、送信前のチェックに役立ちます。

--test_verbose_timeout_warnings

このオプションは、テストのタイムアウトがテストの実際の実行時間よりも大幅に長い場合に、ユーザーに明示的に警告するよう Bazel に指示します。テストのタイムアウトは不安定にならないように設定する必要がありますが、テストのタイムアウトを過度に許容すると、予期せず発生する実際の問題が隠れてしまう可能性があります。

たとえば、通常は 1 ~ 2 分で実行されるテストの場合、ETERNAL や LONG のタイムアウトは緩すぎるため、このような設定を行う必要はありません。

このオプションは、ユーザーが適切なタイムアウト値を決定したり、既存のタイムアウト値のサニティ チェックを行ったりする場合に役立ちます。

--[no]test_keep_going

デフォルトでは、すべてのテストが完了まで実行されます。ただし、このフラグが無効になっている場合、テストに合格しなかった場合、ビルドは中止されます。後続のビルドステップとテスト呼び出しは実行されず、処理中の呼び出しはキャンセルされます。--notest_keep_going--keep_going の両方を指定しないでください。

--flaky_test_attempts=attempts

このオプションでは、なんらかの理由でテストが失敗した場合に試行する最大回数を指定します。最初に失敗して、最終的に成功したテストは、テストサマリーで FLAKY として報告されます。ただし、Bazel 終了コードまたは合格したテストの合計数を特定する際には合格と見なされます。許可された試行がすべて失敗したテストは失敗とみなされます。

デフォルト(このオプションが指定されていない場合、またはデフォルトに設定されている場合)は、通常のテストでは 1 回だけ、flaky 属性が設定されたテストルールでは 3 回試行できます。整数値を指定して、テスト試行の上限をオーバーライドできます。Bazel では、システムの悪用を防ぐために、テストを最大 10 回試行できます。

--runs_per_test=[regex@]number

このオプションでは、各テストを実行する回数を指定します。すべてのテスト実行は別々のテストとして扱われます(フォールバック機能は各テストに個別に適用されます)。

実行に失敗したターゲットのステータスは、--runs_per_test_detects_flakes フラグの値によって異なります。

  • 存在しない場合、実行が失敗するとテスト全体が失敗します。
  • 同じシャードから 2 つの実行が存在していて、PASS と FAIL が返された場合、テストのステータスは「不安定」になります(他の実行で不合格となった場合を除く)。

1 つの数値を指定すると、すべてのテストがその回数だけ実行されます。 また、regex@number という構文を使用して正規表現を指定することもできます。これにより、--runs_per_test の効果が正規表現に一致するターゲットに限定されます(--runs_per_test=^//pizza:.*@4//pizza/ のすべてのテストを 4 回実行します)。この形式の --runs_per_test は複数回指定できます。

--[no]runs_per_test_detects_flakes

このオプションを指定すると(デフォルトでは指定されません)、Bazel は --runs_per_test を通じて不安定なテストシャードを検出します。1 つのシャードに対する 1 つ以上の実行が失敗し、同じシャードパスに対して 1 つ以上の実行が失敗した場合、ターゲットはこのフラグで不安定とみなされます。指定しない場合、ターゲットは失敗ステータスを報告します。

--test_summary=output_style

テスト結果の概要の表示方法を指定します。

  • short は、各テストの結果と、テストが失敗した場合にテスト出力を含むファイルの名前を出力します。これがデフォルト値です。
  • terseshort に似ていますが、さらに短くなります。合格しなかったテストに関する情報のみを出力します。
  • detailed は、各テストだけでなく、失敗した個々のテストケースを出力します。テスト出力ファイルの名前は省略します。
  • none はテストサマリーを出力しません。

--test_output=output_style

テスト出力の表示方法を指定します。

  • summary は、各テストの成否のサマリーを表示します。失敗したテストの出力ログファイル名も示します。サマリーはビルドの最後に出力されます(ビルド中は、テストの開始、合格、不合格のたびに簡単な進行状況メッセージが表示されます)。これはデフォルトの動作です。
  • errors は、失敗したテストの stdout/stderr 出力を統合した直後にのみ stdout に送信します。これにより、同時テストのテスト出力が互いにインターリーブされないようにします。上記のサマリー出力に従って、ビルドのサマリーを出力します。
  • allerrors に似ていますが、合格したものを含むすべてのテストの出力を出力します。
  • streamed は、各テストからの stdout/stderr 出力をリアルタイムでストリーミングします。

--java_debug

このオプションを使用すると、Java テストの Java 仮想マシンは、テストを開始する前に JDWP 準拠のデバッガからの接続を待機します。このオプションは --test_output=streamed を意味します。

--[no]verbose_test_summary

このオプションはデフォルトで有効になっており、テスト時間やその他の追加情報(テスト試行など)がテストサマリーに出力されます。--noverbose_test_summary を指定した場合、テストの概要にはテスト名、テスト ステータス、キャッシュに保存されたテスト インジケーターのみが含まれ、可能な限り 80 文字以下になるようにフォーマットされます。

--test_tmpdir=path

ローカルで実行されるテストの一時ディレクトリを指定します。各テストは、このディレクトリ内の個別のサブディレクトリで実行されます。このディレクトリは、各 bazel test コマンドの先頭でクリーンアップされます。デフォルトでは、bazel はこのディレクトリを Bazel 出力ベース ディレクトリに配置します。

--test_timeout=seconds または --test_timeout=seconds,seconds,seconds,seconds

指定された秒数を新しいタイムアウト値として使用して、すべてのテストのタイムアウト値をオーバーライドします。値が 1 つだけ指定された場合は、すべてのテスト タイムアウト カテゴリで使用されます。

または、4 つのカンマ区切り値を指定して、短期、中期、長期、長期の各テストの各タイムアウトをこの順序で指定することもできます。どちらの形式でも、いずれかのテストサイズのゼロまたは負の値が、テストの作成のページで定義されている特定のタイムアウト カテゴリのデフォルトのタイムアウトに置き換えられます。デフォルトでは、Bazel はサイズが暗黙的に設定されているか明示的に設定されているかにかかわらず、テストのサイズからタイムアウト上限を推測することで、すべてのテストでこれらのタイムアウトを使用します。

タイムアウト カテゴリをサイズとは異なるものとして明示的に記述しているテストは、タイムアウトがサイズタグによって暗黙的に設定された場合と同じ値を受け取ります。したがって、「長い」タイムアウトを宣言するサイズ「small」のテストには、「大規模な」テストと同じ有効なタイムアウトが設定され、明示的なタイムアウトはありません。

--test_arg=arg

コマンドライン オプション、フラグ、引数を各テストプロセスに渡します。このオプションを複数回使用して、複数の引数を渡すことができます。次に例を示します。 --test_arg=--logtostderr --test_arg=--v=3

--test_env=variable=_value_ または --test_env=variable

各テストのテスト環境に挿入する必要がある追加の変数を指定します。value が指定されていない場合は、bazel test コマンドの起動に使用されたシェル環境から継承されます。

この環境には、テスト内から System.getenv("var")(Java)、getenv("var")(C または C++)を使用してアクセスできます。

--run_under=command-prefix

これにより、テストランナーがテストコマンドの前に挿入する接頭辞を指定します。command-prefix は、Bourne シェルのトークン化ルールを使用して単語に分割され、実行されるコマンドの先頭に単語のリストが付加されます。

最初の単語が完全修飾ラベル(// で始まる)の場合、その単語がビルドされます。次に、ラベルは対応する実行可能な場所で置き換えられ、他の単語と一緒に実行されるコマンドの先頭に追加されます。

いくつかの注意点があります。

  • テストの実行に使用される PATH は環境内の PATH と異なる場合があるため、--run_under コマンドには絶対パスcommand-prefix の最初の単語)を使用する必要があります。
  • stdin が接続されていないため、--run_under はインタラクティブなコマンドに使用できません。

例:

        --run_under=/usr/bin/strace
        --run_under='/usr/bin/strace -c'
        --run_under=/usr/bin/valgrind
        --run_under='/usr/bin/valgrind --quiet --num-callers=20'

テストの選択

出力選択オプションで説明されているように、サイズタイムアウトタグ、または言語でテストをフィルタリングできます。便利な一般名フィルタは、特定のフィルタ引数をテストランナーに転送できます。

bazel test のその他のオプション

構文と残りのオプションは、bazel build とまったく同じです。

実行可能ファイルの実行

bazel run コマンドは、単一のターゲットのビルドと実行に使用される点を除き、bazel build と類似しています。一般的なセッションを次に示します。

  % bazel run java/myapp:myapp -- --arg1 --arg2
  Welcome to Bazel
  INFO: Loading package: java/myapp
  INFO: Loading package: foo/bar
  INFO: Loading complete.  Analyzing...
  INFO: Found 1 target...
  ...
  Target //java/myapp:myapp up-to-date:
    bazel-bin/java/myapp:myapp
  INFO: Elapsed time: 0.638s, Critical Path: 0.34s

  INFO: Running command line: bazel-bin/java/myapp:myapp --arg1 --arg2
  Hello there
  $EXEC_ROOT/java/myapp/myapp
  --arg1
  --arg2

bazel run は、Bazel でビルドされたバイナリを直接呼び出すのと似ていますが、同じではありません。その動作は、呼び出されるバイナリがテストかどうかによって異なります。

バイナリがテストでない場合、現在の作業ディレクトリはバイナリの runfiles ツリーになります。

バイナリがテストの場合、現在の作業ディレクトリが exec ルートになり、通常テストが実行される環境を可能な限り再現します。ただし、エミュレーションは完全ではなく、複数のシャードを持つテストをこの方法で実行することはできません(この問題を回避するには、--test_sharding_strategy=disabled コマンドライン オプションを使用します)。

バイナリでは、次の追加の環境変数も使用できます。

  • BUILD_WORKSPACE_DIRECTORY: ビルドが実行されたワークスペースのルート。
  • BUILD_WORKING_DIRECTORY: Bazel の実行元となった現在の作業ディレクトリ。

たとえば、コマンドラインのファイル名をユーザー フレンドリーな方法で解釈するために使用できます。

bazel run」のオプション

--run_under=command-prefix

これは bazel test--run_under オプション(上記を参照)と同じ効果があります。ただし、bazel test によって実行されるテストではなく、bazel run によって実行されるコマンドに適用され、ラベルでは実行できない点が異なります。

Bazel によるロギング出力をフィルタする

bazel run を使用してバイナリを呼び出すと、Bazel は Bazel 自体と呼び出し中のバイナリからのロギング出力を出力します。ログのノイズを減らすには、--ui_event_filters フラグと --noshow_progress フラグを使用して、Bazel 自体からの出力を抑制します。

次に例を示します。bazel run --ui_event_filters=-info,-stdout,-stderr --noshow_progress //java/myapp:myapp

テストの実行

bazel run はテストバイナリを実行することもできます。これは、テストの作成で説明されている環境に近い環境でテストを実行する効果があります。この方法でテストを実行する場合、--test_arg 以外の --test_* 引数は効果がないことに注意してください。

ビルド出力のクリーニング

clean コマンド

Bazel には、Make と同様の clean コマンドがあります。この Bazel インスタンスによって実行されたすべてのビルド構成の出力ディレクトリ、またはこの Bazel インスタンスによって作成された作業ツリー全体が削除され、内部キャッシュがリセットされます。コマンドライン オプションを指定せずに実行すると、すべての構成の出力ディレクトリがクリーンアップされます。

各 Bazel インスタンスは単一のワークスペースに関連付けられているため、clean コマンドを実行すると、そのワークスペースの Bazel インスタンスに対して行ったすべてのビルドからの出力がすべて削除されます。

Bazel インスタンスによって作成された作業ツリー全体を完全に削除するには、--expunge オプションを指定します。clean コマンドを --expunge で実行すると、ビルド出力に加えて、Bazel によって作成されたすべての一時ファイルを含む出力ベースツリー全体が削除されます。また、shutdown コマンドと同等の処理が完了してから Bazel サーバーを停止します。たとえば、Bazel インスタンスのすべてのディスクとメモリのトレースをクリーンアップするには、次のように指定できます。

  % bazel clean --expunge

または、--expunge_async を使用してバックグラウンドで消去することもできます。非同期消去の実行中に、同じクライアントで Bazel コマンドを呼び出しても安全です。

clean コマンドは主に、不要になったワークスペースのディスク容量を再利用する手段として提供されています。Bazel の増分再ビルドは完全ではない可能性があるため、clean を使用すると、問題が発生した場合に一貫した状態を復元できます。

Bazel の設計では、こうした問題は修正可能であり、修正すべきバグは優先度の高いバグです。正しくない増分ビルドを見つけた場合は、clean を使用せずに、バグレポートを提出し、ツールでバグを報告してください。

依存関係グラフのクエリ

Bazel には、ビルド中に使用される依存関係グラフについて質問するためのクエリ言語が含まれています。クエリ言語は query と cquery の 2 つのコマンドで使用されます2 つのコマンドの主な違いは、クエリは読み込みフェーズの後に実行され、cquery は分析フェーズの後に実行されることです。これらのツールは、多くのソフトウェア エンジニアリング タスクで非常に役立ちます。

クエリ言語はグラフに対する代数演算の考え方に基づいています 詳細については

Bazel クエリ リファレンス。参照、例、クエリ固有のコマンドライン オプションについては、このドキュメントを参照してください。

クエリツールでは、いくつかのコマンドライン オプションを使用できます。--output: 出力形式を選択します。--[no]keep_going(デフォルトで無効)を使用すると、エラーが発生したときにクエリの処理を続行できます。エラーの発生時に不完全な結果が許容されない場合、この動作は無効になる場合があります。

--[no]tool_deps オプションはデフォルトで有効になっているため、クエリが実行される依存関係グラフに、ターゲット以外の構成の依存関係が含まれます。

デフォルトで有効になっている --[no]implicit_deps オプションを使用すると、クエリが実行される依存関係グラフに暗黙的な依存関係が含まれます。暗黙的な依存関係とは、BUILD ファイルで明示的に指定されていないものの、bazel によって追加された依存関係です。

例: 「PEBL ツリー内のすべてのテストをビルドするために必要なすべての genrule の定義の場所(BUILD ファイル内)を表示します。」

  bazel query --output location 'kind(genrule, deps(kind(".*_test rule", foo/bar/pebl/...)))'

アクション グラフのクエリ

aquery コマンドを使用すると、ビルドグラフ内のアクションをクエリできます。分析後に構成されたターゲット グラフで動作し、アクション、アーティファクト、それらの関係に関する情報を公開します。

このツールには、いくつかのコマンドライン オプションを使用できます。--output: 出力形式を選択します。デフォルトの出力形式(text)は人が読める形式です。機械が読み取れる形式にするには、proto または textproto を使用します。特に、aquery コマンドは通常の Bazel ビルドで実行され、ビルド中に使用可能なオプションのセットを継承します。

従来の query でも利用できるものと同じ関数セット(siblingsbuildfilestests 以外)がサポートされています。

詳しくは、アクション グラフ クエリをご覧ください。

その他のコマンドとオプション

help

help コマンドは、オンライン ヘルプを提供します。デフォルトでは、Bazel を使用したビルドに示されているように、使用可能なコマンドの概要とヘルプトピックが表示されます。引数を指定すると、特定のトピックに関する詳細なヘルプが表示されます。ほとんどのトピックは、buildquery などの Bazel コマンドですが、コマンドに対応していない追加のヘルプトピックもあります。

--[no]long-l

デフォルトでは、bazel help [topic] はトピックに関連するオプションの概要のみを出力します。--long オプションを指定すると、各オプションのタイプ、デフォルト値、詳細な説明も出力されます。

shutdown

Bazel サーバー プロセスは、shutdown コマンドを使用して停止できます。このコマンドは、Bazel サーバーがアイドル状態になると(たとえば、現在進行中のビルドや他のコマンドの完了後など)に終了します。詳細については、クライアント/サーバーの実装をご覧ください。

Bazel サーバーはアイドル タイムアウト後に自動的に停止するため、このコマンドが必要になることはほとんどありません。ただし、特定のワークスペースでそれ以上ビルドが行われないことがわかっているスクリプトで役立ちます。

shutdown は 1 つのオプション --iff_heap_size_greater_than _n_ を受け入れます。このオプションには、整数の引数(MB 単位)が必要です。指定すると、すでに消費されているメモリ量に基づいてシャットダウンが条件となります。Bazel サーバーでメモリリークがあると、偶発的にクラッシュする可能性があるため、これは多数のビルドを開始するスクリプトで有効です。条件付き再起動を実行すると、この条件がプリエンプトされます。

info

info コマンドは、Bazel サーバー インスタンスまたは特定のビルド構成に関連付けられたさまざまな値を出力します。(ビルドを実行するスクリプトで使用できます)。

info コマンドでは、1 つの引数(オプション)を指定することもできます。これは、以下のリストに示すキーのいずれかの名前です。この場合、bazel info key は 1 つのキーの値のみを出力します。(これは、sed -ne /key:/s/key://p を介して結果をパイプする必要がないため、Bazel をスクリプトで記述する場合に特に便利です)。

構成に依存しないデータ

  • release: この Bazel インスタンスのリリースラベル。リリース済みバイナリでない場合は「開発バージョン」。
  • workspace は、ベース ワークスペース ディレクトリの絶対パスです。
  • install_base: 現在のユーザーのこの Bazel インスタンスで使用されるインストール ディレクトリの絶対パス。Bazel は、内部で必要な実行可能ファイルをこのディレクトリの下にインストールします。

  • output_base: 現在のユーザーとワークスペースの組み合わせで、この Bazel インスタンスで使用されるベース出力ディレクトリの絶対パス。Bazel は、すべてのスクラッチとビルドの出力をこのディレクトリに配置します。

  • execution_root: output_base の下にある実行ルート ディレクトリの絶対パス。このディレクトリは、ビルド中に実行されるコマンドがアクセスできるすべてのファイルのルートであり、それらのコマンドの作業ディレクトリです。ワークスペース ディレクトリが書き込み可能な場合、このディレクトリを指す bazel-<workspace> という名前のシンボリック リンクがそこに配置されます。

  • output_path: 実行ルートの下にある出力ディレクトリの絶対パス。ビルドコマンドの結果として実際に生成されたすべてのファイルに使用されます。ワークスペース ディレクトリが書き込み可能な場合、このディレクトリを指す bazel-out という名前のシンボリック リンクがそこに配置されます。

  • server_pid: Bazel サーバー プロセスのプロセス ID。

  • server_log: Bazel サーバーのデバッグ ログファイルの絶対パス。このファイルには、Bazel サーバーの存続期間にわたるすべてのコマンドのデバッグ情報が含まれています。このファイルは、Bazel デベロッパーとパワーユーザーが使用することを目的としています。

  • command_log: コマンド ログファイルの絶対パス。最新の Bazel コマンドのインターリーブされた stdout ストリームと stderr ストリームが含まれます。bazel info を実行すると、このファイルの内容が最新の Bazel コマンドになるため、このファイルの内容が上書きされます。ただし、--output_base オプションまたは --output_user_root オプションの設定を変更しない限り、コマンド ログファイルの場所は変更されません。

  • used-heap-sizecommitted-heap-sizemax-heap-size: さまざまな JVM ヒープサイズ パラメータを報告します。それぞれ: 現在使用されているメモリ、現在システムから JVM が使用可能であることが保証されているメモリ、可能な最大限の割り当て。

  • gc-countgc-time: この Bazel サーバーを起動してからのガベージ コレクションの累積数と実行にかかった時間。これらの値は、すべてのビルドの開始時にリセットされるわけではありません。

  • package_path: bazel でパッケージを検索するパスをコロンで区切ったリスト。--package_path ビルド コマンドライン引数と同じ形式です。

例: Bazel サーバーのプロセス ID。

% bazel info server_pid
1285

構成固有のデータ

これらのデータは、bazel info に渡される構成オプション(--cpu--compilation_mode など)の影響を受ける場合があります。info コマンドは、依存関係分析を制御するすべてのオプションを受け入れます。これらのオプションによっては、ビルドの出力ディレクトリの場所、コンパイラの選択などが決定されるためです。

  • bazel-binbazel-testlogsbazel-genfiles: ビルドによって生成されたプログラムが配置されている bazel-* ディレクトリへの絶対パスを報告します。これは常にではありませんが、通常は、ビルドが成功した後にベース ワークスペース ディレクトリに作成される bazel-* シンボリック リンクと同じです。ただし、ワークスペース ディレクトリが読み取り専用の場合、bazel-* シンボリック リンクは作成できません。bazel info によってレポートされる値を使用するスクリプトは、シンボリック リンクの存在を前提とするのではなく、より堅牢になります。
  • 完全な Make 環境--show_make_env フラグを指定すると、現在の構成の Make 環境内のすべての変数(CCGLIBC_VERSION など)も表示されます。これらの変数は、Build ファイル内で $(CC) 構文または varref("CC") 構文を使用してアクセスされます。

例: 現在のコンフィグレーション用の C++ コンパイラ。これは Make 環境の $(CC) 変数であるため、--show_make_env フラグが必要です。

  % bazel info --show_make_env -c opt COMPILATION_MODE
  opt

例: 現在の構成の bazel-bin 出力ディレクトリ。これは、なんらかの理由で bazel-bin シンボリック リンクを作成できない場合(読み取り専用ディレクトリからビルドしている場合など)でも、正しいことが保証されます。

% bazel info --cpu=piii bazel-bin
/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/piii-opt/bin
% bazel info --cpu=k8 bazel-bin
/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/k8-opt/bin

version--version

version コマンドは、ビルドされた Bazel バイナリのバージョンの詳細(ビルドされた変更リストや日付など)を出力します。これらは、最新の Bazel を使用しているか、バグを報告しているかどうかを判断する際に特に役立ちます。次のような値があります。

  • changelist: このバージョンの Bazel がリリースされた変更リスト。
  • label: この Bazel インスタンスのリリースラベル。リリース済みバイナリでない場合は「開発バージョン」。バグを報告する際に非常に便利です。

他の引数がない bazel --version は、bazel version --gnu_format と同じ出力を出力しますが、Bazel サーバーの起動やサーバー アーカイブの解凍という副作用がなくなるわけではありません。bazel --version はどこからでも実行できます。ワークスペース ディレクトリは必要ありません。

mobile-install

mobile-install コマンドは、アプリをモバイル デバイスにインストールします。現時点でサポートされているのは、ART を実行する Android デバイスのみです。

詳しくは、bazel モバイル インストールをご覧ください。

次のオプションがサポートされています。

--incremental

設定すると、Bazel はアプリを段階的にインストールしようとします。つまり、前回のビルド以降に変更されたパーツのみをインストールしようとします。AndroidManifest.xml から参照されているリソース、ネイティブ コード、Java リソース(Class.getResource() で参照されているリソースなど)は更新できません。これらを変更する場合は、このオプションを省略する必要があります。Bazel の精神に反し、Android プラットフォームの制限により、このコマンドで適切なタイミングや完全なインストールが必要なタイミングを把握するのは、ユーザーの責任です。

Marshmallow 以降を搭載しているデバイスを使用している場合は、--split_apks フラグを検討してください。

--split_apks

分割 APK を使用してデバイスにアプリをインストールして更新するかどうか。 Marshmallow 以降を搭載したデバイスでのみ動作します。--split_apks を使用する場合、--incremental フラグは必要ありません。

--start_app

インストール後にアプリをクリーンな状態で起動します。--start=COLD と同じです。

--debug_app

デバッガがアタッチされるのを待ってから、インストール後にアプリをクリーンな状態で起動します。 --start=DEBUG と同じです。

--start=_start_type_

アプリのインストール後にアプリを起動する方法。サポートされている _start_type_s:

  • NO: アプリを起動しません。デフォルトです。
  • COLD: インストール後にクリーンな状態からアプリを起動します。
  • WARM 増分インストール時にアプリの状態を保持、復元します。
  • DEBUG: デバッガが起動するまで待機してから、インストール後にアプリをクリーンな状態で起動します。

--adb=path

使用する adb バイナリを指定します。

デフォルトでは、--android_sdk で指定された Android SDK の adb が使用されます。

--adb_arg=serial

adb に追加の引数。これらはコマンドラインでサブコマンドの前にあり、通常は、インストール先のデバイスを指定するために使用されます。 たとえば、使用する Android デバイスまたはエミュレータを選択するには、次のようにします。

% bazel mobile-install --adb_arg=-s --adb_arg=deadbeef

adb を次のように呼び出します。

adb -s deadbeef install ...

--incremental_install_verbosity=number

増分インストールの詳細度。1 に設定すると、デバッグ ロギングがコンソールに出力されます。

dump

dump コマンドは、Bazel サーバーの内部状態のダンプを stdout に出力します。このコマンドは、主に Bazel デベロッパーによる使用を想定しているため、このコマンドの出力は示されておらず、変更される可能性があります。

デフォルトでは、このコマンドは Bazel の状態の特定の部分をダンプするためのオプションの概要を示すヘルプ メッセージを出力します。内部状態をダンプするには、少なくとも 1 つのオプションを指定する必要があります。

次のオプションがサポートされています。

  • --action_cache はアクション キャッシュのコンテンツをダンプします。
  • --packages はパッケージ キャッシュの内容をダンプします。
  • --skyframe は、内部 Bazel 依存関係グラフの状態をダンプします。
  • --rules は、各ルールとアスペクト クラスのルールの概要(カウントとアクション数を含む)をダンプします。これには、ネイティブ ルールと Starlark ルールの両方が含まれます。 メモリ トラッキングが有効になっている場合は、ルールのメモリ使用量も表示されます。
  • --skylark_memory は、指定されたパスに pprof 互換の .gz ファイルをダンプします。この機能を利用するには、メモリ トラッキングを有効にする必要があります。

メモリのトラッキング

一部の dump コマンドにはメモリ トラッキングが必要です。これを有効にするには、起動フラグを Bazel に渡す必要があります。

  • --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.0.jar
  • --host_jvm_args=-DRULE_MEMORY_TRACKER=1

java-agent は、third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.0.jar で Bazel にチェックインされるため、Bazel リポジトリを保持する場所に合わせて $BAZEL を調整してください。

すべてのコマンドでこれらのオプションを Bazel に渡してください。そうしないと、サーバーが再起動します。

例:

    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.0.jar \
    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    build --nobuild <targets>

    # Dump rules
    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.0.jar \
    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    dump --rules

    # Dump Starlark heap and analyze it with pprof
    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.0.jar \
    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    dump --skylark_memory=$HOME/prof.gz
    % pprof -flame $HOME/prof.gz

analyze-profile

analyze-profile コマンドは、Bazel の呼び出し中に収集された JSON トレース プロファイルを分析します。

canonicalize-flags

canonicalize-flags コマンド。Bazel コマンドのオプションのリストを受け取り、同じ効果を持つオプションのリストを返します。新しいオプションのリストは正規のものです。たとえば、効果が同じオプションの 2 つのリストが同じ新しいリストに正規化されます。

--for_command オプションを使用すると、複数のコマンドから選択できます。現時点では、buildtest のみがサポートされています。指定されたコマンドでサポートされていないオプションを使用すると、エラーが発生します。

例は次のとおりです。

  % bazel canonicalize-flags -- --config=any_name --test_tag_filters="-lint"
  --config=any_name
  --test_tag_filters=-lint

起動オプション

このセクションで説明するオプションは、Bazel サーバー プロセスで使用される Java 仮想マシンの起動に影響を与え、そのサーバーが処理する後続のすべてのコマンドに適用されます。すでに実行中の Bazel サーバーがあり、起動オプションが一致しない場合、そのサーバーは再起動されます。

このセクションで説明するオプションはすべて、--key=value 構文または --key value 構文を使用して指定する必要があります。また、これらのオプションは、Bazel コマンド名のに配置する必要があります。startup --key=value を使用して、これらを .bazelrc ファイルにリストします。

--output_base=dir

このオプションにはパス引数が必要です。パス引数では、書き込み可能なディレクトリを指定する必要があります。Bazel はこの場所にすべての出力を書き込みます。出力ベースは、クライアントが Bazel サーバーを見つける際にも役立ちます。出力ベースを変更することで、コマンドを処理するサーバーを変更します。

デフォルトでは、出力ベースはユーザーのログイン名とワークスペース ディレクトリの名前(実際には MD5 ダイジェスト)から取得されるため、一般的な値は /var/tmp/google/_bazel_johndoe/d41d8cd98f00b204e9800998ecf8427e のようになります。

次に例を示します。

 OUTPUT_BASE=/var/tmp/google/_bazel_johndoe/custom_output_base
% bazel --output_base ${OUTPUT_BASE}1 build //foo  &  bazel --output_base ${OUTPUT_BASE}2 build //bar

このコマンドでは、シェルの &amp; 演算子により、2 つの Bazel コマンドが同時に実行されます。各コマンドは、異なる Bazel サーバー インスタンスを使用します(出力ベースが異なるため)。一方、両方のコマンドでデフォルトの出力ベースが使用された場合、両方のリクエストが同じサーバーに送信され、順番に処理されます。つまり、最初に //foo をビルドし、次に //bar を増分ビルドします。

--output_user_root=dir

出力ベースとインストール ベースが作成されるルート ディレクトリを指します。このディレクトリは存在しないか、呼び出し元のユーザーが所有している必要があります。これまでは、さまざまなユーザー間で共有されるディレクトリを指定することが許可されていましたが、現在は許可されなくなりました。問題 #11100 に対処すれば、許可されることがあります。

--output_base オプションを指定すると、--output_user_root を使用してオーバーライドされ、出力ベースが計算されます。

インストール ベースの場所は、--output_user_root に Bazel 埋め込みバイナリの MD5 ID を加えた値に基づいて計算されます。

ファイル システム レイアウト内に適切な場所がある場合は、--output_user_root オプションを使用して、Bazel のすべての出力(インストール ベースと出力ベース)の代わりのベース ロケーションを選択できます。

--server_javabase=dir

Bazel 自体が実行される Java 仮想マシンを指定します。値には、JDK または JRE を含むディレクトリのパスを指定する必要があります。ラベルにすることはできません。このオプションは、Bazel コマンドの前に表示されます。次に例を示します。

  % bazel --server_javabase=/usr/local/buildtools/java/jdk11 build //foo

このフラグは、アプリケーション、テスト、ツールなどの Bazel サブプロセスで使用される JVM には影響しません。代わりに、ビルド オプション --javabase または --host_javabase を使用してください。

このフラグは、以前は --host_javabase という名前(「左側」の --host_javabase と呼ばれることもあります)でしたが、ビルドフラグ --host_javabase(「右側」の --host_javabase と呼ばれることもあります)との混同を避けるために名前が変更されました。

--host_jvm_args=string

Bazel 自体を実行する Java 仮想マシンに渡す起動オプションを指定します。これを使用してスタックサイズを設定できます。次に例を示します。

  % bazel --host_jvm_args="-Xss256K" build //foo

このオプションは、個々の引数を指定して複数回使用できます。このフラグを設定する必要はほとんどありません。スペース区切りの文字列のリストを渡すこともできますが、各文字列は個別の JVM 引数として解釈されますが、この機能はまもなく非推奨になります。

これが、Bazel のサブプロセス(アプリケーション、テスト、ツールなど)で使用される JVM に影響を与えないこと。bazel run で実行するかコマンドラインで実行するかにかかわらず、実行可能な Java プログラムに JVM オプションを渡すには、すべての java_binary プログラムと java_test プログラムがサポートする --jvm_flags 引数を使用する必要があります。または、テストの場合は bazel test --test_arg=--jvm_flags=foo ... を使用します。

--host_jvm_debug

このオプションを使用すると、Java 仮想マシンは JDWP 準拠のデバッガからの接続を待ってから、Bazel 自体のメインメソッドを呼び出します。これは、Bazel デベロッパーが使用することを主な目的としています。

--autodetect_server_javabase

このオプションを使用すると、Bazel は起動時にインストール済みの JDK を自動的に検索し、埋め込まれた JRE が使用できない場合は、インストール済みの JRE にフォールバックします。--explicit_server_javabase を使用すると、Bazel を実行する明示的な JRE を選択できます。

--batch

バッチモードでは、Bazel は標準のクライアント/サーバーモードを使用せず、1 つのコマンドに対して bazel Java プロセスを実行します。これはシグナル処理、ジョブ制御、環境変数の継承に関してより予測可能なセマンティクスに使用されるため、chroot jail で bazel を実行する場合に必要です。

バッチモードでは、同じ output_base 内で適切なキュー セマンティクスが保持されます。つまり、同時呼び出しは重複なく順番に処理されます。 バッチモードの Bazel が、サーバーが稼働しているクライアントで実行されている場合、コマンドを処理する前にまずサーバーが強制終了されます。

バッチモードや上記の別の方法を使用すると、Bazel の実行速度が遅くなります。 これは、特に、ビルドファイルのキャッシュがメモリ常駐であり、連続したバッチ呼び出し間で保持されないためです。したがって、連続ビルドなど、パフォーマンスが重要でない場合には、バッチモードを使用するほうが合理的です。

--max_idle_secs=n

このオプションでは、Bazel サーバー プロセスが、最後のクライアント リクエストから終了するまで待機する時間を秒単位で指定します。デフォルト値は 10,800(3 時間)です。--max_idle_secs=0 を使用すると、Bazel サーバー プロセスが無期限に存続します。

このオプションは、Bazel を呼び出すスクリプトで使用され、Bazel サーバー プロセスが実行されないときに、ユーザーのマシンに Bazel サーバー プロセスが残らないようにします。たとえば、presubmit スクリプトで bazel query を呼び出すことで、ユーザーの保留中の変更によって不要な依存関係が発生しないようにできます。ただし、ユーザーがそのワークスペースで最近のビルドを行っていない場合は、Bazel サーバーをその日アイドル状態のまま残すため、presubmit スクリプトが Bazel サーバーを起動することは望ましくありません。 クエリ リクエストで --max_idle_secs に小さな値を指定すると、スクリプトは、それによって新しいサーバーが起動した場合、ifそのサーバーは直ちに終了し、代わりにサーバーがすでに実行されていた場合は、通常の時間アイドル状態になるまで実行を継続します。もちろん、既存のサーバーのアイドル タイマーはリセットされます。

--[no]shutdown_on_low_sys_mem

有効で --max_idle_secs を正の期間に設定した場合、ビルドサーバーがしばらくアイドル状態になった後、システムのメモリが少なくなったときにサーバーをシャットダウンします。Linux のみ。

ビルドサーバーは、max_idle_secs に対応するアイドル チェックを実行するだけでなく、サーバーがしばらくアイドル状態になると、使用可能なシステムメモリのモニタリングを開始します。使用可能なシステム・メモリが極端に少なくなると、サーバーは終了します。

--[no]block_for_lock

Bazel を有効にした場合、Bazel はサーバーロックを保持している他の Bazel コマンドが完了するのを待ってから、次に進みます。無効にした場合、すぐにロックを取得できない場合、Bazel はエラーで終了します。

デベロッパーは、これを presubmit チェックで使用して、同じクライアントの別の Bazel コマンドによって発生する長い待機を回避できます。

--io_nice_level=n

ベスト エフォート IO スケジューリングのレベルを 0 ~ 7 で設定します。0 が最も優先度が高く、7 が最も優先度が低いです。予測スケジューラが尊重できる優先度は 4 までです。負の値は無視されます。

--batch_cpu_scheduling

Bazel に batch CPU スケジューリングを使用します。このポリシーは、非インタラクティブだが、nice 値を下げたくないワークロードに役立ちます。「man 2 sched_setscheduler」をご覧ください。このポリシーにより、Bazel のスループットと引き換えに、システムのインタラクティビティが向上する可能性があります。

その他のオプション

--[no]announce_rc

起動時に bazelrc ファイルから読み取ったコマンド オプションを Bazel が通知するかどうかを制御します。(スタートアップ オプションは無条件に発表されます)。

--color (yes|no|auto)

このオプションは、Bazel で画面上で出力をハイライト表示するために色を使用するかどうかを決定します。

このオプションを yes に設定すると、カラー出力が有効になります。 このオプションを auto に設定した場合、Bazel は出力がターミナルに送信され、TERM 環境変数が dumbemacsxterm-mono 以外の値に設定されている場合にのみ、カラー出力を使用します。このオプションを no に設定すると、出力がターミナルに送信されるかどうかや、TERM 環境変数の設定に関係なく、カラー出力が無効になります。

--config=name

追加の config セクションを rc ファイルから選択します。現在の command については、そのようなセクションが存在する場合は command:name からもオプションが pull されます。複数回指定すると、複数の構成セクションからフラグを追加できます。拡張は他の定義を指すことができます(たとえば、拡張を連結できます)。

--curses (yes|no|auto)

このオプションにより、Bazel が画面出力でカーソル制御を使用するかどうかが決まります。これにより、データのスクロールが減り、Bazel からの出力ストリームがコンパクトで読みやすいものになります。これは --color で適切に機能します。

このオプションを yes に設定すると、カーソル制御の使用が有効になります。 このオプションを no に設定した場合、カーソル制御の使用は無効になります。このオプションを auto に設定した場合、--color=auto と同じ条件でカーソル制御が有効になります。

--[no]show_timestamps

指定した場合、Bazel によって生成された各メッセージに、メッセージが表示された時刻を示すタイムスタンプが追加されます。