首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bazel选择帮助--配置tcmalloc debug

bazel选择帮助--配置tcmalloc debug
EN

Stack Overflow用户
提问于 2018-12-27 23:23:44
回答 2查看 441关注 0票数 0

我正在做的一个项目--特使代理--使用了Bazel和tcmalloc。我想将它配置为在编译调试和快速构建时使用tcmalloc的调试版本,并使用优化的版本进行优化构建。

还有其他情况,例如,使用以下逻辑将命令行标志传递给bazel以完全关闭tcmalloc:

https://github.com/envoyproxy/envoy/blob/7d2e84d3d0f8a4ffbf4257c450b3e5a6d93d4697/bazel/envoy_build_system.bzl#L166

代码语言:javascript
运行
复制
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)更改为:

代码语言:javascript
运行
复制
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显然希望条件是互斥的,而在这种情况下,我希望“第一个匹配规则获胜”。我得到了这个错误:

代码语言:javascript
运行
复制
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运算符使它们互斥吗?或者有没有其他我可以使用的方法?

EN

Stack Overflow用户

发布于 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++工具链,并检查其状态并返回其编译值。你必须顺着这条线看一看所有的片段。我会要求更好的文档来解决这个问题。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53947289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档