仅针对发布版本构建后构建步骤

时间:2009-10-25 04:30:48

标签: cmake post-build-event

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

如何实现这一目标?

3 个答案:

答案 0 :(得分:4)

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

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(),我建议你不要让自己失望。

答案 1 :(得分:1)

对于基于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的构建,this SO question似乎表明CMAKE_BUILD_TYPE也适用于VS 2005 +。

答案 2 :(得分:0)

在 Visual Studio 中检查配置的另一种方法是使用它的宏:

if(MSVC)
    add_custom_command(TARGET myDLL POST_BUILD
        COMMAND cmd.exe /c if "$(Configuration)" == "Release" "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:myDLL>" "${DIR_FOR_DLL}")
endif()