我正在尝试为CMake设置一个构建后命令,我已经使用了CMake文档中所述的ADD_CUSTOM_COMMAND指令。我想做的是,如果我正在创建可执行文件的发布版本,那么只有后期构建运行。
如何实现这一目标?
答案 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()