在 Windows 上使用 Bazel

<ph type="x-smartling-placeholder"></ph> 报告问题 查看来源 敬上 每晚 · 7.3。 · 7.2 条 · 7.1。 · 7.0。 · 6.5

本页面介绍在 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

有些功能要求 Bazel 能够在 Windows 上创建文件符号链接, 方法是启用 开发者模式 (在 Windows 10 1703 或更高版本上),或者以管理员身份运行 Bazel。 这将启用以下功能:

为了简化操作,请将以下几行代码添加到 bazelrc 文件中:

startup --windows_enable_symlinks
build --enable_runfiles

注意:在 Windows 上创建符号链接的成本很高。--enable_runfiles 标志可能会创建大量文件符号链接。请仅在需要时启用此功能。

运行 Bazel:MSYS2 shell、命令提示符与 PowerShell

建议:在命令提示符 (cmd.exe) 或 PowerShell.

自 2020 年 1 月 15 日起,请勿bash 运行 Bazel,这也是 来自 MSYS2 shell、Git Bash、Cygwin 或任何其他 Bash 变体。虽然 Bazel 可能适用于大多数用例,但有些功能会被破坏,例如 从 MSYS2 使用 Ctrl+C 中断构建)。 另外,如果您选择在 MSYS2 下运行,则需要禁用 MSYS2 的 自动进行路径转换,否则 MSYS 会转换命令行参数 类似 Unix 路径(例如 //foo:bar)转换为 Windows 路径。请参阅 此 Stack Overflow 回答 了解详情。

在不执行 Bash 的情况下使用 Bazel (MSYS2)

在不使用 Bash 的情况下使用 bazel build

1.0 之前的 Bazel 版本过去需要 Bash 构建一些规则。

从 Bazel 1.0 开始,您可以在不使用 Bash 的情况下构建任何规则,除非它具有以下特点:

  • genrule,因为 genrule 会执行 Bash 命令
  • sh_binarysh_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(因为其可执行文件是 Shell 脚本)

在没有 Bash 的情况下使用 bazel 运行

1.0 之前的 Bazel 版本过去要求 Bash 对任何内容执行 bazel run 操作。

从 Bazel 1.0 开始,您可以在不使用 Bash 的情况下运行任何规则,但以下情况除外:

  • 您使用 --run_under--script_path
  • 测试规则本身需要 Bash(因为其可执行文件是 Shell 脚本)

使用 shbinary 和 sh* 规则,不使用 Bash 使用 ctx.actions.run_shell()

您需要使用 Bash 来构建和测试 sh_* 规则,以及构建和测试 Starlark 使用 ctx.actions.run_shell()ctx.resolve_command() 的规则。这个 不仅适用于您项目中的规则,还会应用于 代码库(即使是传递代码库)。

将来可能会选择使用 Windows 子系统 Linux (WSL) 构建这些规则,但目前并不是 Windows 上的 Bazel 子团队。

设置环境变量

您在 Windows 命令提示符 (cmd.exe) 中设置的环境变量 该命令提示符会话中设置的内容如果您创建新的cmd.exe,则需要执行以下操作: 重新设置变量。如需始终在 cmd.exe 启动时设置变量,您需要 可以将其添加到 Control Panel > System Properties > Advanced > Environment Variables... 对话框中的“用户变量”或“系统变量”中。

在 Windows 上构建

使用 MSVC 构建 C++

如需使用 MSVC 构建 C++ 目标,您需要:

  • Visual C++ 编译器

  • (可选)BAZEL_VCBAZEL_VC_FULL_VERSION 环境变量。

    Bazel 会自动检测系统上的 Visual C++ 编译器。 要指示 Bazel 使用特定的 VC 安装,可以设置 以下环境变量:

    对于 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 完整版 可视 C++ 构建工具。您可以选择确切的 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 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)。请确保您已经指定了 已安装 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++ 目标了!

尝试通过我们的一个示例构建目标 projects

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++ 构建工具; 因为虽然使用 clang-cl.exe 作为编译器,仍然需要链接到 Visual C++ 库。

Bazel 可以自动检测系统上安装的 LLVM,您也可以 BAZEL_LLVM 安装了 LLVM 的 Bazel。

  • BAZEL_LLVM:LLVM 安装目录

    set BAZEL_LLVM=C:\Program Files\LLVM
    

如需启用 Clang 工具链以构建 C++,存在几种情况。

  • 在 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
    
    • WORKSPACE 文件中注册平台和工具链:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    --incompatible_enable_cc_toolchain_resolution 标志。因此, 建议通过第二种方法启用 Clang 支持。

构建 Java

如需构建 Java 目标,您需要:

在 Windows 上,Bazel 会为 java_binary 规则构建两个输出文件:

  • 一个 .jar 文件
  • 一个 .exe 文件,可用于设置 JVM 的环境并运行二进制文件

尝试通过我们的一个示例构建目标 projects

  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 规则构建两个输出文件:

  • 自解压 ZIP 文件
  • 可使用 将自解压 ZIP 文件作为参数

您可以运行该可执行文件(其扩展名为 .exe),也可以运行以下命令: 将自解压 zip 文件作为参数的 Python。

尝试通过我们的一个示例构建目标 projects

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

如果您有兴趣详细了解 Bazel 如何在 Google Cloud 上构建 请参阅这一设计 文档