U
    fS                     @  s  d Z 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
Z
ddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZ dd
lmZmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl$m&Z' ddl(m)Z) erddl*Z*dddddZ+dddddZ,e-e!.dd Z/dZ0ddddZ1ddddZ2d dd!d"d#Z3d:dddddd%d&d'Z4d dd(d)Z5dddd*d+Z6dddd,d-Z7d.dd/d0d1d2d3Z8d.dd4d0d5d6d7Z9G d8d9 d9e Z:dS );zI
Create a wheel (.whl) distribution.

A wheel is a built archive format.
    )annotationsN)BytesGenerator	Generator)EmailPolicy)log)iglob)rmtree)TYPE_CHECKINGCallableIterableLiteralSequencecast)ZIP_DEFLATED
ZIP_STORED   )Command__version__)pkginfo_to_metadata)tagsversion)	WheelFilestr)namereturnc                 C  s   t dd| S )zConvert an arbitrary string to a standard distribution name
    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    [^A-Za-z0-9.]+-)resubr    r!   =lib/python3.8/site-packages/setuptools/command/bdist_wheel.py	safe_name#   s    r#   )r   r   c                 C  sF   zt t| W S  tjk
r@   | dd} tdd|  Y S X dS )zB
    Convert an arbitrary string to a standard version string
     .r   r   N)r   _packaging_versionZVersionZInvalidVersionreplacer   r   r   r!   r!   r"   safe_version*   s
    r(   r%   zcp3\dboolr   c                   C  s   t ddkS )NP   )structZcalcsizer!   r!   r!   r"   _is_32bit_interpreter;   s    r.   c                   C  s   dt jd  S )Npyr   )sysversion_infor!   r!   r!   r"   
python_tag?   s    r2   z
str | None)archive_rootr   c                 C  s^   t  }|dr2| dk	r2ddlm} || |}n t rR|dkrFd}n|dkrRd}|d	d
S )z0Return our platform name 'win32', 'linux_x86_64'macosxNr   )calculate_macosx_platform_taglinux-x86_64z
linux-i686linux-aarch64zlinux-armv7lr   _)	sysconfigget_platform
startswithZwheel.macosx_libfiler5   r.   r'   )r3   resultr5   r!   r!   r"   r:   C   s    r:   T)varfallbackexpectedwarnr   c                 C  s:   t | }|dkr2|r.tjd|  dtdd |S ||kS )zfUse a fallback value for determining SOABI flags if the needed config
    var is unset or unavailable.NzConfig variable 'z+' is unset, Python ABI tag may be incorrectr   
stacklevel)r9   get_config_varwarningsr@   RuntimeWarning)r=   r>   r?   r@   valr!   r!   r"   get_flagW   s    

rG   c                  C  s  t d} t }| s|dkrttdrd}d}d}tdttd|dkdrPd	}td
|dk|dkojtjdk dr~tjdk r~d}| t  | | | }n| r|dkr| 	drd| 
dd  }n| r|dkr| 	dr| 
dd }n| r*|dkr*d| 
ddd }|dddd}n^| rh|dkrhd| 
ddd }|dddd}n | r| dddd}nd}|S )zJReturn the ABI tag based on SOABI (if available) or emulate SOABI (PyPy2).ZSOABI)cppp
maxunicode ZPy_DEBUGZgettotalrefcountrH   )r@   dZWITH_PYMALLOC)      mZcpythonr      r   rI   Nr   r%   r8   ZgraalpyrM   )r9   rC   r   interpreter_namehasattrr0   rG   r1   interpreter_versionr;   splitjoinr'   )ZsoabiimplrL   rO   uabir!   r!   r"   get_abi_tagh   s>    
rY   c                 C  s   t | ddS Nr   r8   )r#   r'   r    r!   r!   r"   
safer_name   s    r[   c                 C  s   t | ddS rZ   )r(   r'   r   r!   r!   r"   safer_version   s    r\   zCallable[..., object]z6tuple[type[Exception], Exception, types.TracebackType]None)funcpathexcinfor   c                 C  s   t | ||d  d S )NrP   )remove_readonly_exc)r^   r_   r`   r!   r!   r"   remove_readonly   s    rb   	Exception)r^   r_   excr   c                 C  s   t |tj | | d S )N)oschmodstatS_IWRITE)r^   r_   rd   r!   r!   r"   ra      s    ra   c                   @  s  e Zd ZdZeedZdddded dfd	d
ddddddddd	efddde
  dfddgZddddgZddddZd d! Zed"d# Zd$dd%d&Zd'd( Zd)e d*fd+d+dd,d-d.Zd+d+d/d0d1Zed2dd3d4Zd+d+dd5d6d7ZdS )8bdist_wheelzcreate a wheel distribution)Zstoreddeflated)z
bdist-dir=bz1temporary directory for creating the distributionz
plat-name=pz8platform name to embed in generated filenames [default: N])	keep-tempkzPkeep the pseudo-installation tree around after creating the distribution archive)z	dist-dir=rL   z-directory to put final built distributions in)
skip-buildNz2skip rebuilding everything (for testing/debugging))relativeNz7build the archive using relative paths [default: false])zowner=rW   z@Owner name used when creating a tar file [default: current user])zgroup=gzAGroup name used when creating a tar file [default: current group])	universalNz'make a universal wheel [default: false]zcompression=z6zipfile compression (one of: {}) [default: 'deflated']z, zpython-tag=z3Python implementation compatibility tag [default: 'z'])zbuild-number=NzqBuild number for this particular version. As specified in PEP-0427, this must start with a digit. [default: None])zpy-limited-api=Nz?Python tag (cp32|cp33|cpNN) for abi3 wheel tag [default: false]rn   rp   rq   rs   r]   r*   c                 C  sx   d | _ d | _d | _d | _d| _d| _d | _d | _d | _d | _	d| _
d | _d | _d| _d| _t | _d | _d| _d| _d S )NzipFrj   )	bdist_dirdata_dir	plat_nameplat_tagformat	keep_tempdist_diregginfo_dirroot_is_pure
skip_buildrq   ownergrouprs   compressionr2   build_numberpy_limited_apiplat_name_supplied)selfr!   r!   r"   initialize_options   s&    zbdist_wheel.initialize_optionsc                 C  sP  | j d kr&| dj}tj|d| _ | jd}|  | j	d | _
| jd k	| _z| j| j | _W n& tk
r   td| j d Y nX d}| jdt||  | j p| j  | _| jrtt| jstdt d| jd}d	|kr$td
 |d	 d  }| dkr$d| _| j d k	rL| j d d ! sLtdd S )Nbdistwheelegg_infoz.datazUnsupported compression: )r{   rw   r~   zpy-limited-api must match ''rs   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.rP   )1trueZyesTz1Build tag (build-number) must start with a digit.)r   )"ru   Zget_finalized_command
bdist_basere   r_   rU   distributionZget_command_objZensure_finalizedwheel_dist_namerv   rw   r   supported_compressionsr   KeyError
ValueErrorset_undefined_optionsrt   Zhas_ext_modulesZhas_c_librariesr}   r   r   matchPY_LIMITED_API_PATTERNget_option_dictr   r@   striplowerrs   r   isdigit)r   r   r   Zneed_optionsr   rF   r!   r!   r"   finalize_options   s8    

 

 zbdist_wheel.finalize_optionsc                 C  s8   t | j t| j f}| jr.|| jf7 }d|S )z4Return distribution full name with - replaced with _r   )r[   r   get_namer\   get_versionr   rU   )r   Z
componentsr!   r!   r"   r   '  s    zbdist_wheel.wheel_dist_nameztuple[str, str, str]c                   s(  | j rtt| j nN| jr d nB| jr:| jds:| j n
t| j t rb dkrVd  dkrbd  	 
dd
d	d
d
d | jr| jrd}n| j}|d f}n~t }t }|| }| jr|| dr| j}d}ntt 	 }|| f} fddt D }||ks$td| |S )Nanyr4   )r6   Zlinux_x86_64Z
linux_i686)r7   Zlinux_aarch64Zlinux_armv7lr   r8   r%   r$   zpy2.py3ZnoneZcp3Zabi3c                   s   g | ]}|j |j fqS r!   )ZinterpreterrX   ).0trw   r!   r"   
<listcomp>d  s    z'bdist_wheel.get_tag.<locals>.<listcomp>z'would build wheel with unsupported tag )r   r   r   rw   r}   r;   r:   ru   r.   r   r'   rs   r2   r   rQ   rS   r   rY   Zsys_tagsAssertionError)r   rV   tagZ	impl_nameZimpl_verabi_tagZsupported_tagsr!   r   r"   get_tag2  sF    


zbdist_wheel.get_tagc              	   C  sr  |  d}d|_d|_|  d}d|_| js6| d | j ddd}| j|_d|_| j|_d|_	|  d	}d|_
d
D ] }t|d| tj| j| qtd}tjdkrtjtj| jd}| | _| _t|| jrdnd| td| j  | d |  \}}}	| j d| d| d|	 }
| js4| j}ntj| j| |j}| dd t| j  dt | j!  d}tj| j|}| "| j#| | $| tj%| j&st'| j& tj| j&|
d }t(|d| j)}|*| W 5 Q R X t+| jdg ,ddj-t.j/d d  |f | j0sntd| j  | j1snt.j/dk r`t2| jt3d nt2| jt4d d S ) Nbuild_scriptsZpythonT	build_extFZbuildinstall)Zreinit_subcommandsinstall_scripts)ZheadersZscriptsdataZpurelibZplatlibZinstall_rK   ntz..Zinstall_purelibZinstall_platlibzinstalling to r   Zinstall_egg_info)targetr|   z
.dist-infoz.whlwZ
dist_filesri   z{}.{}r   z	removing )rM      )onerror)Zonexc)5Zreinitialize_command
executableZforceZinplacer~   Zrun_commandru   rootcompileZwarn_dirZno_epsetattrre   r_   rU   rv   r   normpathZinstall_libbaseZinstall_libr}   r   infor   r   rq   _ensure_relativeZinstall_baser   r[   r   r   r\   r   egg2distr|   write_wheelfileexistsr{   makedirsr   r   Zwrite_filesgetattrappendry   r0   r1   rz   Zdry_runr   rb   ra   )r   r   r   r   r   keyZbasedir_observedimpl_tagr   rx   Zarchive_basenamer3   Zdistinfo_dirnameZdistinfo_dirZ
wheel_pathZwfr!   r!   r"   runl  sr    





 
"
zbdist_wheel.runzsetuptools ()r   )wheelfile_base	generatorr   c              	   C  s   ddl m} | }d|d< ||d< t| j |d< | jd k	rH| j|d< |  \}}}|dD ]8}|dD ](}	|dD ]}
d	||	|
f|d
< q|qnq`t	j
|d}td|  t|d}t|dd| W 5 Q R X d S )Nr   )Messagez1.0zWheel-Versionr   zRoot-Is-PurelibZBuildr%   r   ZTagZWHEELz	creating wb)Zmaxheaderlen)Zemail.messager   r   r}   r   r   r   rT   rU   re   r_   r   r   openr   flatten)r   r   r   r   msgr   r   rx   rV   rX   ZplatZwheelfile_pathfr!   r!   r"   r     s     

zbdist_wheel.write_wheelfile)r_   r   c                 C  s6   t j|\}}|dd t jkr2||dd   }|S )Nr   rP   )re   r_   
splitdrivesep)r   r_   Zdriver!   r!   r"   r     s    zbdist_wheel._ensure_relativezIterable[str]c              	   C  s  t dkr| jjjpdS t }| jd}t dkrFttt | jjj}nd|kr`|d d 	 }nd}d|krt
jdtd	d
 ||d d  |s|st|tsd}|D ]f}t|D ]X}|drtd| d q||krtj|rtd| d| d || qq|S )N9   r!   metadata*   license_filesrP   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.r   rA   )zLICEN[CS]E*zCOPYING*zNOTICE*zAUTHORS*~zignoring license file "z" as it looks like a backupzadding license file "z" (matched pattern "z"))setuptools_major_versionr   r   r   setr   r   r   r   rT   rD   r@   DeprecationWarningadd
isinstancelistr   endswithr   debugre   r_   isfiler   )r   filesr   patternspatternr_   r!   r!   r"   license_paths  s>    

zbdist_wheel.license_paths)egginfo_pathdistinfo_pathr   c              	   C  s  ddddd}|| t j|sddl}t jt j|d}||}d	| d
}|r|t j|d }|d| d7 }t|t j|rt	||}	t 
| nlt j|d}
t	||
}	tj||dd d t j|d}t|dd}|  }W 5 Q R X |s|| t j|d}tdddd}t|ddd}t||d|	 W 5 Q R X | jD ](}t j|}t|t j|| q`|| dS )z:Convert an .egg-info directory into a .dist-info directoryr   r]   )rl   r   c                 S  sJ   t j| r0t j| s0t j| r0t|  nt j| rFt |  dS )z-Appropriately delete directory, file or link.N)re   r_   r   islinkisdirshutilr   unlink)rl   r!   r!   r"   adios  s    $z#bdist_wheel.egg2dist.<locals>.adiosr   Nz
*.egg-infozEgg metadata expected at z but not foundz (z) found - possible misnamed archive file?)PKG-INFOc                 S  s   ddddhS )Nr   zrequires.txtzSOURCES.txtznot-zip-safer!   )xyr!   r!   r"   <lambda>9  s
    z&bdist_wheel.egg2dist.<locals>.<lambda>)ignorezdependency_links.txtzutf-8)encodingZMETADATATF)utf8Zmangle_from_Zmax_line_lengthr   )Zpolicy)re   r_   r   globrU   dirnamebasenamer   r   r   mkdirr   Zcopytreer   readr   r   r   r   r   copy)r   r   r   r   r   patpossibleerrZaltZpkg_infoZpkginfo_pathZdependency_links_pathZdependency_links_fileZdependency_linksZpkg_info_pathZserialization_policyoutZlicense_pathfilenamer!   r!   r"   r     sL    



zbdist_wheel.egg2dist)__name__
__module____qualname__Zdescriptionr   r   r   r:   ry   rU   r2   Zuser_optionsZboolean_optionsr   r   propertyr   r   r   r   r   r   r   r   r!   r!   r!   r"   ri      sT   :)

:Y
,ri   )TT);__doc__Z
__future__r   re   r   r   rg   r-   r0   r9   rD   Zemail.generatorr   r   Zemail.policyr   	distutilsr   r   r   r   typingr	   r
   r   r   r   r   Zzipfiler   r   rK   r   r   Zwheel.metadatar   Z	packagingr   r   r&   Zwheel.wheelfiler   typesr#   r(   intrT   r   r   r.   r2   r:   rG   rY   r[   r\   rb   ra   ri   r!   r!   r!   r"   <module>   sN       (