Шаг после сборки только для сборки выпуска

StackOverflow https://stackoverflow.com/questions/1620006

  •  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(), я советую вам избавиться от разочарования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top