On 10/26/06, Duncan Coutts <duncan.coutts@worc.ox.ac.uk> wrote:
On Wed, 2006-10-25 at 22:19 -0500, Brian Smith wrote:
> * What happens when multiple configurations apply?:
>
> Configuration: True
> Build-depends: foo-1.0
>
> Configuration: True
> Build-depends: foo-1.0
>
> I think that if more than one condition applies, then configuration
> should fail with an error.
I think it's important that mutliple configurations can apply at once.
So then the question is how do we interpret additions to fields, eg do
we interpret them as sets or multi-sets. I think we'll have to say that
the order in which the flags are added is undefined (eg for things like
cc-options).
> * You mentioned the case where a using(x) expression conflicts with a
> build-depends:
> Configuration: using(foo = 1.0)
> Build-depends: foo = 2.0
> It seems to me that:
> using(foo = x) == !(available foo > x),
> using(foo > x) == (available foo > x),
> using(foo < x) == !(available foo >= x),
> because of Cabal's "use the latest available version" policy.
They're not the same. If the latest versions of each package do not
satisfy the constraints then Cabal may have to pick different versions
and then the above do not hold.
Additionally, there's no reason why Cabal should not be extended to
allow users to build against older versions of libs they have installed,
eg for testing purposes or because they know only the older version is
available on some site where they intend to deploy.
> If all usages of using(x) can be replaced with available(f(x)), then
> I think it would be better to just get rid of using(x) and allow
> available(x) in both fexp's and cexp's, for consistency. However, I
> know that you do not want to do that, because you don't want
> available(x) allowed in cexp's. As you noted previously in the thread,
> using(x) seems to cause a lot of complications--is it really
> necessary? I think your example of using(x) is easily rewritten to not
> require it:
But even if using is equal to some available expression in normal
circumstances, there's still a reason for using rather than available,
which is that using is less expressive. It doesn't allow packages to
automatically pick up dependencies merely because they're available in
the environment. This is one of the main points of the design. Anything
like that has to go via a flag, which is then controllable by the user
or package manager.
> * Your example used [ os(windows) ]. However, the value for
> System.Info.os is usually "mingw32" or "cygwin" (or similar) on
> Windows. I think that the os() and arch() values should be consistent
> with System.Info whenever possible.
You're probably right, though that in it self needs resolving since
people do need reliable tests for being on windows.
(os(mingw32) || os(mingw64) || os (cygwin)) starts to get a little
unwieldy.