2009-10-25 70 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文件爲代價來縮短輸出。另一方面,似乎沒有辦法在不產生任何輸出的情況下輕易地壓縮拷貝。最後,如果你認爲有一個簡單的辦法,你可以寫,我建議你讓自己失望。