Whenever you choose to install or upgrade a package in aptitude, aptitude makes an immediate attempt to resolve any of its dependencies that are not fulfilled. For each unsatisfied dependency (either a “Depends”, a “Recommends”, or a “Conflicts”), it performs the following steps:
If the dependency is a recommendation, aptitude tries to guess whether it is a “new” recommendation or a “previously satisfied” recommendation. aptitude considers a recommendation to be “new” if the package declaring the recommendation is not currently installed, or if its installed version does not recommend a package of the same name. On the other hand, a recommendation is “previously satisfied” if the package declaring the recommendation is installed, the currently installed version recommends a package of the same name, and that recommendation is currently fulfilled.
For example: suppose that version 1.0
of prog
recommends version
4.0
of libcool1
,
but version 2.0
of
prog
recommends version
5.0
of libcool1
,
and also recommends apache
. If you
choose to upgrade prog
from version
1.0
to version
2.0
, the recommendation of
apache
will be considered to be
“new” because version
1.0
of prog
did
not recommend apache
. On the other
hand, the recommendation of libcool1
is not “new”, because
version 1.0
of
prog
recommended
libcool1
, even though it recommended
a different version. However, if
libcool1
is installed, then that
recommendation will be considered to be
“previously satisfied”.
If the configuration option APT::Install-Recommends
is true
, aptitude will always
attempt to fulfill “new” and
“previously satisfied” recommendations; all
others will be ignored by immediate resolution. If that
option is false
, immediate dependency
resolution will ignore all
recommendations.
If the dependency is on several packages combined with
OR, examine each of the alternatives in the order that
they are given. For instance, if a package depends on
“exim |
mail-transport-agent
”, aptitude will
first process exim
, then
mail-transport-agent
.
For each alternative, attempt to resolve it. If the dependency is a conflict, remove the current alternative if it is installed (and for an unversioned conflict, also remove any package providing the target of the conflict). Otherwise, install the candidate version of the current alternative if it satisfies the dependency. If not, or if there is no candidate version (for instance, because the current alternative is a virtual package), and if the dependency is unversioned, attempt to install the highest-priority package[12] whose candidate version provides the target of the current alternative.
For instance, say we are attempting to resolve
“Depends: exim |
mail-transport-agent
”. aptitude will
first attempt to install the package
exim
. If exim
is
not available, aptitude will then attempt to install
the highest-priority package whose candidate version
provides exim
. If there is no such
package, aptitude will install the highest-priority
package whose candidate version provides the virtual
package mail-transport-agent
. On the
other hand, suppose that the dependency is
“Depends: exim (>= 2.0.0) |
mail-transport-agent
”, but only version
1.0
of exim
is
available. In this case, aptitude will not install
exim
(because the version does not
match), nor will it attempt to install packages
providing exim
(because virtual
packages cannot match a dependency with a version
restriction). Thus, aptitude will fall back to
installing the highest-priority package whose candidate
version provides
mail-transport-agent
.
If a package was installed by the previous step, resolve its dependencies using this algorithm, then stop.
While this technique very often solves all the outstanding package dependencies, it can fail in a number of common circumstances.
Conflicts are resolved by removing the package that is the target of the conflict. But now other packages that depend on this package have unresolved dependencies; the immediate resolver makes no attempt to fix them.
A dependency might not be satisfiable due to version
restrictions and due to the limitation that only
candidate versions are considered. For instance, say
that versions 1.0
and
2.0
of fileutils
are available, that the candidate version is
1.0
, and that the package
octopus
declares a dependency
“Depends: fileutils (>=
2.0)
”. Immediate resolution is unable
to resolve this dependency: it will never consider
version 2.0
of the package, since
that is not the candidate version.
The interactive dependency resolver can solve these situations and more. When there are broken dependencies left over, or when immediate dependency resolution is disabled, the interactive resolver will automatically start searching for a solution. The next section describes how to use the interactive dependency resolver.