Bernd Steinhauser wrote:

> Tiziano Müller schrieb:
>> Bernd Steinhauser wrote:
>> 
>>> Tiziano Müller schrieb:
>>>> Hi everyone
>>>>
>>>> I'd like to bring bug #229521 to your attention and see whether we can
>>>> come up with a solution for it.
>>>>
>>>> The problem:
>>>> A package "foo" depends on a slotted package "bar" _and_ more than one
>>>> slot of "bar" can satisfy this dependency.
>>>>
>>>> Why this is a problem:
>>>> If the dependency looks like one of the following:
>>>> * DEPEND=">=cat/bar-2"
>>>> * DEPEND="<=cat/bar-3"
>>>> * DEPEND="|| ( cat/bar:2 cat/bar:3 )
>>>> then the package manager doesn't know after building "foo" which slot
>>>> of "bar" has been used to build "foo". On the other hand might this
>>>> information be needed to debug problems with package "foo".
>>>>
>>>> The problem gets even worse as soon as RDEPEND comes in:
>>>> (assuming the same examples from above but with RDEPEND)
>>>> * The package manager currently doesn't record which slot has been used
>>>> and can't therefore track whether the user will destroy something in
>>>> case he uninstalls one of the slots of "bar"
>>>> * The package manager can't sanely consider whether an update for a
>>>> slot is actually needed
>>> There is a section in PMS, that tries to address this.
>>>
>>> =================
>>> Slot Dependencies
>>> A named slot dependency consists of a colon followed by a slot name. A
>>> specification with
>>> a named slot dependency matches only if the slot of the matched package
>>> is equal to the slot
>>> specified. If the slot of the package to match cannot be determined
>>> (e.g. because it is not a
>>> supported EAPI), the match is treated as unsuccessful.
>>> An operator slot dependency consists of a colon followed by one of the
>>> following operators:
>>> * Indicates that any slot value is acceptable. In addition, for runtime
>>> dependencies, indicates
>>> that the package will not break if the matched package is uninstalled
>>> and replaced by a
>>> different matching package in a different slot.
>>> = Indicates that any slot value is acceptable. In addition, for runtime
>>> dependencies, indicates
>>> that the package will break unless a matching package with slot equal to
>>> the slot of the
>>> best installed version at the time the package was installed is
>>> available. To implement the equals slot operator, the package manager
>>> will need to store the slot of the
>>> best installed version of the matching package. The package manager may
>>> do this by appending
>>> the appropriate slot after the equals sign when saving the package?s
>>> dependencies. This syntax
>>> is only for package manager use and must not be used by ebuilds.
>>> =================
>>>
>>> So, if you go with that, the dependency would look like this:
>>> DEPEND=">=cat/bar-2:="
>>>
>>> That means, that it accepts any slot of versions above version 2, but
>>> restricts it to the slot it has been built against, at runtime.
>>> The combination of >= and := might look a bit ugly, so maybe it might
>>> indeed be useful to specify a way to provide a list of slots.
>>> But it would work in most cases.
>> 
>> hmm, this is kdebuild-1...
> Indeed, but it is a proposal.
> 
>> I miss two things here:
>> a) What happens in case of DEPEND="", RDEPEND=">=cat/bar-2:=" ? Is that
>> defined? If yes, what does it mean? If not, what shall be the package
>> managers behaviour?
> I don't think, that RDEPEND matters here.
> If a dep is not in DEPEND, that means, that it doesn't affect the build
> process of the package. So in case the dep spec matches more than one
> slot, the package should be able to use both without a rebuild.
> (Which means, that the package manager can switch the dep.)
> If changing the slot would mean, that a rebuild is required, then the
> dep affects the package at build time and should be in DEPEND.
Oh, my point is much simpler:
The kdebuild-1 spec says: "[...] that the package will break unless a
matching package with slot equal to the slot of the best installed version
at the time the package was installed is available."
But: RDEPEND doesn't have to be evaluated before installing the package and
DEPEND doesn't contain this package. So, there is no record of such a
package. What now?

> 
>> b) It is not said that a package depending on "|| ( cat/bar:2 cat/bar:3
>> )" then really uses cat/bar:3 if available, it might as well use
>> cat/bar:2 for one reason or another. It might be clearer if we have slots
>> named "stable", "unstable". In such a case a package depending on cat/bar
>> might decided to use cat/bar:stable if available instead of
>> cat/bar:unstable. So, the spec should either state that the package must
>> use the best matching version or we need another way for such cases, like
>> a function to explicitly tell the pm which slot has been used.
> Not sure if that is a good idea, because you would expect, that those
> slot assignments (assuming you mean stable and unstable as list of
> slots) get changed if a different slot is now "stable" and that would
> break previous assignments.
> BTW, you can already name a slot unstable-2 or similar. KDE 4.0 has slot
> kde-4, for example.
I know :-)

> Regarding the || ( cat/bar:2 cat/bar:3 ) construction, if a package
> manager chooses one out of the two, it should restrict the package to
> this dep at runtime.
Hmm, this is the point: What happens if the package chooses cat/bar:2 to
link against and the package manager records cat/bar:3 since it assumes
this is the better match? Is it it allowed to do the following (it's an
example):

DEPEND="|| ( sys-libs/db:4.5 sys-libs/db:4.6 )"

pkg_setup() {
    DB_VER=""
    # both major versions work but prefer 4.5 if available
    has_version "sys-libs/db:4.5" && DB_VER="4.5"
}

Questions:
a) should DEPEND be valid?
b) will has_version evaluate to true?
c) how will the pm know that the package chose sys-libs/db:4.5
d) should this be allowed or not?
e) if yes, can the package tell the pm about the choice?

> Not sure how the several package managers handle this, tbh.

>> I think that problem a) is a bit nasty, but it might become better if
>> we'd split the dependency variables into DEPEND, RDEPEND, C(OMMON_)DEPEND
>> (where the last one would be used for packages needed at compile time and
>> runtime).
> I would rather vote for labels, which clear the whole dependency thing
> up a bit and doesn't splatter them over several vars.
> Unfortunately that is not compatible with the current way of specifying
> deps.

Labels as proposed by kdebuild-1 are only for PDEPEND, right?


-- 
gentoo-dev@lists.gentoo.org mailing list

Reply via email to