Я действительно изо всех сил пытаюсь заставить 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)
Я был бы заинтересован в лучшем решении, чем выше, но я могу работать с этим.
Правильный способ использования переменных CPack, определенных в установить время, с install(CODE)
команда:
install(CODE "include(CPack)
MESSAGE(\"CPACK_PACKAGE_DIRECTORY=\${CPACK_PACKAGE_DIRECTORY}\")
")
Основные моменты здесь:
Расширение переменной должно быть экранировано: \${...}
, В противном случае, переменная раскрывается немедленно конфигурировать этап, когда он еще не определен.
устанавливать код все еще должен include(CPack)
сделать переменную CPack доступной.
Других решений пока нет …