このページでは、Windows で Bazel を使用するためのベスト プラクティスについて説明します。インストール手順については、Windows に Bazel をインストールするをご覧ください。
既知の問題
Windows 関連の Bazel の問題には、GitHub で「area-Windows」ラベルが付いています。 GitHub-Windows。
ベスト プラクティス
長いパスの問題を回避する
一部のツールには、Windows での最大パス長の制限があります。これには MSVC コンパイラも含まれます。 この問題を回避するには、--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... ダイアログ ボックスで、[User variables] または [System variables] に追加します。
Windows でビルドする
MSVC で C++ をビルドする
MSVC で C++ ターゲットをビルドするには、次のものが必要です。
(省略可)
BAZEL_VC環境変数とBAZEL_VC_FULL_VERSION環境変数。Bazel は、システム上の Visual C++ コンパイラを自動的に検出します。 特定の VC インストールを使用するように Bazel に指示するには、次の環境変数を設定します。
Visual Studio 2017 と 2019 の場合は、
BAZEL_VCのいずれかを設定します。必要に応じて、BAZEL_VC_FULL_VERSIONを設定することもできます。BAZEL_VCVisual C++ Build Tools のインストール ディレクトリset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VCBAZEL_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_VCVisual C++ Build Tools のインストール ディレクトリset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
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-worldbazel-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_LLVMLLVM のインストール ディレクトリset BAZEL_LLVM=C:\Program Files\LLVM
C++ のビルドに Clang ツールチェーンを有効にするには、いくつかの状況があります。
Bazel 7.0.0 以降:
BUILD file( 最上位のBUILDファイルなど)にプラットフォーム ターゲットを追加します。platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )次のビルドフラグを指定して、Clang ツールチェーンを有効にします。
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-clBazel 7.0.0 より前で 0.28 より新しい場合: ビルドフラグ
--compiler=clang-clで Clang ツールチェーンを有効にします。ビルドでフラグ --incompatible_enable_cc_toolchain_resolution が
trueに設定されている場合は、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-worldbazel-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:binbazel-bin\examples\py_native\bin.exepython bazel-bin\examples\py_native\bin.zip
Windows で Bazel が Python ターゲットをビルドする方法について詳しくは、こちらの設計 ドキュメントをご覧ください。