首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPack空CPACK_PACKAGE_DIRECTORY

CPack空CPACK_PACKAGE_DIRECTORY
EN

Stack Overflow用户
提问于 2016-06-23 02:31:41
回答 2查看 1.8K关注 0票数 1

我真的很难让CPack像我想象的那样行事。下面我有一个小的示例设置,在将它应用到一个更大的项目之前,我一直在尝试得到工作。本质上,我试图使用fixup_bundle收集所有依赖项,并将它们复制到打包目录中,以便合并到安装程序(和zip)中。

main.cpp:

代码语言:javascript
复制
int main(unsigned int argc, const char* argv[])
{
    return 0;
}

CMakeLists.txt:

代码语言:javascript
复制
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)

输出总是一堆空变量:

代码语言:javascript
复制
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

感谢@Tsyvarev帮助识别问题+解决方案。问题是安装命令中变量的预成熟扩展。CMake将对文本行中的任何${}变量执行第一级展开。将变量转义为\${}可避免此展开,稍后将由CPack正确展开。

即使有上述情况,除了一个变量之外,所有变量都仍然是空的。幸运的是,它是正确的:

代码语言:javascript
复制
install(CODE "MESSAGE(\"CMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX}\")")

在以下方面的成果:

代码语言:javascript
复制
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

现在,捆绑将是这样运作的:

代码语言:javascript
复制
install(CODE "
   include(BundleUtilities)
   fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/bin/TEST${CMAKE_EXECUTABLE_SUFFIX}\"   \"\"   \"\")
   " COMPONENT Runtime)

也许还有一个更重要的注意事项,因为fixup_bundle使用的是一组固定的字符串,所以您必须有一个非常完善的脊安装结构。从本质上讲,上述功能只适用于单片安装:

代码语言:javascript
复制
set(CPACK_MONOLITHIC_INSTALL on)

我会对一个比上面更好的解决方案感兴趣,但我可以处理这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 07:50:22

使用CPack命令使用安装时定义的使用install(CODE)变量的正确方法:

代码语言:javascript
复制
install(CODE " 
    include(CPack)
    MESSAGE(\"CPACK_PACKAGE_DIRECTORY=\${CPACK_PACKAGE_DIRECTORY}\")
")

这里的要点是:

  1. 应该转义变量的展开:\${...}。否则,当尚未定义变量时,将在配置阶段立即展开变量。
  2. 安装代码仍然需要include(CPack),以使CPack变量可用。
票数 1
EN

Stack Overflow用户

发布于 2021-06-28 21:23:25

对于那些绝望地尝试在互联网上应用所有菜谱的人(像我一样),我还有一个要得到的目录,这个目录对我有用:

代码语言:javascript
复制
install(CODE "MESSAGE(\"DESTDIR=\$ENV{DESTDIR}\")")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37981374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档