bazel select help - настройка отладки tcmalloc - PullRequest
0 голосов
/ 27 декабря 2018

проект, над которым я работаю - 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 в условных выражениях, чтобы сделать их взаимоисключающими? Или есть другой подход, который я мог быиспользовать?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Да, вы можете выбрать цепочку, используя https://github.com/bazelbuild/bazel-skylib/blob/master/lib/selects.bzl#L80. Вы также можете написать свое собственное правило флага функции, которое можно использовать в выборе, и в котором есть произвольная логика, см., Например, https://source.bazel.build/bazel/+/0faef9148362a5234df3507441dadb0f32ade59a:tools/cpp/compiler_flag.bzl, этоправило, которое можно использовать в select, которое получает текущий набор инструментов C ++, проверяет его состояние и возвращает значение компилятора.Вам нужно будет немного следить за темой, чтобы увидеть все фрагменты.Я попрошу лучшие документы для этого.

0 голосов
/ 04 января 2019

Не ответ, но, возможно, я могу дать вам несколько идей:

На данный момент вы можете имитировать и / или путем вложения выбирает или рефакторинг ваших config_settings.

Есть предложениедля некоторых изменений, чтобы добавить гибкость здесь: https://github.com/bazelbuild/proposals/blob/master/designs/2018-11-09-config-setting-chaining.md

Вы также можете найти некоторые полезные идеи в Skylib.https://github.com/bazelbuild/bazel-skylib

...