【问题标题】:Why should include(CPack) go after the per project package configuration?为什么要在每个项目包配置之后包含(CPack)?
【发布时间】:2019-04-26 12:16:20
【问题描述】:

我正在尝试使用 CMakeCPack 模块并得到一些令人困惑的行为。我有 CpackMylib.cmake 包含在根 CMakeLists.txt 中。它看起来如下:

include(CPack)             #included on top
install (TARGETS mylib
          LIBRARY
          DESTINATION /usr/lib
          COMPONENT mylib-all
)

install (DIRECTORY include/
          DESTINATION /usr/include/mylib 
          COMPONENT mylib-all)
set(CPACK_PACKAGE_NAME "mylib")
set(CPACK_GENERATOR "DEB")

当运行make package 时,它无法创建具有以下跟踪的包:

Run CPack packaging tool...
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: mylib
CPack: - Install project: mylib
CMake Error at /home/krjoff/mylib/cmake_install.cmake:55 (file):
  file INSTALL cannot copy file "/home/krjoff/mylib/libmylib.so" to
  "/usr/lib/mylib.so".


CMake Error at /home/krjoff/mylib/cmake_install.cmake:73 (file):
  file INSTALL cannot set permissions on "/usr/include/mylib"


CPack Error: Error when generating package: mylib
Makefile:129: recipe for target 'package' failed
make: *** [package] Error 1

看起来它只是忽略了我在include(CPack) 之后放置的所有变量,并尝试构建一些STGZ 包并立即安装它。但是,如果我在完成所有配置后将include(CPack) 放在CpackMylib.cmake 的末尾,它就可以正常工作了。

有人能解释一下为什么必须在所有配置设置之后加上include(CPack) 吗?

【问题讨论】:

  • @YSC 有点,是的。但这绝对不是一个可取的行为。此外,它会尝试安装默认的 STGZ 包,我将其覆盖为 DEB
  • @YSC 当然,正如我提到的,在所有变量都按预期设置后包括CPack。我只是对这种行为感到好奇......
  • 我的坏......

标签: c++ cmake cpack


【解决方案1】:

这就是CPack 的工作方式。当您在CMakeLists.txtinclude 它时,它会读取its documentation 中列出的所有变量,例如CPACK_GENERATORCPACK_PACKAGE_NAME,并创建packagetarget,然后您使用make package 调用。

如果在设置这些变量之前包含它,它们的值将被忽略。

在您的CMakeLists.txt 文件中包含此CPack 模块之前,可以设置多种变量来自定义生成的安装程序。最常用的变量是:

  • CPACK_PACKAGE_NAME
    包(或应用程序)的名称。如果未指定,则默认为项目名称。

  • CPACK_PACKAGE_VENDOR
    软件包供应商的名称。 (例如,“套件”)。默认为“人类”。

  • CPACK_PACKAGE_DIRECTORY
    CPack 进行打包的目录。如果未设置,则默认(内部)为构建目录。该变量可以在 CPack 配置文件中定义,也可以通过 cpack 命令行选项 -B 定义。如果设置,命令行选项会覆盖配置文件中的值。

  • ...

来源:CPack --- CMake

【讨论】:

  • 谢谢。我想问以下问题:将所有与包相关的配置放在一个单独的.cmake文件中,最后包含include(CPack),这是一个好习惯吗?然后简单地将其包含在一个根 CMakeLists.txt 中。
  • 这就是我所做的;)
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多