[Distutils] How can I create prebuilt distributions?

David Ascher DavidA@ActiveState.com
Fri Feb 14 15:25:57 2003

M.-A. Lemburg wrote:

> Ah, not being mean... it's just that I have asked so many
> times to make the code public and nothing ever happened.

The client code ships with ActivePython.  Feel free to look at it, and then 
tell me if you really want it =).  On the PPD-generation front, we basically 
define a new distutils target, and then do "python setup.py bdist_ppm" and 
then package the setup.py and the distributions subdirectories.  The details 
of bdist_ppm change periodically, and I know I've given that code to some 
people, I don't remember if I sent it to you.  Regardless, it's not a solid 
foundation for the future.

The fundamental problem is that people write setup.py's which aren't tested in 
the case where the "install" phase is done on a different machine than the 
build.  So the build phase may do lots of machine-specific checking and then 
the install phase breaks if e.g. Python is installed in a different directory, 
or it's built on win2k and installed on win9x, etc.  The way people manage 
'supplementary' files varies also a great deal between packages.  It's also 
very hard to do packages which install different things depending on what is 
available on the target machine.

I think that the "right" answer involves a _lot_ of work specifying and 
validating the definitions for the targets, _if that approach is to be used_. 
  I'm not 100% sure that that approach is the right one.  The bdist_wininst 
approach seems to work much better in practice, although I'm not sure that it 
covers all the cases that I wanted to cover (things getting installed in the 
Tools directory with proper shebang line tweaking, etc.).

> There has been some work put into a package directory recently
> (see http://www.python.org/peps/pep-0301.html) and registering
> .ppm like files in such a directory would sure make the Python
> experience an even better one :-)

Yes, I know about PyPI, and I'm definitely hoping that we'll be able to help 
provide PPM-style functionality for everything registered in PyPI.

> The system is missing the "get the stuff and install it" part
> (which is good, since its better to do this in small steps
> rather than coming up with big ideas and then losing interest).

One problem with how PyPPM has "happened" in the past has been that the people 
doing it at ActiveState either weren't knowledgeable enough about Python or 
distutils, or didn't have the bandwidth needed to effect the required changes 
in distutils or in people's setup.py's.  (I still think that shipping 
setup.pys as opposed to using a declarative syntax was a mistake, but that's 
water under the bridge, although maybe we could build a dam).

Distutils is a pretty scary beast, and build and installation is a nasty 
domain in general because there are so many different variations.  If I 
estimated how much time it would take to do PyPPM right from scratch, it would 
probably amount to six man-months of work of my best build engineer.  That's 
something that I need to justify with a business case, something that's harder 
than some people expect. =)  In the Perl world, PPM is a no-brainer for us to 
fund, because PPM is only practically available through ActivePerl, and we get 
a lot of business benefits by providing ActivePerl for free.  In the Python 
world, everytime we talk about doing PPM-style things with ActivePython, key 
people say "I don't care about ActivePython, make it open source so that we 
can add it to the core"  (note that ActivePython users don't say that =). 
While I completely understand the reaction, I'm sure you can understand that 
it makes the business case quite tricky.

The good news is that we're reviewing our PPM strategy, and that we may be 
able to approach the problem in more effective ways than we have in the past. 
  I think that PyPI will help as well because it provides a centralized point 
by which we can e.g. contact all of the maintainers.  We could also presumably 
add functionality to the PyPI server that validates whether one can make a PPD 
out of the package, etc.

I'm willing to spend some time talking about this, just not able to commit to 
spending significant development time or promise deliverables.