bazelrc 構成ファイルを書き込む

Bazel では多くのオプションを使用できます。一部のオプション(--subcommands など)は頻繁に変更されますが、他のオプション(--package_path など)は複数のビルドで同じままです。ビルド(およびその他のコマンド)ごとに変更されていないオプションを指定しないようにするには、.bazelrc という構成ファイルでオプションを指定します。

.bazelrc ファイルの場所

Bazel は、次の場所でオプションの構成ファイルを検索します。オプションはこの順序で解釈されるため、競合が発生した場合は、後のファイルのオプションが前のファイルの値よりも優先されます。これらのファイルの読み込みを制御するオプションはすべてスタートアップ オプションです。つまり、bazel の後、コマンド(buildtest など)の前に記述する必要があります。

  1. --nosystem_rc が存在しない場合は、システム RC ファイル

    パス:

    • Linux/macOS/Unix の場合: /etc/bazel.bazelrc
    • Windows の場合: %ProgramData%\bazel.bazelrc

    このファイルが存在しない場合でもエラーにはなりません。

    システム指定の別の場所が必要な場合は、カスタム Bazel バイナリをビルドして、BAZEL_SYSTEM_BAZELRC_PATH 値を //src/main/cpp:option_processorでオーバーライドする必要があります。 システム指定の場所には、Unix の ${VAR_NAME} や Windows の %VAR_NAME% などの環境変数参照が含まれる場合があります。

  2. ワークスペース RC ファイル。ただし、--noworkspace_rc が存在する場合は除きます。

    パス: ワークスペース ディレクトリの .bazelrc(メインの MODULE.bazel ファイルの横)。

    このファイルが存在しない場合でもエラーにはなりません。

  3. ホーム RC ファイル。ただし、--nohome_rc が存在する場合は除きます。

    パス:

    • Linux/macOS/Unix の場合: $HOME/.bazelrc
    • Windows の場合: %USERPROFILE%\.bazelrc が存在する場合は %USERPROFILE%\.bazelrc、存在しない場合は %HOME%/.bazelrc

    このファイルが存在しない場合でもエラーにはなりません。

  4. 環境変数 RC ファイル。パスが BAZELRC 環境変数で設定されている場合。

    環境変数には、カンマ区切りの複数のパスを含めることができます。

  5. ユーザー指定の RC ファイル--bazelrc=file で指定されている場合

    このフラグは省略可能ですが、複数回指定することもできます。

    /dev/null は、以降の --bazelrc がすべて無視されることを示します。これは 、リリース ビルドなどでユーザー RC ファイルの検索を無効にする場合に便利です。

    次に例を示します。

    --bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
    
    • x.rcy.rc が読み取られます。
    • 前の /dev/null のため、z.rc は無視されます。

このオプションの構成ファイルに加えて、Bazel はグローバル RC ファイルを検索します。詳細については、グローバル bazelrc のセクションをご覧ください。

.bazelrc の構文とセマンティクス

すべての UNIX「rc」ファイルと同様に、.bazelrc ファイルは行ベースの文法を持つテキスト ファイルです。空行と #(コメント)で始まる行は無視されます。各行には一連の単語が含まれており、Bourne シェルと同じルールに従ってトークン化されます。

インポート

importtry-importtry-import-if-bazel-version で始まる行は特殊です。これらを使用して他の「rc」ファイルを読み込みます。ワークスペース ルートからの相対パスを指定するには、import %workspace%/path/to/bazelrc と記述します。

さまざまな import ステートメントの違いは次のとおりです。

  • import - imported'ed ファイルが見つからない場合(または読み取れない場合)、Bazel は失敗します。
  • try-import - ファイルのインポートが試行されますが、 import とは異なり、ファイルが見つからない場合(または読み取れない場合)、Bazel は失敗しません。
  • try-import-if-bazel-version - try-import と似ていますが、インポートを試行する前に、現在の Bazel バージョンに関する追加の 条件がチェックされます。構文については、以下をご覧ください。

プロジェクトが複数の Bazel バージョンで動作する必要がある場合や、ある Bazel バージョンから別の Bazel バージョンに移行する場合に、条件付きの Bazel バージョン インポートが役立ちます。各リリースでフラグが非推奨になったり、削除されたり、導入されたりする可能性があるため、Bazel バージョンごとに異なるフラグが必要になる場合があります。使用している Bazel のバージョンを確認するには、bazel --version を実行します。次の条件付きチェックがサポートされており、有効なセマンティック バージョンが必要です。

# Strictly greater than: used for post-release targeting
try-import-if-bazel-version >7.0.0 %workspace%/configs/post_v7.rc

# Greater than or equal to: commonly used for feature introduction
try-import-if-bazel-version >=6.0.0 %workspace%/configs/features.rc

# Strictly less than: used for deprecated flags removed in newer versions
try-import-if-bazel-version <7.0.0 %workspace%/configs/legacy.rc

# Less than or equal to: caps configuration to a specific version
try-import-if-bazel-version <=5.4.0 %workspace%/configs/v5_fixes.rc

# Exact match: hotfix for a specific broken release
try-import-if-bazel-version ==6.3.2 %workspace%/configs/hotfix_6.3.2.rc

# Not equal to: excludes broken version from standard config
try-import-if-bazel-version !=7.0.1 %workspace%/configs/standard.rc

追加のチルダ演算子は、パッチ、マイナー、メジャー バージョンの変更の範囲を提供します。

# Equivalent to >=1.2.3 <1.3.0
try-import-if-bazel-version ~1.2.3 %workspace%/configs/1.2.3_flags.rc

# Equivalent to >=1.2.0 <1.3.0 (Same as 1.2.x)
try-import-if-bazel-version ~1.2 %workspace%/configs/1.2_flags.rc

# Equivalent to >=1.0.0 <2.0.0 (Same as 1.x)
try-import-if-bazel-version ~1 %workspace%/configs/v1_flags.rc

インポートの優先順位:

  • インポートされたファイルのオプションは、import ステートメントの前に指定されたオプションよりも優先されます。
  • import ステートメントの後に指定されたオプションは、インポートされたファイルのオプションよりも優先されます。
  • 後でインポートされたファイルのオプションは、以前にインポートされたファイルよりも優先されます。

オプションのデフォルト

bazelrc のほとんどの行では、デフォルトのオプション値を定義します。各行の最初の単語は、これらのデフォルトが適用されるタイミングを指定します。

  • startup: スタートアップ オプション。コマンドの前に記述され、 bazel help startup_options で説明されています。
  • common: サポートするすべての Bazel コマンドに適用する必要があるオプション。この方法で指定されたオプションをコマンドがサポートしていない場合、他の Bazel コマンドで有効であれば、そのオプションは無視されます。 これはオプション名にのみ適用されます。現在のコマンドが指定された名前のオプションを受け入れるが、指定された値をサポートしていない場合、コマンドは失敗します。
  • always: すべての Bazel コマンドに適用されるオプション。この方法で指定されたオプションをコマンドがサポートしていない場合、コマンドは失敗します。
  • command: オプション が適用される Bazel コマンド(buildquery など)。これらのオプションは、指定されたコマンドから継承するすべてのコマンドにも適用されます。(たとえば、testbuild から継承されます)。

これらの各行は複数回使用でき、最初の単語に続く引数は、1 行に記述されているかのように結合されます。(「スイス アーミー ナイフ」コマンドライン インターフェースを備えた別のツールである CVS のユーザーは、.cvsrc と同様の構文を使用できます)。たとえば、次の行は

build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar

次のように結合されます。

build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar

有効なフラグは --verbose_failures--test_tmpdir=/tmp/bar です。

オプションの優先順位:

  • コマンドラインのオプションは、常に RC ファイルのオプションよりも優先されます。 たとえば、RC ファイルに build -c opt と記述されていても、コマンドライン フラグが -c dbg の場合、コマンドライン フラグが優先されます。
  • RC ファイル内では、優先順位は具体性によって決まります。より具体的なコマンドの行は、より具体的なコマンドの行よりも優先されます。

    具体性は継承によって定義されます。一部のコマンドは他のコマンドからオプションを継承するため、継承元のコマンドよりも具体的になります。たとえば、testbuild コマンドから継承されるため、すべての bazel build フラグは bazel test で有効であり、同じオプションの test 行がない限り、すべての build 行は bazel test にも適用されます。RC ファイルに次のように記述されている場合:

    test -c dbg --test_env=PATH
    build -c opt --verbose_failures

    then bazel build //foo-c opt --verbose_failures を使用し、bazel test //foo--verbose_failures -c dbg --test_env=PATH を使用します。

    継承(具体性)グラフは次のとおりです。

    • すべてのコマンドは common から継承されます。
    • 次のコマンドは build から継承され(より具体的です): testruncleanmobile-installinfoprint_actionconfigcqueryaquery
    • coveragefetchvendortest から継承されます。
  • 同じコマンドのオプションを同じ具体性で指定する 2 つの行は、ファイル内での出現順に解析されます。

  • この優先順位ルールはファイル順序と一致しないため、RC ファイル内で優先順位に従うと読みやすくなります。ファイルの先頭に common オプションを記述し、ファイルの末尾に最も具体的なコマンドを記述します。このようにすると、オプションが読み取られる順序と適用される順序が同じになるため、より直感的になります。

RC ファイルの行で指定された引数には、ビルド ターゲットの名前など、オプションではない引数が含まれる場合があります。これらは、同じファイルで指定されたオプションと同様に、コマンドラインの兄弟よりも優先順位が低く、常にオプション以外の引数の明示的なリストの先頭に追加されます。

--config

RC ファイルは、オプションのデフォルトを設定するだけでなく、オプションをグループ化して、一般的なグループのショートカットを提供するためにも使用できます。これを行うには、コマンドに :name 接尾辞を追加します。これらのオプションはデフォルトで無視されますが、オプション --config=name が存在する場合は、コマンドラインまたは .bazelrc ファイルに存在する場合でも、別の構成定義内であっても、再帰的に含まれます。command:name で指定されたオプションは、上記の優先順位で、該当するコマンドに対してのみ展開されます。

--config=foo は、RC ファイルで定義されたオプションを「インプレース」で展開するため、構成に指定されたオプションは --config=foo オプションと同じ優先順位になります。

この構文は、startup を使用して スタートアップ オプションを設定する場合には適用されません。.bazelrc で startup:config-name --some_startup_option を設定しても無視されます。

--enable_platform_specific_config

.bazelrc のプラットフォーム固有の構成は、--enable_platform_specific_config を使用して自動的に有効にできます。たとえば、ホスト OS が Linux で build コマンドが実行されると、build:linux 構成が 自動的に有効になります。サポートされている OS 識別子は、linuxmacoswindowsfreebsdopenbsd です。このフラグを有効にすることは、Linux で --config=linux、Windows で --config=windows、macOS で --config=macos、FreeBSD で --config=freebsd、OpenBSD で --config=openbsd を使用することと同じです。

--enable_platform_specific_config をご覧ください。

以下に、~/.bazelrc ファイルの例を示します。

# Bob's Bazel option defaults

startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going

# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600

Bazel の動作を制御するその他のファイル

.bazelignore

Bazel で無視するワークスペース内のディレクトリ(他のビルドシステムを使用する関連プロジェクトなど)を指定できます。ワークスペースのルートに .bazelignore というファイルを作成し、Bazel で無視するディレクトリを 1 行に 1 つずつ追加します。エントリはワークスペース ルートからの相対パスです。

.bazelignore ファイルでは glob セマンティクスは使用できません。Bazel 8 では、別のディレクティブ ignore_directories() を使用できる REPO.bazel ファイルが導入されました。 .bazelignore と同様に、無視するディレクトリのリストを受け取りますが、glob セマンティクスを使用します。 #24203 をご覧ください。

グローバル bazelrc ファイル

Bazel は、次の順序でオプションの bazelrc ファイルを読み取ります。

  1. /etc/bazel.bazelrc にあるシステム RC ファイル。
  2. $workspace/tools/bazel.rc にあるワークスペース RC ファイル。
  3. $HOME/.bazelrc にあるホーム RC ファイル。

ここに記載されている各 bazelrc ファイルには、無効にするために使用できる対応するフラグ(--nosystem_rc--noworkspace_rc--nohome_rc など)があります。--ignore_all_rc_files スタートアップ オプションを渡すことで、Bazel にすべての bazelrc を無視させることもできます。