new Library Infrastructure spec.

Arie Peterson ariep at xs4all.nl
Fri Jun 4 18:10:01 EDT 2004


At 18:12 2004-06-03 -0400, Isaac Jones <ijones at syntaxpolice.org> wrote:
>We're trying to give the end users (and tools that may be layered on
>top of the packaging system) a consistent interface to packages whose
>needs and underlying implementations are very different.  (Think of
>the different kinds of needs between HUnit and wxHaskell).
>
>Now Distribution.Simple is a particular implementation of this
>interface which is meant for very simple libraries and tools.
>
>What you propose to provide is a secure infrastructure for building
>and installing very simple libraries and tools, but not providing a
>common interface across diverse libraries and tools.  I feel that this
>is a completely different goal.  (I also think that if this is what's
>desired, the user is better off using a packaging system that has more
>guarantees, and not installing code from untrusted sources at all (see
>my work in "apt-secure" btw) but that's neither here nor there.)

I do not understand why a strictly defined data structure would not be a 
common interface, and why a (for ignorant windows users like me, at least) 
obscure and opaque makefile would.
Do you mean by 'interface' the way in which a user invokes the 
installation? I would like to be able to choose whether I type "make 
install" myself, let a linux package manager handle that for me, or perhaps 
use some customised homemade install manager to give me exactly the 
information and options I want. Alex' idea of an installation data 
structure suits that wish perfectly. As mentioned before, it would be 
particularly nice to know what files/directories are to be modified or added.

>Distribution.Simple provides some mechanisms for making Angela's life
>easier, especially with very simple libraries. Now say Angela has a
>library that uses Distribution.Simple, but she's altered it to utilize
>the Happy preprocessor, and (let's say) Distribution.Simple doesn't
>know anything about Happy.  Now Angela can add a "system" call to her
>Setup file to preprocess what she needs to, and continue using the
>rest of the Distribution.Simple mechanism she was using before.
>
>In the StaticSetup scheme, Angela is out of luck.  She can't change
>the behavior of StaticSetup to do the right thing, so she has to get
>rid of her build system altogether and start from scratch with
>makefiles or something.  This is what we want to avoid.

If the preprocessor is to be executed by the user, then this is just a 
dependency and can be listed as such in the install structure.
If the preprocessor is to be executed by Angela, then she does so happily 
(sorry ;-)) and the user need not know that a preprocessor was used.
Am I missing the point?


Let me suggest a different approach.

We could define a Setup/Installation monad, together with some some 
primitives (display a message, ask for user input, move files, check 
dependencies, request installation of other packages, etc.). One special 
primitive might be 'IO', containing an arbitrary IO operation, to 
accommodate installation actions that cannot be defined in terms of the 
given primitives.

A package description/installation might consist of a haskell data 
structure, holding some basic properties of the package and a Setup () 
structure.
This package structure may be distributed:
1. as haskell source code alone, to allow users to install the package with 
their own customised installer or a default ghc installer;
2. in source form with an installer that the user may or may not use;
3. compiled by the author with her installer to produce a binary executable 
installer.

Notice that an 'installer' in this context is a haskell program, typically 
run with hugs or ghci (unless dynamic linking will be widely supported), 
that merely has a Setup () as a parameter and interprets this structure on 
the fly, in a way that the author of the installer thinks best: install the 
package in the right directory, do or do not download necessary libraries 
automatically, do or do not ask the user to authorise the IO parts, 
register the program with the compiler of choice, etc.. The installer might 
get settings from a conf file or bother the user with every detail - that 
is up to the author of the installer.


I feel somewhat awkward to suggest this wild idea, because the proposal 
seems well-thought out and quite mature.
So please convince me that this approach is useless :-).

Regards,

Arie



More information about the Libraries mailing list