このページでは、Windows で Bazel を使用する際のベスト プラクティスについて説明します。インストール手順については、Windows に Bazel をインストールするをご覧ください。
既知の問題
Windows 関連の Bazel の問題には、GitHub で「team-Windows」 ラベルが付いています。未解決の問題については、こちらをご覧ください。
ベスト プラクティス
長いパスの問題を回避する
一部のツール(MSVC コンパイラなど)には、Windows での最大パス長の制限があります。 この問題を回避するには、--output_user_root フラグを使用して、Bazel の短い出力ディレクトリを指定します。
たとえば、bazelrc ファイルに次の行を追加します。
startup --output_user_root=C:/tmp8.3 ファイル名のサポートを有効にする
Bazel は、長いファイルパスの短い名前バージョンを作成しようとします。そのためには、長いパスのファイルが存在するボリュームで 8.3 ファイル名のサポート を有効にする必要があります。次のコマンドを実行すると、すべてのボリュームで 8.3 名前の作成を有効にできます。
fsutil 8dot3name set 0シンボリック リンクのサポートを有効にする
一部の機能では、Bazel が Windows でファイル シンボリック リンクを作成できるようにする必要があります。 デベロッパー モードを有効にする(Windows 10 バージョン 1703 以降)か、Bazel を管理者として実行します。 これにより、次の機能が有効になります。
簡単に設定できるように、bazelrc ファイルに次の行を追加します。
startup --windows_enable_symlinksbuild --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 アーキテクチャをターゲットとしています。別の
ターゲット アーキテクチャを指定するには、ターゲット アーキテクチャの --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 Tools をインストールする必要があります。
コンパイラとして clang-cl.exe を使用しても、
Visual C++ ライブラリにリンクする必要があるためです。
Bazel は、システム上の LLVM インストールを自動的に検出できます。また、
Bazel に LLVM がインストールされている場所を BAZEL_LLVM で明示的に伝えることもできます。
BAZEL_LLVMLLVM のインストール ディレクトリ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-clMODULE.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-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 ターゲットをビルドする方法について詳しくは、こちらの設計 ドキュメントをご覧ください。