[Distutils] [Fwd: Re: Annoucing distribute project]

Phillip J. Eby pje at telecommunity.com
Sun Sep 28 15:08:40 CEST 2008

At 03:34 PM 9/26/2008, Ian Bicking wrote:
>I'm not sure I agree with removing setup.py, though I dislike how it 
>functions currently -- that you kind of have to poke it from the 
>side to get basic information out of it, instead of something more 
>declarative.  In some ways it's the distutils/setuptools interface 
>that most people actually use -- pyinstall for instance only calls 
>setup.py in subprocesses to install the package, and never touches 
>it directly.  So anything that acts fairly similar to the current 
>setup.py's will be compatible.  This is part of why I don't think 
>the backward compatibility issue is as difficult as Guido suggests.
>Though... really if pyinstall could easily detect a new source 
>format and only setup.py with the old source format, it wouldn't be 
>hard to support both.  There does need to be room for custom code, 
>but mostly for the build/compilation process.

The main reason to drop setup.py as the interface is to prevent 
people writing their own crazy command line "parsing" (e.g. probing 
sys.argv directly) and from trying to install stuff or do other 
things unconditionally in code that shouldn't be doing anything but 
configuration.  Having a 'configure.py' or some such would be a clear 
break with the past in this respect.

That is, a configure.py script would be there if and only if you 
needed dynamic metadata or build-spec generation, and it shouldn't be 
designed to run as a user-run script, but instead be invoked in a 
restricted way by build and install tools.  It should also be 
required to be sandboxable, in the sense that it should write to no 
files outside the build area.  It should also be well-understood that 
it is not to unconditionally import dependencies, nor assume that 
failure to import a dependency means the dependency isn't present.

(And if you don't have any dynamic metadata requirements, the package 
metadata and build specs should be able to be defined in 
non-executable configuration files, with no need for a configure.py.)

IOW, the main reason (IMO) to drop backward compatibility is 
precisely to get rid of setup.py and thus all of the crazy hairy 
things people do with it that they've got no business doing (because 
they can't accomplish what they need any other way, without first 
becoming an expert at distutils internals).

Meanwhile, legitimate *build* extensions can and should be restrained 
to *building*, rather than installing.  We can define a build 
directory layout for installers to use for actual installation, 
including various platform-specific elements (such as icons/menu 
items, registry stuff, post-install scripts, etc.) which it's then 
the responsibility of individual installer programs to handle.

I guess that means that we would need to spec out:

1. Source tree layout
2. Build configuration files/build processing
3. configure.py
4. sdist format & metadata
5. build tree layout (for build code to build and installers to install from)

But the basic idea is that the stdlib supplies the 
build-and-distribute framework, package authors can have build 
extensions, but only install programs can actually install or 
uninstall anything.  The build layout should be flexible enough to 
allow things like dumping Debian or RPM or MSI metadata in there, for 
"install" tools (which might technically be platform bdist tools) to pull out.

This is a rather important separation of duties, because right now 
bdist tools are responsible for build management and tricking 
"install" commands in order to do their work.  This makes it too hard 
for people to write bdist tools.  (And you can't even *think* about 
custom install tools with the distutils now.)

These elements would make it possible for the distutils to be divided 
up into more maintainable slices, that are owned by a much larger 
group of people, with much lower probability of burnout.  Given a 
stable build layout, install tools aren't likely to change 
much.  Given a stable source and build layout, build tools aren't 
likely to change much.  The hairiest bits (extension/compiler stuff) 
will have to be in stdlib anyway, and are fairly isolated within the 
overall process.

(I also think we should encourage the model pioneered in buildout and 
setuptools of keeping build extensions as separate packages from the 
things they're used to build, but I could be convinced that making it 
*possible* (but not necessarily easy) to include a build extension 
within a package that's using it, could *perhaps* be a reasonable idea.)

More information about the Distutils-SIG mailing list