首页 > 解决方案 > cmake:“make install”和“make package”之间的区别

问题描述

我正在使用 CMake 生成我的 makefile。我的可部署目标是 RPM,这一切都运行良好。根据文件系统指南,我的 RPM 安装到

/opt/mytool
    /bin - executables
    /lib64 - libraries
/etc/opt/mytool - configuration files

RPM 由 CPack 使用make package

在开发测试期间,我不想安装 RPM。它需要提升权限,并将任何给定机器一次限制为一个(开发人员)版本。在我让所有 RPM 工作正常之前,我能够“进行安装”并创建一个install像这样的简单树:

install
    /opt/mytool
        bin
        lib64

但是,将配置文件引入不同的位置已经使工作变得混乱。我希望将其扩展到包括

install
    /etc/opt/mytool

但我可以没有它。不幸的是,当我尝试时,make install我得到了这个错误:

Install the project...
-- Install configuration: "Debug"
CMake Error at cmake_install.cmake:49 (file):
  file cannot create directory: /etc/opt/mytool.  Maybe need administrative
  privileges.

CMakeLists.txt文件的违规部分是

install(FILES ${PROJECT_SOURCE_DIR}/../Config/mytool.cfg
    DESTINATION /etc/opt/mytool
)

我查看了CMake rpm 在 /etc/init.d 中安装文件,但我的 RPM 构建得很好(而且我正在使用 CMake 3)

make install和之间有什么区别make package(我可以推断后者正在运行 CPack,它工作得很好)?如何创建开发安装树

标签: cmake

解决方案


两个构建目标之间的区别在于,package在您的情况下创建一个 RPM 文件,同时install将提供给命令的资源复制到install()提供给DESTINATION参数的位置:

目的地

指定要安装文件的磁盘目录。如果给出完整路径(带有前导斜杠或驱动器号),则直接使用它。如果给出了相对路径,则相对于CMAKE_INSTALL_PREFIX 变量的值进行解释。可以使用CMAKE_INSTALL_PREFIX变量文档中解释的 DESTDIR 机制在安装时重新定位前缀。

您指定复制/etc/opt/mytool您显然没有写入权限的文件并遇到引用的错误。

你有两个选项来解决这个问题,第二个显然是首选,因为它允许每个开发人员提供他们自己的系统本地设置,临时安装开发文件的位置:

  • 设置DESTINATION您具有写入权限的路径
  • 设置相对路径并cmake使用附加参数调用以指定开发安装树的位置:
cmake -H<source path> -B<build path> -DCMAKE_INSTALL_PREFIX=<install path>

推荐阅读