【问题标题】:bazel select help -- configuring tcmalloc debugbazel select help -- 配置 tcmalloc 调试
【发布时间】:2019-05-25 14:46:22
【问题描述】:

我正在进行的一个项目——Envoy 代理——使用 Bazel 和 tcmalloc。我想将其配置为在为 debug 和 fastbuild 编译时使用调试版本的 tcmalloc,并为优化构建使用优化版本。

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

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

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


    【解决方案1】:

    不是答案,但也许我可以给你一些想法:

    到目前为止,您可以通过嵌套选择或重构您的 config_settings 来模拟 and 和 or。

    这里有一些更改以增加灵活性的提议: https://github.com/bazelbuild/proposals/blob/master/designs/2018-11-09-config-setting-chaining.md

    您还可以在 Skylib 中找到一些有用的想法。 https://github.com/bazelbuild/bazel-skylib

    【讨论】:

      【解决方案2】:

      是的,您可以使用https://github.com/bazelbuild/bazel-skylib/blob/master/lib/selects.bzl#L80 进行链接选择。您还可以编写自己的功能标志规则,可以在选择中使用,并且其中包含逻辑逻辑,请参见 https://source.bazel.build/bazel/+/0faef9148362a5234df3507441dadb0f32ade59a:tools/cpp/compiler_flag.bzl 例如,这是一个可以在选择中使用的规则,它可以获取当前的 C++ 工具链并检查其状态并返回其编译器值。您必须稍微关注一下线程才能查看所有部分。我会为此要求更好的文档。

      【讨论】:

      • 酷。更好的文档会非常棒。你是说如果我只是用selects.with_or({ 替换select({,那么我的例子就可以工作——它不会给我“模糊匹配”的抱怨吗?对我来说,OR 功能给了我那个,或者我可以用 OR 门构建那个设备对我来说并不完全明显。我想我需要与门和非门:)如果可以的话, select() 就可以了: select({condA:a-result, AND(NOT(condA),condB):b-result...})
      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多