如何在 CMake 构建的 RPM 文件中设置目录权限位?

问题描述 投票:0回答:1

我正在使用 CMake 的 RPM 支持创建 RPM 文件。我发现安装 RPM 时创建的目录的权限取决于创建 RPM 的用户的

umask
。我尝试设置 CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS 但这似乎没有帮助。

cmake file-permissions rpm cpack
1个回答
1
投票

在 CMake/CPack 中创建 RPM 文件分为两个步骤。首先,在

_CPack_Packages/
的子目录下创建一个临时目录结构。然后,这个临时目录结构用于创建 RPM 文件。

当 CPack 隐式创建临时目录时,它使用

CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
变量来请求特定权限。在
mkdir()
的正常操作下,这是通过过程
umask
修改的。例如,在
umask 022
下以及
CMakeLists.txt
文件中的以下语句:

set(CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
    OWNER_READ OWNER_WRITE OWNER_EXECUTE
    GROUP_READ GROUP_EXECUTE
    WORLD_READ WORLD_EXECUTE)

目录权限为

drwxr-xr-x

umask 027
下,权限将是

drwxr-x---

执行 RPM 构建的第二步时,生成的 RPM

.spec
文件包含:

%files
%defattr(-,root,root,-)

并且 RPM 文件中嵌入的权限是从 CMake 创建的实际临时目录复制的。如果 RPM 安装的软件期望任何用户都能够读取已安装的文件,那么安装将无法正常工作。

解决方案是使用 CPACK_RPM_DEFAULT_DIR_PERMISSIONS 代替,如下所示:

set(CPACK_RPM_DEFAULT_DIR_PERMISSIONS
    OWNER_READ OWNER_WRITE OWNER_EXECUTE
    GROUP_READ GROUP_EXECUTE
    WORLD_READ WORLD_EXECUTE)

使用此设置时,生成的

.spec
文件包含:

%files
%defattr(-,root,root,755)

其中

755
是安装 RPM 时应用的特定权限。在这种情况下,CMake 创建的临时文件的权限位(仍将受到
umask
调整)不再相关。

当 RPM

.spec
文件是手工制作时,根据需要显式设置安装的文件和目录权限当然是一个很好的做法。上面展示了如何使用 CMake 的 RPM 创建支持来完成此任务。

© www.soinside.com 2019 - 2024. All rights reserved.