[Distutils] thoughts on distutils 1 & 2 (addendum)

has hengist.podd at virgin.net
Wed May 19 18:07:02 EDT 2004


Stefan Seefeld wrote:

>>- Decoupling DU build procedures from DU installation procedures 
>>also implies delegating control of building and installing to 
>>separate scripts (e.g. 'build.py', 'install.py'), rather than 
>>having a single 'setup.py' script doing double duty.
>
>As others already pointed out, what you suggest doesn't really change
>anything: 'setup.py' is just a facade to access distutils' functionality.
>building and installing *is* already controlled by two distinct objects
>('commands').
>
>>Superficially this may sound like it's creating more(!) work for 
>>module developers, but bear in mind my goal of making these scripts 
>>more generic so that in most cases the module developer can simply 
>>[re]use existing ones rather than have to code new versions each 
>>time.
>
>what do you want to reuse that you can't right now ?

The 'setup.py' [or whatever you want to call it] script. Reduce the 
amount of code the module developer needs to write. For simple 
modules and packages, this could (and should) be zero.


>However, in order for 'build' and 'install' to work smoothly together,
>they both have to respect some conventions, for example use some common
>metadata format to share information about the things to be installed.

Of course.

My point is that some of this data shouldn't be in the setup scripts, 
and at least some of the rest should be automatically determined by 
the system rather than specified by the user (unless they need to 
override the automatics):

- Put metadata (by which I mean information describing the 
module/package itself; its name, version, author, dependencies, etc) 
into a standard metadata file, e.g. meta.txt, within the package.

- Put data/code used to build the distro into a build.py script. Put 
data/code used to install the distro into a install.py script.

i.e. There should be a clear distinction made between information 
describing the module and information used merely in 
building/installing it (custom paths, framework bindings, etc). These 
are two very different things and should be handled accordingly. 
[Note: any time I say 'metadata' I'm referring to the former, not the 
latter.]


With DU1, all this data is squidged into setup.py. This is 
suboptimal: it's not very convenient to read/edit, and there's some 
unnecessary duplication of metadata occurring over the build/install 
process as some of this data gets duplicated into PKG-INFO (which'd 
be unnecessary if it was put into a meta.txt file in the first place).

Often the only unique information stored in setup.py is said 
'metadata', which is really a suboptimal arrangement. (Plus stuff 
like sub-package names, which can and should be gotten rid of in 
most, if not all, cases.)

Maybe a practical example'd help:

Current:

	from distutils.core import setup

	setup(name = 'HTMLTemplate',
		version = '0.4.3',
		description = 'HTML templating engine.',
		author = 'HAS',
		author_email = '', # see Manual.txt
 
	url='http://freespace.virgin.net/hamish.sanderson/htmltemplate.html',
		license = 'LGPL',
		platforms = ['any'],
		long_description = 'HTMLTemplate converts 
XML/HTML/XHTML templates ...',
		py_modules = ['HTMLTemplate'],
		)


Suggested:

- meta.txt

	version
		0.4.3
	description
		HTML templating engine
	author
		HAS
	author email
		see Manual.txt
	url
		http://freespace.virgin.net/hamish.sanderson/htmltemplate.html
	license
		LGPL
	platforms
		any
	long description
		HTMLTemplate converts XML/HTML/XHTML templates ...


- install.py

	#!/usr/bin/env python

	from DU2 import install
	install()


- build.py

	#!/usr/bin/env python

	from sys import argv
	from DU2 import build
	build(argv[1], omit='\.pyc$')


Eliminating unnecessary duplication means the name shouldn't need to 
be declared more than once (i.e. the package folder name). The 
py_modules value is, by default, unnecessary. PKG-INFO is obsolete. 
README can be auto-generated (though I kinda wonder just how useful 
this really is and if it could be eliminated altogether). Both 
install.py and build.py are generic scripts: the former can be 
automatically inserted into the distro, the latter run from the shell 
as a standard build script.

It'll still scale up just as well as DU1, so that's not a concern. 
The aim here is to handle the simplest and [presumably] most common 
cases more cleanly.

HTH

has
-- 
http://freespace.virgin.net/hamish.sanderson/



More information about the Distutils-SIG mailing list