Gentoo Archives: gentoo-dev

From: Michael Orlitzky <mjo@g.o>
To: gentoo-dev@l.g.o
Subject: [gentoo-dev] REQUIRED_USE, global USE flags, user-friendliness...
Date: Fri, 27 Jan 2017 17:27:02
1 Forked from the gdbm/berkdb thread, wall of text ensues...
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?
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."
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.
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.
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.