为啥要在每个项目包配置之后包含(CPack)?
Posted
技术标签:
【中文标题】为啥要在每个项目包配置之后包含(CPack)?【英文标题】:Why should include(CPack) go after the per project package configuration?为什么要在每个项目包配置之后包含(CPack)? 【发布时间】:2019-04-26 12:16:20 【问题描述】:我正在尝试使用 CMake
的 CPack
模块并得到一些令人困惑的行为。我有 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.txt
中include
它时,它会读取its documentation 中列出的所有变量,例如CPACK_GENERATOR
或CPACK_PACKAGE_NAME
,并创建package
target,然后您使用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 包没有出现