python-peps/pep-0739/index.html

1329 lines
101 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 739 Static description file for build details of Python installations | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0739/">
<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 739 Static description file for build details of Python installations | peps.python.org'>
<meta property="og:description" content="Introduce a standard format for a static description file with build details of Python installations.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0739/">
<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="Introduce a standard format for a static description file with build details of Python installations.">
<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 739</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 739 Static description file for build details of Python installations</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">Filipe Laíns &lt;lains&#32;&#97;t&#32;riseup.net&gt;</dd>
<dt class="field-even">PEP-Delegate<span class="colon">:</span></dt>
<dd class="field-even">Paul Moore &lt;p.f.moore&#32;&#97;t&#32;gmail.com&gt;</dd>
<dt class="field-odd">Discussions-To<span class="colon">:</span></dt>
<dd class="field-odd"><a class="reference external" href="https://discuss.python.org/t/pep-739-static-description-file-for-build-details-of-python-installations/44572">Discourse thread</a></dd>
<dt class="field-even">Status<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Proposal under active discussion and revision">Draft</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">Topic<span class="colon">:</span></dt>
<dd class="field-even"><a class="reference external" href="../topic/packaging/">Packaging</a></dd>
<dt class="field-odd">Created<span class="colon">:</span></dt>
<dd class="field-odd">19-Dec-2023</dd>
<dt class="field-even">Python-Version<span class="colon">:</span></dt>
<dd class="field-even">3.14</dd>
</dl>
<hr class="docutils" />
<section id="contents">
<details><summary>Table of Contents</summary><ul class="simple">
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#scope">Scope</a></li>
<li><a class="reference internal" href="#location">Location</a></li>
<li><a class="reference internal" href="#format">Format</a><ul>
<li><a class="reference internal" href="#schema-version"><code class="docutils literal notranslate"><span class="pre">schema_version</span></code></a></li>
<li><a class="reference internal" href="#base-prefix"><code class="docutils literal notranslate"><span class="pre">base_prefix</span></code></a></li>
<li><a class="reference internal" href="#platform"><code class="docutils literal notranslate"><span class="pre">platform</span></code></a></li>
<li><a class="reference internal" href="#language"><code class="docutils literal notranslate"><span class="pre">language</span></code></a><ul>
<li><a class="reference internal" href="#language-version"><code class="docutils literal notranslate"><span class="pre">language.version</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#implementation"><code class="docutils literal notranslate"><span class="pre">implementation</span></code></a><ul>
<li><a class="reference internal" href="#implementation-name"><code class="docutils literal notranslate"><span class="pre">implementation.name</span></code></a></li>
<li><a class="reference internal" href="#implementation-version"><code class="docutils literal notranslate"><span class="pre">implementation.version</span></code></a><ul>
<li><a class="reference internal" href="#implementation-version-major"><code class="docutils literal notranslate"><span class="pre">implementation.version.major</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-minor"><code class="docutils literal notranslate"><span class="pre">implementation.version.minor</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-micro"><code class="docutils literal notranslate"><span class="pre">implementation.version.micro</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-releaselevel"><code class="docutils literal notranslate"><span class="pre">implementation.version.releaselevel</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-serial"><code class="docutils literal notranslate"><span class="pre">implementation.version.serial</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#interpreter"><code class="docutils literal notranslate"><span class="pre">interpreter</span></code></a><ul>
<li><a class="reference internal" href="#interpreter-path"><code class="docutils literal notranslate"><span class="pre">interpreter.path</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#abi"><code class="docutils literal notranslate"><span class="pre">abi</span></code></a><ul>
<li><a class="reference internal" href="#abi-flags"><code class="docutils literal notranslate"><span class="pre">abi.flags</span></code></a></li>
<li><a class="reference internal" href="#abi-extension-suffix"><code class="docutils literal notranslate"><span class="pre">abi.extension_suffix</span></code></a></li>
<li><a class="reference internal" href="#abi-stable-abi-suffix"><code class="docutils literal notranslate"><span class="pre">abi.stable_abi_suffix</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#suffixes"><code class="docutils literal notranslate"><span class="pre">suffixes</span></code></a></li>
<li><a class="reference internal" href="#libpython"><code class="docutils literal notranslate"><span class="pre">libpython</span></code></a><ul>
<li><a class="reference internal" href="#libpython-dynamic"><code class="docutils literal notranslate"><span class="pre">libpython.dynamic</span></code></a></li>
<li><a class="reference internal" href="#libpython-static"><code class="docutils literal notranslate"><span class="pre">libpython.static</span></code></a></li>
<li><a class="reference internal" href="#libpython-link-to-libpython"><code class="docutils literal notranslate"><span class="pre">libpython.link_to_libpython</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#c-api"><code class="docutils literal notranslate"><span class="pre">c_api</span></code></a><ul>
<li><a class="reference internal" href="#c-api-headers"><code class="docutils literal notranslate"><span class="pre">c_api.headers</span></code></a></li>
<li><a class="reference internal" href="#c-api-pkgconfig-path"><code class="docutils literal notranslate"><span class="pre">c_api.pkgconfig_path</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#arbitrary-data"><code class="docutils literal notranslate"><span class="pre">arbitrary_data</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#example">Example</a></li>
<li><a class="reference internal" href="#json-schema">JSON Schema</a></li>
<li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul>
<li><a class="reference internal" href="#having-a-larger-scope">Having a larger scope</a></li>
</ul>
</li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
</details></section>
<section id="abstract">
<h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2>
<p>Introduce a standard format for a static description file with build details
of Python installations.</p>
</section>
<section id="rationale">
<h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2>
<p>When introspecting a Python installation, running code is often undesirable or
impossible. Having a static description file makes various of Python build
details available without having to run the interpreter.</p>
<p>This is helpful for use-cases such as cross-compilation, Python launchers, etc.</p>
</section>
<section id="scope">
<h2><a class="toc-backref" href="#scope" role="doc-backlink">Scope</a></h2>
<p>This PEP defines a format for the description file, and a standard location for
where to place it.</p>
</section>
<section id="location">
<h2><a class="toc-backref" href="#location" role="doc-backlink">Location</a></h2>
<p>When possible, Python installations should install the static description file
inside the standard library directory, with the name <code class="docutils literal notranslate"><span class="pre">build-details.json</span></code>
(Eg. <code class="docutils literal notranslate"><span class="pre">/usr/lib/python3.14/build-details.json</span></code>).</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>Given that there may be technical challenges, Python implementations are not
required to provide the file if not feasable. In such scenarios, they may
choose to provide it in a different maner.</p>
</div>
<div class="admonition attention">
<p class="admonition-title">Attention</p>
<p>Notwithstanding the standard location specified here, it does not prevent the
file from <strong>additionally</strong> being provided in another location, and with a
different name. In fact, the PEP authors expect future PEPs to define
additional locations to install this file, for better discoverability.</p>
</div>
</section>
<section id="format">
<h2><a class="toc-backref" href="#format" role="doc-backlink">Format</a></h2>
<p>The format specification is defined by the JSON Schema definition provided
below, which is rendered in an human-readable format here.</p>
<table class="docutils align-default" id="spec-start">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">$schema</span></code></td>
<td><a class="reference external" href="https://json-schema.org/draft/2020-12/schema">https://json-schema.org/draft/2020-12/schema</a></td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">$id</span></code></td>
<td><a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.schema.json">https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.schema.json</a></td>
</tr>
<tr class="row-odd"><td>Title</td>
<td>Static description file for the build details of Python
installations</td>
</tr>
<tr class="row-even"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-odd"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="schema-version">
<h3><a class="toc-backref" href="#schema-version" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">schema_version</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code> (constant — <code class="docutils literal notranslate"><span class="pre">1</span></code>)</td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Schema version.<p>This is a constant value and MUST be <code class="docutils literal notranslate"><span class="pre">1</span></code>, when using the
schema described here. Future iterations of this schema MUST
update this value.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="base-prefix">
<h3><a class="toc-backref" href="#base-prefix" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">base_prefix</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Base prefix of the Python installation.<p>Either an absolute path, or a relative path to directory where
this file is contained.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><code class="docutils literal notranslate"><span class="pre">/usr</span></code>, <code class="docutils literal notranslate"><span class="pre">../..</span></code>, etc.</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="platform">
<h3><a class="toc-backref" href="#platform" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">platform</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>System platform string.<p>This field SHOULD be equivalent to <code class="docutils literal notranslate"><span class="pre">sysconfig.get_platform()</span></code>.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">linux-x86_64</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="language">
<h3><a class="toc-backref" href="#language" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">language</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details related to the Python language
specification.<p>In addition to the required keys, implementations may choose to
include extra keys with implementation-specific details.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>True</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="language-version">
<h4><a class="toc-backref" href="#language-version" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">language.version</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>String representation the Python language version — a version
string consisting only of the <em>major</em> and <em>minor</em> components.<p>This field SHOULD be equivalent to
<code class="docutils literal notranslate"><span class="pre">sysconfig.get_python_version()</span></code>.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><code class="docutils literal notranslate"><span class="pre">3.14</span></code>, etc.</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="implementation">
<h3><a class="toc-backref" href="#implementation" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details related to Python implementation.<p>This section SHOULD be equivalent to
<a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.implementation" title="(in Python v3.12)"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.implementation</span></code></a>. It follows specification defined
in PEP 421, meaning that on top of the required keys,
implementation-specific keys can also exist, but must be
prefixed with an underscore.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>True</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Allowed</strong></td>
</tr>
</tbody>
</table>
<section id="implementation-name">
<h4><a class="toc-backref" href="#implementation-name" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.name</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Lower-case name of the Python implementation.</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><code class="docutils literal notranslate"><span class="pre">cpython</span></code>, <code class="docutils literal notranslate"><span class="pre">pypy</span></code>, etc.</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="implementation-version">
<h4><a class="toc-backref" href="#implementation-version" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object in the format of <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.version_info" title="(in Python v3.12)"><code class="xref py py-data docutils literal notranslate"><span class="pre">sys.version_info</span></code></a>, containing
the implementation version.</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">{'major':</span> <span class="pre">3,</span> <span class="pre">'minor':</span> <span class="pre">13,</span> <span class="pre">'micro':</span> <span class="pre">1,</span> <span class="pre">'releaselevel':</span> <span class="pre">'final',</span> <span class="pre">'serial':</span> <span class="pre">0}</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">{'major':</span> <span class="pre">7,</span> <span class="pre">'minor':</span> <span class="pre">3,</span> <span class="pre">'micro':</span> <span class="pre">16,</span> <span class="pre">'releaselevel':</span> <span class="pre">'final',</span> <span class="pre">'serial':</span> <span class="pre">0}</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
<tr class="row-odd"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="implementation-version-major">
<h5><a class="toc-backref" href="#implementation-version-major" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version.major</span></code></a></h5>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">number</span></code></td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="implementation-version-minor">
<h5><a class="toc-backref" href="#implementation-version-minor" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version.minor</span></code></a></h5>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">number</span></code></td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="implementation-version-micro">
<h5><a class="toc-backref" href="#implementation-version-micro" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version.micro</span></code></a></h5>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">number</span></code></td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="implementation-version-releaselevel">
<h5><a class="toc-backref" href="#implementation-version-releaselevel" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version.releaselevel</span></code></a></h5>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code> (enum — <code class="docutils literal notranslate"><span class="pre">alpha</span></code>, <code class="docutils literal notranslate"><span class="pre">beta</span></code>, <code class="docutils literal notranslate"><span class="pre">candidate</span></code>, <code class="docutils literal notranslate"><span class="pre">final</span></code>)</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="implementation-version-serial">
<h5><a class="toc-backref" href="#implementation-version-serial" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">implementation.version.serial</span></code></a></h5>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">number</span></code></td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
</section>
<section id="interpreter">
<h3><a class="toc-backref" href="#interpreter" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">interpreter</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details Python interpreter.<p>This section MUST be present if the Python installation provides
an interpreter binary, otherwise this section will be missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="interpreter-path">
<h4><a class="toc-backref" href="#interpreter-path" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">interpreter.path</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>The path to the Python interprer. Either an absolute path, or a
relative path to the path defined in the <code class="docutils literal notranslate"><span class="pre">base_prefix</span></code> key.</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">/usr/bin/python</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">bin/python</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="abi">
<h3><a class="toc-backref" href="#abi" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">abi</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details related to ABI.</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="abi-flags">
<h4><a class="toc-backref" href="#abi-flags" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">abi.flags</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">array</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Build configuration flags, used to calculate the extension
suffix.<p>The flags MUST be defined in the order they appear on the
extension suffix.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><code class="docutils literal notranslate"><span class="pre">['t',</span> <span class="pre">'d']</span></code>, etc.</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="abi-extension-suffix">
<h4><a class="toc-backref" href="#abi-extension-suffix" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">abi.extension_suffix</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Suffix used for extensions built against the current
implementation version.<p>This field MUST be present if the Python implementation supports
extensions, otherwise this entry will be missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">.cpython-314-x86_64-linux-gnu.so</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="abi-stable-abi-suffix">
<h4><a class="toc-backref" href="#abi-stable-abi-suffix" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">abi.stable_abi_suffix</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Suffix used for extensions built against the stable ABI.<p>This field MUST be present if the Python implementation has a
stable ABI extension suffix, otherwise this entry will be
missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><code class="docutils literal notranslate"><span class="pre">.abi3.so</span></code>, etc.</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="suffixes">
<h3><a class="toc-backref" href="#suffixes" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">suffixes</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Valid module suffixes grouped by type.<p>This section SHOULD be equivalent to the
<code class="docutils literal notranslate"><span class="pre">importlib.machinery.*_SUFFIXES</span></code> attributes, if the
implementation provides such suffixes. However, if the Python
implementation does not provide suffixes of the kind specified
by any of the attributes, the equivalent sub-section is not
required to be present. Additionally, if a Python implementation
provides extension kinds other than the ones listed on
<code class="docutils literal notranslate"><span class="pre">importlib.machinery</span></code> module, they MAY add a sub-section for
them.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">{'source':</span> <span class="pre">['.py'],</span> <span class="pre">'bytecode':</span> <span class="pre">['.pyc'],</span> <span class="pre">'optimized_bytecode':</span> <span class="pre">['.pyc'],</span> <span class="pre">'debug_bytecode':</span> <span class="pre">['.pyc'],</span> <span class="pre">'extensions':</span> <span class="pre">['.cpython-313-x86_64-linux-gnu.so',</span> <span class="pre">'.abi3.so',</span> <span class="pre">'.so']}</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-odd"><td>Additional properties</td>
<td><strong>Allowed</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="libpython">
<h3><a class="toc-backref" href="#libpython" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">libpython</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details related to the <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library.<p>This section MUST by present if Python installation provides a
<code class="docutils literal notranslate"><span class="pre">libpython</span></code> library, otherwise this section will be missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="libpython-dynamic">
<h4><a class="toc-backref" href="#libpython-dynamic" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">libpython.dynamic</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>The path to the dynamic <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library. Either an
absolute path, or a relative path to the path defined in the
<code class="docutils literal notranslate"><span class="pre">base_prefix</span></code> key.<p>This field MUST be present if the Python installation provides a
dynamic <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library, otherwise this entry will be
missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">/usr/lib/libpython3.14.so.1.0</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">lib/libpython3.14.so.1.0</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="libpython-static">
<h4><a class="toc-backref" href="#libpython-static" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">libpython.static</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>The path to the static <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library. Either an absolute
path, or a relative path to the path defined in the
<code class="docutils literal notranslate"><span class="pre">base_prefix</span></code> key.<p>This field MUST be present if the Python installation provides a
static <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library, otherwise this entry will be
missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="libpython-link-to-libpython">
<h4><a class="toc-backref" href="#libpython-link-to-libpython" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">libpython.link_to_libpython</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">boolean</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Should extensions built against a dynamic <code class="docutils literal notranslate"><span class="pre">libpython</span></code> link to
it?<p>This field MUST be present if the Python installation provides a
dynamic <code class="docutils literal notranslate"><span class="pre">libpython</span></code> library, otherwise this entry will be
missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="c-api">
<h3><a class="toc-backref" href="#c-api" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">c_api</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing details related to the Python C API, if
available.<p>This section MUST be present if the Python implementation
provides a C API, otherwise this section will be missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Not allowed</strong></td>
</tr>
</tbody>
</table>
<section id="c-api-headers">
<h4><a class="toc-backref" href="#c-api-headers" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">c_api.headers</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>The path to the C API headers. Either an absolute path, or a
relative path to the path defined in the <code class="docutils literal notranslate"><span class="pre">base_prefix</span></code> key.</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">/usr/include/python3.14</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">include/python3.14</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>True</strong></td>
</tr>
</tbody>
</table>
</section>
<section id="c-api-pkgconfig-path">
<h4><a class="toc-backref" href="#c-api-pkgconfig-path" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">c_api.pkgconfig_path</span></code></a></h4>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>The path to the pkg-config definition files. Either an absolute
path, or a relative path to the path defined in the
<code class="docutils literal notranslate"><span class="pre">base_prefix</span></code> key.<p>This field MUST be present if the Python implementation provides
pkg-config definition files for the C API, otherwise this
section will be missing.</p>
</td>
</tr>
<tr class="row-odd"><td>Examples</td>
<td><ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">/usr/lib/pkgconfig</span></code></li>
<li><code class="docutils literal notranslate"><span class="pre">lib/pkgconfig</span></code></li>
<li>etc.</li>
</ul>
</td>
</tr>
<tr class="row-even"><td>Required</td>
<td><strong>False</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="arbitrary-data">
<h3><a class="toc-backref" href="#arbitrary-data" role="doc-backlink"><code class="docutils literal notranslate"><span class="pre">arbitrary_data</span></code></a></h3>
<table class="docutils align-default">
<colgroup>
<col style="width: 25.0%" />
<col style="width: 75.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td>Type</td>
<td><code class="docutils literal notranslate"><span class="pre">object</span></code></td>
</tr>
<tr class="row-even"><td>Description</td>
<td>Object containing extra arbitrary data.<p>This is meant to be used as an escape-hatch, to include any
relevant data that is not covered by this specification.
Implamentations may choose what data to provide in this section.</p>
</td>
</tr>
<tr class="row-odd"><td>Required</td>
<td><strong>False</strong></td>
</tr>
<tr class="row-even"><td>Additional properties</td>
<td><strong>Allowed</strong></td>
</tr>
</tbody>
</table>
</section>
</section>
<section id="example">
<span id="spec-end"></span><h2><a class="toc-backref" href="#example" role="doc-backlink">Example</a></h2>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="p">{</span>
<span class="linenos"> 2</span><span class="w"> </span><span class="nt">&quot;schema_version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;1&quot;</span><span class="p">,</span>
<span class="linenos"> 3</span><span class="w"> </span><span class="nt">&quot;base_prefix&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr&quot;</span><span class="p">,</span>
<span class="linenos"> 4</span><span class="w"> </span><span class="nt">&quot;platform&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;linux-x86_64&quot;</span><span class="p">,</span>
<span class="linenos"> 5</span><span class="w"> </span><span class="nt">&quot;language&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;3.14&quot;</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="nt">&quot;implementation&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cpython&quot;</span><span class="p">,</span>
<span class="linenos">10</span><span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">11</span><span class="w"> </span><span class="nt">&quot;major&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
<span class="linenos">12</span><span class="w"> </span><span class="nt">&quot;minor&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="p">,</span>
<span class="linenos">13</span><span class="w"> </span><span class="nt">&quot;micro&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="linenos">14</span><span class="w"> </span><span class="nt">&quot;releaselevel&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;alpha&quot;</span><span class="p">,</span>
<span class="linenos">15</span><span class="w"> </span><span class="nt">&quot;serial&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
<span class="linenos">16</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">17</span><span class="w"> </span><span class="nt">&quot;hexversion&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">51249312</span><span class="p">,</span>
<span class="linenos">18</span><span class="w"> </span><span class="nt">&quot;cache_tag&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cpython-314&quot;</span><span class="p">,</span>
<span class="linenos">19</span><span class="w"> </span><span class="nt">&quot;_multiarch&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;x86_64-linux-gnu&quot;</span>
<span class="linenos">20</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">21</span><span class="w"> </span><span class="nt">&quot;interpreter&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">22</span><span class="w"> </span><span class="nt">&quot;path&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr/bin/python&quot;</span>
<span class="linenos">23</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">24</span><span class="w"> </span><span class="nt">&quot;abi&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">25</span><span class="w"> </span><span class="nt">&quot;flags&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;t&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;d&quot;</span><span class="p">],</span>
<span class="linenos">26</span><span class="w"> </span><span class="nt">&quot;extension_suffix&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;.cpython-314-x86_64-linux-gnu.so&quot;</span><span class="p">,</span>
<span class="linenos">27</span><span class="w"> </span><span class="nt">&quot;stable_abi_suffix&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;.abi3.so&quot;</span>
<span class="linenos">28</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">29</span><span class="w"> </span><span class="nt">&quot;suffixes&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">30</span><span class="w"> </span><span class="nt">&quot;source&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.py&quot;</span><span class="p">],</span>
<span class="linenos">31</span><span class="w"> </span><span class="nt">&quot;bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">32</span><span class="w"> </span><span class="nt">&quot;optimized_bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">33</span><span class="w"> </span><span class="nt">&quot;debug_bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">34</span><span class="w"> </span><span class="nt">&quot;extensions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.cpython-314-x86_64-linux-gnu.so&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;.abi3.so&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;.so&quot;</span><span class="p">]</span>
<span class="linenos">35</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">36</span><span class="w"> </span><span class="nt">&quot;libpython&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">37</span><span class="w"> </span><span class="nt">&quot;dynamic&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr/lib/libpython3.14.so.1.0&quot;</span><span class="p">,</span>
<span class="linenos">38</span><span class="w"> </span><span class="nt">&quot;static&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a&quot;</span><span class="p">,</span>
<span class="linenos">39</span><span class="w"> </span><span class="nt">&quot;link_to_libpython&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
<span class="linenos">40</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">41</span><span class="w"> </span><span class="nt">&quot;c_api&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">42</span><span class="w"> </span><span class="nt">&quot;headers&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr/include/python3.14&quot;</span><span class="p">,</span>
<span class="linenos">43</span><span class="w"> </span><span class="nt">&quot;pkgconfig_path&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/usr/lib/pkgconfig&quot;</span>
<span class="linenos">44</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">45</span><span class="p">}</span>
</pre></div>
</div>
</section>
<section id="json-schema">
<h2><a class="toc-backref" href="#json-schema" role="doc-backlink">JSON Schema</a></h2>
<div class="highlight-json notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="p">{</span>
<span class="linenos"> 2</span><span class="w"> </span><span class="nt">&quot;$schema&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;https://json-schema.org/draft/2020-12/schema&quot;</span><span class="p">,</span>
<span class="linenos"> 3</span><span class="w"> </span><span class="nt">&quot;$id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;https://github.com/python/peps/blob/main/peps/pep-0739/python-build-info-v1.schema.json&quot;</span><span class="p">,</span>
<span class="linenos"> 4</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos"> 5</span><span class="w"> </span><span class="nt">&quot;title&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Static description file for the build details of Python installations&quot;</span><span class="p">,</span>
<span class="linenos"> 6</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 7</span><span class="w"> </span><span class="s2">&quot;schema_version&quot;</span><span class="p">,</span>
<span class="linenos"> 8</span><span class="w"> </span><span class="s2">&quot;platform&quot;</span><span class="p">,</span>
<span class="linenos"> 9</span><span class="w"> </span><span class="s2">&quot;language&quot;</span><span class="p">,</span>
<span class="linenos"> 10</span><span class="w"> </span><span class="s2">&quot;implementation&quot;</span>
<span class="linenos"> 11</span><span class="w"> </span><span class="p">],</span>
<span class="linenos"> 12</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos"> 13</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 14</span><span class="w"> </span><span class="nt">&quot;schema_version&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 15</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 16</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Schema version.\n\nThis is a constant value and MUST be ``1``, when using the schema described here. Future iterations of this schema MUST update this value.&quot;</span><span class="p">,</span>
<span class="linenos"> 17</span><span class="w"> </span><span class="nt">&quot;const&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;1&quot;</span>
<span class="linenos"> 18</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 19</span><span class="w"> </span><span class="nt">&quot;base_prefix&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 20</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 21</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Base prefix of the Python installation.\n\nEither an absolute path, or a relative path to directory where this file is contained.&quot;</span><span class="p">,</span>
<span class="linenos"> 22</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 23</span><span class="w"> </span><span class="s2">&quot;/usr&quot;</span><span class="p">,</span>
<span class="linenos"> 24</span><span class="w"> </span><span class="s2">&quot;../..&quot;</span>
<span class="linenos"> 25</span><span class="w"> </span><span class="p">]</span>
<span class="linenos"> 26</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 27</span><span class="w"> </span><span class="nt">&quot;platform&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 28</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 29</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;System platform string.\n\nThis field SHOULD be equivalent to ``sysconfig.get_platform()``.&quot;</span><span class="p">,</span>
<span class="linenos"> 30</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 31</span><span class="w"> </span><span class="s2">&quot;linux-x86_64&quot;</span>
<span class="linenos"> 32</span><span class="w"> </span><span class="p">]</span>
<span class="linenos"> 33</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 34</span><span class="w"> </span><span class="nt">&quot;language&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 35</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos"> 36</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details related to the Python language specification.\n\nIn addition to the required keys, implementations may choose to include extra keys with implementation-specific details.&quot;</span><span class="p">,</span>
<span class="linenos"> 37</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 38</span><span class="w"> </span><span class="s2">&quot;version&quot;</span>
<span class="linenos"> 39</span><span class="w"> </span><span class="p">],</span>
<span class="linenos"> 40</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos"> 41</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 42</span><span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 43</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 44</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;String representation the Python language version — a version string consisting only of the *major* and *minor* components.\n\nThis field SHOULD be equivalent to ``sysconfig.get_python_version()``.&quot;</span><span class="p">,</span>
<span class="linenos"> 45</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;3.14&quot;</span><span class="p">]</span>
<span class="linenos"> 46</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 47</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 48</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 49</span><span class="w"> </span><span class="nt">&quot;implementation&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 50</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos"> 51</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details related to Python implementation.\n\nThis section SHOULD be equivalent to :py:data:`sys.implementation`. It follows specification defined in PEP 421, meaning that on top of the required keys, implementation-specific keys can also exist, but must be prefixed with an underscore.&quot;</span><span class="p">,</span>
<span class="linenos"> 52</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 53</span><span class="w"> </span><span class="s2">&quot;name&quot;</span><span class="p">,</span>
<span class="linenos"> 54</span><span class="w"> </span><span class="s2">&quot;version&quot;</span><span class="p">,</span>
<span class="linenos"> 55</span><span class="w"> </span><span class="s2">&quot;hexversion&quot;</span><span class="p">,</span>
<span class="linenos"> 56</span><span class="w"> </span><span class="s2">&quot;cache_tag&quot;</span>
<span class="linenos"> 57</span><span class="w"> </span><span class="p">],</span>
<span class="linenos"> 58</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
<span class="linenos"> 59</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 60</span><span class="w"> </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 61</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 62</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Lower-case name of the Python implementation.&quot;</span><span class="p">,</span>
<span class="linenos"> 63</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;cpython&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;pypy&quot;</span><span class="p">]</span>
<span class="linenos"> 64</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 65</span><span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 66</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos"> 67</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object in the format of :py:data:`sys.version_info`, containing the implementation version.&quot;</span><span class="p">,</span>
<span class="linenos"> 68</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;major&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;minor&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;micro&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;releaselevel&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;serial&quot;</span><span class="p">],</span>
<span class="linenos"> 69</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos"> 70</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos"> 71</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 72</span><span class="w"> </span><span class="nt">&quot;major&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
<span class="linenos"> 73</span><span class="w"> </span><span class="nt">&quot;minor&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">13</span><span class="p">,</span>
<span class="linenos"> 74</span><span class="w"> </span><span class="nt">&quot;micro&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="linenos"> 75</span><span class="w"> </span><span class="nt">&quot;releaselevel&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;final&quot;</span><span class="p">,</span>
<span class="linenos"> 76</span><span class="w"> </span><span class="nt">&quot;serial&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
<span class="linenos"> 77</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 78</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 79</span><span class="w"> </span><span class="nt">&quot;major&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span>
<span class="linenos"> 80</span><span class="w"> </span><span class="nt">&quot;minor&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span>
<span class="linenos"> 81</span><span class="w"> </span><span class="nt">&quot;micro&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span>
<span class="linenos"> 82</span><span class="w"> </span><span class="nt">&quot;releaselevel&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;final&quot;</span><span class="p">,</span>
<span class="linenos"> 83</span><span class="w"> </span><span class="nt">&quot;serial&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
<span class="linenos"> 84</span><span class="w"> </span><span class="p">}</span>
<span class="linenos"> 85</span><span class="w"> </span><span class="p">],</span>
<span class="linenos"> 86</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 87</span><span class="w"> </span><span class="nt">&quot;major&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 88</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span>
<span class="linenos"> 89</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 90</span><span class="w"> </span><span class="nt">&quot;minor&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 91</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span>
<span class="linenos"> 92</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 93</span><span class="w"> </span><span class="nt">&quot;micro&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 94</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span>
<span class="linenos"> 95</span><span class="w"> </span><span class="p">},</span>
<span class="linenos"> 96</span><span class="w"> </span><span class="nt">&quot;releaselevel&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos"> 97</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos"> 98</span><span class="w"> </span><span class="nt">&quot;enum&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;alpha&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;beta&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;candidate&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;final&quot;</span><span class="p">]</span>
<span class="linenos"> 99</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">100</span><span class="w"> </span><span class="nt">&quot;serial&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">101</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;number&quot;</span>
<span class="linenos">102</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">103</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">104</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">105</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">106</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">107</span><span class="w"> </span><span class="nt">&quot;interpreter&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">108</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">109</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details Python interpreter.\n\nThis section MUST be present if the Python installation provides an interpreter binary, otherwise this section will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">110</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">111</span><span class="w"> </span><span class="s2">&quot;path&quot;</span>
<span class="linenos">112</span><span class="w"> </span><span class="p">],</span>
<span class="linenos">113</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos">114</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">115</span><span class="w"> </span><span class="nt">&quot;path&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">116</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">117</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The path to the Python interprer. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.&quot;</span><span class="p">,</span>
<span class="linenos">118</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">119</span><span class="w"> </span><span class="s2">&quot;/usr/bin/python&quot;</span><span class="p">,</span>
<span class="linenos">120</span><span class="w"> </span><span class="s2">&quot;bin/python&quot;</span>
<span class="linenos">121</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">122</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">123</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">124</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">125</span><span class="w"> </span><span class="nt">&quot;abi&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">126</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">127</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details related to ABI.&quot;</span><span class="p">,</span>
<span class="linenos">128</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">129</span><span class="w"> </span><span class="s2">&quot;flags&quot;</span><span class="p">,</span>
<span class="linenos">130</span><span class="w"> </span><span class="s2">&quot;extension_suffix&quot;</span>
<span class="linenos">131</span><span class="w"> </span><span class="p">],</span>
<span class="linenos">132</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos">133</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">134</span><span class="w"> </span><span class="nt">&quot;flags&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">135</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;array&quot;</span><span class="p">,</span>
<span class="linenos">136</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Build configuration flags, used to calculate the extension suffix.\n\nThe flags MUST be defined in the order they appear on the extension suffix.&quot;</span><span class="p">,</span>
<span class="linenos">137</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
<span class="linenos">138</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">139</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;t&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;d&quot;</span><span class="p">]</span>
<span class="linenos">140</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">141</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">142</span><span class="w"> </span><span class="nt">&quot;extension_suffix&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">143</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">144</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Suffix used for extensions built against the current implementation version.\n\nThis field MUST be present if the Python implementation supports extensions, otherwise this entry will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">145</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">146</span><span class="w"> </span><span class="s2">&quot;.cpython-314-x86_64-linux-gnu.so&quot;</span>
<span class="linenos">147</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">148</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">149</span><span class="w"> </span><span class="nt">&quot;stable_abi_suffix&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">150</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">151</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Suffix used for extensions built against the stable ABI.\n\nThis field MUST be present if the Python implementation has a stable ABI extension suffix, otherwise this entry will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">152</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">153</span><span class="w"> </span><span class="s2">&quot;.abi3.so&quot;</span>
<span class="linenos">154</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">155</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">156</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">157</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">158</span><span class="w"> </span><span class="nt">&quot;suffixes&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">159</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">160</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Valid module suffixes grouped by type.\n\nThis section SHOULD be equivalent to the ``importlib.machinery.*_SUFFIXES`` attributes, if the implementation provides such suffixes. However, if the Python implementation does not provide suffixes of the kind specified by any of the attributes, the equivalent sub-section is not required to be present. Additionally, if a Python implementation provides extension kinds other than the ones listed on ``importlib.machinery`` module, they MAY add a sub-section for them.&quot;</span><span class="p">,</span>
<span class="linenos">161</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">162</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">163</span><span class="w"> </span><span class="nt">&quot;source&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.py&quot;</span><span class="p">],</span>
<span class="linenos">164</span><span class="w"> </span><span class="nt">&quot;bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">165</span><span class="w"> </span><span class="nt">&quot;optimized_bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">166</span><span class="w"> </span><span class="nt">&quot;debug_bytecode&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.pyc&quot;</span><span class="p">],</span>
<span class="linenos">167</span><span class="w"> </span><span class="nt">&quot;extensions&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;.cpython-313-x86_64-linux-gnu.so&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;.abi3.so&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;.so&quot;</span><span class="p">]</span>
<span class="linenos">168</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">169</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">170</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">171</span><span class="w"> </span><span class="nt">&quot;libpython&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">172</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">173</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details related to the ``libpython`` library.\n\nThis section MUST by present if Python installation provides a ``libpython`` library, otherwise this section will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">174</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos">175</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">176</span><span class="w"> </span><span class="nt">&quot;dynamic&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">177</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">178</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The path to the dynamic ``libpython`` library. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">179</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">180</span><span class="w"> </span><span class="s2">&quot;/usr/lib/libpython3.14.so.1.0&quot;</span><span class="p">,</span>
<span class="linenos">181</span><span class="w"> </span><span class="s2">&quot;lib/libpython3.14.so.1.0&quot;</span>
<span class="linenos">182</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">183</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">184</span><span class="w"> </span><span class="nt">&quot;static&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">185</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">186</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The path to the static ``libpython`` library. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python installation provides a static ``libpython`` library, otherwise this entry will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">187</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">188</span><span class="w"> </span><span class="s2">&quot;/usr/lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a&quot;</span><span class="p">,</span>
<span class="linenos">189</span><span class="w"> </span><span class="s2">&quot;lib/python3.14/config-3.14-x86_64-linux-gnu/libpython3.14.a&quot;</span>
<span class="linenos">190</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">191</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">192</span><span class="w"> </span><span class="nt">&quot;link_to_libpython&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">193</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;boolean&quot;</span><span class="p">,</span>
<span class="linenos">194</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Should extensions built against a dynamic ``libpython`` link to it?\n\nThis field MUST be present if the Python installation provides a dynamic ``libpython`` library, otherwise this entry will be missing.&quot;</span>
<span class="linenos">195</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">196</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">197</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">198</span><span class="w"> </span><span class="nt">&quot;c_api&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">199</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">200</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing details related to the Python C API, if available.\n\nThis section MUST be present if the Python implementation provides a C API, otherwise this section will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">201</span><span class="w"> </span><span class="nt">&quot;required&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">202</span><span class="w"> </span><span class="s2">&quot;headers&quot;</span>
<span class="linenos">203</span><span class="w"> </span><span class="p">],</span>
<span class="linenos">204</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="linenos">205</span><span class="w"> </span><span class="nt">&quot;properties&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">206</span><span class="w"> </span><span class="nt">&quot;headers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">207</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">208</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The path to the C API headers. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.&quot;</span><span class="p">,</span>
<span class="linenos">209</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">210</span><span class="w"> </span><span class="s2">&quot;/usr/include/python3.14&quot;</span><span class="p">,</span>
<span class="linenos">211</span><span class="w"> </span><span class="s2">&quot;include/python3.14&quot;</span>
<span class="linenos">212</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">213</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">214</span><span class="w"> </span><span class="nt">&quot;pkgconfig_path&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">215</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;string&quot;</span><span class="p">,</span>
<span class="linenos">216</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;The path to the pkg-config definition files. Either an absolute path, or a relative path to the path defined in the ``base_prefix`` key.\n\nThis field MUST be present if the Python implementation provides pkg-config definition files for the C API, otherwise this section will be missing.&quot;</span><span class="p">,</span>
<span class="linenos">217</span><span class="w"> </span><span class="nt">&quot;examples&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="linenos">218</span><span class="w"> </span><span class="s2">&quot;/usr/lib/pkgconfig&quot;</span><span class="p">,</span>
<span class="linenos">219</span><span class="w"> </span><span class="s2">&quot;lib/pkgconfig&quot;</span>
<span class="linenos">220</span><span class="w"> </span><span class="p">]</span>
<span class="linenos">221</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">222</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">223</span><span class="w"> </span><span class="p">},</span>
<span class="linenos">224</span><span class="w"> </span><span class="nt">&quot;arbitrary_data&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="linenos">225</span><span class="w"> </span><span class="nt">&quot;type&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;object&quot;</span><span class="p">,</span>
<span class="linenos">226</span><span class="w"> </span><span class="nt">&quot;description&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Object containing extra arbitrary data.\n\nThis is meant to be used as an escape-hatch, to include any relevant data that is not covered by this specification. Implamentations may choose what data to provide in this section.&quot;</span><span class="p">,</span>
<span class="linenos">227</span><span class="w"> </span><span class="nt">&quot;additionalProperties&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span>
<span class="linenos">228</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">229</span><span class="w"> </span><span class="p">}</span>
<span class="linenos">230</span><span class="p">}</span>
</pre></div>
</div>
</section>
<section id="rejected-ideas">
<h2><a class="toc-backref" href="#rejected-ideas" role="doc-backlink">Rejected Ideas</a></h2>
<section id="having-a-larger-scope">
<h3><a class="toc-backref" href="#having-a-larger-scope" role="doc-backlink">Having a larger scope</a></h3>
<p>One of the main requests in the discussion of this PEP was the inclusion of
other kind of information, such as the <code class="docutils literal notranslate"><span class="pre">site-packages</span></code> path. It is the opinion
of the PEP authors that information regarding the Python environment should be
provided by a separate file, creating the a clear separation between the build
details, which should be immutable across any interpreter instance, and details
that can change, such as environment details.</p>
</section>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document is placed in the public domain or under the
CC0-1.0-Universal license, whichever is more permissive.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0739.rst">https://github.com/python/peps/blob/main/peps/pep-0739.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0739.rst">2024-09-12 02:43:59 GMT</a></p>
</article>
<nav id="pep-sidebar">
<h2>Contents</h2>
<ul>
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#scope">Scope</a></li>
<li><a class="reference internal" href="#location">Location</a></li>
<li><a class="reference internal" href="#format">Format</a><ul>
<li><a class="reference internal" href="#schema-version"><code class="docutils literal notranslate"><span class="pre">schema_version</span></code></a></li>
<li><a class="reference internal" href="#base-prefix"><code class="docutils literal notranslate"><span class="pre">base_prefix</span></code></a></li>
<li><a class="reference internal" href="#platform"><code class="docutils literal notranslate"><span class="pre">platform</span></code></a></li>
<li><a class="reference internal" href="#language"><code class="docutils literal notranslate"><span class="pre">language</span></code></a><ul>
<li><a class="reference internal" href="#language-version"><code class="docutils literal notranslate"><span class="pre">language.version</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#implementation"><code class="docutils literal notranslate"><span class="pre">implementation</span></code></a><ul>
<li><a class="reference internal" href="#implementation-name"><code class="docutils literal notranslate"><span class="pre">implementation.name</span></code></a></li>
<li><a class="reference internal" href="#implementation-version"><code class="docutils literal notranslate"><span class="pre">implementation.version</span></code></a><ul>
<li><a class="reference internal" href="#implementation-version-major"><code class="docutils literal notranslate"><span class="pre">implementation.version.major</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-minor"><code class="docutils literal notranslate"><span class="pre">implementation.version.minor</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-micro"><code class="docutils literal notranslate"><span class="pre">implementation.version.micro</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-releaselevel"><code class="docutils literal notranslate"><span class="pre">implementation.version.releaselevel</span></code></a></li>
<li><a class="reference internal" href="#implementation-version-serial"><code class="docutils literal notranslate"><span class="pre">implementation.version.serial</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#interpreter"><code class="docutils literal notranslate"><span class="pre">interpreter</span></code></a><ul>
<li><a class="reference internal" href="#interpreter-path"><code class="docutils literal notranslate"><span class="pre">interpreter.path</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#abi"><code class="docutils literal notranslate"><span class="pre">abi</span></code></a><ul>
<li><a class="reference internal" href="#abi-flags"><code class="docutils literal notranslate"><span class="pre">abi.flags</span></code></a></li>
<li><a class="reference internal" href="#abi-extension-suffix"><code class="docutils literal notranslate"><span class="pre">abi.extension_suffix</span></code></a></li>
<li><a class="reference internal" href="#abi-stable-abi-suffix"><code class="docutils literal notranslate"><span class="pre">abi.stable_abi_suffix</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#suffixes"><code class="docutils literal notranslate"><span class="pre">suffixes</span></code></a></li>
<li><a class="reference internal" href="#libpython"><code class="docutils literal notranslate"><span class="pre">libpython</span></code></a><ul>
<li><a class="reference internal" href="#libpython-dynamic"><code class="docutils literal notranslate"><span class="pre">libpython.dynamic</span></code></a></li>
<li><a class="reference internal" href="#libpython-static"><code class="docutils literal notranslate"><span class="pre">libpython.static</span></code></a></li>
<li><a class="reference internal" href="#libpython-link-to-libpython"><code class="docutils literal notranslate"><span class="pre">libpython.link_to_libpython</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#c-api"><code class="docutils literal notranslate"><span class="pre">c_api</span></code></a><ul>
<li><a class="reference internal" href="#c-api-headers"><code class="docutils literal notranslate"><span class="pre">c_api.headers</span></code></a></li>
<li><a class="reference internal" href="#c-api-pkgconfig-path"><code class="docutils literal notranslate"><span class="pre">c_api.pkgconfig_path</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#arbitrary-data"><code class="docutils literal notranslate"><span class="pre">arbitrary_data</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#example">Example</a></li>
<li><a class="reference internal" href="#json-schema">JSON Schema</a></li>
<li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul>
<li><a class="reference internal" href="#having-a-larger-scope">Having a larger scope</a></li>
</ul>
</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-0739.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>