2009-10-25 72 views
3

我正在尝试为CMake安装一个后期构建命令,我已经使用CMake文档中所述的ADD_CUSTOM_COMMAND指令进行了这项工作。但是,如果我正在创建可执行文件的发行版本,我只想执行后构建。发布构建步骤仅适用于发布构建

如何做到这一点?

回答

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() 

对于基于Visual Studio版本,this SO question似乎表明,CMAKE_BUILD_TYPE还与VS 2005+。

+0

我使用VS2008和CMake 2.8,这不起作用。 – Robert

+0

-1:CMAKE_BUILD_TYPE仅在运行时定义。这个答案是错误的。 – Gili

+1

@Gili:对于单个配置生成器(Makefile生成器),它在生成时可用。 – richq

1

我遇到了类似的问题,想将DLL文件复制到目标目录,但仅用于发布版本。经过大量撕裂的头发后,我设法使用几个发生器表达式($<...>件事)来使其工作。我在七年后将它放在这里并不是为了解决您的问题(尽管我会赞赏您的针对性水平),但为了挽救下一个患有此相同问题的人的头发并在谷歌上找到此问题:

set(no_copy $<NOT:$<CONFIG:Release>>) 
add_custom_command(TARGET myDLL POST_BUILD 
    COMMAND "${CMAKE_COMMAND}" -E 
    # do nothing for non-Release build 
    $<${no_copy}:echo> $<${no_copy}:"copy omitted for non-release build, command would have been "> 
    # copy file for release build 
    copy_if_different $<TARGET_FILE:myDLL> ${DIR_FOR_DLL}) 

诀窍是在命令前写一个echo否则会发出。人们可以将命令行的其余部分封装在多个生成器表达式中,以牺牲完全无法读取的cmake文件为代价来缩短输出。另一方面,似乎没有办法在不产生任何输出的情况下轻易地压缩拷贝。最后,如果你认为有一个简单的办法,你可以写,我建议你让自己失望。