1 |
Forked from the gdbm/berkdb thread, wall of text ensues... |
2 |
|
3 |
|
4 |
On 01/27/2017 03:32 AM, Fabian Groffen wrote: |
5 |
> |
6 |
> You mention REQUIRED_USE should be used sparingly, I think I see your |
7 |
> reasoning, but if so, then why did we add it in the first place? |
8 |
|
9 |
There are a few conflicting interests at play. Before REQUIRED_USE, we |
10 |
would have a bunch of checks in pkg_pretend() to test if the user's |
11 |
configuration was invalid. If it was, we could output a nice explanation |
12 |
and tell him to try again. But, bash code in pkg_pretend can't be |
13 |
understood by the package manager, and requires execution to determine |
14 |
if a package can be installed. So we got REQUIRED_USE, which fixes those |
15 |
problems, and introduces a new one: no one knows WTF to do when portage |
16 |
outputs a REQUIRED_USE error. Now you get what looks like a core dump of |
17 |
the dependency graph instead of "this package only uses one database, so |
18 |
pick either mysql or sqlite." |
19 |
|
20 |
Both approaches have another problem: USE flag constraints on packages |
21 |
simply don't work with global USE flags. Global USE flags don't work |
22 |
that well to begin with, since the same flag means different things to |
23 |
each package (and the fact that they're global means "enable foo" is all |
24 |
we get for documentation). Regardless, when you have 100 flags enabled |
25 |
globally and start installing thousands of packages with USE |
26 |
constraints, you're eventually going to get to a point where everything |
27 |
has conflicting requirements and you need to switch to package.use to |
28 |
sort it all out. |
29 |
|
30 |
Both pkg_pretend and REQUIRED_USE have that problem and try to solve it |
31 |
in different ways. If you don't care about machine-readability, then in |
32 |
pkg_pretend you could try to choose "the best" of two conflicting flags |
33 |
and just silently go with it. There are a lot of problems with that, |
34 |
like what happens if you need to add a conditional dependency on those |
35 |
flags (you can't change DEPEND in pkg_pretend). With REQUIRED_USE, you |
36 |
instead need to set IUSE defaults to get it to do something without user |
37 |
interaction, but the tricks that you can do with IUSE don't solve every |
38 |
REQUIRED_USE conflict. In the harder cases, you can try to figure out |
39 |
what to do on behalf of the user in the ebuild, but then you're right |
40 |
back to the same set of problems that you had with pkg_pretend, because |
41 |
the decision is being made in code and not in metadata/flags. |
42 |
|
43 |
I think a slow migration away from global USE flags is the only way out |
44 |
of the jam. We get better USE flag docs for free, and no REQUIRED_USE |
45 |
conflicts that the user didn't cause himself. We could probably also get |
46 |
rid of a lot of IUSE defaults that serve only to undo various profile |
47 |
defaults. It would be annoying at first, but once a few critical profile |
48 |
defaults are moved into package.use, better. |