[SM-Discuss] Circular dependencies between spells
Fredrik Carlström
fredrik.carlstrom at tele2.se
Mon Aug 25 11:07:48 EDT 2008
Hi
I've noticed some problems with circular dependencies between spells in
sorcery. For example casting pkgconfig and enabling the optional
dependency on glib2, will fail if pkgconfig isn't already installed.
This is because pkgconfig is a build time requirement for glib2, but
sorcery will try to install glib2 before pkgconfig. Is this a bug, or
isn't resolution of circular dependencies implemented in sorcery?
If the latter is the case, this is a sketch of a simple and perhaps
possible solution. Observe that I'm not familiar with how this is
currently done in sorcery, so this might be easy, hard or even
impossible to implement. There might be problems and that I'm not aware
of. Perhaps someone more familiar with sorcery than I, could take a look
at this and see if it's at all possible to do.
First, unconditional circular dependencies between packages (as for
example between tetex and tetex-texmf) would have to be resolved. The
only way this can happen (outside the tool chain) is if at least one is
a runtime dependency of the other. These must be labeled as such. To get
this solution to work, it is only needed in those rare cases where there
are an explicit unconditional circular dependence between packages.
We get:
runtime_depends Must be installed before or after this package.
depends Must be installed before this package is built.
optional_depends Must be installed before configuring and building
with this support.
While collecting spells for installation, runtime dependencies can be
treated as before. There will be no essential difference in the
collection of spells to cast. While casting spells, runtime dependencies
can be ignored.
The part that must be reimplemented is the casting of queued spells.
This can be done in two functions:
The first function will loop through the queue repeatedly and install
spells that have all build time dependencies fulfilled, until the queue
is empty.
function install(queue) {
while the install queue is nonempty {
for pkg in queue {
if all build time dependencies are fulfilled
cast pkg # and remove from the queue
dequeued=true
}
if not dequeued then forced_install(queue) # If there is a circular
blocking optional dependency
}
}
The second function forces an installation if there is a circular
blocking optional dependency
function forced_install(queue) {
search the queue after a package pkg with all unconditional
dependencies fulfilled,
and as few optional dependencies as possible
that are not installed
cast pkg # without the optional_depends from spells that are not
currently installed, but do NOT remove from the queue
}
Somewhere in this, self triggers and logging etc must be checked and
done as well. This is so that all the intricate internals of spell
casting are fulfilled.
If this could be implemented, the example with pkgconfig and glib2 would
be solved as follows:
First install(queue) will try to install glib2 and pkgconfig, but fail
miserably with both due to a circular dependency. Then forced_install
will cast pkgconfig without the optional support for glib2. After that
glib2 can be casted, and at last pkgconfig will be reinstalled with
support for glib2.
---
Fredik Carlström
More information about the SM-Discuss
mailing list