Команда 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.

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