我正在尝试为CMake设置一个构建后命令,我已经使用了CMake文档中所述的ADD_CUSTOM_COMMAND指令。我想做的是,如果我正在创建可执行文件的发布版本,那么只有后期构建运行。

如何实现这一目标?

有帮助吗?

解决方案

对于基于Makefile的生成器,您可以检查CMAKE_BUILD_TYPE变量并对其值进行操作:

if(CMAKE_BUILD_TYPE STREQUAL Debug)
    message(STATUS "Do debug stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL Release)
    message(STATUS "Do release stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
    message(STATUS "Do release with debug info stuff")
elseif(CMAKE_BUILD_TYPE STREQUAL MinSizeRel)
    message(STATUS "Do minimal size release stuff")
endif()

对于基于Visual Studio的构建,此SO问题似乎表明<=>也适用于VS 2005 +。

其他提示

我碰到了类似的东西,想要将DLL文件复制到目标目录,但仅用于发布版本。在经过大量撕裂后,我设法使用一些生成器表达式($<...> thingies)使其工作。七年后我把它放在这里并不是为了解决你的问题(虽然我很佩服你的相关程度),但为了挽救下一个有同样问题的人的头发并在谷歌上找到这个问题:

set(no_copy $<NOT:$<CONFIG:Release>>) # An abbreviation to make the example easier to read.
add_custom_command(TARGET myDLL POST_BUILD
    COMMAND "${CMAKE_COMMAND}" -E
    # do nothing for non-Release build
    $<${no_copy}:echo>
    # output text to make clear that the copy command is not actually issued
    $<${no_copy}:"copy omitted for non-release build, command would have been ">
    # the actual copy command, which is overridden by the "echo" above
    # in the case of a non-release build
    copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL})

诀窍是在命令前写一个echo,否则会发出。这样,即使输出一点噪声,也不执行该命令。可以将命令行的其余部分包含在许多生成器表达式中,以便以完全不可读的cmake文件为代价来缩短输出。另一方面,似乎没有办法在不产生任何输出的情况下可移植地抑制副本。最后,如果你觉得有一个简单的问题,你可以写if($<CONFIG:Release>) ... endif(),我建议你不要让自己失望。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top