Команда CMake set_property с выражениями генератора, использующими несколько значений
Я использую CMake v3.13.4 с Visual Studio 2017 Win64
генератор и мне нужно изменить параметры командной строки для библиотекаря Visual Studio (для библиотеки объектов CMake).
Для этого CMake предлагает целевое свойство STATIC_LIBRARY_OPTIONS
который может быть установлен set_property
а также set_target_properties
команда.
В документации говорится, что STATIC_LIBRARY_OPTIONS
поддерживает выражения генератора:
Содержание
STATIC_LIBRARY_OPTIONS
может использовать "выражения генератора" с синтаксисом$<...>
, См. Руководство по cmake-generator-expressions(7) для доступных выражений. См. Руководство cmake-buildsystem(7) для получения дополнительной информации об определении свойств buildsystem.
Но: независимо от того, что я пытаюсь, значения не экранированы должным образом, например
set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>)
приводит к следующему в Visual Studio:
All Options: `/OUT:"..." /LTCG /MACHINE:X64 /NOLOGO
Additional Options: %(AdditionalOptions) /machine:x64 ""$"<1:/WX" "/ERRORREPORT:NONE>"
Я попробовал следующее, все они, кажется, не удается.
set_property(TARGET object_library PROPERTY
STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>
#STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>"
#STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX /NOLOGO /LTCG /ERRORREPORT:NONE">
#STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX /NOLOGO /LTCG /ERRORREPORT:NONE>
#STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>
#STATIC_LIBRARY_OPTIONS $<$<CONFIG:Release>:"/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE">
#STATIC_LIBRARY_OPTIONS "$<$<CONFIG:Release>:/WX;/NOLOGO;/LTCG;/ERRORREPORT:NONE>"
)
Итак, мой вопрос: как я могу передать несколько значений, используя выражения генератора для STATIC_LIBRARY_OPTIONS
с set_property
или же set_target_properties
команда?
3 ответа
Благодаря @ Цывареву я смог решить эту проблему. Решение состоит в том, чтобы заключить каждое значение в собственное выражение генератора:
set_property(TARGET object_library PROPERTY
STATIC_LIBRARY_OPTIONS
$<$<CXX_COMPILER_ID:MSVC>:/WX>
$<$<CXX_COMPILER_ID:MSVC>:/NOLOGO>
$<$<CXX_COMPILER_ID:MSVC>:/ERRORREPORT:NONE>
$<$<CXX_COMPILER_ID:MSVC>:$<$<CONFIG:Release>:/LTCG>>
)
Предполагая, что у вас есть список опций:
set(option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)
вы можете создать для них список генераторных выражений одной командой:
list(TRANSFORM option_list
REPLACE ".+" "$<$<CXX_COMPILER_ID:MSVC>:\\0>"
OUTPUT_VARIABLE option_list_msvc
)
Полученный список можно использовать напрямую:
set_property(TARGET object_library PROPERTY STATIC_LIBRARY_OPTIONS ${option_list_msvc})
Список потока команд (TRANSFORM) доступен, начиная с CMake 3.12.
Этот ответ предназначен для будущих читателей с более новым cmake: как подробно описано в этом ответе @firmament, в зависимости от версии cmake также может быть возможно поместить все значения в список через
set(my_option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)
и передаем этот список в выражение генератора:
"<$<CONFIG:Release>:${my_option_list}>"
Это работает на cmake 3.18.4 с выражениями генератора clang и gcc.