проект, над которым я работаю - Envoy proxy - использует Bazel и tcmalloc.Я хотел бы настроить его на использование отладочной версии tcmalloc при компиляции для отладки и fastbuild, а также использовать оптимизированную версию для оптимизированных сборок.
Есть и другие условия, например, передан флаг командной строкичтобы полностью отключить 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 ((1009 *https://github.com/envoyproxy/envoy/pull/5424) при непрерывной интеграции, которая меняет логику (https://github.com/envoyproxy/envoy/blob/1ed5aba5894ce519181edbdaee3f52c2971befaf/bazel/envoy_build_system.bzl#L156) to:
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
Каков наилучший способ решить эту проблему? Можно ли использовать условное выражение Python длянастройки командной строки bazel? Могу ли я использовать операторы AND или OR в условных выражениях, чтобы сделать их взаимоисключающими? Или есть другой подход, который я мог быиспользовать?