如何以跨平台方式使用 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 似乎只存储最新配置的工件。
我希望我的 Bazel 项目使用 c++17。有一个类似的问题 (
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 似乎只存储最新配置的工件。