发布构建步骤仅适用于发布构建

Bil*_*eal 6 cmake post-build-event

我正在尝试为CMake设置构建后命令,这已使用CMake文档中所述的ADD_CUSTOM_COMMAND指令完成。但是,我要执行的操作是仅在创建可执行文件的发布版本时才进行构建后运行。

如何做到这一点?

tob*_*i_s 6

我遇到了类似的情况,想要将DLL文件复制到目标目录,但仅用于发行版本。经过大量的头发撕裂之后,我设法使用一些生成器表达式($<...>thingies)使其起作用。我把它放在这里七年后并不能解决您的问题(尽管我会钦佩您的针对性),但是为了保存下一个有同样问题的人的颅骨,并在Google上找到这个问题:

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})
Run Code Online (Sandbox Code Playgroud)

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


ric*_*chq 2

对于基于 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()
Run Code Online (Sandbox Code Playgroud)

对于基于 Visual Studio 的构建,这个 SO 问题似乎表明CMAKE_BUILD_TYPE也适用于 VS 2005+。

  • -1:CMAKE_BUILD_TYPE 仅在运行时定义。这个答案是错误的。 (4认同)
  • @Gili:对于单个配置生成器(Makefile 生成器),它在生成时可用。 (2认同)