Вопрос или проблема
Я хотел бы написать основное правило о добавлении некоторых источников, когда конфигурация находится в режиме отладки
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": [],
})
Ответ или решение
Для решения проблемы с использованием 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, чтобы гарантировать, что ваша настройка работает корректно.