Re: mutex-flags

2017-07-19 Thread Oleg Grenrus
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




signature.asc
Description: OpenPGP digital signature
___
cabal-devel mailing list
cabal-devel@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/cabal-devel


mutex-flags

2017-07-18 Thread Lee John

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