如何给CMake生成的文件添加执行权限?

jin*_*123 3 cmake

我有一个文件wrapper.sh.in,其内容如下:

#!/bin/bash
DEPENDENCY_VERSION=@dependency_VERSION@
/location/of/installed/dependency/${DEPENDENCY_VERSION}/some_script.sh "$@"
Run Code Online (Sandbox Code Playgroud)

这个wrapper.sh.in脚本具有常规不可执行文件(0644)的通常文件权限,但我需要CMake 生成的文件具有执行权限,因为它是一个脚本,因此意味着要运行。


以下是我当前在 CMakeLists.txt 中执行的操作,以生成包装器脚本:

configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh.in
    ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    @ONLY
    )
Run Code Online (Sandbox Code Playgroud)


这是我尝试更改生成的wrapper.sh脚本的权限的方法。

尝试#1(失败):

file(
    COPY ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
    )
Run Code Online (Sandbox Code Playgroud)

尝试#2(失败):

install(
    FILES ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh
    DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
    COMPONENT runtime
    )
Run Code Online (Sandbox Code Playgroud)


将生成的wrapper.sh脚本的文件权限更改为普通脚本的文件权限(0755)的 正确方法是什么?

Tsy*_*rev 6

在大多数情况下,“就地”复制文件是个坏主意。

相反,将文件配置到一个(中间)位置,然后将其(具有更改的权限)复制到最终位置:

configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh.in
    ${CMAKE_CURRENT_SOURCE_DIR}/tmp/wrapper.sh
    @ONLY
    )

file(
    COPY ${CMAKE_CURRENT_SOURCE_DIR}/tmp/wrapper.sh
    DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}
    FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
    )
Run Code Online (Sandbox Code Playgroud)