【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