CPack empty CPACK_PACKAGE_DIRECTORY

Я действительно изо всех сил пытаюсь заставить CPack действовать так, как я себе представляю. У меня есть небольшой пример настройки ниже, который я пытался получить работу, прежде чем применить его к гораздо большему проекту. По сути, я пытаюсь использовать fixup_bundle, чтобы собрать все зависимости и скопировать их в каталог упаковки для объединения в установщик (и zip).

main.cpp:

int main(unsigned int argc, const char* argv[])
{
return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1.0)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Multimedia Widgets AxContainer OpenGL)

add_executable(TEST main.cpp)

target_link_libraries(TEST
Qt5::AxContainer
Qt5::Core
Qt5::Multimedia
Qt5::Gui
Qt5::Widgets
Qt5::OpenGL
)

install(
TARGETS TEST
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
COMPONENT Runtime
)

install(CODE "MESSAGE(\"CPACK_PACKAGING_PREFIX=${CPACK_PACKAGING_PREFIX}\")")
install(CODE "MESSAGE(\"CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_INSTALL_PREFIX=${CPACK_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_INSTALL_DIRECTORY=${CPACK_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGE_INSTALL_DIRECTORY=${CPACK_PACKAGE_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGING_INSTALL_PREFIX=${CPACK_PACKAGING_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGE_DIRECTORY=${CPACK_PACKAGE_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TOPLEVEL_DIRECTORY=${CPACK_TOPLEVEL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_DIRECTORY=${CPACK_TEMPORARY_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_OUTPUT_FILE_NAME=${CPACK_OUTPUT_FILE_NAME}\")")
install(CODE "MESSAGE(\"CPACK_OUTPUT_FILE_PATH=${CPACK_OUTPUT_FILE_PATH}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_PACKAGE_FILE_NAME=${CPACK_TEMPORARY_PACKAGE_FILE_NAME}\")")
install(CODE "MESSAGE(\"CPACK_NATIVE_INSTALL_DIRECTORY=${CPACK_NATIVE_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_INSTALL_DIRECTORY=${CPACK_TEMPORARY_INSTALL_DIRECTORY}\")")install(CODE "include(BundleUtilities)
fixup_bundle(\"${CPACK_PACKAGE_DIRECTORY}/TEST${CMAKE_EXECUTABLE_SUFFIX}\"   \"\"   \"${DIRS}\")
" COMPONENT Runtime)

set(CPACK_GENERATOR "ZIP" "NSIS")

include(CPack)

И на выходе всегда куча пустых переменных:

CPACK_PACKAGING_PREFIX=
CMAKE_INSTALL_PREFIX=C:/Program Files (x86)/Project
CPACK_INSTALL_PREFIX=
CPACK_INSTALL_DIRECTORY=
CPACK_PACKAGE_INSTALL_DIRECTORY=
CPACK_PACKAGING_INSTALL_PREFIX=
CPACK_PACKAGE_DIRECTORY=
CPACK_TOPLEVEL_DIRECTORY=
CPACK_TEMPORARY_DIRECTORY=
CPACK_OUTPUT_FILE_NAME=
CPACK_OUTPUT_FILE_PATH=
CPACK_TEMPORARY_PACKAGE_FILE_NAME=
CPACK_NATIVE_INSTALL_DIRECTORY=
CPACK_TEMPORARY_INSTALL_DIRECTORY=
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.4/Modules/BundleUtilities.cmake:861 (message):
error: fixup_bundle: not a valid bundle, app: /TEST.exe

Очевидно, что он не найдет правильный исполняемый файл. Я ожидаю, что CPACK_PACKAGE_DIRECTORY будет выглядеть примерно так:

$ {CMAKE_BINARY_DIR} / _ CPack_Packages / $ {CPACK_SYSTEM_NAME} / $ {CPACK_GENERATOR} / $ {CPACK_PACKAGE_FILE_NAME}

Обновление 2016-06-23

Спасибо @ Цывареву за помощь в определении проблемы + решение. Проблема заключается в преждевременном расширении переменных внутри команд установки. CMake сделает расширение первого уровня для любых переменных $ {} в текстовых строках. Экранирование переменной как \ $ {} позволяет избежать этого расширения и впоследствии будет корректно раскрыто CPack.

Даже с учетом вышеизложенного все переменные все еще пусты, кроме одной. К счастью, это правильно:

install(CODE "MESSAGE(\"CMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX}\")")

результаты в:

CMAKE_INSTALL_PREFIX=C:/Users/User/Documents/dev/build-test_deploy-Desktop_Qt_5_5_1_MSVC2012_32bit-Default/_CPack_Packages/win32/ZIP/Project-0.1.1-win32

Теперь комплектация будет работать так:

install(CODE "include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/bin/TEST${CMAKE_EXECUTABLE_SUFFIX}\"   \"\"   \"\")
" COMPONENT Runtime)

Может быть, еще одно важное замечание, так как fixup_bundle использует набор фиксированных строк, у вас будет довольно симпатичная структура установки. По сути, вышесказанное будет работать только для монолитных установок:

set(CPACK_MONOLITHIC_INSTALL on)

Я был бы заинтересован в лучшем решении, чем выше, но я могу работать с этим.

0

Решение

Правильный способ использования переменных CPack, определенных в установить время, с install(CODE) команда:

install(CODE "include(CPack)
MESSAGE(\"CPACK_PACKAGE_DIRECTORY=\${CPACK_PACKAGE_DIRECTORY}\")
")

Основные моменты здесь:

  1. Расширение переменной должно быть экранировано: \${...}, В противном случае, переменная раскрывается немедленно конфигурировать этап, когда он еще не определен.

  2. устанавливать код все еще должен include(CPack) сделать переменную CPack доступной.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]