我正在使用 CMake 的 RPM 支持创建 RPM 文件。我发现安装 RPM 时创建的目录的权限取决于创建 RPM 的用户的
umask
。我尝试设置 CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS 但这似乎没有帮助。
在 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 创建支持来完成此任务。