Windows での Bazel の使用

問題を報告 ソースを表示 毎晩

このページでは、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

一部の機能では、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-01-15 の時点では、MSYS2 シェル、Git Bash、Cygwin、その他の Bash バリアントなど、bash から Bazel を実行しないでください。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_* ルールのビルドとテスト、および 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++ ターゲットをビルドするには、次のものが必要です。

  • 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 のバージョンを指定することもできます。Windows 8.1 SDK を使用する場合は、Windows 10 SDK の完全な番号(10.0.10240.0 など)を使用するか、8.1 と指定します(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++ をビルドする

Bazel 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
    

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 ファイル
  • .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 ファイル
  • 自己解凍形式の 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 ターゲットをビルドする方法について詳しくは、こちらの設計ドキュメントをご覧ください。