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

时间:2019-03-20 14:10:26

标签: visual-studio build cmake cmake-language

我正在将Visual Studio 2017 Win64生成器与CMake v3.13.4配合使用,并且需要修改Visual Studio库管理器的命令行选项(对于CMake对象库)。

要实现该目标,CMake提供了STATIC_LIBRARY_OPTIONSset_target_properties命令可以设置的目标属性set_property

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

  

STATIC_LIBRARY_OPTIONS的内容可以将“生成器表达式”与   语法$<...>。参见cmake-generator-expressions(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_OPTIONSset_property命令将多个值传递给set_target_properties

3 个答案:

答案 0 :(得分:1)

假设您有一个列表选项:

1234-5623

您可以通过一个命令为它们创建一个生成器表达式列表:

set(option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)

结果列表可以直接使用:

list(TRANSFORM option_list
  REPLACE ".+" "$<$<CXX_COMPILER_ID:MSVC>:\\0>"
  OUTPUT_VARIABLE option_list_msvc
)

命令流list(TRANSFORM)自CMake 3.12起可用。

答案 1 :(得分:0)

由于@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>>
  )

答案 2 :(得分:0)

在下面找到我的答案,正如@Tsyvarev帮助我意识到的那样,对问题的情况无济于事。请改考虑他的回答。 当我发现他在下面的评论很有帮助时,我将答案留在这里,以便您阅读评论。

此答案适用于具有新cmake的未来读者: 正如{firmament在this answer中所详细说明的那样,根据cmake版本的不同,也可以通过以下方式将所有值放入列表中

addEventListener("load", initialize)

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

set(my_option_list /WX /NOLOGO /LTCG /ERRORREPORT:NONE)

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