Hello there,

In the last days, I have been fighting against || ( ) dependencies.
Here are the most common use cases:
— virtuals
— autotools.exlib (and similar slotted tools like vala.exlib)
— ffmpeg vs. libav
— vim vs. gvim
— cdrtools and friends
— ruby vs. rake/rubygems
— text-based browsers
There are a few other cases but I am not familiar enough with these so I will focus on the list above before “fixing” corner cases.

From bottom to top:
The last cases (from vim to text-based browsers) can be solved with virtuals quite easily. I will just wait for the virtuals case to be decided to update them.


The ffmpeg vs. libav case is a bit more tricky. I will need the answer to one question to decide here: can you *always* runtime-switch between libav and ffmpeg? IOW, are some packages using build-time #ifs to use them?
If we *can* runtime-switch, a virtual is good here too.
If we *cannot*, here are two and a half solutions:
1. a slot-based virtual. With a := slot dependency, that would force people to rebuild packages if they change from libav to ffmpeg
2. use [ffmpeg] and [libav] on each package, two variants here:
a. make them mutually exclusive (but this is not DEFAULT_SRC_CONFIGURE_*-friendly, unless we add something to handle that choose-between -two-implementations case, which is quite common) b. make [libav] prefer libav over ffmpeg, while [ffmpeg] is always “use that feature” (which may confuse people for packages non-libav-aware that will lead to a blocker)


The autotools.exlib case can be solved in two ways:
1. a new annotation "|| ( ) [[ selection = first-unmasked ]]"
2. always use the best slot available (which would simplify a lot of things)

With 1., we can simplify the resolver work by always picking the best version while the use is still able to mask newer slots to keep only one (older) slot installed.
With 2. we just force everyone to have all the needed slots installed.


Last but not least, the virtuals. Simple: || ( ) dependencies in virtuals need to die. The elegant solution came from Ciaran: option-driven virtuals. You will find attached to this email an example. The first part is such a virtual created by hand. The second part is the same virtual using virtual.exlib to fill MYOPTIONS and DEPENDENCIES automatically. The last part is the resulting "cave show -c".
Which solution (manual or exlib) do you prefer, or do you have another idea?


Of course, I will happily update everything we have currently to the new decided style.

Comments and questions are welcome.


Cheers,

--

Quentin “Sardem FF7” Glidic
Manual virtual/notification-daemon.exheres-0:
# Copyright 2009 Mike Kelly
# Copyright 2013 Quentin "Sardem FF7" Glidic <[email protected]>
# Distributed under the terms of the GNU General Public License v2

SUMMARY="virtual for notification-daemon providers"

PLATFORMS="~amd64 ~x86"
MYOPTIONS="
    ( virtuals:
        awesome                  [[ description = [ Use Awesome as a 
notification daemon (with the naughty library) ] ]]
        dunst                    [[ description = [ Use dunst as a notification 
daemon ] ]]
        eventd                   [[ description = [ Use eventd as a 
notification daemon ] ]]
        gnome-shell              [[ description = [ Use GNOME-Shell as a 
notification daemon ] ]]
        kde-runtime              [[ description = [ Use KDE as a notification 
daemon (with knotify) ] ]]
        notification-daemon      [[ description = [ Use notification-daemon as 
a notification daemon ] ]]
        notification-daemon-xfce [[ description = [ Use 
notification-daemon-xfce as a notification daemon ] ]]
        notify-osd               [[ description = [ Use Notify-OSD as a 
notification daemon ] ]]
    ) [[ number-selected = exactly-one ]]
"

DEPENDENCIES="
    virtuals:awesome? ( x11-wm/awesome[>=3.1] )
    virtuals:dunst? ( x11-apps/dunst )
    virtuals:eventd? ( net/eventd[dbus] )
    virtuals:gnome-shell? ( gnome-desktop/gnome-shell )
    virtuals:kde-runtime? ( kde/kde-runtime )
    virtuals:notification-daemon? ( x11-apps/notification-daemon )
    virtuals:notification-daemon-xfce? ( xfce-extra/notification-daemon-xfce )
    virtuals:notify-osd? ( x11-apps/notify-osd )
"

exlib virtual/notification-daemon.exheres-0:
# Copyright 2009 Mike Kelly
# Copyright 2013 Quentin "Sardem FF7" Glidic <[email protected]>
# Distributed under the terms of the GNU General Public License v2

VIRTUAL_PACKAGES=(
    'x11-wm/awesome[>=3.1] Awesome with the naughty library'
    'x11-apps/dunst dunst'
    'net/eventd[dbus] eventd'
    'gnome-desktop/gnome-shell GNOME-Shell'
    'kde/kde-runtime KDE with knotify'
    'x11-apps/notification-daemon notification-daemon'
    'xfce-extra/notification-daemon-xfce notification-daemon-xfce'
    'x11-apps/notify-osd Notify-OSD'
)
require virtual [ usage="as a notification daemon" ]

SUMMARY="virtual for notification-daemon providers"

PLATFORMS="~amd64 ~x86"
MYOPTIONS=""

DEPENDENCIES=""

$ cave show -c notification-daemon::arbor
* virtual/notification-daemon::arbor
    ::arbor                   0(~)* {:0}
    virtual/notification-daemon-0:0::arbor
    Homepage
    Summary                   virtual for notification-daemon providers
    Options
        virtuals
            -awesome          Use Awesome as a notification daemon (with the 
naughty library)
            -dunst            Use dunst as a notification daemon
            -eventd           Use eventd as a notification daemon
            -gnome-shell      Use GNOME-Shell as a notification daemon
            -kde-runtime      Use KDE as a notification daemon (with knotify)
            -notification-daemon Use notification-daemon as a notification 
daemon
            -notification-daemon-xfce Use notification-daemon-xfce as a 
notification daemon
            -notify-osd       Use Notify-OSD as a notification daemon
        Build Options
            symbols=compress  How to handle debug symbols in installed files
                              Permitted values:
                                  compress:  Split and compress debug symbols
                                  preserve:  Preserve debug symbols
                                  split:     Split debug symbols
                                  strip:     Strip debug symbols
            jobs=5            How many jobs the package's build system should 
use, where supported
                              Should be an integer >= 1
            -dwarf_compress   Compress DWARF2+ debug information
            recommended_tests Run tests considered by the package to be 
recommended
            -trace            Trace actions executed by the package (very 
noisy, for debugging broken builds only)
            work=tidyup       Whether to preserve or remove working directories
                              Permitted values:
                                  leave:     Do not remove, but allow 
destructive merges
                                  preserve:  Preserve the working directory
                                  remove:    Always remove the working directory
                                  tidyup:    Tidy up work directory after a 
successful build
    Dependencies
                              (
                                  virtuals:awesome? (
                                      x11-wm/awesome[>=3.1]
                                  )
                                  virtuals:dunst? (
                                      x11-apps/dunst
                                  )
                                  virtuals:eventd? (
                                      net/eventd[dbus]
                                  )
                                  virtuals:gnome-shell? (
                                      gnome-desktop/gnome-shell
                                  )
                                  virtuals:kde-runtime? (
                                      kde/kde-runtime
                                  )
                                  virtuals:notification-daemon? (
                                      x11-apps/notification-daemon
                                  )
                                  virtuals:notification-daemon-xfce? (
                                      xfce-extra/notification-daemon-xfce
                                  )
                                  virtuals:notify-osd? (
                                      x11-apps/notify-osd
                                  )
                              ) [[ defined-in = [ virtual.exlib ] ]]
    Downloads
        Overridden Masks
            Supported platforms ~amd64 ~x86

_______________________________________________
Exherbo-dev mailing list
[email protected]
http://lists.exherbo.org/mailman/listinfo/exherbo-dev

Reply via email to