mutex-flags
Oleg Grenrus
oleg.grenrus at iki.fi
Wed Jul 19 09:08:02 UTC 2017
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 at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/cabal-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/cabal-devel/attachments/20170719/bc3ae274/attachment.sig>
More information about the cabal-devel
mailing list