Шаг после сборки только для сборки выпуска
-
06-07-2019 - |
Вопрос
Я пытаюсь настроить команду пост-сборки для CMake, что я и сделал, используя директиву ADD_CUSTOM_COMMAND, как указано в документации по CMake. Однако я хотел бы, чтобы пост-сборка выполнялась только в том случае, если я создаю релизную сборку моего исполняемого файла.
Как это сделать?
Решение
Для генераторов на основе 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 этот вопрос SO , по-видимому, предполагает, что <=> также работает с VS 2005 +. р>
Другие советы
Я столкнулся с чем-то похожим, желая скопировать файл DLL в каталог назначения, но только для сборок релиза. После большого количества порванных волос мне удалось заставить его работать, используя несколько выражений генератора ($<...>
штуковины). Я помещаю это здесь семь лет спустя не столько для решения вашей проблемы (хотя я бы восхитился вашим уровнем уместности), но для того, чтобы сохранить волосы черепа следующего человека, столкнувшегося с такой же проблемой и найдя этот вопрос в 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})
Хитрость заключается в том, чтобы написать echo
перед командой, которая в противном случае была бы введена. Таким образом, команда не выполняется, даже если выводится немного шума. Можно заключить оставшуюся часть командной строки в несколько выражений генератора, чтобы сократить вывод за счет полностью нечитаемого файла cmake. С другой стороны, кажется, что нет способа подавить копию переносимым образом, не генерируя никакого вывода. Наконец, если вы думаете, что есть выход, и вы можете просто написать if($<CONFIG:Release>) ... endif()
, я советую вам избавиться от разочарования.