CINXE.COM
PEP 656 – Platform Tag for Linux Distributions Using Musl | peps.python.org
<!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 656 – Platform Tag for Linux Distributions Using Musl | peps.python.org</title> <link rel="shortcut icon" href="../_static/py.png"> <link rel="canonical" href="https://peps.python.org/pep-0656/"> <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 656 – Platform Tag for Linux Distributions Using Musl | peps.python.org'> <meta property="og:description" content="This PEP proposes a new platform tag series musllinux for binary Python package distributions for a Python installation that depends on musl on a Linux distribution. The tag works similarly to the “perennial manylinux” platform tags specified in PEP 600..."> <meta property="og:type" content="website"> <meta property="og:url" content="https://peps.python.org/pep-0656/"> <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="This PEP proposes a new platform tag series musllinux for binary Python package distributions for a Python installation that depends on musl on a Linux distribution. The tag works similarly to the “perennial manylinux” platform tags specified in PEP 600..."> <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> » </li> <li><a href="../pep-0000/">PEP Index</a> » </li> <li>PEP 656</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 656 – Platform Tag for Linux Distributions Using Musl</h1> <dl class="rfc2822 field-list simple"> <dt class="field-odd">Author<span class="colon">:</span></dt> <dd class="field-odd">Tzu-ping Chung <uranusjr at gmail.com></dd> <dt class="field-even">Sponsor<span class="colon">:</span></dt> <dd class="field-even">Brett Cannon <brett at python.org></dd> <dt class="field-odd">PEP-Delegate<span class="colon">:</span></dt> <dd class="field-odd">Paul Moore <p.f.moore at gmail.com></dd> <dt class="field-even">Discussions-To<span class="colon">:</span></dt> <dd class="field-even"><a class="reference external" href="https://discuss.python.org/t/7165">Discourse thread</a></dd> <dt class="field-odd">Status<span class="colon">:</span></dt> <dd class="field-odd"><abbr title="Accepted and implementation complete, or no longer active">Final</abbr></dd> <dt class="field-even">Type<span class="colon">:</span></dt> <dd class="field-even"><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-odd">Topic<span class="colon">:</span></dt> <dd class="field-odd"><a class="reference external" href="../topic/packaging/">Packaging</a></dd> <dt class="field-even">Created<span class="colon">:</span></dt> <dd class="field-even">17-Mar-2021</dd> <dt class="field-odd">Post-History<span class="colon">:</span></dt> <dd class="field-odd">17-Mar-2021, 18-Apr-2021</dd> <dt class="field-even">Resolution<span class="colon">:</span></dt> <dd class="field-even"><a class="reference external" href="https://discuss.python.org/t/7165/32">Discourse message</a></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="#motivation">Motivation</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#specification">Specification</a><ul> <li><a class="reference internal" href="#reading-the-musl-version">Reading the musl version</a></li> <li><a class="reference internal" href="#formatting-the-tag">Formatting the tag</a></li> <li><a class="reference internal" href="#recommendations-to-package-indexes">Recommendations to package indexes</a></li> </ul> </li> <li><a class="reference internal" href="#backwards-compatibility">Backwards Compatibility</a></li> <li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul> <li><a class="reference internal" href="#create-a-platform-tag-based-specifically-for-alpine-linux">Create a platform tag based specifically for Alpine Linux</a></li> </ul> </li> <li><a class="reference internal" href="#references">References</a></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>This PEP proposes a new platform tag series <code class="docutils literal notranslate"><span class="pre">musllinux</span></code> for binary Python package distributions for a Python installation that depends on musl on a Linux distribution. The tag works similarly to the “perennial manylinux” platform tags specified in <a class="pep reference internal" href="../pep-0600/" title="PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions">PEP 600</a>, but targeting platforms based on musl instead.</p> </section> <section id="motivation"> <h2><a class="toc-backref" href="#motivation" role="doc-backlink">Motivation</a></h2> <p>With the wide use of containers, distributions such as Alpine Linux <a class="reference internal" href="#alpine" id="id1"><span>[alpine]</span></a>, have been gaining more popularity than ever. Many of them based on musl <a class="reference internal" href="#musl" id="id2"><span>[musl]</span></a>, a different libc implementation from glibc, and therefore cannot use the existing <code class="docutils literal notranslate"><span class="pre">manylinux</span></code> platform tags. This means that Python package projects cannot deploy binary distributions on PyPI for them. Users of such projects demand build constraints from those projects, putting unnecessary burden on project maintainers.</p> </section> <section id="rationale"> <h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2> <p>According to the documentation, musl has a stable ABI, and maintains backwards compatibility <a class="reference internal" href="#musl-compatibility" id="id3"><span>[musl-compatibility]</span></a> <a class="reference internal" href="#compare-libcs" id="id4"><span>[compare-libcs]</span></a>, so a binary compiled against an earlier version of musl is guaranteed to run against a newer musl runtime <a class="reference internal" href="#musl-compat-ml" id="id5"><span>[musl-compat-ml]</span></a>. Therefore, we use a scheme similar to the glibc-version-based manylinux tags, but against musl versions instead of glibc.</p> <p>Logic behind the new platform tag largely follows <a class="pep reference internal" href="../pep-0600/" title="PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions">PEP 600</a> (“perennial manylinux”), and requires wheels using this tag make similar promises. Please refer to <a class="pep reference internal" href="../pep-0600/" title="PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions">PEP 600</a> for more details on rationale and reasoning behind the design.</p> <p>The <code class="docutils literal notranslate"><span class="pre">musllinux</span></code> platform tags only apply to Python interpreters dynamically linked against the musl libc and executed on the runtime shared library, on a Linux operating system. Statically linked interpreters or mixed builds with other libc implementations (such as glibc) are out of scope and not supported by platform tags defined in this document. Such interpreters should not claim compatibility with <code class="docutils literal notranslate"><span class="pre">musllinux</span></code> platform tags.</p> </section> <section id="specification"> <h2><a class="toc-backref" href="#specification" role="doc-backlink">Specification</a></h2> <p>Tags using the new scheme will take the form:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>musllinux_${MUSLMAJOR}_${MUSLMINOR}_${ARCH} </pre></div> </div> <p>This tag promises the wheel works on any mainstream Linux distribution that uses musl version <code class="docutils literal notranslate"><span class="pre">${MUSLMAJOR}.${MUSLMINOR}</span></code>, following the perennial design. All other system-level dependency requirements rely on the community’s definition to the intentionally vague “mainstream” description introduced in <a class="pep reference internal" href="../pep-0600/" title="PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions">PEP 600</a>. A wheel may make use of newer system dependencies when all mainstream distributions using the specified musl version provide the dependency by default; once all mainstream distributions on the musl version ship a certain dependency version by default, users relying on older versions are automatically removed from the coverage of that <code class="docutils literal notranslate"><span class="pre">musllinux</span></code> tag.</p> <section id="reading-the-musl-version"> <h3><a class="toc-backref" href="#reading-the-musl-version" role="doc-backlink">Reading the musl version</a></h3> <p>The musl version values can be obtained by executing the musl libc shared library the Python interpreter is currently running on, and parsing the output:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">re</span> <span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_musl_major_minor</span><span class="p">(</span><span class="n">so</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""Detect musl runtime version.</span> <span class="sd"> Returns a two-tuple ``(major, minor)`` that indicates musl</span> <span class="sd"> library's version, or ``None`` if the given libc .so does not</span> <span class="sd"> output expected information.</span> <span class="sd"> The libc library should output something like this to stderr::</span> <span class="sd"> musl libc (x86_64)</span> <span class="sd"> Version 1.2.2</span> <span class="sd"> Dynamic Program Loader</span> <span class="sd"> """</span> <span class="n">proc</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">so</span><span class="p">],</span> <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="n">lines</span> <span class="o">=</span> <span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">proc</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span> <span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span> <span class="k">if</span> <span class="n">line</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">4</span><span class="p">]</span> <span class="o">!=</span> <span class="s2">"musl"</span><span class="p">:</span> <span class="k">return</span> <span class="kc">None</span> <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">"Version (\d+)\.(\d+)"</span><span class="p">,</span> <span class="n">lines</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="n">match</span><span class="p">:</span> <span class="k">return</span> <span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)),</span> <span class="nb">int</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)))</span> <span class="k">return</span> <span class="kc">None</span> </pre></div> </div> <p>There are currently two possible ways to find the musl library’s location that a Python interpreter is running on, either with the system <code class="docutils literal notranslate"><span class="pre">ldd</span></code> command <a class="reference internal" href="#ldd" id="id6"><span>[ldd]</span></a>, or by parsing the <code class="docutils literal notranslate"><span class="pre">PT_INTERP</span></code> section’s value from the executable’s ELF header <a class="reference internal" href="#elf" id="id7"><span>[elf]</span></a>.</p> </section> <section id="formatting-the-tag"> <h3><a class="toc-backref" href="#formatting-the-tag" role="doc-backlink">Formatting the tag</a></h3> <p>Distributions using the tag make similar promises to those described in <a class="pep reference internal" href="../pep-0600/" title="PEP 600 – Future ‘manylinux’ Platform Tags for Portable Linux Built Distributions">PEP 600</a>, including:</p> <ol class="arabic simple"> <li>The distribution works on any mainstream Linux distributions with musl version <code class="docutils literal notranslate"><span class="pre">${MUSLMAJOR}.${MUSLMINOR}</span></code> or later.</li> <li>The distribution’s <code class="docutils literal notranslate"><span class="pre">${ARCH}</span></code> matches the return value of <code class="docutils literal notranslate"><span class="pre">sysconfig.get_platform()</span></code> on the host system, replacing period (<code class="docutils literal notranslate"><span class="pre">.</span></code>) and hyphen (<code class="docutils literal notranslate"><span class="pre">-</span></code>) characters with underscores (<code class="docutils literal notranslate"><span class="pre">_</span></code>), as outlined in <a class="pep reference internal" href="../pep-0425/" title="PEP 425 – Compatibility Tags for Built Distributions">PEP 425</a> and <a class="pep reference internal" href="../pep-0427/" title="PEP 427 – The Wheel Binary Package Format 1.0">PEP 427</a>.</li> </ol> <p>Example values:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">musllinux_1_1_x86_64</span> <span class="c1"># musl 1.1 running on x86-64.</span> <span class="n">musllinux_1_2_aarch64</span> <span class="c1"># musl 1.2 running on ARM 64-bit.</span> </pre></div> </div> <p>The value can be formatted with the following Python code:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">sysconfig</span> <span class="k">def</span><span class="w"> </span><span class="nf">format_musllinux</span><span class="p">(</span><span class="n">musl_version</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">])</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span> <span class="n">os_name</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">arch</span> <span class="o">=</span> <span class="n">sysconfig</span><span class="o">.</span><span class="n">get_platform</span><span class="p">()</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s2">"-"</span><span class="p">)</span> <span class="k">assert</span> <span class="n">os_name</span> <span class="o">==</span> <span class="s2">"linux"</span> <span class="ow">and</span> <span class="n">sep</span><span class="p">,</span> <span class="s2">"Not a Linux"</span> <span class="n">arch</span> <span class="o">=</span> <span class="n">arch</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"."</span><span class="p">,</span> <span class="s2">"_"</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"-"</span><span class="p">,</span> <span class="s2">"_"</span><span class="p">)</span> <span class="k">return</span> <span class="sa">f</span><span class="s2">"musllinux_</span><span class="si">{</span><span class="n">musl_version</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">musl_version</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">arch</span><span class="si">}</span><span class="s2">"</span> </pre></div> </div> </section> <section id="recommendations-to-package-indexes"> <h3><a class="toc-backref" href="#recommendations-to-package-indexes" role="doc-backlink">Recommendations to package indexes</a></h3> <p>It is recommended for Python package repositories, including PyPI, to accept platform tags matching the following regular expression:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">musllinux_</span><span class="p">([</span><span class="mi">0</span><span class="o">-</span><span class="mi">9</span><span class="p">]</span><span class="o">+</span><span class="p">)</span><span class="n">_</span><span class="p">([</span><span class="mi">0</span><span class="o">-</span><span class="mi">9</span><span class="p">]</span><span class="o">+</span><span class="p">)</span><span class="n">_</span><span class="p">([</span><span class="o">^.-</span><span class="p">]</span><span class="o">+</span><span class="p">)</span> </pre></div> </div> <p>Python package repositories may impose additional requirements to reject Wheels with known issues, including but not limited to:</p> <ul class="simple"> <li>A <code class="docutils literal notranslate"><span class="pre">musllinux_1_1</span></code> wheel containing symbols only available in musl 1.2 or later.</li> <li>Wheel that depends on external libraries not considered generally available to the intended audience of the package index.</li> <li>A platform tag claiming compatibility to a non-existent musl version (like <code class="docutils literal notranslate"><span class="pre">musllinux_9000_0</span></code>).</li> </ul> <p>Such policies are ultimately up to individual package repositories. It is not the author’s intention to impose restrictions to the maintainers.</p> </section> </section> <section id="backwards-compatibility"> <h2><a class="toc-backref" href="#backwards-compatibility" role="doc-backlink">Backwards Compatibility</a></h2> <p>There are no backwards compatibility concerns in this PEP.</p> </section> <section id="rejected-ideas"> <h2><a class="toc-backref" href="#rejected-ideas" role="doc-backlink">Rejected Ideas</a></h2> <section id="create-a-platform-tag-based-specifically-for-alpine-linux"> <h3><a class="toc-backref" href="#create-a-platform-tag-based-specifically-for-alpine-linux" role="doc-backlink">Create a platform tag based specifically for Alpine Linux</a></h3> <p>Past experience on the <code class="docutils literal notranslate"><span class="pre">manylinux</span></code> tag series shows this approach would be too costly time-wise. The author feels the “works well with others” rule both is more inclusive and works well enough in practice.</p> </section> </section> <section id="references"> <h2><a class="toc-backref" href="#references" role="doc-backlink">References</a></h2> <div role="list" class="citation-list"> <div class="citation" id="alpine" role="doc-biblioentry"> <dt class="label" id="alpine">[<a href="#id1">alpine</a>]</dt> <dd><a class="reference external" href="https://alpinelinux.org/">https://alpinelinux.org/</a></div> <div class="citation" id="musl" role="doc-biblioentry"> <dt class="label" id="musl">[<a href="#id2">musl</a>]</dt> <dd><a class="reference external" href="https://musl.libc.org">https://musl.libc.org</a></div> <div class="citation" id="musl-compatibility" role="doc-biblioentry"> <dt class="label" id="musl-compatibility">[<a href="#id3">musl-compatibility</a>]</dt> <dd><a class="reference external" href="https://wiki.musl-libc.org/compatibility.html">https://wiki.musl-libc.org/compatibility.html</a></div> <div class="citation" id="compare-libcs" role="doc-biblioentry"> <dt class="label" id="compare-libcs">[<a href="#id4">compare-libcs</a>]</dt> <dd><a class="reference external" href="https://www.etalabs.net/compare_libcs.html">https://www.etalabs.net/compare_libcs.html</a></div> <div class="citation" id="musl-compat-ml" role="doc-biblioentry"> <dt class="label" id="musl-compat-ml">[<a href="#id5">musl-compat-ml</a>]</dt> <dd><a class="reference external" href="https://mail.python.org/archives/list/distutils-sig@python.org/message/VRXSTNXWHPAVUW253ZCWWMP7WDTBAQDL/">https://mail.python.org/archives/list/distutils-sig@python.org/message/VRXSTNXWHPAVUW253ZCWWMP7WDTBAQDL/</a></div> <div class="citation" id="ldd" role="doc-biblioentry"> <dt class="label" id="ldd">[<a href="#id6">ldd</a>]</dt> <dd><a class="reference external" href="https://www.unix.com/man-page/posix/1/ldd/">https://www.unix.com/man-page/posix/1/ldd/</a></div> <div class="citation" id="elf" role="doc-biblioentry"> <dt class="label" id="elf">[<a href="#id7">elf</a>]</dt> <dd><a class="reference external" href="https://refspecs.linuxfoundation.org/elf/elf.pdf">https://refspecs.linuxfoundation.org/elf/elf.pdf</a></div> </div> </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-0656.rst">https://github.com/python/peps/blob/main/peps/pep-0656.rst</a></p> <p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0656.rst">2025-02-01 08:55:40 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="#motivation">Motivation</a></li> <li><a class="reference internal" href="#rationale">Rationale</a></li> <li><a class="reference internal" href="#specification">Specification</a><ul> <li><a class="reference internal" href="#reading-the-musl-version">Reading the musl version</a></li> <li><a class="reference internal" href="#formatting-the-tag">Formatting the tag</a></li> <li><a class="reference internal" href="#recommendations-to-package-indexes">Recommendations to package indexes</a></li> </ul> </li> <li><a class="reference internal" href="#backwards-compatibility">Backwards Compatibility</a></li> <li><a class="reference internal" href="#rejected-ideas">Rejected Ideas</a><ul> <li><a class="reference internal" href="#create-a-platform-tag-based-specifically-for-alpine-linux">Create a platform tag based specifically for Alpine Linux</a></li> </ul> </li> <li><a class="reference internal" href="#references">References</a></li> <li><a class="reference internal" href="#copyright">Copyright</a></li> </ul> <br> <a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0656.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>