Команда CMake set_property с выражениями генератора, использующими несколько значений - PullRequest
0 голосов
/ 20 марта 2019

Я использую 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-expression (7) Руководство по доступным выражениям. См. cmake-buildsystem (7) руководство для получения дополнительной информации по определению свойств системы сборки.

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

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?

1 Ответ

1 голос
/ 21 марта 2019

Благодаря @ Цывареву я смог решить эту проблему.Решение состоит в том, чтобы обернуть каждое значение в собственное выражение генератора:

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>>
  )
...