He's not dead, he's resting
MYOPTIONS: It’s like IUSE with Candy
Up until recently, this has just been a differently named variable, minus support for IUSE defaults because we hateses them. But now that Paludis has the choices API we’re not stuck using that format. The first extension is fairly simple:
MYOPTIONS="foo bar baz linguas: en en_GB fr"
This is much nicer than having to write out
linguas:en linguas:en_GB etc., and is especially important for exheres-0 because
USE_EXPAND) values must be explicitly listed.
The next step is flag descriptions.
use.local.desc is rather crude, and XML is horrible, so we thought about re-using annotations:
MYOPTIONS=" X [[ description = [ Build a graphical user interface ] ]] python [[ description = [ Build Python language bindings ] ]] nls linguas: en en_GB fr"
Any undescribed flag falls back to the global description — general consensus is to keep those, because they make it easier for a user to set up a fresh
Whilst we’re at it, we might as well solve the conflicting options problem. In the good old days, use flags were used only when something was optional — that is, if support for foo also needed support for bar,
USE="-foo bar" would just compile without bar. Unfortunately, a few people didn’t really like that, and even more unfortunately developers started doing horrible
die calls in
pkg_setup rather than coming up with a proper solution.
With half of the
pkg_setup die calls eliminated by use dependencies, it seems a shame not to fix the other not-quite-half-because-of-a-few-obscure-things. There’s already
pkg_pretend for exheres-0, which is a big improvement, but moving handling of the common cases into the package manager is cleaner.
So, we start with the simplest case: flags requiring other flags.
MYOPTIONS=" X python gtk [[ requires = [ X python ] ]] qt [[ requires = X ]] motif [[ requires = X ]] "
We might like
SUBOPTIONS and negatives too:
MYOPTIONS=" minimal python [[ requires = [ -minimal ] ]] linguas: en en_GB [[ requires = [ linguas: en ] ]] "
There might be a case for “if blah is not enabled then …” requirements:
MYOPTIONS=" X -ncurses [[ requires = [ X ] ]] "
although we have a nicer solution this particular case. Note that it’s ok to list the same flag multiple times, so the above can be written as:
MYOPTIONS=" X ncurses -ncurses [[ requires = [ X ] ]] "
For convenience, we’d like to be able to apply the same requires annotation to multiple items:
MYOPTIONS=" X python ( gtk [[ requires = python ]] qt motif ) [[ requires = X ]] "
gtk requires both
python (although excessive mixing of things is discouraged for style reasons).
Sometimes, you have to select one of a number of flags:
MYOPTIONS=" ( gtk qt motif ) [[ number-selected = exactly-one ]] "
Also allowed are
Sometimes requirements are conditional, too:
MYOPTIONS=" X python X? ( ( gtk [[ requires = python ]] qt motif ) [[ number-selected = exactly-one requires = X ]] ) "
Although, for style reasons, this would end up looking more like:
MYOPTIONS=" X [[ description = [ Include a GUI ] ]] python [[ description = [ Build Python language bindings ] ]] gtk qt motif gtk [[ requires = python ]] ( gtk qt motif ) [[ requires = X ]] X? ( ( gtk qt motif ) [[ number-selected = exactly-one ]] ) "
As for how these are verified… They’re checked at
--pretend --install time, right before
pkg_pretend is run. Even if a requirement fails, though,
pkg_pretend is still run, allowing us to show as many notices as necessary at the same time.
The failure is indicated to the user by the
pkg_bad_options function. This probably won’t be overridden by very many packages, and those that do will almost certainly call
default. The default output looks like this:
These packages will be installed: * test-cat/test-pkg::ciaranm :1 [N 1] <target> X gtk -motif -python qt build_options: recommended_tests split strip "Dummy test package" Total: 1 package (1 new) * The following option requirements are unmet for test-cat/test-pkg-1: * Enabling option 'gtk' requires option 'python' to be enabled * Exactly one of options ( gtk, qt, motif ) must be met * Cannot continue with install due to the errors indicated above
And just think, all that without resorting to convoluted and incomprehensible set theory.