python-peps/pep-0229/index.html

220 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<title>PEP 229 Using Distutils to Build Python | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0229/">
<link rel="stylesheet" href="../_static/style.css" type="text/css">
<link rel="stylesheet" href="../_static/mq.css" type="text/css">
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light">
<link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark">
<link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss">
<meta property="og:title" content='PEP 229 Using Distutils to Build Python | peps.python.org'>
<meta property="og:description" content="The Modules/Setup mechanism has some flaws:">
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0229/">
<meta property="og:site_name" content="Python Enhancement Proposals (PEPs)">
<meta property="og:image" content="https://peps.python.org/_static/og-image.png">
<meta property="og:image:alt" content="Python PEPs">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="description" content="The Modules/Setup mechanism has some flaws:">
<meta name="theme-color" content="#3776ab">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all">
<title>Following system colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="9"></circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all">
<title>Selected dark colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all">
<title>Selected light colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
</svg>
<script>
document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto"
</script>
<section id="pep-page-section">
<header>
<h1>Python Enhancement Proposals</h1>
<ul class="breadcrumbs">
<li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> &raquo; </li>
<li><a href="../pep-0000/">PEP Index</a> &raquo; </li>
<li>PEP 229</li>
</ul>
<button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())">
<svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg>
<span class="visually-hidden">Toggle light / dark / auto colour theme</span>
</button>
</header>
<article>
<section id="pep-content">
<h1 class="page-title">PEP 229 Using Distutils to Build Python</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">A.M. Kuchling &lt;amk&#32;&#97;t&#32;amk.ca&gt;</dd>
<dt class="field-even">Status<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Accepted and implementation complete, or no longer active">Final</abbr></dd>
<dt class="field-odd">Type<span class="colon">:</span></dt>
<dd class="field-odd"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd>
<dt class="field-even">Created<span class="colon">:</span></dt>
<dd class="field-even">16-Nov-2000</dd>
<dt class="field-odd">Python-Version<span class="colon">:</span></dt>
<dd class="field-odd">2.1</dd>
<dt class="field-even">Post-History<span class="colon">:</span></dt>
<dd class="field-even"><p></p></dd>
</dl>
<hr class="docutils" />
<section id="contents">
<details><summary>Table of Contents</summary><ul class="simple">
<li><a class="reference internal" href="#introduction">Introduction</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#implementation">Implementation</a></li>
<li><a class="reference internal" href="#unresolved-issues">Unresolved Issues</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
</details></section>
<section id="introduction">
<h2><a class="toc-backref" href="#introduction" role="doc-backlink">Introduction</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">Modules/Setup</span></code> mechanism has some flaws:</p>
<ul class="simple">
<li>People have to remember to uncomment bits of <code class="docutils literal notranslate"><span class="pre">Modules/Setup</span></code> in
order to get all the possible modules.</li>
<li>Moving <code class="docutils literal notranslate"><span class="pre">Setup</span></code> to a new version of Python is tedious; new modules
have been added, so you cant just copy the older version, but
have to reconcile the two versions.</li>
<li>Users have to figure out where the needed libraries, such as
<code class="docutils literal notranslate"><span class="pre">zlib</span></code>, are installed.</li>
</ul>
</section>
<section id="proposal">
<h2><a class="toc-backref" href="#proposal" role="doc-backlink">Proposal</a></h2>
<p>Use the Distutils to build the modules that come with Python.</p>
<p>The changes can be broken up into several pieces:</p>
<ol class="arabic">
<li>The Distutils needs some Python modules to be able to build
modules. Currently I believe the minimal list is <code class="docutils literal notranslate"><span class="pre">posix</span></code>, <code class="docutils literal notranslate"><span class="pre">_sre</span></code>,
and <code class="docutils literal notranslate"><span class="pre">string</span></code>.<p>These modules will have to be built before the Distutils can be
used, so theyll simply be hardwired into <code class="docutils literal notranslate"><span class="pre">Modules/Makefile</span></code> and
be automatically built.</p>
</li>
<li>A top-level setup.py script will be written that checks the
libraries installed on the system and compiles as many modules
as possible.</li>
<li><code class="docutils literal notranslate"><span class="pre">Modules/Setup</span></code> will be kept and settings in it will override
<code class="docutils literal notranslate"><span class="pre">setup.py</span></code>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 where <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> works correctly,
everything in <code class="docutils literal notranslate"><span class="pre">Setup</span></code> will remain commented out. The other
<code class="docutils literal notranslate"><span class="pre">Setup.*</span></code> become unnecessary, since nothing will be generating
<code class="docutils literal notranslate"><span class="pre">Setup</span></code> automatically.</li>
</ol>
<p>The patch was checked in for Python 2.1, and has been subsequently
modified.</p>
</section>
<section id="implementation">
<h2><a class="toc-backref" href="#implementation" role="doc-backlink">Implementation</a></h2>
<p>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 were certain the patch will be left in, or they can
wait for Python 2.2.</p>
<p>The patch makes the following changes:</p>
<ul class="simple">
<li>Makes some required changes to distutils/sysconfig (these will
be checked in separately)</li>
<li>In the top-level <code class="docutils literal notranslate"><span class="pre">Makefile.in</span></code>, the “sharedmods” target simply
runs <code class="docutils literal notranslate"><span class="pre">&quot;./python</span> <span class="pre">setup.py</span> <span class="pre">build&quot;</span></code>, and “sharedinstall” runs
<code class="docutils literal notranslate"><span class="pre">&quot;./python</span> <span class="pre">setup.py</span> <span class="pre">install&quot;</span></code>. The “clobber” target also deletes
the <code class="docutils literal notranslate"><span class="pre">build/</span></code> subdirectory where Distutils puts its output.</li>
<li><code class="docutils literal notranslate"><span class="pre">Modules/Setup.config.in</span></code> only contains entries for the <code class="docutils literal notranslate"><span class="pre">gc</span></code> and <code class="docutils literal notranslate"><span class="pre">thread</span></code>
modules; the <code class="docutils literal notranslate"><span class="pre">readline</span></code>, <code class="docutils literal notranslate"><span class="pre">curses</span></code>, and <code class="docutils literal notranslate"><span class="pre">db</span></code> modules are removed because
its now <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>s job to handle them.</li>
<li><code class="docutils literal notranslate"><span class="pre">Modules/Setup.dist</span></code> now contains entries for only 3 modules
<code class="docutils literal notranslate"><span class="pre">_sre</span></code>, <code class="docutils literal notranslate"><span class="pre">posix</span></code>, and <code class="docutils literal notranslate"><span class="pre">strop</span></code>.</li>
<li>The <code class="docutils literal notranslate"><span class="pre">configure</span></code> script builds <code class="docutils literal notranslate"><span class="pre">setup.cfg</span></code> from <code class="docutils literal notranslate"><span class="pre">setup.cfg.in</span></code>. This
is needed for two reasons: to make building in subdirectories
work, and to get the configured installation prefix.</li>
<li>Adds <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> to the top directory of the source tree. <code class="docutils literal notranslate"><span class="pre">setup.py</span></code>
is the largest piece of the puzzle, though not the most
complicated. <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> contains a subclass of the <code class="docutils literal notranslate"><span class="pre">BuildExt</span></code>
class, and extends it with a <code class="docutils literal notranslate"><span class="pre">detect_modules()</span></code> method that does
the work of figuring out when modules can be compiled, and adding
them to the exts list.</li>
</ul>
</section>
<section id="unresolved-issues">
<h2><a class="toc-backref" href="#unresolved-issues" role="doc-backlink">Unresolved Issues</a></h2>
<p>Do we need to make it possible to disable the 3 hard-wired modules
without manually hacking the Makefiles? [Answer: No.]</p>
<p>The Distutils always compile modules as shared libraries. How do
we support compiling them statically into the resulting Python
binary?</p>
<p>[Answer: building a Python binary with the Distutils should be
feasible, though no one has implemented it yet. This should be
done someday, but isnt a pressing priority as messing around with
the top-level <code class="docutils literal notranslate"><span class="pre">Makefile.pre.in</span></code> is good enough.]</p>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0229.rst">https://github.com/python/peps/blob/main/peps/pep-0229.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0229.rst">2023-09-09 17:39:29 GMT</a></p>
</article>
<nav id="pep-sidebar">
<h2>Contents</h2>
<ul>
<li><a class="reference internal" href="#introduction">Introduction</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#implementation">Implementation</a></li>
<li><a class="reference internal" href="#unresolved-issues">Unresolved Issues</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
<br>
<a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0229.rst">Page Source (GitHub)</a>
</nav>
</section>
<script src="../_static/colour_scheme.js"></script>
<script src="../_static/wrap_tables.js"></script>
<script src="../_static/sticky_banner.js"></script>
</body>
</html>