a
    n=ic                  	   @   st  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZmZmZ e
e eeedf dddZe
e ee dd	d
ZG dd deZeee dddZe eee dddZeee dddZedkrpddlZe ZedsJ dede edeej eddd ee dde!d d!d" D ]Z"ee"d#d q\dS )$zPEP 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returnc                 C   s   t || t |S N)structunpackreadcalcsize)r   r    r   e/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/packaging/_musllinux.py_read_unpacked   s    r   )r   r	   c              	   C   sh  |  d zt| d}W n tjy.   Y dS 0 |dd tdkrHdS |  tdd zdd	d
|d  \}}}W n ty   Y dS 0 tj| }zt| |\}}}}}}}	W n tjy   Y dS 0 t	|	d D ]}
|  |||
   z|t| |\}}}W n tjy   Y  dS 0 |dkr,q|  | t
| |d}d|vr\ dS |  S dS )zDetect 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   s   ELFHHI   )IIIIHHHIIIIIIII)r   r   r   )QQQIHHHIIQQQQQQ)r         )r   r       musl)seekr   r   errortupler   KeyErroroperator
itemgetter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interpreterr   r   r   _parse_ld_musl_from_elf   sF    





r7   c                   @   s   e Zd ZU eed< eed< dS )_MuslVersionmajorminorN)__name__
__module____qualname__int__annotations__r   r   r   r   r8   G   s   
r8   )outputr	   c                 C   sx   dd dd |   D D }t|dk s<|d d d dkr@d S td	|d
 }|sXd S tt|d
t|ddS )Nc                 S   s   g | ]}|r|qS r   r   .0nr   r   r   
<listcomp>M       z'_parse_musl_version.<locals>.<listcomp>c                 s   s   | ]}|  V  qd S r
   )r(   rA   r   r   r   	<genexpr>M   rE   z&_parse_musl_version.<locals>.<genexpr>r   r   r   r   zVersion (\d+)\.(\d+)r   )r9   r:   )
splitlineslenrematchr8   r>   group)r@   linesmr   r   r   _parse_musl_versionL   s     rN   )
executabler	   c              	   C   s   t  N}z|t| d}W n  ty>   Y W d   dS 0 t|}W d   n1 s\0    Y  |sndS tj|gtjdd}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OSErrorr7   
subprocessrunPIPErN   rQ   )rO   stackr   ldprocr   r   r   _get_musl_versionV   s    
&r^   )archr	   c                 c   sH   t tj}|du rdS t|jddD ]}d|j d| d|  V  q$dS )aT  Generate 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_r.   )r^   sysrO   r%   r:   r9   )r_   sys_muslr:   r   r   r   platform_tagsn   s
    	
rd   __main__zlinux-z	not linuxzplat:zmusl:ztags: )endz[.-]r.   -r   r`   z
      )#__doc__rS   	functoolsr#   r&   rI   r   rX   rb   typingr   r   r   r   r   bytesstrr>   r   r7   r8   rN   	lru_cacher^   rd   r;   	sysconfigget_platformplat
startswithprintrO   subsplittr   r   r   r   <module>   s2   1


"