如何让Bazel的gcc9构建忽略linux平台默认配置?
你遇到的问题根源是:启用--enable_platform_specific_config后,build:linux配置会自动应用到所有Linux系统(包括Ubuntu 20.04)。当你在Ubuntu 20.04上指定--config=gcc9时,Bazel会同时加载gcc9和gcc11两个配置,导致-std=c++20(来自gcc11)和-std=c++2a(来自gcc9)同时传给GCC 9,而GCC 9不支持c++20这个参数,所以报错。
有几种可行的方案,按需选择:
方案1:针对Ubuntu版本配置(推荐)
Bazel支持基于具体发行版版本的配置,把通用的build:linux换成仅针对Ubuntu 22.04的配置,这样只有Ubuntu 22.04会自动启用gcc11,Ubuntu 20.04不受影响。修改后的.bazelrc如下:
build --enable_platform_specific_config # GCC 9.3 build:gcc9 --cxxopt=-std=c++2a build:gcc9 --cxxopt=-Wall # GCC 11.2 build:gcc11 --cxxopt=-std=c++20 build:gcc11 --cxxopt=-Wall # 仅Ubuntu 22.04自动启用gcc11 build:ubuntu22.04 --config=gcc11
这样Ubuntu 22.04直接跑bazel build //...就会用gcc11,Ubuntu 20.04跑bazel build --config=gcc9 //...时,不会加载gcc11的配置,自然不会报错。
方案2:启用gcc9时自动禁用linux配置
在gcc9的配置里加上--nolinux,这样当你指定--config=gcc9时,会自动取消build:linux的自动应用。修改后的.bazelrc:
build --enable_platform_specific_config # GCC 9.3 build:gcc9 --nolinux build:gcc9 --cxxopt=-std=c++2a build:gcc9 --cxxopt=-Wall # GCC 11.2 build:gcc11 --cxxopt=-std=c++20 build:gcc11 --cxxopt=-Wall build:linux --config=gcc11
这个方案不用区分Ubuntu版本,只要启用gcc9配置,就会屏蔽linux配置的影响。
方案3:命令行临时覆盖(适合临时场景)
在Ubuntu 20.04构建时,手动加上--nolinux参数,禁用自动加载的linux配置:
bazel build --config=gcc9 --nolinux //...
不过这个需要每次构建都加参数,不如前两个方案方便。
内容的提问来源于stack exchange,提问作者Vertexwahn

