为什么应该在每个项目包配置之后包含(CPack)?

St.*_*rio 3 c++ cmake cpack

我正在尝试CPackmodule ofCMake并得到一些令人困惑的行为。我已将CpackMylib.cmake其包含在 root 中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")
Run Code Online (Sandbox Code Playgroud)

并且在运行时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
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释为什么有必要将include(CPack)所有配置设置放在后面吗?

YSC*_*YSC 5

这就是应该如何工作CPack。当您include在您的 中时,它会读取其文档CMakeLists.txt中列出的所有变量(如或 )并创建您然后调用的目标。CPACK_GENERATORCPACK_PACKAGE_NAMEpackagemake package

\n\n

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

\n\n
\n

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

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

  • \n
  • CPACK_PACKAGE_VENDOR
    \n 软件包供应商的名称。(例如,\xe2\x80\x9cKitware\xe2\x80\x9d)。默认值为 \xe2\x80\x9cHumanity\xe2\x80\x9d。

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

  • \n
  • ...

  • \n
\n
\n\n

来源:CPack --- CMake

\n

  • 我就是做这个的 ;) (2认同)