U
    .c,                     @  sN  U d dl m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 G dd dZdddd	Zd
dddZd
dddZdd
dddZedd Zded< G dd deZddddZddddZddddZdd d!d"d#Ze d dd$d%Zdddd
d&d'd(Zd)d*d+d,Zddd-d.d/d0ZdS )1    )annotationsN)IOIterator
NamedTuplec                   @  s\   e Zd ZG dd deZdZdZdZdZdZ	dZ
dZdZd	Zd
ZdZdZdddddZdS )_ELFFileHeaderc                   @  s   e Zd ZdZdS )z$_ELFFileHeader._InvalidELFFileHeaderz7
        An invalid ELF file header was found.
        N)__name__
__module____qualname____doc__ r   r   G/tmp/pip-unpacked-wheel-vud_xk1z/wheel/vendored/packaging/_manylinux.py_InvalidELFFileHeader   s   r   iFLE            (   >   l      ~ i   i   z	IO[bytes]None)filereturnc                   sz  ddd fdd}|d| _ | j | jkr2t |d| _| j| j| jhkrVt |d| _| j| j| j	hkrzt |d| _
|d| _|d| _ d| _| j| jkrd	nd
}| j| jkrdnd}| j| jkrdnd}| j| jkr|n|}||| _||| _||| _||| _||| _||| _||| _||| _||| _||| _||| _||| _||| _d S )Nstrint)fmtr   c                   sH   z   t| }t| |}W n tjk
r>   t Y nX |d S )Nr   )readstructcalcsizeunpackerrorr   r   )r   dataresultr   r   r   r   &   s    z'_ELFFileHeader.__init__.<locals>.unpackz>IB   z<Hz>Hz<Iz<Qz>Q)e_ident_magicELF_MAGIC_NUMBERr   r   e_ident_class
ELFCLASS32
ELFCLASS64e_ident_dataELFDATA2LSBELFDATA2MSBe_ident_versione_ident_osabie_ident_abiversionr   e_ident_pade_type	e_machine	e_versione_entrye_phoffe_shoffe_flagse_ehsizee_phentsizee_phnume_shentsizee_shnum
e_shstrndx)selfr   r   format_hformat_iformat_qformat_pr   r!   r   __init__%   s>    

















z_ELFFileHeader.__init__N)r   r   r	   
ValueErrorr   r%   r'   r(   r*   r+   EM_386EM_S390EM_ARM	EM_X86_64EF_ARM_ABIMASKEF_ARM_ABI_VER5EF_ARM_ABI_FLOAT_HARDrB   r   r   r   r   r      s   r   z_ELFFileHeader | None)r   c               
   C  sH   z$t tjd} t| }W 5 Q R X W n tttjfk
rB   Y d S X |S )Nrb)opensys
executabler   OSError	TypeErrorr   )f
elf_headerr   r   r   _get_elf_headerN   s    rS   boolc                  C  sn   t  } | d krdS | j| jk}|| j| jkM }|| j| jkM }|| j| j@ | j	kM }|| j| j
@ | j
kM }|S NF)rS   r&   r'   r)   r*   r1   rF   r6   rH   rI   rJ   rR   r    r   r   r   _is_linux_armhfW   s    

rW   c                  C  sB   t  } | d krdS | j| jk}|| j| jkM }|| j| jkM }|S rU   )rS   r&   r'   r)   r*   r1   rD   rV   r   r   r   _is_linux_i686j   s    rX   r   )archr   c                 C  s$   | dkrt  S | dkrt S | dkS )Narmv7li686>   s390xx86_64ppc64leaarch64ppc64)rW   rX   )rY   r   r   r   _have_compatible_abit   s
    ra   c                   C  s   dS )N2   r   r   r   r   r   <lambda>       rc   zdict[int, int]_LAST_GLIBC_MINORc                   @  s   e Zd ZU ded< ded< dS )_GLibCVersionr   majorminorN)r   r   r	   __annotations__r   r   r   r   rf      s   
rf   z
str | Nonec                  C  sJ   z&t d} | dk	st|  \}}W n ttttfk
rD   Y dS X |S )zJ
    Primary implementation of glibc_version_string using os.confstr.
    CS_GNU_LIBC_VERSIONN)osconfstrAssertionErrorsplitAttributeErrorrO   rC   )version_string_versionr   r   r   _glibc_version_string_confstr   s    
rs   c                  C  s   zddl } W n tk
r"   Y dS X z| d}W n tk
rH   Y dS X z
|j}W n tk
rj   Y dS X | j|_| }t|t	s|
d}|S )zG
    Fallback implementation of glibc_version_string using ctypes.
    r   Nascii)ctypesImportErrorCDLLrO   gnu_get_libc_versionro   c_char_prestype
isinstancer   decode)ru   process_namespacerx   version_strr   r   r   _glibc_version_string_ctypes   s"    


r   c                   C  s   t  p
t S )z9Returns glibc version string, or None if not using glibc.)rs   r   r   r   r   r   _glibc_version_string   s    r   ztuple[int, int])r~   r   c                 C  s@   t d| }|s$td|  t dS t|dt|dfS )a3  Parse glibc version.

    We use a regexp instead of str.split because we want to discard any
    random junk that might come after the minor version -- this might happen
    in patched/forked versions of glibc (e.g. Linaro's version of glibc
    uses version strings like "2.20-2014.11"). See gh-3588.
    z$(?P<major>[0-9]+)\.(?P<minor>[0-9]+)z=Expected glibc version with 2 components major.minor, got: %sr   rg   rh   )rematchwarningswarnRuntimeWarningr   group)r~   mr   r   r   _parse_glibc_version   s    r   c                  C  s   t  } | d krdS t| S )Nr   )r   r   )r~   r   r   r   _get_glibc_version   s    r   )namerY   rr   r   c                 C  s   t  }||k rdS zdd l}W n tk
r4   Y dS X t|drj||d |d |}|d k	rft|S dS |tddkrt|drt|jS |tdd	krt|d
rt|jS |tddkrt|drt|j	S dS )NFr   Tmanylinux_compatibler   r      manylinux1_compatible   manylinux2010_compatible   manylinux2014_compatible)
r   
_manylinuxrv   hasattrr   rT   rf   r   r   r   )r   rY   rr   Z	sys_glibcr   r    r   r   r   _is_compatible   s,    






r   manylinux2014manylinux2010
manylinux1))r   r   )r   r   )r   r   zIterator[str])linuxrY   r   c                 c  s   t |sd S tdd}|dkr(tdd}tt  }|g}t|jd ddD ]}t| }|t|| qJ|D ]}|j|jkr|j}nd}t|j|dD ]^}t|j|}	dj|	 }
t	|
||	r| 
d|
V  |	tkrt|	 }t	|||	r| 
d|V  qqld S )	Nr      >   r]   r[      r   r   zmanylinux_{}_{}r   )ra   rf   r   rangerg   re   appendrh   formatr   replace_LEGACY_MANYLINUX_MAP)r   rY   Ztoo_old_glibc2Zcurrent_glibcZglibc_max_listZglibc_majorZglibc_minorZ	glibc_maxZ	min_minorglibc_versiontagZ
legacy_tagr   r   r   platform_tags  s.    



r   )
__future__r   collections	functoolsrk   r   r   rM   r   typingr   r   r   r   rS   rW   rX   ra   defaultdictre   ri   rf   rs   r   r   r   	lru_cacher   r   r   r   r   r   r   r   <module>   s8    =	
,
