CMake:如何添加仅针对一种配置执行的自定义命令?
CMake: How to add a custom command that is only executed for one configuration?
我想添加一个 cmake 自定义命令,该命令仅在使用 Visual Studio 多配置生成器时在调试配置中构建自定义目标时执行。有没有一种干净的方法可以做到这一点?
为了实现这一点,我首先尝试将整个命令列表包装在生成器表达式中,如下所示。
add_custom_command(
...
COMMAND $<$<CONFIG:Debug>:cmake;-E;echo;foo>
)
但这在执行命令时给我一个语法错误。经过反复试验,我得到了以下 hacky 解决方案。这会将命令列表的每个单词包装在这样的生成器表达式中。
add_custom_command(
...
COMMAND $<IF:$<CONFIG:Debug>,cmake,echo>;$<IF:$<CONFIG:Debug>,-E, >;$<IF:$<CONFIG:Debug>,echo, >;$<IF:$<CONFIG:Debug>,foo, >
)
编译调试配置时执行 cmake -E echo foo
命令,对所有其他配置执行虚拟命令 echo " " " " " "
。
这很丑陋,必须根据主机系统更改虚拟命令。在 Linux 上可能是 ":" ":" ":" ":"
。那么有没有更简洁的方法来做到这一点?
感谢您的宝贵时间!
这是我的一段代码(在几个单配置和多配置平台上测试过):
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(DebugEchoFoo NONE)
string(
APPEND _cmd
"$<IF:$<CONFIG:Debug>,"
"${CMAKE_COMMAND};-E;echo;foo,"
"${CMAKE_COMMAND};-E;echo_append"
">"
)
add_custom_target(
${PROJECT_NAME}
ALL
COMMAND "${_cmd}"
COMMAND_EXPAND_LISTS
)
注意:COMMAND_EXPAND_LISTS
是关键字仅适用于 CMake 版本 >= 3.8
参考
我想添加一个 cmake 自定义命令,该命令仅在使用 Visual Studio 多配置生成器时在调试配置中构建自定义目标时执行。有没有一种干净的方法可以做到这一点?
为了实现这一点,我首先尝试将整个命令列表包装在生成器表达式中,如下所示。
add_custom_command(
...
COMMAND $<$<CONFIG:Debug>:cmake;-E;echo;foo>
)
但这在执行命令时给我一个语法错误。经过反复试验,我得到了以下 hacky 解决方案。这会将命令列表的每个单词包装在这样的生成器表达式中。
add_custom_command(
...
COMMAND $<IF:$<CONFIG:Debug>,cmake,echo>;$<IF:$<CONFIG:Debug>,-E, >;$<IF:$<CONFIG:Debug>,echo, >;$<IF:$<CONFIG:Debug>,foo, >
)
编译调试配置时执行 cmake -E echo foo
命令,对所有其他配置执行虚拟命令 echo " " " " " "
。
这很丑陋,必须根据主机系统更改虚拟命令。在 Linux 上可能是 ":" ":" ":" ":"
。那么有没有更简洁的方法来做到这一点?
感谢您的宝贵时间!
这是我的一段代码(在几个单配置和多配置平台上测试过):
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(DebugEchoFoo NONE)
string(
APPEND _cmd
"$<IF:$<CONFIG:Debug>,"
"${CMAKE_COMMAND};-E;echo;foo,"
"${CMAKE_COMMAND};-E;echo_append"
">"
)
add_custom_target(
${PROJECT_NAME}
ALL
COMMAND "${_cmd}"
COMMAND_EXPAND_LISTS
)
注意:COMMAND_EXPAND_LISTS
是关键字仅适用于 CMake 版本 >= 3.8