CMake configure_file非输出文件所有者执行失败的解决方法咨询
CMake configure_file 跨用户构建权限问题
环境配置
- 系统:Ubuntu 20.04
- CMake版本:3.27.4
- 构建架构:云构建+本地构建共享代码目录,目录已设置
setguid属性,确保云构建生成文件的组所有权统一,本地用户在该组内拥有读写权限
问题现象
云构建完成后,configure_file生成的文件归属云构建用户。此时执行本地构建,configure_file步骤触发权限错误:
CMake Error at buildTools/configPaths.cmake:25 (configure_file): Operation not permitted
- 手动将文件所有权修改为本地用户后,错误消失
- 直接读写该文件(不通过CMake)无权限问题
- 删除文件后重新本地构建,文件会以本地用户身份创建,组权限符合预期
深入排查(更新)
- 仅当输出文件内容无需变更时触发报错;若修改文件内容但保留所有权不变,CMake执行成功,且文件会自动归属本地用户
- 查阅CMake源码后确认:
configure_file始终会尝试设置输出文件的权限- 仅当输入与输出内容不同时,才会执行复制操作(复制前会删除原文件,本地用户具备此权限)
- 内容未变更时,不会生成归属本地用户的新文件,后续的
chmod权限设置调用因文件属云构建用户而失败
解决方案建议
1. 强制重新生成目标文件
在configure_file执行前,添加逻辑判断文件所有者是否为当前用户,若不是则删除文件,迫使CMake重新生成:
set(OUTPUT_FILE "path/to/your/output.file") execute_process(COMMAND stat -c "%U" ${OUTPUT_FILE} OUTPUT_VARIABLE FILE_OWNER OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) if(NOT FILE_OWNER STREQUAL "$ENV{USER}") file(REMOVE ${OUTPUT_FILE}) endif() configure_file(input.file ${OUTPUT_FILE} ...)
2. 替代configure_file避免主动权限设置
用CMake内置命令组合替代configure_file,跳过主动设置权限的步骤,依赖目录setguid特性继承权限:
set(INPUT_FILE "input.file") set(OUTPUT_FILE "path/to/output.file") set(TEMP_FILE "${OUTPUT_FILE}.tmp") # 先生成临时文件(含变量替换) execute_process(COMMAND ${CMAKE_COMMAND} -E configure_file ${INPUT_FILE} ${TEMP_FILE}) # 仅当内容不同时复制到目标路径,不修改权限 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TEMP_FILE} ${OUTPUT_FILE}) # 清理临时文件 file(REMOVE ${TEMP_FILE})
内容的提问来源于stack exchange,提问作者barrett
相关产品推荐
相关产品推荐

