2009-10-25 5 views
3

Я пытаюсь настроить команду post-build для CMake, которую я сделал с помощью директивы ADD_CUSTOM_COMMAND, как указано в документации CMake. Однако, что бы я хотел сделать, это только запуск пост-сборки, если я создаю сборку выпуска моего исполняемого файла.Опубликовать шаг только для выпуска build

Как это осуществить?

ответ

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-файл в целевой каталог, но только для релизов. После много порванных волос мне удалось заставить его работать, используя несколько выражений генератора ($<...> штук). Я помещаю это здесь через семь лет не так много, чтобы решить вашу проблему (хотя я бы восхищался вашим уровнем уместности), но для того, чтобы спасти черепные волосы следующего человека, имеющего эту же проблему, и найти этот вопрос в google:

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. С другой стороны, похоже, нет способа подавить копию портативно, не генерируя никакого выхода. Наконец, если вы считаете, что вам легко, и вы можете просто написать , я советую вам избавить себя от разочарования.