Windows での Bazel の使用

このページでは、Windows で Bazel を使用する際のベスト プラクティスについて説明します。インストール手順については、Windows に Bazel をインストールするをご覧ください。

既知の問題

Windows 関連の Bazel の問題には、GitHub で「area-Windows」ラベルが付いています。 GitHub-Windows

ベスト プラクティス

長いパスの問題を回避する

一部のツール(MSVC コンパイラなど)には、Windows でのパスの長さの上限があります。 この問題を回避するには、--output_user_root フラグを使用して、Bazel の短い出力ディレクトリを指定します。

たとえば、bazelrc ファイルに次の行を追加します。

startup --output_user_root=C:/tmp

一部の機能では、Bazel が Windows でファイル シンボリック リンクを作成できる必要があります。 デベロッパー モードを有効にする(Windows 10 バージョン 1703 以降)か、Bazel を管理者として実行します。 これにより、次の機能が有効になります。

簡単に設定できるように、bazelrc ファイルに次の行を追加します。

startup --windows_enable_symlinks

build --enable_runfiles

: Windows でのシンボリック リンクの作成は負荷の高いオペレーションです。--enable_runfiles フラグを使用すると、大量のファイル シンボリック リンクが作成される可能性があります。この機能は、必要な場合にのみ有効にしてください。

Bazel の実行: MSYS2 シェル、コマンド プロンプト、PowerShell

推奨事項: コマンド プロンプト(cmd.exe)または PowerShell から Bazel を実行します。

2020 年 1 月 15 日の時点で、MSYS2 シェル、Git Bash、Cygwin、その他の Bash バリアントのいずれであっても、 から Bazel を実行bash -- しないでください。Bazel はほとんどのユースケースで動作しますが、 MSYS2 から Ctrl+C でビルドを中断するなど、一部の機能が破損しています)。 また、MSYS2 で実行する場合は、MSYS2 の自動パス変換を無効にする必要があります。無効にしないと、MSYS は Unix パス(//foo:bar など)のように見えるコマンドライン引数を Windows パスに変換します。 詳細については、 StackOverflow の回答 をご覧ください。

Bash(MSYS2)を使用せずに Bazel を使用する

Bash を使用せずに bazel build を使用する

1.0 より前の Bazel バージョンでは、一部のルールをビルドするために Bash が必要でした。

Bazel 1.0 以降では、次のいずれかでない限り、Bash を使用せずに任意のルールをビルドできます。

  • genrule。genrule は Bash コマンドを実行するため。
  • sh_binary または sh_test ルール。これらは本質的に Bash を必要とするため。
  • ctx.actions.run_shell() または ctx.resolve_command() を使用する Starlark ルール

ただし、genrule は、ファイルのコピーやテキスト ファイルの書き込みなどの簡単なタスクによく使用されます。genrule を使用する代わりに(Bash に依存する)、bazel-skylib リポジトリで適切なルールを見つけることができます。Windows でビルドする場合、これらのルールには Bash は必要ありません

Bash を使用せずに bazel test を使用する

1.0 より前の Bazel バージョンでは、bazel test を実行するために Bash が必要でした。

Bazel 1.0 以降では、次の場合を除き、Bash を使用せずに任意のルールをテストできます。

  • --run_under を使用する場合
  • テストルール自体に Bash が必要な場合(実行可能ファイルがシェル スクリプトであるため)

Bash を使用せずに bazel run を使用する

1.0 より前の Bazel バージョンでは、bazel run を実行するために Bash が必要でした。

Bazel 1.0 以降では、次の場合を除き、Bash を使用せずに任意のルールを実行できます。

  • --run_under または --script_path を使用する場合
  • テストルール自体に Bash が必要な場合(実行可能ファイルがシェル スクリプトであるため)

Bash を使用せずに sh_binary ルール、sh_* ルール、ctx.actions.run_shell() を使用する

sh_* ルールをビルドしてテストするには、Bash が必要です。また、ctx.actions.run_shell()ctx.resolve_command() を使用する Starlark ルールをビルドしてテストするには、Bash が必要です。これは、プロジェクト内のルールだけでなく、プロジェクトが依存する外部リポジトリ(推移的)のルールにも適用されます。

今後、Windows Subsystem for Linux(WSL)を使用してこれらのルールをビルドするオプションが提供される可能性がありますが、現在のところ、Bazel-on-Windows サブチームでは優先されていません。

環境変数の設定

Windows コマンド プロンプト(cmd.exe)で設定した環境変数は、そのコマンド プロンプト セッションでのみ設定されます。新しい cmd.exe を起動する場合は、変数を再度設定する必要があります。cmd.exe の起動時に常に変数を設定するには、 [ユーザー環境変数] または [システム環境変数] に、Control Panel > System Properties > Advanced > Environment Variables... ダイアログ ボックスで追加します。

Windows でビルドする

MSVC で C++ をビルドする

MSVC で C++ ターゲットをビルドするには、次のものが必要です。

  • Visual C++ コンパイラ

  • (省略可)BAZEL_VC 環境変数と BAZEL_VC_FULL_VERSION 環境変数。

    Bazel は、システム上の Visual C++ コンパイラを自動的に検出します。 特定の VC インストールを使用するように Bazel に指示するには、次の環境変数を設定します。

    Visual Studio 2017 と 2019 の場合は、BAZEL_VC のいずれかを設定します。必要に応じて、BAZEL_VC_FULL_VERSION を設定することもできます。

    • BAZEL_VC Visual C++ Build Tools のインストール ディレクトリ

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (省略可)Visual Studio 2017 と 2019 のみ。Visual C++ Build Tools の完全なバージョン番号。複数のバージョンがインストールされている場合は、BAZEL_VC_FULL_VERSION で正確な Visual C++ Build Tools バージョンを選択できます。それ以外の場合は、Bazel が最新バージョンを選択します。

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    Visual Studio 2015 以前の場合は、BAZEL_VC を設定します。(BAZEL_VC_FULL_VERSION はサポートされていません)。

    • BAZEL_VC Visual C++ Build Tools のインストール ディレクトリ

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • Windows SDK

    Windows SDK には、Bazel 自体を含む Windows アプリケーションのビルドに必要なヘッダー ファイルとライブラリが含まれています。デフォルトでは、インストールされている最新の Windows SDK が使用されます。BAZEL_WINSDK_FULL_VERSION を設定して、Windows SDK バージョンを指定することもできます。10.0.10240.0 などの完全な Windows 10 SDK 番号を使用するか、8.1 を指定して Windows 8.1 SDK を使用します(Windows 8.1 SDK のバージョンは 1 つのみです)。指定した Windows SDK がインストールされていることを確認してください。

    要件: これは VC 2017 と 2019 でサポートされています。スタンドアロンの VC 2015 Build Tools では Windows SDK の選択がサポートされていません。Visual Studio 2015 の完全なインストールが必要です。それ以外の場合、BAZEL_WINSDK_FULL_VERSION は無視されます。

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

すべて設定したら、C++ ターゲットをビルドできます。

サンプル プロジェクトのいずれかからターゲットをビルドしてみてください。

bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe

デフォルトでは、ビルドされたバイナリは x64 アーキテクチャをターゲットとしています。ARM64 アーキテクチャ用にビルドするには、

--platforms=//:windows_arm64  --extra_toolchains=@local_config_cc//:cc-toolchain-arm64_windows

MODULE.bazel@local_config_cc を導入するには、

bazel_dep(name = "rules_cc", version = "0.1.1")
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")

動的リンク ライブラリ(DLL ファイル)をビルドして使用するには、こちらの 例をご覧ください。

コマンドラインの長さの上限: Windows コマンドラインの長さの上限の問題を防ぐには、 コンパイラ パラメータ ファイル機能を有効にします--features=compiler_param_file

Clang で C++ をビルドする

0.29.0 以降、Bazel は LLVM の MSVC 互換コンパイラ ドライバ(clang-cl.exe)を使用したビルドをサポートしています。

要件: Clang でビルドするには、両方 LLVM と Visual C++ Build Tools をインストールする必要があります。 コンパイラとして clang-cl.exe を使用しても、 Visual C++ ライブラリにリンクする必要があるためです。

Bazel はシステム上の LLVM インストールを自動的に検出できます。また、BAZEL_LLVM で LLVM のインストール場所を明示的に Bazel に伝えることもできます。

  • BAZEL_LLVM LLVM のインストール ディレクトリ

    set BAZEL_LLVM=C:\Program Files\LLVM

Clang ツールチェーンを有効にするには、Bazel のバージョンと、Bzlmod を使用しているか WORKSPACE を使用しているかによって構成が異なります。


Bazel 8 以降:

  • Bzlmod を使用する(推奨):

    1. MODULE.bazelrules_cc が読み込まれていることを確認し、CC ツールチェーンを構成します。 ```python bazel_dep(name = "rules_cc", version = "0.0.17") # Or newer

      cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension") use_repo(cc_configure, "local_config_cc") ```

    2. BUILD ファイル(ルート BUILD ファイルなど)に platform ターゲットを定義します: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. 次のフラグを使用してツールチェーンを有効にします: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE を使用する:

    1. WORKSPACE ファイルに rules_cc の依存関係とツールチェーンを読み込みます : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. BUILD ファイル(ルート BUILD ファイルなど)に platform ターゲットを定義します: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. 次のフラグを使用してツールチェーンを有効にします: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 7:

注: Bazel 7 では、@bazel_tools//tools/cpp:clang-cl@rules_cc 制約のエイリアスではありません。 Bazel 7 で rules_ccclang-cl を正しく使用するには、@rules_cc リポジトリ内の制約を参照する必要があります。ラベル @rules_cc//cc/private/toolchain:clang-cl は技術的には非公開ですが、Bazel 7 で WORKSPACE と Bzlmod の設定間で一貫した動作を実現するために必要です。

  • Bzlmod を使用する:

    1. Bazel 8 の例のように MODULE.bazel を設定します。

    2. platform ターゲットを @rules_cc プライベート制約を使用して定義します: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. 次のフラグを使用してツールチェーンを有効にします: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE を使用する:

    1. WORKSPACE ファイルに rules_cc の依存関係とツールチェーンを読み込みます : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. platform ターゲットを @rules_cc プライベート制約を使用して定義します: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. 次のフラグを使用してツールチェーンを有効にします: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 0.29 ~ 6.x:

  • ビルドフラグ --compiler=clang-cl で Clang ツールチェーンを有効にします。

  • ビルドでフラグ --incompatible_enable_cc_toolchain_resolutiontrueに設定されている場合は、Bazel 7.0.0 の方法を使用します。

Bazel 0.28 以前:

  • Clang はサポートされていません。

Java をビルドする

Java ターゲットをビルドするには、次のものが必要です。

Windows では、Bazel は java_binary ルール用に次の 2 つの出力ファイルをビルドします。

  • .jar ファイル
  • JVM の環境を設定してバイナリを実行できる .exe ファイル

サンプル プロジェクトのいずれかからターゲットをビルドしてみてください。

  bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
  bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe

Python をビルドする

Python ターゲットをビルドするには、次のものが必要です。

Windows では、Bazel は py_binary ルール用に次の 2 つの出力ファイルをビルドします。

  • 自己解凍型 zip ファイル
  • 自己解凍型 zip ファイルを引数として Python インタープリタを起動できる実行可能ファイル

実行可能ファイル(拡張子 .exe)を実行するか、自己解凍型 zip ファイルを引数として Python を実行します。

サンプル プロジェクトのいずれかからターゲットをビルドしてみてください。

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

Bazel が Windows で Python ターゲットをビルドする方法について詳しくは、こちらの 設計 ドキュメントをご覧ください。