[Distutils] How can I create prebuilt distributions?

David Ascher DavidA@ActiveState.com
Fri Feb 14 17:31:02 2003

Jack Jansen wrote:

> I'm interested. I'm working on a thing called the Package Install 
> Manager for Python (pimp) 

I'm going to say this just once.  Please change the name.  It's funny, but 
it's not 'serious'.  I told the Piddle folks the same thing, and they 
regretted not changing it after it was too late.  There, it's off my 
conscience =).

> right now. I was planning not to go into 
> design discussions until 2.3 is out and only at that time write up a PEP 
> or something, but as pimp is 90% done I guess I can spare the time. 

Funny -- not going into design discussions until after you're done =).

> But Mac users often don't have a development 
> environment, and even if they do having them type in distutils commands 
> isn't exactly considered good style. 

Absolutely.  Same problem w/ Windows

> So the idea behind pimp is that there is an online database of packages 
> that is specific to a (OS-version, python-version) combination and that 
> has a maintainer who is responsible for not adding only packages that 
> have been tested and tried. Preferably the database should have source 
> and binary version of all packages, so the end user can state a 
> preference for either. The database also has dependency information, and 
> bits of code so pimp can actively test whether a specific package is 
> installed into your python, etc etc. 

This is exactly what PPM was designed for, and it works (95% of the time) for 
Perl.  See e.g. http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/Packages

The way it works as a user is that if you have ActivePerl installed you can type

'ppm install Yada-Yada-Yada' and it will work (on Solaris only, according to 
the table above =).

We update that from CPAN regularly (now), using an automated build system.  We 
have two people dedicated to that at this time.  This is a non-trivial 
resource commitment, both in hardware and in personel.

The idea behind PyPPM is that we would do the same for Python.  The problems 
came about because, as everyone here known,

	- there is no CPAN (with the actual sources, not just a catalog)

	- for a long time, there was no distutils

	- even with distutils, the process is much harder than in Perl.
           I'm not 100% sure I understand why.  One hunch I have is that
           95% of CPAN is "strictly" modules.  No front-end tools, no
           Start Menu configurations, very little dependencies on third-party
           packages, etc.  (also, 90% of CPAN is junk IMO, but that's another
           problem ;-).

Regardless of what else you do, I suggest you consider the The Open Software 
Description Format: http://www.w3.org/TR/NOTE-OSD

PPD (the format used in PPM) is a slight derivative of that.

> I hope that people will appear who want to maintain the database, and 
> even if I have to do it myself it's still less of a bottleneck if I 
> don't have to do it at the same time of making sure everything in a new 
> Python release works.

That job is what ActiveState does for Perl for three platforms right now. 
Note that there's more to do than maintaining the database - there's building 
the packages and testing them (and in our case, serving them).

> If people want to have a look at pimp: it's in Lib/plat-mac/pimp.py. 
> It's probably MacOSX-specific right now, but that shouldn't be too 
> difficult to fix.

Famous last words =).

Seriously, though -- cross-platform setup.py's are hard to come by as soon as 
you deviate from pure Python modules.  They tend to fail if e.g. the versions 
of shared libraries installed are of different version.  Some setup.py's 
create scripts -- are those installed in Tools, in the base Python directory, 
where?  Are their shebang lines tweaked on install?  Do they even get 
mentioned in the manifest and put in the distribution directories?  Etc.

I'm not trying to criticize the authors of setup.py's, btw!  I just know from 
painful experience that building cross-platform build systems takes a _huge_ 
amount of time.  Unfortunately, the highest value Python packages tend to rely 
on extension modules (one exception to that general statement is platform.py, 
one of my favorite pure-python modules), and so it's the edge cases that cause 
the greatest grief on the user side.  For example, PIL is notoriously hard to 
build -- it's not because Fredrik is incompetent or mean -- it's because the 
number of combintions that have to be dealt with is large, and it's very hard 
to know when you're "done" except through slow, distributed, painful testing 
in the field.

Don't get me wrong -- I think it's great that you're doing this, but I want to 
suggest that you're not 90% done =).