� ��^i� ��dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZde ededeedffd�Zde ede efd �ZGd �d e ��Zd ede efd �Zej��dede efd���Zdede efd�Zedkr�ddlZej��Ze�d��s Jd���ede��edeej����edd���eej dde�!dd��d����D]Z"ee"d����dSdS) z�PEP 656 support. This module implements logic to detect if the currently running Python is linked against musl, and what musl version is used. �N)�IO�Iterator� NamedTuple�Optional�Tuple�f�fmt�return.c�v�tj||�tj|������S�N)�struct�unpack�read�calcsize)rr s ��/builddir/build/BUILDROOT/alt-python311-pip-21.3.1-4.el8.x86_64/opt/alt/python311/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py�_read_unpackedrs*�� �=��a�f�f�V�_�S�%9�%9�:�:� ;� ;�;�c�b�|�d�� t|d��}n#tj$rYdSwxYw|dd�t d��krdS|�tjd��d�� dd d �|d\}}}t j|�}n#t$rYdSwxYw t||��\}}}}}}} n#tj$rYdSwxYwt| dz��D]�} |�||| zz�� |t||����\} } } n#tj$rYdSwxYw| d kr�Z|�| ��tj |� | ����� d ��}d |vrdS|cSdS)z�Detect musl libc location by parsing the Python executable. Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html r�16BN�sELF�HHI�)�IIIIHHH�IIIIIIII)rrr)�QQQIHHH�IIQQQQQQ)r��)rr���musl)�seekrr �error�tupler�operator� itemgetter�KeyError�range�os�fsdecoder�strip)r�ident�e_fmt�p_fmt�p_idx�p_get�_�e_phoff� e_phentsize�e_phnum�i�p_type�p_offset�p_filesz� interpreters r�_parse_ld_musl_from_elfr:s$�� �F�F�1�I�I�I���q�%�(�(���� �<�����t�t����� �R�a�R�y�E�*�%�%�%�%��t��F�F�6�?�5� !� !�1�%�%�%� ,� 2�1� � � ��(����u�e��#�U�+���� �����t�t����� �4B�1�e�4L�4L�1��7�A�q�!�[�'�'�� �<�����t�t����� �7�Q�;� � � � �� ���w��q��(�)�)�)� �).��~�a��/G�/G�)H�)H� &�F�H�h�h���|� � � ��4�4�4� ���� �Q�;�;� � ���x�����k�!�&�&��"2�"2�3�3�9�9�$�?�?� � �� $� $��4�4����� �4sB�(�;�;�B(�( B6�5B6�:C�C&�%C&�D7�7E � E c�$�eZdZUeed<eed<dS)� _MuslVersion�major�minorN)�__name__� __module__� __qualname__�int�__annotations__�rrr<r<Gs"������� �J�J�J� �J�J�J�J�Jrr<�outputc��d�d�|���D��D��}t|��dks|ddd�dkrdStjd|d��}|sdSt t |�d����t |�d����� ��S) Nc��g|]}|�|��SrDrD��.0�ns r� z'_parse_musl_version..Ms�� F� F� F�1�A� F�Q� F� F� Frc3�>K�|]}|���V��dSr )r+rHs r� z&_parse_musl_version..Ms*����@�@�q������@�@�@�@�@�@rrrrr!zVersion (\d+)\.(\d+)r)r=r>)� splitlines�len�re�matchr<rB�group)rE�lines�ms r�_parse_musl_versionrULs��� F� F�@�@�F�,=�,=�,?�,?�@�@�@� F� F� F�E� �5�z�z�A�~�~��q��"�1�"���/�/��t� ��(�%��(�3�3�A� ���t� �c�!�'�'�!�*�*�o�o�S�������_�_� E� E� E�Er� executablec�l�tj��5} |�t|d����}n#t$rYddd��dSwxYwt |��}ddd��n #1swxYwY|sdSt j|gt jd���}t|j ��S)a`Detect currently-running musl runtime version. This is done by checking the specified executable's dynamic linking information, and invoking the loader to parse its output for a version string. If the loader is musl, the output would be something like:: musl libc (x86_64) Version 1.2.2 Dynamic Program Loader �rbNT)�stderr�universal_newlines) � contextlib� ExitStack� enter_context�open�IOErrorr:� subprocess�run�PIPErUrY)rV�stackr�ld�procs r�_get_musl_versionrfVs�� � � � �(�5� ��#�#�D��T�$:�$:�;�;�A�A��� � � �� (�(�(�(�(�(�(�(� ���� $�Q� '� '�� (�(�(�(�(�(�(�(�(�(�(����(�(�(�(� ���t� �>�2�$�z��4� P� P� P�D� �t�{� +� +�+s1�A1�#:�A1� A�A1�A�A1�1A5�8A5�archc#�K�ttj��}|�dSt|jdd��D]}d|j�d|�d|��V��dS)aTGenerate musllinux tags compatible to the current platform. :param arch: Should be the part of platform tag after the ``linux_`` prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a prerequisite for the current platform to be musllinux-compatible. :returns: An iterator of compatible musllinux tags. N������ musllinux_r1)rf�sysrVr(r>r=)rg�sys_muslr>s r� platform_tagsrmnsr����!���0�0�H������x�~�r�2�.�.�;�;��:�8�>�:�:�E�:�:�D�:�:�:�:�:�:�;�;r�__main__zlinux-z not linuxzplat:zmusl:ztags:� )�endz[.-]r1�-rriz )#�__doc__r[� functoolsr%r)rPr r`rk�typingrrrrr�bytes�strrBrr:r<rU� lru_cacherfrmr?� sysconfig� get_platform�plat� startswith�printrV�sub�split�trDrr�r�s����� ������������ � � � � � � � � � � � ����� � � � �<�<�<�<�<�<�<�<�<�<�<�<�<�<�<�b��i�<�c�<�e�C��H�o�<�<�<�<�.�r�%�y�.�X�c�]�.�.�.�.�b�����:���� F��F���(>�F�F�F�F������,�#�,�(�<�*@�,�,�,���,�. ;�� ;��� � ;� ;� ;� ;�  �z������� !�9� !� #� #�D� �?�?�8� $� $�1�1�k�1�1� $� �E�'�4���� �E�'�$�$�S�^�4�4�5�5�5� �E�'�s����� �]�6�2�6�'�3�� � �3��0B�0B�2�0F�G�G� H� H�!�!�� ��a�Z� � � � � ���!�!r