summaryrefslogtreecommitdiff
blob: 338e78de91b1011e938c9489a3d03607d82aaa6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
---
GLEP: 62
Title: Optional runtime dependencies via runtime-switchable USE flags
Author: Michał Górny <mgorny@gentoo.org>
Type: Standards Track
Status: Deferred
Version: 1
Created: 2012-06-17
Last-Modified: 2019-02-23
Post-History: 2012-07-11
Content-Type: text/x-rst
---

Status
======

Marked as deferred by GLEP editor Ulrich Müller on 2019-02-23, due to
inactivity.


Abstract
========

This GLEP addresses the issue of referencing optional runtime
dependencies in Gentoo packages and ebuilds. It does introduce
a concept of runtime-switchable USE flags to achieve that goal.


Motivation
==========

Optional runtime dependencies are often found in packages installing
various scripts (shell, python, perl). These are not strictly required
for the particular package to work but installing them enables
additional functionality.

Unlike in compiled programs, enabling or disabling those features
(dependencies) does not affect the files installed by the package.
They can be installed and uninstalled independently of the package,
resulting in changes of functionality without a need to rebuild
the package.

Currently such dependencies are usually expressed only through
``pkg_postinst()`` messages. This forces user to manually install
the necessary dependencies, and uninstall them when they are no longer
necessary.

Another solution is to use regular USE flags. Those flags do not strictly
follow the principles of USE flags because they do not affect files
installed by the package and are not entirely effective to the package
(a disabled feature will still be available if necessary dependency is
installed). Additionally, it requires unnecessary rebuilds
of the package in order to change the dependencies.


Specification
=============

The ebuilds aiming to provide features enabled through optional runtime
dependencies should:

1. create regular USE flags for all those features, following
   appropriate specifications for Gentoo ebuilds, and including
   the flags in the ``IUSE`` variable;
2. introduce additional ``IUSE_RUNTIME`` variable listing names of USE
   flags related to optional runtime dependencies (without prefixes
   related to IUSE defaults).

Additionally, the ebuilds must obey the following rules:

1. all flags listed in ``IUSE_RUNTIME`` have to be listed in ``IUSE``
   as well,
2. flags listed in ``IUSE_RUNTIME`` can be referenced in ``RDEPEND``,
   ``PDEPEND`` and ``REQUIRED_USE`` variables,
3. flags listed in ``IUSE_RUNTIME`` must not be referenced in phase
   functions, ``DEPEND``, ``LICENSE`` or ``SRC_URI``,
4. flags listed in ``IUSE_RUNTIME`` can be referenced through USE
   dependencies by other packages' ``DEPEND``, ``RDEPEND``
   and ``PDEPEND`` variables but it is unallowed to request disabling
   those flags (only ``[flag]`` and ``[flag?]`` forms are allowed),
5. flags listed in ``IUSE_RUNTIME`` can be referenced through
   ``has_version`` and ``best_version`` yet the caller must not rely
   upon those flags being disabled.

The package manager should treat flags listed in ``IUSE_RUNTIME``
as regular USE flags, except for the following:

1. enabling or disabling any of the flags must not involve rebuilding
   the package,
2. it should be possible for a package manager to change those flags
   on a installed package without using the original ebuild [1]_,
3. when queried on a installed package, the package manager must
   consider a particular flag enabled only if its dependencies
   are satisfied already [2]_,
4. the flags may be listed in the visual output in a distinct way
   to inform the user that they affect runtime dependencies only.

.. [1] The package manager has to ensure that all relevant information
       is stored in the installed package metadata.
.. [2] The result of this check can be cached when updating the metadata
       of installed package, and it is not strictly required that
       a package manager must ensure that the dependency graph is still
       consistent afterwards.


Rationale
=========

The proposed solution tries to solve the issue of handling runtime
dependencies while reusing the existing infrastructure. Most
importantly, users will be able to reuse the existing tools
and configuration files to enable and disable optional runtime
and build-time dependencies alike.

The remaining reused features include:

- dependency syntax (USE-conditionals),
- ability to use ``REQUIRED_USE``, USE dependencies,
- ability to describe flags in `metadata.xml`,
- global flag names (and descriptions).

Alternative proposed solution involved creating additional ``SDEPEND``
variable. That proposition had the following disadvantages:

- being package-oriented rather than feature-oriented,
- lack of ability to express multiple packages required by a single
  feature,
- lack of ability to express cross-feature dependencies,
- lack of ability to describe features provided by enabled packages,
- necessity of implementing a new user interface parts to control
  the dependencies,
- lack of backwards compatibility.

Those disadvantages could be fixed by either extending dependency
syntax alike Exherbo (grouping, annotations) or using USE flags.
The latter is practically equivalent to this solution yet introduces
another variable unnecessarily.


Reference implementation
========================

In order to support runtime-switchable USE flag changes on installed
packages, a package manager should store the following information
in the installed package metadata:

1. a list of runtime-switchable flags (``IUSE_RUNTIME``),
2. a list of runtime dependencies conditional to runtime-switchable
   flags, not subjected to USE expansion (relevant part of ``RDEPEND``),
3. a list of ``REQUIRED_USE`` constraints relevant to runtime-switchable
   USE flags.

The package manager should be also able to update the list of effective
USE flags in installed package metadata (``USE``) without rebuilding
the package.

The following procedure should apply when a dependency atom is
considered (either as a package dependency or user-requested atom):

1. if the dependency is not satisfied with an installed package,
   perform the dependency resolution on ebuilds as usual (in order to
   install a new package);
2. if runtime-switchable USE updates are disabled, continue to
   the next dependency (with this one satisfied);
3. ``current_use`` = installed package metadata . ``USE``;
4. ``effective_use`` = requested ``USE`` for the package;
5. ``use_changes`` = ``current_use`` xor ``effective_use``;
6. if ``use_changes`` is empty, continue to the next dependency;
7. ``iuse_runtime`` = installed package metadata . ``IUSE_RUNTIME``;
8. ``reg_use_changes`` = ``use_changes`` and not ``iuse_runtime``;
9. if ``reg_use_changes`` is not empty and regular USE updates
   are enabled, perform the dependency resolution on ebuilds (in order
   to rebuild the package);
10. ``run_use_changes`` = ``use_changes`` and ``iuse_runtime``;
11. if ``run_use_changes`` is empty, continue to the next dependency;
12. ``required_use`` = installed package metadata . ``REQUIRED_USE``;
13. perform a check for ``required_use`` constraints being satisfied
    by ``effective_use``;
14. ``run_rdepend`` = installed package metadata . ``RDEPEND`` (with
    unexpanded ``IUSE_RUNTIME`` conditionals);
15. perform the dependency resolution for ``run_rdepend`` with
    ``effective_use``,
16. queue the package for runtime-switchable USE update.

Furthermore, after installing all dependencies introduced by the above
procedure (``run_rdepend`` resolution), if a package was queued for
runtime-switchable USE update, the package manager should write a new
value for ``USE`` key in installed package metadata.


Backwards compatibility
=======================

Package managers not implementing this GLEP will consider
the ``IUSE_RUNTIME`` variable as an irrelevant bash variable and treat
runtime-switchable USE flags as regular USE flags. The dependency tree
will still be consistent yet packages may be rebuilt unnecessarily.


Copyright
=========

This work is licensed under the Creative Commons Attribution-ShareAlike 3.0
Unported License.  To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/3.0/.