【CMake】Linux 下权限丢失与软链接失效问题

发布于:2024-06-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

【CMake】Linux 下权限丢失与软链接失效问题

问题概述

一般使用 CMake 安装,在 Windows 平台不会出问题,因为 Windows 平台基本上除了管理员权限外,没有其他什么文件权限。

使用 CMake 拷贝或者安装文件一般使用 file 或 install 命令,在使用精简版的方式

file(INSTALL somefiles DESTINATION /full/path)
install(FILES somefiles DESTINATION /full/path)

在 Linux 平台上会出现权限丢失

解决方法

1 - 安装目录

安装目录,添加 USE_SOURCE_PERMISSIONS 选项
其 CMake 指令原型为

install(DIRECTORY dirs... DESTINATION <dir>
          [FILE_PERMISSIONS permissions...]
          [DIRECTORY_PERMISSIONS permissions...]
          [USE_SOURCE_PERMISSIONS] [OPTIONAL]
          [CONFIGURATIONS [Debug|Release|...]]
          [COMPONENT <component>] [FILES_MATCHING]
          [[PATTERN <pattern> | REGEX <regex>]
           [EXCLUDE] [PERMISSIONS permissions...]] [...])

举例

install(DIRECTORY ${PROJECT_SOURCE_DIR}/dir DESTINATION /some/full/path 
USE_SOURCE_PERMISSIONS)

也可以通过设置 CMake 变量 CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS 来达到在所有使用 install 和 file(install) 的地方全局生效,例:

set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
     OWNER_READ OWNER_WRITE OWNER_EXECUTE
     GROUP_READ GROUP_EXECUTE
     WORLD_READ WORLD_EXECUTE)

若此变量未设置,则使用系统默认文件权限。

2 - 安装文件

install 使用 PROGRAMS,此选项默认包含 OWNER_EXECUTE, GROUP_EXECUTE, WORLD_EXECUTE 权限,也就相当于 linux 下对文件使用了

chmod ugo+x filename

此指令原型为

install(PROGRAMS files... DESTINATION <dir>
          [PERMISSIONS permissions...]
          [CONFIGURATIONS [Debug|Release|...]]
          [COMPONENT <component>]
          [RENAME <name>] [OPTIONAL])

3 - 手动指定

在 install 时手动指定权限,即指定其 PERMISSIONS 选项

install(TARGETS targets... [EXPORT <export-name>]
        [[ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
          PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
         [DESTINATION <dir>]
         [PERMISSIONS permissions...]
         [CONFIGURATIONS [Debug|Release|...]]
         [COMPONENT <component>]
         [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP]
        ] [...])

举例

install(TARGETS targets DESTINATION /some/full/path PERMISSIONS 
	OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)

或者定义一个自己的变量 在其他 install 处使用

set(MY_PROJECT_PERMISSIONS  OWNER_READ OWNER_WRITE OWNER_EXECUTE 
	GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
install(TARGETS targets DESTINATION /some/full/path PERMISSIONS ${MY_PROJECT_PERMISSIONS})

使用 Linux 下原生命令行注意事项

cp 命令需要添指定选项,否则会出现权限丢失或软连接失效

选项 解释
-p 保留源文件或目录的所有属性信息
-d 复制链接文件时,将目标文件也建立为链接文件
cp -d srcdir destdir -rf

参考链接

https://cmake.org/cmake/help/v2.8.10/cmake.html#command%3ainstall