CMake MSVC如何仅为Debug配置添加自定义构建命令
仅为Debug配置添加自定义命令的实现方案
通用适配方案(兼容所有生成器,推荐)
使用CMake条件生成器表达式限定命令生效范围,可同时适配Visual Studio、XCode等多配置生成器,以及Makefile、Ninja等单配置生成器,仅Debug配置下会执行复制命令,其余配置完全不注入该命令逻辑:
if (MSVC) add_custom_command(TARGET my_target PRE_BUILD COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E copy ${src} ${dst}> ) endif()
其中$<$<CONFIG:Debug>:[命令内容]>是CMake内置的条件生成器表达式,仅当当前构建配置为Debug时,才会将冒号后的命令内容写入构建规则,其余配置下该表达式会展开为空,等效于不存在这条命令。
单配置生成器专用方案
如果你仅使用Makefile、Ninja这类在配置阶段就固定构建类型的单配置生成器,也可以直接判断CMAKE_BUILD_TYPE变量实现需求:
if (MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug") add_custom_command(TARGET my_target PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${src} ${dst}) endif()
注意该方案不适用于多配置生成器,多配置生成器的CMAKE_BUILD_TYPE变量在配置阶段无实际生效值,构建配置是在构建阶段由用户手动选择的。
额外提示
- 如果
src或dst路径包含空格、特殊字符,建议使用$<SHELL_PATH:包裹路径避免解析错误,示例如下:COMMAND $<$<CONFIG:Debug>:${CMAKE_COMMAND} -E copy $<SHELL_PATH:${src}> $<SHELL_PATH:${dst}>>
内容的提问来源于stack exchange,提问作者Elad Maimoni
相关产品推荐
相关产品推荐

