我正在做的一个项目--特使代理--使用了Bazel和tcmalloc。我想将它配置为在编译调试和快速构建时使用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 out (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冲突,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运算符使它们互斥吗?或者有没有其他我可以使用的方法?
发布于 2019-01-10 14:25:46
是的,你可以使用https://github.com/bazelbuild/bazel-skylib/blob/master/lib/selects.bzl#L80链接选择。你也可以编写自己的特性标志规则,它可以在select中使用,并且在其中包含库逻辑,例如,参见https://source.bazel.build/bazel/+/0faef9148362a5234df3507441dadb0f32ade59a:tools/cpp/compiler_flag.bzl,它是一个可以在selects中使用的规则,它获得当前的C++工具链,并检查其状态并返回其编译值。你必须顺着这条线看一看所有的片段。我会要求更好的文档来解决这个问题。
https://stackoverflow.com/questions/53947289
复制相似问题