PEP 656: Clarification on platform definition and musl detection (#1877)
This commit is contained in:
parent
e31aab38ed
commit
f68daf1984
66
pep-0656.rst
66
pep-0656.rst
|
@ -14,9 +14,9 @@ Abstract
|
||||||
========
|
========
|
||||||
|
|
||||||
This PEP proposes a new platfrom tag series ``musllinux`` for
|
This PEP proposes a new platfrom tag series ``musllinux`` for
|
||||||
binary Python package distributions for a Python installation linked
|
binary Python package distributions for a Python installation that
|
||||||
against musl on a Linux distribution. The tag works similarly to the
|
depends on musl on a Linux distribution. The tag works similarly to
|
||||||
"perennial manylinux" platform tags specified in :pep:`600`, but
|
the "perennial manylinux" platform tags specified in :pep:`600`, but
|
||||||
targeting platforms based on musl instead.
|
targeting platforms based on musl instead.
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,6 +46,14 @@ Logic behind the new platform tag largely follows :pep:`600`, and
|
||||||
require wheels using this tag make similar promises. Please refer to
|
require wheels using this tag make similar promises. Please refer to
|
||||||
the PEP for more details on rationale and reasoning behind the design.
|
the PEP for more details on rationale and reasoning behind the design.
|
||||||
|
|
||||||
|
The ``musllinux`` 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
|
||||||
|
``musllinux`` platform tags.
|
||||||
|
|
||||||
|
|
||||||
Specification
|
Specification
|
||||||
=============
|
=============
|
||||||
|
@ -54,6 +62,48 @@ Tags using the new scheme will take the form::
|
||||||
|
|
||||||
musllinux_${MUSLMAJOR}_${MUSLMINOR}_${ARCH}
|
musllinux_${MUSLMAJOR}_${MUSLMINOR}_${ARCH}
|
||||||
|
|
||||||
|
Reading the musl version
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
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::
|
||||||
|
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def get_musl_major_minor(so: str) -> tuple[int, int] | None:
|
||||||
|
"""Detect musl runtime version.
|
||||||
|
|
||||||
|
Returns a two-tuple ``(major, minor)`` that indicates musl
|
||||||
|
library's version, or ``None`` if the given libc .so does not
|
||||||
|
output expected information.
|
||||||
|
|
||||||
|
The libc library should output something like this to stderr::
|
||||||
|
|
||||||
|
musl libc (x86_64)
|
||||||
|
Version 1.2.2
|
||||||
|
Dynamic Program Loader
|
||||||
|
"""
|
||||||
|
proc = subprocess.run([so], stderr=subprocess.PIPE, text=True)
|
||||||
|
lines = (line.strip() for line in proc.stderr.splitlines())
|
||||||
|
lines = [line for line in lines if line]
|
||||||
|
if len(lines) < 2 or lines[0][:4] != "musl":
|
||||||
|
return None
|
||||||
|
match = re.match(r"Version (\d+)\.(\d+)", lines[1])
|
||||||
|
if match:
|
||||||
|
return (int(match.group(1)), int(match.group(2)))
|
||||||
|
return None
|
||||||
|
|
||||||
|
There are currently two possible ways to find the musl library's
|
||||||
|
location that a Python interpreter is running on, either with the
|
||||||
|
system ``ldd`` command [ldd]_, or by parsing the ``PT_INTERP``
|
||||||
|
section's value from the executable's ELF header [elf]_.
|
||||||
|
|
||||||
|
|
||||||
|
Formatting the tag
|
||||||
|
------------------
|
||||||
|
|
||||||
Distributions using the tag make similar promises to those described
|
Distributions using the tag make similar promises to those described
|
||||||
in :pep:`600`, including:
|
in :pep:`600`, including:
|
||||||
|
|
||||||
|
@ -77,6 +127,9 @@ The value can be formatted with the following Python code::
|
||||||
arch = arch.replace("-", "_")
|
arch = arch.replace("-", "_")
|
||||||
return f"musllinux_{musl_version[0]}_{musl_version[1]}_{arch}"
|
return f"musllinux_{musl_version[0]}_{musl_version[1]}_{arch}"
|
||||||
|
|
||||||
|
Recommendations to package indexes
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
It is recommended for Python package repositories, including PyPI, to
|
It is recommended for Python package repositories, including PyPI, to
|
||||||
accept platform tags matching the following regular expression::
|
accept platform tags matching the following regular expression::
|
||||||
|
|
||||||
|
@ -85,7 +138,8 @@ accept platform tags matching the following regular expression::
|
||||||
Python package repositories may impose additional requirements to
|
Python package repositories may impose additional requirements to
|
||||||
reject Wheels with known issues, including but not limited to:
|
reject Wheels with known issues, including but not limited to:
|
||||||
|
|
||||||
* A ``musllinux_1_1`` wheel containing symbols only available in musl 1.2.
|
* A ``musllinux_1_1`` wheel containing symbols only available in musl
|
||||||
|
1.2 or later.
|
||||||
* Wheel that depends on external libraries not considered generally
|
* Wheel that depends on external libraries not considered generally
|
||||||
available to the intended audience of the package index.
|
available to the intended audience of the package index.
|
||||||
* A platform tag claiming compatibility to a non-existent musl version
|
* A platform tag claiming compatibility to a non-existent musl version
|
||||||
|
@ -126,6 +180,10 @@ References
|
||||||
|
|
||||||
.. [musl-compat-ml] https://mail.python.org/archives/list/distutils-sig@python.org/message/VRXSTNXWHPAVUW253ZCWWMP7WDTBAQDL/
|
.. [musl-compat-ml] https://mail.python.org/archives/list/distutils-sig@python.org/message/VRXSTNXWHPAVUW253ZCWWMP7WDTBAQDL/
|
||||||
|
|
||||||
|
.. [ldd] https://www.unix.com/man-page/posix/1/ldd/
|
||||||
|
|
||||||
|
.. [elf] https://refspecs.linuxfoundation.org/elf/elf.pdf
|
||||||
|
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
=========
|
=========
|
||||||
|
|
Loading…
Reference in New Issue