このページでは、Windows で Bazel を使用する際のベスト プラクティスについて説明します。インストール手順については、Windows に Bazel をインストールするをご覧ください。
既知の問題
Windows 関連の Bazel の問題は、GitHub で「team-Windows」というラベルが付けられています。未解決の問題はこちらで確認できます。
ベスト プラクティス
長いパスの問題を回避する
MSVC コンパイラなど、一部のツールには Windows のパスの最大長の制限があります。この問題を回避するには、--output_user_root フラグを使用して Bazel の短い出力ディレクトリを指定します。
たとえば、bazelrc ファイルに次の行を追加します。
startup --output_user_root=C:/tmp
8.3 ファイル名のサポートを有効にする
Bazel は、長いファイルパスに対して略称バージョンを作成しようとします。ただし、これを行うには、長いパスを含むファイルが存在するボリュームに対して 8.3 ファイル名のサポートを有効にする必要があります。すべてのボリュームで 8.3 の名前の作成を有効にするには、次のコマンドを実行します。
fsutil 8dot3name set 0
シンボリック リンクのサポートを有効にする
一部の機能では、デベロッパー モード(Windows 10 バージョン 1703 以降)を有効にするか、管理者として Bazel を実行して、Windows で Bazel がファイルのシンボリック リンクを作成できるようにする必要があります。これにより、次の機能が有効になります。
簡単にするために、bazelrc ファイルに次の行を追加します。
startup --windows_enable_symlinks
build --enable_runfiles
注: Windows でのシンボリック リンクの作成は負荷の高い操作です。--enable_runfiles
フラグを指定すると、大量のファイルのシンボリック リンクが作成される可能性があります。この機能は必要な場合にのみ有効にしてください。
Bazel の実行: MSYS2 シェル、コマンド プロンプト、PowerShell の比較
おすすめの方法: コマンド プロンプト(cmd.exe
)または PowerShell から Bazel を実行します。
2020 年 1 月 15 日以降、bash
から Bazel を実行しないでください(MSYS2 シェル、Git Bash、Cygwin、またはその他の Bash バリアントから)。Bazel はほとんどのユースケースで機能しますが、MSYS2 から Ctrl+C キーでビルドを中断するなど、いくつかの動作に不具合があります。また、MSYS2 で実行する場合は、MSYS2 の自動パス変換を無効にする必要があります。無効にしないと、MSYS は Unix パスに似たコマンドライン引数(//foo:bar
など)を Windows のパスに変換します。詳しくは、Stack Overflow のこちらの回答をご覧ください。
Bash を使用しない Bazel の使用(MSYS2)
Bash を使用せずに bazel ビルドを使用する
1.0 より前のバージョンの Bazel では、Bash で一部のルールをビルドする必要がありました。
Bazel 1.0 以降では、次の場合を除き、Bash を使用せずにあらゆるルールをビルドできます。
genrule
。genrules が Bash コマンドを実行するためsh_binary
ルールまたはsh_test
ルール(本質的に Bash が必要なため)ctx.actions.run_shell()
またはctx.resolve_command()
を使用する Starlark ルール
ただし、genrule
は多くの場合、ファイルのコピーやテキスト ファイルの作成などの単純なタスクに使用されます。genrule
(および Bash に依存)を使用する代わりに、bazel-skylib リポジトリに適切なルールがあります。Windows で構築する場合、これらのルールに Bash は必要ありません。
Bash を使用せずに bazel テストを使用する
バージョン 1.0 より前の Bazel では、Bash で bazel test
をすべて行うことを必須としていました。
Bazel 1.0 以降では、Bash を使用せずにすべてのルールをテストできます。ただし、次の場合は例外です。
--run_under
を使用する場合- テストルール自体に Bash が必要です(実行ファイルがシェル スクリプトであるため)
Bash を使用せずに bazel を実行する
バージョン 1.0 より前の Bazel では、Bash で bazel run
をすべて行うことを必須としていました。
Bazel 1.0 以降では、Bash を使用せずにすべてのルールを実行できます。ただし、次の場合は例外です。
--run_under
または--script_path
を使用している- テストルール自体に Bash が必要です(実行ファイルがシェル スクリプトであるため)
shbinary と sh* ルール、および Bash を使用せずに resourcemanager.actions.run_shell() を使用する
sh_*
ルールをビルドしてテストし、ctx.actions.run_shell()
と ctx.resolve_command()
を使用する Starlark ルールを作成してテストするには、Bash が必要です。これは、プロジェクト内のルールだけでなく、プロジェクトが(推移的であっても)依存している外部リポジトリ内のルールに適用されます。
将来的に、Linux 用 Windows サブシステム(WSL)を使用してこれらのルールを作成するオプションが利用可能になる可能性はありますが、現時点では Bazel-on-Windows サブチームの優先度ではありません。
環境変数を設定する
Windows コマンド プロンプト(cmd.exe
)で設定した環境変数は、そのコマンド プロンプト セッションでのみ設定されます。新しい cmd.exe
を開始する場合は、変数を再度設定する必要があります。cmd.exe
の起動時に変数を常に設定するには、Control Panel >
System Properties > Advanced > Environment 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_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 アプリケーションのビルドに必要なヘッダー ファイルとライブラリ(Bazel 自体を含む)が含まれています。デフォルトでは、インストールされている最新の Windows SDK が使用されます。
BAZEL_WINSDK_FULL_VERSION
を設定して、Windows SDK バージョンを指定することもできます。Windows 10 SDK の完全な番号(10.0.10240.0 など)を使用するか、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 アーキテクチャをターゲットとしています。別のターゲット アーキテクチャを指定するには、ターゲット アーキテクチャに --cpu
ビルド オプションを設定します。
* x64(デフォルト): --cpu=x64_windows
またはオプションなし
* x86: --cpu=x64_x86_windows
* ARM: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
たとえば、ARM アーキテクチャのターゲットをビルドするには、次のコマンドを実行します。
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
ダイナミック リンク ライブラリ(DLL ファイル)をビルドして使用するには、こちらの例をご覧ください。
コマンドラインの長さの制限: Windows のコマンドラインの長さ制限の問題を防ぐには、--features=compiler_param_file
でコンパイラ パラメータ ファイル機能を有効にします。
Clang で C++ をビルドする
0.29.0 以降、Bazel は LLVM の MSVC 互換コンパイラ ドライバ(clang-cl.exe
)を使用したビルドをサポートしています。
要件: Clang でビルドするには、LLVM と Visual C++ Build ツールの両方をインストールする必要があります。これは、コンパイラとして clang-cl.exe
を使用する場合でも、Visual C++ ライブラリにリンクする必要があるためです。
Bazel は、システムへの LLVM のインストールを自動的に検出できます。また、BAZEL_LLVM
によって、LLVM のインストール場所を明示的に Bazel に指定することもできます。
BAZEL_LLVM
: LLVM のインストール ディレクトリset BAZEL_LLVM=C:\Program Files\LLVM
C++ のビルドで Clang ツールチェーンを有効にする場合、いくつかの状況があります。
bazel 0.28 以前: Clang はサポートされていません。
--incompatible_enable_cc_toolchain_resolution
を使用しない場合: ビルドフラグ--compiler=clang-cl
を使用して Clang ツールチェーンを有効にできます。--incompatible_enable_cc_toolchain_resolution
を使用する場合は、プラットフォーム ターゲットを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-cl
- プラットフォームとツールチェーンを
MODULE.bazel
ファイルに登録します。
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
--incompatible_enable_cc_toolchain_resolution フラグは、今後の Bazel リリースでデフォルトで有効になる予定です。したがって、2 番目の方法で 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 ターゲットをビルドする方法の詳細については、設計ドキュメントをご覧ください。