如何以跨平台方式使用 Bazel 设置 C++ 版本?

How to set C++ version with Bazel in a cross platform way?

我希望我的 Bazel 项目使用 c++17。有一个类似的问题 () 但接受的答案没有移植到 MSCV。

MSCV 需要 --cxxopt='/std:c++17' 而 gcc 需要 --cxxopt='--std=c++17'.

有没有人有基于最流行的 Windows 和 Linux 编译器(gcc、MSCV、clang)将版本设置为 c++17 的最小示例配置?我很难理解工具链文档。

以下无效。

# .bazelrc

build --cxxopt=select({
    "@bazel_tools//src/conditions:windows": "/std:c++17",
    "//conditions:default": "--std=c++17",
})

在项目的每个 cc_binary 目标中,包括以下内容。

# BUILD

COPTS = select({
    "@bazel_tools//src/conditions:windows": ["/std:c++17"],
    "//conditions:default": ["--std=c++17"],
})    

...

cc_binary(
    name = "example",
    srcs = ["example.cc"],
    ...
    copts=COPTS
)


当然,这非常乏味,如果有人试图在 Windows 上使用 gcc,就会中断。我很乐意接受更好的答案。

您可以在 .bazelrc:

中执行类似的操作
# GCC 9.3
build:gcc9 --cxxopt=-std=c++2a
build:gcc9 --cxxopt=-Wall
build:gcc9 --cxxopt=-Werror
##build:gcc9 --cxxopt=-Wextra
build:gcc9 --define compiler=gcc9_3_0

build:macos --cxxopt=-std=c++2a
build:macos --cxxopt=-Wall
#build:macos --cxxopt=-Werror
##build:macos --cxxopt=-Wextra
build:macos --define compiler=clang12

# Clang 13.0.0
build:clang13 --cxxopt=-std=c++17
#build:clang13 --cxxopt=-mavx
#build:clang13 --cxxopt=-mavx2
#build:clang13 --cxxopt=-msse4.2
#build:clang13 --cxxopt=-Werror
build:clang13 --define compiler=clang13
build:clang13 --incompatible_enable_cc_toolchain_resolution
build:clang13 --cxxopt=-mwaitpkg

# Mingw
build:mingw --cxxopt=-std=c++2a
#build:mingw --cxxopt=-Wall
#build:mingw --cxxopt=-Werror
#build:mingw --cxxopt=-Wextra
build:mingw --compiler=mingw-gcc

# Visual Studio 2019
build:vs2019 --cxxopt=/std:c++17
build:vs2019 --enable_runfiles # https://github.com/bazelbuild/bazel/issues/8843
build:vs2019 --define compiler=vs2019
build:vs2019 --copt=-DWIN32_LEAN_AND_MEAN
build:vs2019 --copt=-DNOGDI
build:vs2019 --host_copt=-DWIN32_LEAN_AND_MEAN
build:vs2019 --host_copt=-DNOGDI

# Visual Studio 2022
build:vs2022 --config=vs2019

然后 select 进行构建时的配置,例如bazel --config=vs2022 //...

当您每次都懒得输入您可以在主目录中创建的配置时(例如 ~/.bazelrc 一个包含 build --config=config_for_the_machine.

的文件

配置开关很昂贵。如果你切换配置,Bazel 需要重新运行很多东西。如果您经常在不同的配置(例如 GCC 和 Clang)之间切换一台机器,那么请使用 Bazel 远程缓存服务器。我在我的本地机器上使用了一个 - 这使得配置开关便宜,因为 Bazel 远程缓存服务器能够存储不同配置的工件,而 Bazel 似乎只存储最新配置的工件。