我正在做的一个项目——Envoy 代理——使用 Bazel 和 tcmalloc。我想将其配置为在为 debug 和 fastbuild 编译时使用 tcmalloc 的调试版本,并为优化构建使用优化版本。
还有其他条件,例如传递给 bazel 以完全关闭 tcmalloc 的命令行标志,使用以下逻辑:
def tcmalloc_external_dep(repository):
return select({
repository + "//bazel:disable_tcmalloc": None,
"//conditions:default": envoy_external_dep_path("tcmalloc_and_profiler"),
})
我有公关(https://github.com/envoyproxy/envoy/pull/5424)失败的持续集成改变了逻辑(https://github.com/envoyproxy/envoy/blob/1ed5aba5894ce519181edbdaee3f52c2971befaf/bazel/envoy_build_system.bzl #L156)到:
def tcmalloc_external_dep(repository):
return select({
repository + "//bazel:disable_tcmalloc": None,
repository + "//bazel:dbg_build": envoy_external_dep_path("tcmalloc_debug"),
"//conditions:default": envoy_external_dep_path("tcmalloc_and_profiler"),
})
然而,这不起作用,因为我们允许在调试版本上禁用 tcmalloc(我们在运行 tsan 时在连续集成脚本中这样做)。这与 bazel 相冲突,当我在这种情况下想要“第一个匹配规则获胜”时,显然期望条件是互斥的。我收到此错误:
ERROR: /home/jmarantz/git4/envoy/test/common/network/BUILD:58:1: Illegal ambiguous match on configurable attribute "malloc" in //test/common/network:dns_impl_test:
//bazel:disable_tcmalloc
//bazel:dbg_build
Multiple matches are not allowed unless one is unambiguously more specialized.
ERROR: Analysis of target '//test/common/network:dns_impl_test' failed; build aborted:
/home/jmarantz/git4/envoy/test/common/network/BUILD:58:1: Illegal ambiguous match on configurable attribute "malloc" in //test/common/network:dns_impl_test:
//bazel:disable_tcmalloc
//bazel:dbg_build
解决这个问题的最佳方法是什么?我可以在 bazel 命令行设置上使用 Python 条件吗?我可以在条件表达式中使用 AND 或 OR 运算符来使它们互斥吗?还是我可以使用另一种方法?