Bazel использует select с условием на config_setting, когда режим компиляции dbg/debug.

Вопрос или проблема

Я хотел бы написать основное правило о добавлении некоторых источников, когда конфигурация находится в режиме отладки

cc_library(
    name = "mylib",
    strip_include_prefix = "/mylib/include/" ,
    visibility = ["//visibility:public"],
    deps = [  ":lib_headers",
           ] + 
            + select({
         "@config_setting//compilation_mode:dbg":  [":dbg_add_symb"] ,
          "//conditions:default" : [] ,
    }) 
    ,
    tags = ["manual"],
    linkstatic=1,
)

такой способ явно не понятен bazel, каково истинное условие, пожалуйста?
какая ключевая цель говорит о том, что мы находимся в режиме компиляции отладки, пожалуйста?
спасибо
@hlopko @dms

bazel build :mylib
не работает, так как условие
“@config_setting//compilation_mode:dbg”: [“:dbg_add_symb”] ,

не понимается, я не нахожу, что это за условие я должен написать.

Добавьте

config_setting(
    name = "compilation_mode_dbg",
    values = {
        "compilation_mode": "dbg",
    },
)

и затем вы можете сделать

select({
    ":compilation_mode_dbg": [":dbg_add_symb"],
    "//conditions:default": [],
})

Смотрите https://bazel.build/docs/configurable-attributes

Ответ или решение

Для решения проблемы с использованием select в Bazel для условия на config_setting, связанного с режимом компиляции dbg или debug, необходимо следовать определённым шагам. В этом ответе мы разберём, как правильно настроить cc_library, чтобы добавлять определённые источники в зависимости от режима компиляции, а также как правильно указать условие для select.

Шаг 1: Создайте config_setting

Первый шаг — определить config_setting, который будет представлять режим компиляции dbg. Этот блок кода будет определять, когда вы находитесь в режиме отладки (debug mode).

config_setting(
    name = "compilation_mode_dbg",
    values = {
        "compilation_mode": "dbg",
    },
)

С помощью config_setting вы создаёте условие, которое будет проверяться во время компиляции. В данном случае, если режим компиляции равен dbg, тогда будет активировано указанное условие.

Шаг 2: Используйте select в cc_library

Теперь, когда config_setting объявлен, вы можете использовать его в вашем целевом объекте cc_library с помощью select. Вот как может выглядеть ваша библиотека после внесения изменений:

cc_library(
    name = "mylib",
    strip_include_prefix = "/mylib/include/",
    visibility = ["//visibility:public"],
    deps = [
        ":lib_headers",
    ] + select({
        ":compilation_mode_dbg": [":dbg_add_symb"],
        "//conditions:default": [],
    }),
    tags = ["manual"],
    linkstatic = 1,
)

В этом коде select будет проверять, соответствует ли текущий режим компиляции условию compilation_mode_dbg. Если условие истинно (т.е., вы находитесь в режиме dbg), будет добавлен таргет ":dbg_add_symb" к списку зависимостей. В противном случае, выберется значение по умолчанию — пустой список.

Как проверить, что всё работает корректно?

Чтобы убедиться, что ваш код работает как задумано, вы можете выполнить компиляцию вашей библиотеки с помощью команды:

bazel build :mylib --compilation_mode=dbg

Или вы можете запустить с другим режимом компиляции, чтобы проверить, что dbg_add_symb не будет добавлен:

bazel build :mylib --compilation_mode=opt

Заключение

Использование select в сочетании с config_setting для определения дополнительной зависимости в зависимости от режима компиляции — это распространенная практика в Bazel. Следуя приведенным шагам, вы сможете эффективно управлять зависимостями вашей библиотеки в зависимости от режима компиляции. Обязательно проверьте свою конфигурацию с помощью команд Bazel, чтобы гарантировать, что ваша настройка работает корректно.

Оцените материал
Добавить комментарий

Капча загружается...