U
    P^9                     @   s  d Z ddlZddlZddlZddl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 ddlmZ dd	lmZ ddlZd
dlmZmZ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! ej"Z"ej#Z#dZ$dd Z%dd Z&G dd deZ'dS )zI
Create a wheel (.whl) distribution.

A wheel is a built archive format.
    N)	Generator)Command)get_python_version)log)iglob)rmtree)warn   )get_abbr_implget_impl_verget_abi_tagget_platform)write_pkg_info)pkginfo_to_metadata)	WheelFile)
pep425tags)__version__zcp3\dc                 C   s   t | ddS N-_)	safe_namereplace)name r   4/tmp/pip-install-220asx0h/wheel/wheel/bdist_wheel.py
safer_name#   s    r   c                 C   s   t | ddS r   )safe_versionr   )versionr   r   r   safer_version'   s    r   c                   @   s   e Zd ZdZdddde  fdddd	d
ddddde d  fddgZddddgZdd Zdd Z	e
dd Zdd Zdd  Zd!e d" fd#d$Zd%d& Ze
d'd( Zd)d* ZdS )+bdist_wheelzcreate a wheel distribution)z
bdist-dir=bz1temporary directory for creating the distributionz
plat-name=pz;platform name to embed in generated filenames (default: %s))	keep-tempkzPkeep the pseudo-installation tree around after creating the distribution archive)z	dist-dir=dz-directory to put final built distributions in)
skip-buildNz2skip rebuilding everything (for testing/debugging))relativeNz7build the archive using relative paths (default: false))zowner=uz@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python-tag=Nz7Python implementation compatibility tag (default: py%s)r   )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)r"   r%   r&   r)   c                 C   sz   d | _ d | _d | _d | _d| _d| _d | _d | _d | _d | _	d| _
d | _d | _d| _dt d  | _d | _d| _d| _d S )NzipFpyr   )	bdist_dirdata_dir	plat_nameplat_tagformat	keep_tempdist_diregginfo_dirroot_is_pure
skip_buildr&   ownergroupr)   r   
python_tagbuild_numberpy_limited_apiplat_name_supplied)selfr   r   r   initialize_optionsU   s$    zbdist_wheel.initialize_optionsc                 C   s   | j d kr&| dj}tj|d| _ | jd | _| jd k	| _	d}| j
dt||  | j ph| j  | _| jrtt| jstdt | jd}d|krtd |d d  }| d	krd
| _| jd k	r| jd d  stdd S )Nbdistwheelz.data)r2   r.   r5   zpy-limited-api must match '%s'r)   z=The [wheel] section is deprecated. Use [bdist_wheel] instead.r	   )1trueyesTz1Build tag (build-number) must start with a digit.)r>   )r,   get_finalized_command
bdist_baseospathjoinwheel_dist_namer-   r.   r;   set_undefined_optionsr*   distributionhas_ext_moduleshas_c_librariesr4   r:   rematchPY_LIMITED_API_PATTERN
ValueErrorget_option_dictloggerr   striplowerr)   r9   isdigit)r<   rD   Zneed_optionsr?   valr   r   r   finalize_optionsi   s,    


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   rJ   get_namer   get_versionr9   rG   )r<   
componentsr   r   r   rH      s    zbdist_wheel.wheel_dist_namec                 C   s  | j r| j}n.| jrd}n"| jp$t }|dkr<tjdkr<d}|dddd}| jrt| jrbd}n| j}|d	|f}nt	 }t
 }|| }| jr|| d
r| j}d}ntt  }|||f}tj| j r|nd d}| js||d kstd||d f ||kstd||S )Nany)zlinux-x86_64linux_x86_64i
linux_i686r   r   .zpy2.py3noneZcp3Zabi3)Zsupplied_platformr   z%s != %sz)would build wheel with unsupported tag {})r;   r.   r4   r   sysmaxsizer   r)   r8   r
   r   r:   
startswithstrr   rT   r   get_supportedAssertionErrorr0   )r<   r.   impltagZ	impl_nameimpl_verabi_tagZsupported_tagsr   r   r   get_tag   s8    
 zbdist_wheel.get_tagc              	   C   s*  |  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 |  \}}}	d| j|||	}
| js&| j}ntj| j| |j}| dd dt| j  t!| j" }tj| j|}| #| j$| | %| tj&| j'st(| j' tj| j'|
d }t)|d}|*| W 5 Q R X t+| jdg ,dt- |f | j.s&td| j | j/s&t0| j d S )Nbuild_scriptspythonT	build_extFbuildinstall)reinit_subcommandsinstall_scripts)headersscriptsdatapurelibplatlibinstall_ ntz..install_purelibinstall_platlibzinstalling to %sz{}-{}-{}-{}install_egg_info)targetr3   z{}-{}.dist-infoz.whlw
dist_filesr   zremoving %s)1reinitialize_command
executableforceZinplacer5   run_commandr,   rootcompilewarn_dirZno_epsetattrrE   rF   rG   r-   r   normpathinstall_libbaseinstall_libr4   rR   inforj   r0   rH   r&   _ensure_relativeinstall_baserI   r   rJ   rX   r   rY   egg2distr3   write_wheelfileexistsr2   makedirsr   Zwrite_filesgetattrappendr   r1   dry_runr   )r<   rk   rm   ro   rq   keyZbasedir_observedimpl_tagri   r/   Zarchive_basenameZarchive_rootZdistinfo_dirnamedistinfo_dir
wheel_pathZwfr   r   r   run   sv    








zbdist_wheel.runzbdist_wheel ()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TagWHEELzcreating %sr~   )maxheaderlen)email.messager   rc   r4   rT   r9   rj   splitrG   rE   rF   rR   r   openr   flatten)r<   Zwheelfile_base	generatorr   msgr   ri   r/   rf   abiplatZwheelfile_pathfr   r   r   r   	  s     

zbdist_wheel.write_wheelfilec                 C   s6   t j|\}}|dd t jkr2||dd   }|S )Nr   r	   )rE   rF   
splitdrivesep)r<   rF   driver   r   r   r     s    zbdist_wheel._ensure_relativec                 C   s   | j d}t }tdd |ddd  D }d|krXtdt ||d d  d|krld|krld	}|D ]>}t	|D ]0}||kr|t
j|r|td
|| || q|qp|S )Nmetadatac                 S   s   h | ]}|qS r   r   ).0optionr   r   r   	<setcomp>)  s    z,bdist_wheel.license_paths.<locals>.<setcomp>Zlicense_files)rx   rx   r	   Zlicense_filezEThe "license_file" option is deprecated. Use "license_files" instead.)zLICEN[CS]E*zCOPYING*zNOTICE*zAUTHORS*z/adding license file "%s" (matched pattern "%s"))rJ   rQ   setsortedgetr   r   DeprecationWarningaddr   rE   rF   isfilerR   r   )r<   r   filespatternspatternrF   r   r   r   license_paths%  s$    zbdist_wheel.license_pathsc              	   C   sX  dd }|| t j|sxddl}t jt j|d}||}d|f }|rpt j|d }|d|f 7 }t|t j|r|}	t	||}
t 
| njt j|d}	t	||	}
tj||d	d
 d t j|d}t|d}|  }W 5 Q R X |s|| tt j|d|
 | jD ](}t j|}t|t j|| q"|| dS )z:Convert an .egg-info directory into a .dist-info directoryc                 S   sJ   t j| r0t j| s0t j| r0t|  nt j| rFt |  dS )z-Appropriately delete directory, file or link.N)rE   rF   r   islinkisdirshutilr   unlink)r!   r   r   r   adios?  s    $z#bdist_wheel.egg2dist.<locals>.adiosr   Nz
*.egg-infoz)Egg metadata expected at %s but not foundz- (%s 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>c  s   z&bdist_wheel.egg2dist.<locals>.<lambda>)ignorezdependency_links.txtrMETADATA)rE   rF   r   globrG   dirnamebasenamerP   r   r   mkdirr   copytreer   readrS   r   r   copy)r<   Zegginfo_pathZdistinfo_pathr   r   patpossibleerrZaltZpkginfo_pathpkg_infoZdependency_links_pathZdependency_links_fileZdependency_linksZlicense_pathfilenamer   r   r   r   =  s<    




zbdist_wheel.egg2dist)__name__
__module____qualname__descriptionr   r   user_optionsboolean_optionsr=   rW   propertyrH   rj   r   wheel_versionr   r   r   r   r   r   r   r   r   +   sD   $
&R
r   )(__doc__rE   r   r`   rM   email.generatorr   distutils.corer   distutils.sysconfigr   	distutilsr   rR   r   r   r   warningsr   pkg_resourcesr   r
   r   r   r   Zpkginfor   r   r   Z	wheelfiler   rx   r   r   r   r   rO   r   r   r   r   r   r   r   <module>   s0   