带有使用多个值的生成器表达式的 CMake set_property 命令

CMake set_property command with generator expressions using multiple values

我正在使用带有 Visual Studio 2017 Win64 生成器的 CMake v3.13.4,我需要修改 Visual Studio 图书管理员(对于 CMake 对象库)的命令行选项。

为了实现这一目标,CMake 提供了目标 属性 STATIC_LIBRARY_OPTIONS that can be set by the set_propertyset_target_properties 命令。

文档指出 STATIC_LIBRARY_OPTIONS 支持生成器表达式:

Contents of STATIC_LIBRARY_OPTIONS may use “generator expressions” with the syntax $<...>. See the cmake-generator-expressions(7) manual for available expressions. See the cmake-buildsystem(7) manual for more on defining buildsystem properties.

但是:无论我尝试什么,值都没有正确转义',例如

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

所以我的问题是:如何使用生成器表达式将多个值通过 set_propertyset_target_properties 命令传递给 STATIC_LIBRARY_OPTIONS

感谢@Tsyvarev,我已经能够解决这个问题。解决方案是将每个值包装到它自己的生成器表达式中:

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

下面是我的答案,正如@Tsyvarev 帮助我意识到的那样,对问题的情况没有帮助。请考虑他的回答。 因为我发现他下面的评论很有帮助,所以我会在这里留下答案,以便您阅读评论。

此答案适用于未来使用较新 cmake 的读者: 正如@firmament 在 中详述的那样,根据 cmake 版本,也可以通过

将所有值放入列表中
set(my_option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)

并将此列表传递给生成器表达式:

"<$<CONFIG:Release>:${my_option_list}>"

这适用于带有 clang 和 gcc 生成器表达式的 cmake 3.18.4。

假设您有 列表 个选项:

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

命令流 list(TRANSFORM) 从 CMake 3.12 开始可用。