为啥要在每个项目包配置之后包含(CPack)?

Posted

技术标签:

【中文标题】为啥要在每个项目包配置之后包含(CPack)?【英文标题】: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。我只是对这种行为感到好奇...... 我的坏...... 【参考方案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 中。 这就是我所做的;)

以上是关于为啥要在每个项目包配置之后包含(CPack)?的主要内容,如果未能解决你的问题,请参考以下文章

cmake/cpack 组件 debuginfo rpm 包没有出现

使用 CMake 和 CPack 为一个组件创建包

为啥要在项目中使用#include_next?

没有出现cmake / cpack组件的debuginfo rpm包

如何用 CPack 生成 WIX 包?

如何将所有3rdparty运行时依赖项包含在linux上的cmake / cpack生成的包中?