Library Infrastructure code & help wanted

Simon Marlow simonmar at
Thu Jan 22 10:04:44 EST 2004

> > Having a single package database for all Haskell 
> implementations seems a
> > hard thing to implement: when GHC is installed, it will 
> have to check
> > whether the database and haskell-config already exist, and 
> similarly for
> > the other Haskell implementations.  When a Haskell system is
> > deinstalled, it has to decide whether to de-isntall 
> haskell-config and
> > the package database.  
> I don't think that's so bad.  Figuring out if a package database
> already exists should be a matter of having an agreed upon
> System.Directory.systemConfigDir.  Then maybe the package database
> itself can tell you where to find haskell-config.

What about multiple versions of GHC installed on a system, each with
different sets of packages installed?  Can I still install GHC in my own
home directory, without needing to modify files in /etc?

> I think that the compilers / interpreters installed on the system will
> also be stored in the "package config" database.  If you're
> deinstalling yourself, the package database can tell you whether
> you're the only compiler left and thus whether to get rid of
> haskell-config.
> That said, I think there are still issues with having a single package
> database, for instance, what if a package configuration for one
> Haskell Implementation has a field that conflicts with the package
> configuration for another implementation.  Yuck!  But maybe that won't
> come up.  For instance, right now there are separate flags for ghc,
> nhc, and hugs opts, and probably there should be flags for 
> shared opts.

Also, there doesn't seem to be provision in the package configuration
for naming libraries specific to a particular implementation (eg. to use
this package on GHC you must link in libHSwibble.a from /foo/bar, but on
nhc98 you link in libHSnhc_wibble.a from ...).  It seems to me that
every field needs to be duplicated for each compiler installation;
either that or you could put the compiler name in the package
identifier, so you'd have packages like "ghc-6.2-base-1.0",

Incedentally, GHC never uses the extra_ghc_opts in the package
configuration.  In fact, I don't think it should be there: it doesn't
make sense in conjunction with auto packages (if I don't know whether
I'm using a package or not, I don't know whether to add the flags).  The
flags fields should be disabled if auto is True.

> > I'd rather just admit that the Haskell systems are 
> separate, and each
> > provides its own implementation of Distribution.Package.  Yes, this
> > means that if you run Setup.lhs with Hugs it is different 
> than running
> > it with GHCi:  if I want to install a package for GHC I 
> have to run the
> > Setup.lhs script using GHC.
> I think this would dash my hopes of being able to install a package
> with a single command.  The idea so far has been to have some kind of
> haskell-interactive / runhugs-type executable /usr/bin/haskell which
> will execute the setup script to install and configure the package
> based on the already-installed compilers.

It doesn't prevent you doing this.  Here's how it might work:

  - Each compiler has their own package database, and their own
    implementation of Distribution.Package with an
    implementation-defined location for the package database(s).

  - There is a suite of tools, including haskell-config and
    /usr/bin/haskell, which are installed only once.
    These tools know about all the installed compilers on the
    system.  We could install these tools with a compiler, or
    separately; installs/deinstalls of compilers need to update
    some state so that the tools are aware.

  - /usr/bin/haskell could run the script it is given using
    each compiler on the system, if that's what you want.  eg.

    $ /usr/bin/haskell script.hs
    -- runs script.hs using the default compiler

    $ /usr/bin/haskell --all script.hs
    -- runs the script using each compiler on the system

    so to do an installation for all compilers, you say
    './Setup.lhs --all --install', assuming that Setup.lhs begins with

> Likewise, when you install a new compiler, it knows about what
> packages are there already for the other ones and might take a crack
> at building them for itself.
> This isn't so far fetched: elisp for emacs and xemacs already do
> something similar on Debian at least.

We can aim for this in the long term if you like - I still believe this
is something that the package management system should do for us,
though.  The end result is the same, and it's a lot less work.


More information about the Haskell-Cafe mailing list