【问题标题】:cmake install directory without OWNER_WRITE没有OWNER_WRITE的cmake安装目录
【发布时间】:2021-01-05 08:20:52
【问题描述】:

我有一个通用组件模板,它应该以下列方式安装不同的项目:

/path/to/Components/<COMPONENT_NAME>/<COMPONENT_VERSION>/CONTENTS

我在 CMakeLists.txt 中的安装规则如下所示:

install(TARGETS ${TARGET_NAME} DESTINATION lib PERMISSIONS ${FILE_PERMISSIONS})
install(FILES include/${TARGET_NAME}.h DESTINATION include PERMISSIONS ${FILE_PERMISSIONS}

通过仅设置 PERMISSIONS,安装规则创建的目录将具有系统的 umask。使用 install 的目录选项不适合我的用例,因为我只打算安装单个/特定文件(特别是在包含目录中)。 我发现了一个非常好的行为描述/错误报告。 https://gitlab.kitware.com/cmake/cmake/-/issues/9620

有了这些新信息,我设法设置了 CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS,它可以部分解决该问题,但不能完全解决。问题是已安装的目录应具有读取和执行权限,并且没有用户、组或其他人的写入权限。

通过设置:

set (CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE)

我不再被允许在目录树中创建子文件夹/文件。

所以问题是: cmake 中是否有一个选项可以安装组件(在没有 root/admin 权限的用户空间中)并将整个目录结构(新创建的目录的)保留为 OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE?基本上它应该在安装时设置目录的写访问权限,并以将目录设置为指定的访问标志结束。

【问题讨论】:

  • 如果没有人有写权限怎么能创建任何东西?还是您的意思是让管理员仍然具有写入权限并且安装脚本以使用管理员权限运行?
  • 我认为对这种行为存在误解。基本上,要安装的用户在文件夹中具有写访问权限:/path/to/Components/,但应写入已安装的目录,然后即使安装它的用户也只有读访问权限。
  • (1) 但重点是什么?所有者可以随意更改目录的权限,因此使其对他们不可写是缺乏保护的。 (2) 目录必须是初始可写的,否则不能安装文件。

标签: c++ c makefile cmake build


【解决方案1】:

所以问题是:在 cmake 中是否有一个选项可以安装组件(在没有 root/管理员权限的用户空间中)并离开 整个目录结构(新创建的目录)为 OWNER_READ 仅 OWNER_EXECUTE GROUP_READ GROUP_EXECUTE?基本上它应该设置 安装时对目录的写访问权并以设置结束 指定访问标志的目录。

如您所见,您无法创建最初不可写的目录,因为您无法在其中安装文件。相反,如果对此有任何疑问,那么作为初步安装步骤,您必须确保最终目标目录至少是可写的。

文件和目录具有拒绝所有者写访问权限的模式是非常不寻常的,但是,这几乎没有用处。所有者可以随意更改自己文件的模式,而不管当前模式如何,并且在某些情况下,他们可以覆盖该模式而无需实际更改它。那么,你真的应该考虑放弃这个计划。

但是如果你想继续,那么我看到的唯一方法是有一个单独的安装操作,在所有想要的文件都安装在其中之后,根据需要修改目录的权限。您可以在 CMake 中使用install(SCRIPT) or install(CODE) 设置自定义安装逻辑,例如使用execute_process() 实现细节。后者具有特定于操作系统的方面,因此如果您确实尝试支持上述所有内容,您将需要 Windows 和 Unix-y 系统的单独替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2023-01-25
    • 1970-01-01
    • 2017-01-14
    • 2014-12-22
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多