GLEP 62:通过运行时可切换的 USE 标志实现可选的运行时依赖

作者 Michał Górny <mgorny@gentoo.org>
类型 标准跟踪
状态 延期
版本 1
创建日期 2012-06-17
最后修改日期 2019-02-23
发布历史 2012-07-11
GLEP 源码 glep-0062.rst

状态

由于不活跃,GLEP 编辑 Ulrich Müller 于 2019-02-23 将其标记为延期。

摘要

此 GLEP 解决了在 Gentoo 软件包和 ebuild 中引用可选运行时依赖项的问题。它引入了运行时可切换 USE 标志的概念来实现该目标。

动机

在安装各种脚本(shell、python、perl)的软件包中经常会发现可选的运行时依赖项。这些并不是特定软件包工作所严格要求的,但安装它们可以启用附加功能。

与编译程序不同,启用或禁用这些功能(依赖项)不会影响软件包安装的文件。它们可以独立于软件包进行安装和卸载,从而在无需重建软件包的情况下更改功能。

目前,此类依赖项通常仅通过pkg_postinst()消息来表达。这迫使用户手动安装必要的依赖项,并在不再需要时卸载它们。

另一种解决方案是使用常规 USE 标志。这些标志并不严格遵循 USE 标志的原则,因为它们不会影响软件包安装的文件,并且对软件包并非完全有效(如果安装了必要的依赖项,则禁用的功能仍然可用)。此外,为了更改依赖项,需要不必要地重建软件包。

规范

旨在提供通过可选运行时依赖项启用的功能的 ebuild 应

  1. 按照 Gentoo ebuild 的相应规范,为所有这些功能创建常规 USE 标志,并将这些标志包含在IUSE变量中;
  2. 引入额外的IUSE_RUNTIME变量,列出与可选运行时依赖项相关的 USE 标志的名称(不带与 IUSE 默认值相关的 前缀)。

此外,ebuild 必须遵守以下规则

  1. 列在IUSE_RUNTIME中的所有标志也必须列在IUSE中,
  2. 列在IUSE_RUNTIME中的标志可以在RDEPEND, PDEPENDREQUIRED_USE变量中引用,
  3. 列在IUSE_RUNTIME不得在阶段函数中引用,DEPEND, LICENSESRC_URI,
  4. 列在IUSE_RUNTIME可以通过其他软件包的 USE 依赖项在DEPEND, RDEPENDPDEPEND变量中引用,但不允许请求禁用这些标志(仅允许[flag][flag?]形式),
  5. 列在IUSE_RUNTIME可以通过has_versionbest_version引用,但调用者不得依赖于禁用这些标志。

软件包管理器应将列在IUSE_RUNTIME中的标志视为常规 USE 标志,但以下情况除外

  1. 启用或禁用任何标志不得涉及重建软件包,
  2. 软件包管理器应该能够在不使用原始 ebuild 的情况下更改已安装软件包上的这些标志 [1]
  3. 当查询已安装的软件包时,软件包管理器必须仅在其依赖项已满足的情况下才将特定标志视为已启用 [2]
  4. 这些标志可能会以不同的方式列在可视化输出中,以告知用户它们仅影响运行时依赖项。
[1]软件包管理器必须确保所有相关信息都存储在已安装的软件包元数据中。
[2]在更新已安装软件包的元数据时,可以缓存此检查的结果,并且并非严格要求软件包管理器必须确保依赖关系图之后仍然一致。

基本原理

提出的解决方案尝试在重用现有基础架构的同时解决处理运行时依赖项的问题。最重要的是,用户将能够重用现有工具和配置文件来启用和禁用可选的运行时和构建时依赖项。

其余重用的功能包括

  • 依赖语法(USE 条件),
  • 使用REQUIRED_USE的能力,USE 依赖项,
  • metadata.xml 中描述标志的能力,
  • 全局标志名称(和描述)。

提出的替代解决方案涉及创建额外的SDEPEND变量。该提议具有以下缺点

  • 面向软件包而不是面向功能,
  • 缺乏表达单个功能所需的多个软件包的能力,
  • 缺乏表达跨功能依赖项的能力,
  • 缺乏描述启用软件包提供的功能的能力,
  • 需要实现新的用户界面部分来控制依赖项,
  • 缺乏向后兼容性。

可以通过扩展类似 Exherbo 的依赖语法(分组、注释)或使用 USE 标志来解决这些缺点。后者实际上等同于此解决方案,但又引入了另一个不必要的变量。

参考实现

为了支持对已安装软件包进行运行时可切换 USE 标志更改,软件包管理器应在已安装软件包元数据中存储以下信息

  1. 运行时可切换标志列表(IUSE_RUNTIME),
  2. 以运行时可切换标志为条件的运行时依赖项列表,不受 USE 扩展的限制(RDEPEND),
  3. 的相关部分)REQUIRED_USE与运行时可切换 USE 标志相关的

约束列表。软件包管理器还应该能够更新已安装软件包元数据中的有效 USE 标志列表(USE

),而无需重建软件包。

  1. 当考虑依赖项原子(作为软件包依赖项或用户请求的原子)时,应应用以下过程
  2. 如果依赖项不满足已安装的软件包,则像往常一样对 ebuild 执行依赖项解析(以安装新软件包);
  3. 如果禁用了运行时可切换 USE 更新,则继续下一个依赖项(满足此依赖项);current_use软件包管理器还应该能够更新已安装软件包元数据中的有效 USE 标志列表(;
  4. = 已安装软件包元数据 .effective_use软件包管理器还应该能够更新已安装软件包元数据中的有效 USE 标志列表(= 为软件包请求的
  5. use_changes = 如果禁用了运行时可切换 USE 更新,则继续下一个依赖项(满足此依赖项);xor= 已安装软件包元数据 .;
  6. 如果use_changes为空,则继续下一个依赖项;
  7. iuse_runtimecurrent_useIUSE_RUNTIME;
  8. reg_use_changes = use_changes且非iuse_runtime;
  9. 如果reg_use_changes不为空且启用了常规 USE 更新,则对 ebuild 执行依赖项解析(以重建软件包);
  10. run_use_changes = use_changesiuse_runtime;
  11. 如果run_use_changes为空,则继续下一个依赖项;
  12. required_usecurrent_useREQUIRED_USE;
  13. 执行检查,以确保required_use约束满足= 已安装软件包元数据 .;
  14. run_rdependcurrent_useRDEPEND(使用未扩展的IUSE_RUNTIME条件);
  15. 使用run_rdepend= 已安装软件包元数据 .,
  16. 执行依赖项解析;

将软件包排队以进行运行时可切换 USE 更新。此外,在安装了上述过程引入的所有依赖项之后(run_rdepend(分辨率),如果一个软件包被列入队列等待运行时可切换 USE 更新,则软件包管理器应该为软件包管理器还应该能够更新已安装软件包元数据中的有效 USE 标志列表(已安装软件包元数据中的键写入新值。

向后兼容性

未实现此 GLEP 的软件包管理器会将IUSE_RUNTIME变量视为无关的 bash 变量,并将运行时可切换 USE 标志视为常规 USE 标志。依赖关系树仍然保持一致,但软件包可能会不必要地重新构建。