bazel select help - настройка отладки tcmalloc

Проект , над которым я работаю - Envoy proxy - использует Bazel и tcmalloc. Я хотел бы настроить его на использование отладочной версии tcmalloc при компиляции для отладки и fastbuild, а также использовать оптимизированную версию для оптимизированных сборок.

Существуют и другие условия, например, флаг командной строки, передаваемый 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). Это идет вразрез с базелом, который, очевидно, ожидает, что условия будут взаимоисключающими, когда я хочу, чтобы в этом случае "выиграл первое правило соответствия". Я получаю эту ошибку:

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++, проверяет его состояние и возвращает значение компилятора. Вам нужно будет немного следить за темой, чтобы увидеть все фрагменты. Я попрошу лучшие документы для этого.

Другие вопросы по тегам