带有使用多个值的生成器表达式的 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_property
和 set_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_property
或 set_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 开始可用。
我正在使用带有 Visual Studio 2017 Win64
生成器的 CMake v3.13.4,我需要修改 Visual Studio 图书管理员(对于 CMake 对象库)的命令行选项。
为了实现这一目标,CMake 提供了目标 属性 STATIC_LIBRARY_OPTIONS
that can be set by the set_property
和 set_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_property
或 set_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 在
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 开始可用。