【发布时间】:2019-05-25 14:46:22
【问题描述】:
我正在进行的一个项目——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"),
})
我的 PR 出局 (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 运算符使它们互斥吗?或者我可以使用其他方法吗?
【问题讨论】:
标签: bazel envoyproxy