PEP 229 – Using Distutils to Build Python
- Author:
- A.M. Kuchling <amk at amk.ca>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 16-Nov-2000
- Python-Version:
- 2.1
- Post-History:
Table of Contents
Introduction
The Modules/Setup
mechanism has some flaws:
- People have to remember to uncomment bits of
Modules/Setup
in order to get all the possible modules. - Moving
Setup
to a new version of Python is tedious; new modules have been added, so you can’t just copy the older version, but have to reconcile the two versions. - Users have to figure out where the needed libraries, such as
zlib
, are installed.
Proposal
Use the Distutils to build the modules that come with Python.
The changes can be broken up into several pieces:
- The Distutils needs some Python modules to be able to build
modules. Currently I believe the minimal list is
posix
,_sre
, andstring
.These modules will have to be built before the Distutils can be used, so they’ll simply be hardwired into
Modules/Makefile
and be automatically built. - A top-level setup.py script will be written that checks the libraries installed on the system and compiles as many modules as possible.
Modules/Setup
will be kept and settings in it will overridesetup.py
’s usual behavior, so you can disable a module known to be buggy, or specify particular compilation or linker flags. However, in the common case wheresetup.py
works correctly, everything inSetup
will remain commented out. The otherSetup.*
become unnecessary, since nothing will be generatingSetup
automatically.
The patch was checked in for Python 2.1, and has been subsequently modified.
Implementation
Patch #102588 on SourceForge contains the proposed patch. Currently the patch tries to be conservative and to change as few files as possible, in order to simplify backing out the patch. For example, no attempt is made to rip out the existing build mechanisms. Such simplifications can wait for later in the beta cycle, when we’re certain the patch will be left in, or they can wait for Python 2.2.
The patch makes the following changes:
- Makes some required changes to distutils/sysconfig (these will be checked in separately)
- In the top-level
Makefile.in
, the “sharedmods” target simply runs"./python setup.py build"
, and “sharedinstall” runs"./python setup.py install"
. The “clobber” target also deletes thebuild/
subdirectory where Distutils puts its output. Modules/Setup.config.in
only contains entries for thegc
andthread
modules; thereadline
,curses
, anddb
modules are removed because it’s nowsetup.py
’s job to handle them.Modules/Setup.dist
now contains entries for only 3 modules –_sre
,posix
, andstrop
.- The
configure
script buildssetup.cfg
fromsetup.cfg.in
. This is needed for two reasons: to make building in subdirectories work, and to get the configured installation prefix. - Adds
setup.py
to the top directory of the source tree.setup.py
is the largest piece of the puzzle, though not the most complicated.setup.py
contains a subclass of theBuildExt
class, and extends it with adetect_modules()
method that does the work of figuring out when modules can be compiled, and adding them to the ‘exts’ list.
Unresolved Issues
Do we need to make it possible to disable the 3 hard-wired modules without manually hacking the Makefiles? [Answer: No.]
The Distutils always compile modules as shared libraries. How do we support compiling them statically into the resulting Python binary?
[Answer: building a Python binary with the Distutils should be
feasible, though no one has implemented it yet. This should be
done someday, but isn’t a pressing priority as messing around with
the top-level Makefile.pre.in
is good enough.]
Copyright
This document has been placed in the public domain.
Source: https://github.com/python/peps/blob/main/peps/pep-0229.rst
Last modified: 2023-09-09 17:39:29 GMT