0

我正在做的一个项目——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"),
    })

我有公关(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 运算符来使它们互斥吗?还是我可以使用另一种方法?

4

2 回答 2

1

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

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

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

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

于 2019-01-04T02:47:51.103 回答
0

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

于 2019-01-10T06:25:45.690 回答