bazel select help - настройка отладки tcmalloc
Проект , над которым я работаю - Envoy proxy - использует Bazel и tcmalloc. Я хотел бы настроить его на использование отладочной версии tcmalloc при компиляции для отладки и fastbuild, а также использовать оптимизированную версию для оптимизированных сборок.
Существуют и другие условия, например, флаг командной строки, передаваемый bazel для полного отключения tcmalloc, с использованием этой логики:
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). Это идет вразрез с базелом, который, очевидно, ожидает, что условия будут взаимоисключающими, когда я хочу, чтобы в этом случае "выиграл первое правило соответствия". Я получаю эту ошибку:
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 в условных выражениях, чтобы сделать их взаимоисключающими? Или есть другой подход, который я мог бы использовать?
2 ответа
Не ответ, но, возможно, я могу дать вам несколько идей:
На данный момент вы можете смоделировать и / или путем вложения выбирает или рефакторинг ваших config_settings.
Есть предложение внести некоторые изменения, чтобы добавить гибкости здесь: https://github.com/bazelbuild/proposals/blob/master/designs/2018-11-09-config-setting-chaining.md
Вы также можете найти некоторые полезные идеи в Skylib. https://github.com/bazelbuild/bazel-skylib
Да, вы можете выбрать цепочку, используя https://github.com/bazelbuild/bazel-skylib/blob/master/lib/selects.bzl#L80. Вы также можете написать свое собственное правило флага функции, которое может использоваться в select и которое содержит в себе логику, см., Например, https://source.bazel.build/bazel/+/0faef9148362a5234df3507441dadb0f32ade59a:tools/cpp/compiler_flag.bzl это правило, которое можно использовать в select, которое получает текущий набор инструментов C++, проверяет его состояние и возвращает значение компилятора. Вам нужно будет немного следить за темой, чтобы увидеть все фрагменты. Я попрошу лучшие документы для этого.