Extending the dependency syntax
Simon Marlow
simonmar at microsoft.com
Thu Aug 11 06:07:59 EDT 2005
On 11 August 2005 04:38, Isaac Jones wrote:
> "Simon Marlow" <simonmar at microsoft.com> writes:
>
> (snip)
>> build-depends:
>> --enable-ghc? (
>> ghc>=6.4 ? [ghc64] |
>> ghc>=5.04 ? [ghc-old])
>> | --enable-hugs? [hugs]
>> | true ? true, -- other compilers are allowed
>> --enable-debug? (HUnit-1.0, [debug]) | true? [release]
>> --enable-gnome? (
>> libglade >= 2,
>> gtksourceview >= 0.6,
>> gconf >= 2, [gnome] ),
>> --enable-mozilla? ( mozilla >= 1.4, [mozilla] ),
>> --enable-doc? ( haddock >= 0.6 )
>
> What happens now with the issue that Duncan mentioned, where the built
> system picks up configuration information from the build / configure
> environment that's different from the user's environment? It could
> either pick up too much or too little. For "too little" we could use
> the --enable flags to override the detection mechanism, and maybe a
> --disable-all-detection mechanism similar to the -fhide-all-packages
> mechanism would be useful. One problem is that --enable-foo doesn't
> necessarily exist for optional dependencies.
The example I wrote above is deterministic: it doesn't pick up
dependencies from the environment and change its configuration
automatically (this isn't accidental). I'm going with the
derministic-dependencies-by-default approach, which seems better.
It's possible to write non-deterministic dependencies with this scheme.
Perhaps that's a problem.
A few messages back I mentioned that we might have an --auto-enable
switch to get back the handy non-deterministic behaviour. I can't
immediately see how to make it work (eg. we don't want --enable-debug
enabled automatically if HUnit is available). But I don't consider the
lack of --auto-enable to be a big deal - good OS packaging systems like
Gentoo provide this anway.
> Another point: The dependency syntax you show mixes packages and
> pseudo-packages like GHC, alex, etc... I don't think we should use the
> same syntax / field for this, since in reality, they have separate
> namespaces. In fact you might be insane enough to want to talk about
> them separately: maybe you have the haxml library installed, but not
> the haxml toolchain... maybe you want the ghc executable, but not the
> ghc package...
Ok, but separating these dependencies will mean that you can't combine
them. eg. you can say "if I have GHC 6.4 and wxHaskell then ... else
...". And separating them seems to make the system more complicated
rather than less... but I don't feel that strongly.
> We used to have a distinction between depends and build-depends, but
> we threw that away, I think because we weren't using the
> non-build-depends stuff at all... I note that having separate depends
> vs build-depends fields doesn't actually fix the above problems. BTW,
> are you suggesting that we change the meaning of depends and really
> adding a build-depends field?
I'm just suggesting extending the syntax of build-depends in a
backwards-compatible way.
> There are at least four kinds of simple dependencies, not taking into
> account configurations:
>
> 1) build-depending on packages - which is what depends: means now.
> This is always a build-time dependency.
>
> 2) build-depending on executables like GHC - that the simple build
> infrastructure knows about / needs. It would also be nice if we
> had a more sensible way of adding --with-foo= flags,
> extra-foo-opts, and configure-time detection for stuff in this
> category.
I put some thought into the --with-foo thing too, and Dimitry's
suggestion, but again I think we should deal with one thing at a time.
> 3) run-time depending on executables like gpg, gnome, etc. These are
> likely to be executables that Simple has never heard of before.
>
> 4) build-depending on stuff that the simple build infrastructure
> doesn't know about. This may not be very common, but folks not
> using Distribution.Simple may want to use this field to express
> dependencies too, so it would be nice if we could express
> build-time dependencies on non-package tools which we don't already
> know about.
>
> In reality, there are even more kinds :(
>
> The original request, I believe, was for better support of
> tool-depends mainly 2, but perhaps 3 and 4 are also important? 3 is a
> very common situation in Debian, and 4 is important for completeness
> for systems that don't want to use Distribution.Simple, and maybe for
> stuff like libglade?
My feeling is that Cabal's build-depends should deal with dependencies
that it needs to know about in order to build, install and register the
package. Everything else should be pushed into the OS-level packager.
> I have been thinking that Cabal should worry about 1 and 2 only, and
> let the OS package system worry about 3 and 4,
bingo :)
> but Duncan's
> requirements open the door to 3, and it's not going to be obvious to
> people that they can't talk about tools that Simple doesn't know
> about. In fact, it snuck into the above example. How the heck does
> Distribution.Simple know what version of Mozilla is installed? Maybe
> you didn't really mean that?
>
> But I do think that if we're overhauling the dependency syntax, we
> should think about all kinds of dependencies so we don't paint
> ourselves into a corner. 1 is the only kind that currently has a
> flexible infrastructure; 2 is done now, but can be sloppy sometimes;
> as I haven't always added --with-foo= flags when we need them and
> such.
>
> But how can we be flexible about 3 and 4? Are they important?
...
> Am I being too much of a perfectionist in trying to be complete here?
> Should we really just allow 1 and 2 and punt on the rest? Is it
> important to distinguish between 1 and 2?
They're definitely important when building an OS package from a Cabal
package, and we'd like to automate this process as much as possible.
Therefore it might be useful to have a consistent way to specify hints
to the OS packager, extra dependencies and so on. This might take the
form of a naming scheme for OS-packaging hint files, or extra sections
in the .cabal file.
I vote for punting on (3) and (4), but allowing hints to be provided for
passing these dependencies to the OS packager.
> Also, I'm not sure we're really doing gentoo a favor by making the
> dependency syntax so complex. I think Duncan wanted to be able to
> automatically parse the cabal file and figure out the dependencies for
> alex and such, but now he's faced with:
>
> --enable-mozilla? ( mozilla >= 1.4, [mozilla] ),
This one's easy: "mozilla? (>=mozilla-1.4)" (if I got the ebuild
syntax right). The GHC section reduces to >=ghc-5.04. The
--enable-debug section reduces to "debug? ( HUnit-1.0 )", or goes away
entirely if you don't care about debugging in the OS package.
Basically, the existing build-depends syntax is a subset of what Gentoo
allows, and I'm proposing a superset (modulo the lack of depdencies on C
libraries etc.). The .cabal->.ebuild generator would have to fail on
dependencies that it didn't understand - I don't think this is a huge
problem, since complex dependencies will be rare, and there will be a
way for the Cabal packager to provide hints to the .cabal->.ebuild
generator.
I don't think we should restrict ourselves to the lowest common
denominator of Gentoo, Debian, FreeBSD, RPM, etc.
Duncan, does this sound plausible?
Cheers,
Simon
More information about the Libraries
mailing list