Hi,

I proposed multiway flags about a year ago [1].
With that you could write:

    flag xx
      values: a, b, c, d
     
    if flag(xx == a)
      build-depends: xx-a
    if flag(xx == b)
      build-depends: xx-b
    if flag(xx == c)
      build-depends: xx-c
    if flag(xx == d)
      build-depends: xx-d

The benefits over your proposal, is that there's only one flag!

The alternatives mentioned in the issue [1] consider only automatic flags,
but now as I think about, manual multiway flags can be useful too.

---

For complex "multiway" selection example see:

http://hackage.haskell.org/package/functor-classes-compat-1/functor-classes-compat.cabal

The idea is that with two flags (transformers-1 and transformers-2) you have
already 4 combinations, so you don't need 4 flags.
That's not intuitive interface for manual flags though.

(There the "elif" syntax would help, which I'll add to Cabal for GHC-8.4)

---

Another way to write "mutex" is (with three flags: a, b, c):

  -- at least one:
  if !(flag(a) || flag(b) || flag(c))
  -- at most one:
  if flag(a) && flag(b)
     build-depends: base<0
  if flag(a) && flag(c)
     build-depends: base<0
  if flag(b) && flag(c)
     build-depends: base<0

That's tedious to go thru all pairs, but quite straightforward.
And can live in a separate block from where the actual flag-logic is
defined.

The same trick can be used with two-flags for three options:

    if flag(xx-1)
      if flag(xx-2)
        -- option 1
      else
        -- option 2
    else
      if flag(xx-2)
        -- option 3
      else
        build-depends: base<0

It's also discussed to add explicit

   fail: Unsupported configuration

so we don't need to use unsatisfiable "base<0" constraint.

- Oleg

[1]: https://github.com/haskell/cabal/issues/3526

On 19.07.2017 04:50, Lee John wrote:
> I think the mutex flags might be needed. For example, if my program use 
> accelerate and I want my program can use both of cuda, llvm, (etc) as the 
> backend for accelerating, I need to write a lot of if-statements in cabal 
> file to control that there will be only one backend to be used. So I think 
> that mutex-flags might be useful.
>
> For example:
>
> …
> flag a
> default: False
> flag b
> default: False
> flag c
> default: False
> flag d
> default: False
> ...
> exec…
> …
> if flag(a) && !flag(b) && !flag(c) && !flag(d)
>       build-depends: xx-a
>
> …
> if !flag(a) && flag(b) && !flag(c) && !flag(d)
>       build-depends: xx-b
>
> …
> if !flag(a) && !flag(b) && flag(c) && !flag(d)
>       build-depends: xx-c
>
> …
> if !flag(a) && !flag(b) && !flag(c) 
>       build-depends: xx-d
> …
>
> The above codes are also hard to maintain or extend. Following codes will 
> better.
>
> …
> flag a
> default: False
> flag b
> default: False
> flag c
> default: False
> flag d
> default: False
> mutex 
> flags: a b c d
> default: d
> …
>
> if flag(a)
> build-depends: xx-a
>
> if flag(b)
> build-depends: xx-b
>
> if flag(c)
> build-depends: xx-c
>
> if flag(d)
> build-depends: xx-d
> ...
> _______________________________________________
> cabal-devel mailing list
> cabal-devel@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/cabal-devel


Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
cabal-devel mailing list
cabal-devel@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/cabal-devel

Reply via email to