He's not dead, he's resting
EAPI 2: !! Blockers
This is part three of a series of posts describing EAPI 2.
Blockers are a nuisance for end users. It’s rarely obvious how to fix them or what they mean, and getting it wrong can leave systems unusable.
There have been various proposals on how to fix this. For
exheres-0, we’re going to go with something like this:
DEPENDENCIES=" !app-misc/superfrozbinator [[ description = [ Can only have one frozbinator installed at once ] resolution = uninstall-blocked-after url = [ http://explain.example.org/?only-one-frozbinator ] ]] !dev-libs/icky [[ description = [ Having icky installed breaks the build process ] resolution = [ manual ] url = [ http://explain.example.org/?myfroz-hates-icky ] ]]"
The user can then be presented with a list of things that would need to be uninstalled to resolve blockers, along with clear descriptions of why they need to do so. Once the user has explicitly accepted the uninstalls, the package manager could then safely perform the installs.
Unfortunately, annotations aren’t something that can be implemented for Portage any time soon. Instead, Portage has gone with a fairly horrible and dangerous semi-automatic block resolution system that sometimes removes blocked packages automatically (often screwing up the user’s system in the process). Whilst doing so, Portage changed the meaning of EAPI 0 / 1 blockers from “this must not be installed when we do the build” to “this must be uninstalled after we do the build”.
EAPI 2 introduces a new kind of blocker using double exclamation marks, like
!!app-misc/other. This goes back to the old meaning of “this must not be installed when we do the build”, keeping
!app-misc/other for “this must be uninstalled after we do the build”.
This does not, unfortunately, make the user any safer, but it does allow packages that really can’t have something installed at build time to say so.