このページでは、Windows で Bazel を使用するためのベスト プラクティスについて説明します。設置方法 手順については、Windows に Bazel をインストールするをご覧ください。
既知の問題
Windows 関連の Bazel の問題は「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 でファイルのシンボリック リンクを作成できるように Bazel が必要です。 有効にするか デベロッパー モード (Windows 10 バージョン 1703 以降の場合)、または管理者として Bazel を実行します。 これにより、次の機能が有効になります。
この処理を簡単にするために、次の行を bazelrc ファイルに追加します。
startup --windows_enable_symlinks
build --enable_runfiles
注: Windows でシンボリック リンクを作成すると、負荷の高いオペレーションになります。--enable_runfiles
フラグを指定すると、大量のファイル シンボリック リンクが作成される可能性があります。この機能は必要な場合にのみ有効にしてください。
Bazel の実行: MSYS2 シェル、コマンド プロンプト、PowerShell
おすすめの方法: Bazel は、コマンド プロンプト(cmd.exe
)または
PowerShell.
2020-01-15 の時点では、bash
から Bazel を実行しないでください。
MSYS2 シェル、Git Bash、Cygwin、その他の Bash バリアントからダウンロードします。Bazel は
ほとんどのユースケースでうまくいくかもしれませんが
MSYS2 から Ctrl+C キーでビルドを中断します)。
また、MSYS2 で実行する場合は、MSYS2 の
自動パス変換。そうしない場合、MSYS はコマンドライン引数を
Unix パス(//foo:bar
など)から Windows パスへのパスを指定します。詳しくは、
こちらの StackOverflow の回答
をご覧ください。
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 が必要(その実行ファイルがシェル スクリプトであるため)
Bash なしで sh_binary ルールと sh_* ルール、および gsuite.actions.run_shell() を使用する
sh_*
ルールのビルドとテスト、および Starlark のビルドとテストには Bash が必要です
ctx.actions.run_shell()
と ctx.resolve_command()
を使用するルール。この
そのプロジェクト内のルールだけでなく、任意の外部
依存するリポジトリの数を制限することです(推移的であっても)。
将来的には、Windows サブシステムを使用して、 これらのルールを構築するために Linux(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 の数によって決まります。厳密な Visual C++ Build Tools を選択できる 複数のバージョンがインストールされている場合はBAZEL_VC_FULL_VERSION
でバージョン、それ以外の場合は 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 など)を使用するか、Windows 8.1 を使用する場合は 8.1 を指定します。 SDK(利用可能な Windows 8.1 SDK のバージョンは 1 つのみ)その際、 Windows SDK がインストールされていること。要件: これは VC 2017 および 2019 でサポートされています。スタンドアロンの VC 2015 ビルドツールは、 使用する場合は、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++ をビルドする
Bazel 0.29.0 以降、Bazel は LLVM の MSVC 互換コンパイラ ドライバ(clang-cl.exe
)を使用したビルドをサポートしています。
要件: Clang でビルドするには、両方をインストールする必要があります。
LLVM および Visual C++ Build Tools
これは clang-cl.exe
をコンパイラとして使用するものの、
Visual C++ ライブラリ。
Bazel は、システムへの LLVM のインストールを自動的に検出できます。また、明示的に指定することも、
LLVM が BAZEL_LLVM
によってインストールされた Bazel。
BAZEL_LLVM
: LLVM のインストール ディレクトリset BAZEL_LLVM=C:\Program Files\LLVM
C++ のビルド用に Clang ツールチェーンを有効にするには、いくつかの状況が考えられます。
bazel 0.28 以前: Clang はサポートされていません。
--incompatible_enable_cc_toolchain_resolution
を使用しない場合: Clang ツールチェーンは、ビルドフラグ--compiler=clang-cl
で有効にできます。--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
ファイル.exe
ファイル。JVM の環境を設定し、バイナリを実行できます。
こちらのサンプル プロジェクト:
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 ファイル
- Python インタープリタを起動できる実行可能ファイルを 自己解凍形式の zip ファイルを引数として
実行可能ファイル(拡張子は .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 による Python ターゲットのビルド方法の詳細に興味がある場合は、 このデザインが のドキュメントをご覧ください。