
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÝPf~  ã               @   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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 ddlmZ ddlmZ ddlZddlmZ ddlmZmZ dd	lmZmZm Z  dd
l!m"Z"m#Z# ddlm$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 dZ9d9Z:ej;e<ƒZ=G dd„ de>ƒZ?dd„ Z@dd„ ZAd;dd„ZBd d!„ ZCd"d#„ ZDejEd$ejFƒZGd%d&„ ZHd'd(„ ZId<d+d,„ZJd-d.„ ZKeKd/d0„ ƒZLd1d2„ ZMd3d4„ ZNG d5d6„ d6e>ƒZOG d7d8„ d8e>ƒZPdS )=zH
Support for installing and building the "wheel" binary package format.
é    )Úabsolute_importN)Úurlsafe_b64encode)ÚParser)ÚStringIO)Ú
expanduser)Úpath_to_urlÚ
unpack_url)ÚInstallationErrorÚInvalidWheelFilenameÚUnsupportedWheel)Údistutils_schemeÚPIP_DELETE_MARKER_FILENAME)Ú
pep425tags)Úcall_subprocessÚ
ensure_dirÚcaptured_stdoutÚrmtreeÚread_chunks)Úopen_spinner)Ú
indent_log)ÚSETUPTOOLS_SHIM)ÚScriptMaker)Úpkg_resources)Úcanonicalize_name)Úconfigparserz.whlé   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
WheelCachez&A cache of wheels for future installs.c             C   s   |rt |ƒnd| _|| _dS )zÉCreate a wheel cache.

        :param cache_dir: The root of the cache.
        :param format_control: A pip.index.FormatControl object to limit
            binaries being read from the cache.
        N)r   Ú
_cache_dirÚ_format_control)ÚselfÚ	cache_dirÚformat_control© r"   ú/usr/lib/python3.6/wheel.pyÚ__init__8   s    zWheelCache.__init__c             C   s   t | j|| j|ƒS )N)Úcached_wheelr   r   )r   ÚlinkÚpackage_namer"   r"   r#   r%   B   s    zWheelCache.cached_wheelN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r%   r"   r"   r"   r#   r   5   s   
r   c             C   s�   |j g}|jdk	r4|jdk	r4|jdj|j|jgƒƒ dj|ƒ}tj|jƒ ƒjƒ }|dd… |dd… |dd… |dd… g}t	j
j| df|žŽ S )aË  
    Return a directory to store cached wheels in for link.

    Because there are M wheels for any one sdist, we provide a directory
    to cache them in, and then consult that directory when looking up
    cache hits.

    We only insert things into the cache if they have plausible version
    numbers, so that we don't contaminate the cache with things that were not
    unique. E.g. ./package might have dozens of installs done for it and build
    a version of 0.0...and if we built and cached a wheel, we'd end up using
    the same wheel even if the source has been edited.

    :param cache_dir: The cache_dir being used by pip.
    :param link: The link of the sdist for which this will cache wheels.
    Nú=ú#é   é   é   Zwheels)Zurl_without_fragmentZ	hash_nameÚhashÚappendÚjoinÚhashlibZsha224ÚencodeZ	hexdigestÚosÚpath)r    r&   Z	key_partsZkey_urlZhashedÚpartsr"   r"   r#   Ú_cache_for_linkG   s    
,r9   c             C   s,  | s|S |s|S |j r|S |js$|S |s,|S t|ƒ}tjj||ƒ}d|krN|S t| |ƒ}ytj|ƒ}W n: t	k
r  } z|j
t
jt
jfkrŽ|S ‚ W Y d d }~X nX g }	xL|D ]D}
yt|
ƒ}W n tk
rÒ   w¬Y nX |jƒ sÞq¬|	j|jƒ |
fƒ q¬W |	� sþ|S |	jƒ  tjj||	d d ƒ}tjjt|ƒƒS )NÚbinaryr   r   )Úis_wheelÚis_artifactr   ÚpipÚindexÚfmt_ctl_formatsr9   r6   ÚlistdirÚOSErrorÚerrnoÚENOENTÚENOTDIRÚWheelr
   Ú	supportedr2   Úsupport_index_minÚsortr7   r3   ÚLinkr   )r    r&   r!   r'   Zcanonical_nameZformatsÚrootZwheel_namesÚeZ
candidatesÚ
wheel_nameÚwheelr7   r"   r"   r#   r%   p   sF    

r%   Úsha256é   c             C   st   t j|ƒ}d}t| dƒ�2}x*t||d�D ]}|t|ƒ7 }|j|ƒ q(W W dQ R X dt|jƒ ƒjdƒj	dƒ }||fS )z6Return (hash, length) for path using hashlib.new(algo)r   Úrb)ÚsizeNzsha256=Úlatin1r,   )
r4   ÚnewÚopenr   ÚlenÚupdater   ÚdigestÚdecodeÚrstrip)r7   ZalgoZ	blocksizeÚhZlengthÚfÚblockrW   r"   r"   r#   Úrehash—   s    

r]   c             C   s6   t jd dk ri }d}nddi}d}t| || f|ŽS )Nr   é   ÚbÚnewlineÚ )ÚsysÚversion_inforT   )ÚnameÚmodeÚnlÚbinr"   r"   r#   Úopen_for_csv¥   s    rh   c             C   s–   t jj| ƒr’t| dƒ�H}|jƒ }|jdƒs.dS tjjtj	ƒ ƒ}d| t j
jdƒ }|jƒ }W dQ R X t| dƒ�}|j|ƒ |j|ƒ W dQ R X dS dS )	zLReplace #!python with #!/path/to/python
    Return True if file was changed.rP   s   #!pythonFs   #!ÚasciiNÚwbT)r6   r7   ÚisfilerT   ÚreadlineÚ
startswithrb   Ú
executabler5   ÚgetfilesystemencodingÚlinesepÚreadÚwrite)r7   ZscriptÚ	firstlineZexenameÚrestr"   r"   r#   Ú
fix_script¯   s    

ru   zZ^(?P<namever>(?P<name>.+?)(-(?P<ver>\d.+?))?)
                                \.dist-info$c             C   s†   | j ddƒ}xttj|ƒD ]f}tj|ƒ}|r|jdƒ|krttjj||dƒƒ�,}x$|D ]}|j	ƒ j
ƒ }|dkrTdS qTW W dQ R X qW dS )	zP
    Return True if the extracted wheel in wheeldir should go into purelib.
    ú-Ú_rd   ÚWHEELzroot-is-purelib: trueTNF)Úreplacer6   r@   Údist_info_reÚmatchÚgrouprT   r7   r3   ÚlowerrY   )rd   ÚwheeldirZname_foldedÚitemr{   rM   Úliner"   r"   r#   Úroot_is_purelibÄ   s    

r�   c          
   C   sº   t jj| ƒsi i fS t| ƒ�<}tƒ }x$|D ]}|j|jƒ ƒ |jdƒ q*W |jdƒ W d Q R X tj	ƒ }dd„ |_
|j|ƒ i }i }|jdƒršt|jdƒƒ}|jdƒr²t|jdƒƒ}||fS )NÚ
r   c             S   s   | S )Nr"   )Zoptionr"   r"   r#   Ú<lambda>ä   s    z!get_entrypoints.<locals>.<lambda>Zconsole_scriptsZgui_scripts)r6   r7   ÚexistsrT   r   rr   ÚstripÚseekr   ZRawConfigParserZoptionxformZreadfpZhas_sectionÚdictÚitems)ÚfilenameÚfpÚdatar€   ZcpÚconsoleÚguir"   r"   r#   Úget_entrypointsÔ   s$    





rŽ   FTc       +   )      s*  |st | |||||	d�}t| ˆƒr,|d ‰n|d ‰g ‰g ‰ˆjtjjƒtjj }i ‰tƒ ‰ g }|r²tƒ �4}tj	ƒ �  tj
dƒ tj|ddd� W dQ R X W dQ R X tj|jƒ ƒ dd	„ ‰d3‡ ‡‡‡‡fdd„	‰	d4‡‡‡	‡
fdd„	}||ˆdƒ ˆ�stdˆ
 ƒ‚tjjˆd dƒ}t|ƒ\‰‰‡‡fdd„}xvˆD ]n}d}d}x^tjtjjˆ|ƒƒD ]F}d}|dk�rpt}|}tjjˆ||ƒ}|| }|||d
||d� �qVW �q4W td|d ƒ‰dˆ_td5ƒˆ_dˆ_‡‡
fdd„}|ˆ_dˆ_ˆjddƒ}|�rždtjk�rd| }|jˆj|ƒƒ tjjddƒdk�rTdt j!dd… |f }|jˆj|ƒƒ dt j!dd … |f }|jˆj|ƒƒ d!d"„ ˆD ƒ}x|D ]}ˆ|= �qŽW ˆjd#dƒ}|�rdtjk�rÔd$| }|jˆj|ƒƒ d%t j!dd … |f }|jˆj|ƒƒ d&d"„ ˆD ƒ}x|D ]}ˆ|= �qW t"ˆƒdk�rJ|jˆj#d'd"„ ˆj$ƒ D ƒƒƒ t"ˆƒdk�r||jˆj#d(d"„ ˆj$ƒ D ƒd)diƒƒ tjjˆd d*ƒ}tjjˆd d+ƒ}t%|d,ƒ�}|j&d-ƒ W dQ R X t'j(||ƒ |j)|ƒ tjjˆd d.ƒ} tjjˆd d/ƒ}!t*| d0ƒ��}"t*|!d1ƒ�ø}#t+j,|"ƒ}$t+j-|#ƒ}%xV|$D ]N}&ˆj|&d |&d ƒ|&d< |&d ˆ k�rpt.|&d ƒ\|&d< |&d2< |%j/|&ƒ �q.W x`|D ]X}'t.|'ƒ\}(})ˆ|'ˆƒ}*|
�rÌ|*j0|
ƒ�rÌtjjtjtjj1|*|
ƒƒ}*|%j/|*|(|)fƒ �q†W x"ˆD ]}'|%j/ˆ|' ddfƒ �qèW W dQ R X W dQ R X t'j(|!| ƒ dS )6zInstall a wheel)ÚuserÚhomerJ   ÚisolatedÚprefixÚpurelibÚplatlibÚignoreT)ÚforceÚquietNc             S   s   t jj| |ƒjt jjdƒS )Nú/)r6   r7   Úrelpathry   Úsep)ÚsrcÚpr"   r"   r#   Únormpath  s    z"move_wheel_files.<locals>.normpathFc                s.   ˆ| ˆƒ}ˆ|ˆƒ}|ˆ|< |r*ˆ j |ƒ dS )z6Map archive RECORD paths to installation RECORD paths.N)Úadd)ÚsrcfileÚdestfileZmodifiedZoldpathÚnewpath)ÚchangedÚ	installedÚlib_dirr�   r~   r"   r#   Úrecord_installed  s
    

z*move_wheel_files.<locals>.record_installedc                sØ  t |ƒ �xÈtj| ƒD �]¸\}}}|t| ƒd … jtjjƒ}tjj||ƒ}	|rj|jtjjdƒd j	dƒrjqxŒ|D ]„}
tjj|||
ƒ}|r¨|dkr¨|j	dƒr¨ˆ j
|
ƒ qpqp|rp|
j	dƒrpt|
ƒjtˆjƒƒrpˆ sêtd| d djˆƒ ƒ‚ˆj
|ƒ qpW xÖ|D ]Î}|�r||ƒ�rqþtjj||ƒ}tjj|||ƒ}t |	ƒ tj||ƒ tj|ƒ}ttdƒ�rptj||j|jfƒ tj|tjƒ�r®tj|ƒ}|jtjB tjB tjB }tj||ƒ d	}|�rÀ||ƒ}ˆ|||ƒ qþW qW d S )
Nr   r   z.datara   z
.dist-infoz!Multiple .dist-info directories: z, ÚutimeF)r   r6   ÚwalkrU   Úlstripr7   rš   r3   ÚsplitÚendswithr2   r   rm   rd   ÚAssertionErrorÚshutilZcopyfileÚstatÚhasattrr¦   Úst_atimeÚst_mtimeÚaccessÚX_OKÚst_modeÚS_IXUSRÚS_IXGRPÚS_IXOTHÚchmod)ÚsourceÚdestZis_baseÚfixerÚfilterÚdirZsubdirsÚfilesZbasedirZdestdirÚsZ
destsubdirr[   rŸ   r    ÚstZpermissionsr¢   )Ú	data_dirsÚinfo_dirr¥   Úreqr"   r#   Úclobber  sJ    






z!move_wheel_files.<locals>.clobberz!%s .dist-info directory not foundr   zentry_points.txtc                sh   | j ƒ jdƒr| d d… }n<| j ƒ jdƒr8| d d… }n | j ƒ jdƒrT| d d… }n| }|ˆ kpf|ˆkS )	Nz.exer/   z
-script.pyé
   z.pyaéüÿÿÿiöÿÿÿrÅ   )r}   rª   )rd   Z	matchname)rŒ   r�   r"   r#   Úis_entrypoint_wrappera  s    z/move_wheel_files.<locals>.is_entrypoint_wrapperÚscripts)rº   r»   ra   c                s<   | j d krtd| ˆf ƒ‚ˆ j| j| j jdƒd | j dœ S )Nz­Invalid script entry point: %s for req: %s - A callable suffix is required. Cf https://packaging.python.org/en/latest/distributing.html#console-scripts for more information.Ú.r   )ÚmoduleZimport_nameÚfunc)Úsuffixr	   Úscript_templater’   r©   )Úentry)ÚmakerrÂ   r"   r#   Ú_get_script_text�  s    
z*move_wheel_files.<locals>._get_script_textzÐ# -*- coding: utf-8 -*-
import re
import sys

from %(module)s import %(import_name)s

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
r=   ZENSUREPIP_OPTIONSzpip = Z
altinstallz
pip%s = %sr   r^   c             S   s   g | ]}t jd |ƒr|‘qS )zpip(\d(\.\d)?)?$)Úrer{   )Ú.0Úkr"   r"   r#   ú
<listcomp>×  s    z$move_wheel_files.<locals>.<listcomp>Zeasy_installzeasy_install = zeasy_install-%s = %sc             S   s   g | ]}t jd |ƒr|‘qS )zeasy_install(-\d\.\d)?$)rÐ   r{   )rÑ   rÒ   r"   r"   r#   rÓ   ä  s    c             S   s   g | ]}d | ‘qS )z%s = %sr"   )rÑ   Úkvr"   r"   r#   rÓ   ì  s    c             S   s   g | ]}d | ‘qS )z%s = %sr"   )rÑ   rÔ   r"   r"   r#   rÓ   ñ  s    r�   Z	INSTALLERzINSTALLER.piprj   s   pip
ÚRECORDz
RECORD.pipÚrzw+r.   )F)NN)ra   )2r   r�   rY   r6   r7   rš   Úsetr   ÚwarningsÚcatch_warningsÚfilterwarningsÚ
compileallÚcompile_dirÚloggerÚdebugÚgetvaluer«   r3   rŽ   r@   ru   r   rÃ   ZvariantsZset_moderÏ   rÌ   ÚpopÚenvironÚextendZmakeÚgetrb   ÚversionrU   Zmake_multiplerˆ   rT   rr   r¬   Úmover2   rh   ÚcsvÚreaderÚwriterr]   Zwriterowrm   r™   )+rd   rÂ   r~   r�   r�   rJ   Z	pycompileÚschemer‘   r’   Zstrip_file_prefixr¸   Z	generatedÚstdoutrÃ   Zep_filerÆ   Zdatadirrº   r»   Zsubdirr¹   rÏ   Z
pip_scriptÚspecZpip_eprÒ   Zeasy_install_scriptZeasy_install_epZ	installerZtemp_installerZinstaller_fileÚrecordZtemp_recordZ	record_inZ
record_outrç   rè   Úrowr[   rZ   ÚlZ
final_pathr"   )r¢   rŒ   rÀ   r�   rÁ   r£   r¤   rÎ   r�   r¥   rÂ   r~   r#   Úmove_wheel_filesð   sÎ    




$;



#









.rï   c                s   t jˆ ƒ‡ fdd„ƒ}|S )Nc              ?   s6   t ƒ }x*ˆ | |ŽD ]}||kr|j|ƒ |V  qW d S )N)r×   rž   )ÚargsÚkwÚseenr   )Úfnr"   r#   Úunique  s
    
z_unique.<locals>.unique)Ú	functoolsÚwraps)ró   rô   r"   )ró   r#   Ú_unique  s    r÷   c             c   sŠ   ddl m} tj|| jdƒƒƒ}xd|D ]\}tjj| j|d ƒ}|V  |j	dƒr&tjj
|ƒ\}}|dd… }tjj||d ƒ}|V  q&W dS )	a  
    Yield all the uninstallation paths for dist based on RECORD-without-.pyc

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .pyc.
    r   )ÚFakeFilerÕ   z.pyNr^   z.pycéýÿÿÿ)Ú	pip.utilsrø   ræ   rç   Zget_metadata_linesr6   r7   r3   Úlocationrª   r©   )Údistrø   rÖ   rí   r7   Zdnró   Úbaser"   r"   r#   Úuninstallation_paths"  s    


rþ   c             C   sd   yTdd„ t jd| ƒD ƒd }|jdƒ}tƒ j|ƒ}|d jƒ }ttt|j	dƒƒƒ}|S    dS dS )	z†
    Return the Wheel-Version of an extracted wheel, if possible.

    Otherwise, return False if we couldn't parse / extract it.
    c             S   s   g | ]}|‘qS r"   r"   )rÑ   Údr"   r"   r#   rÓ   ?  s    z!wheel_version.<locals>.<listcomp>Nr   rx   zWheel-VersionrÈ   F)
r   Zfind_on_pathZget_metadatar   Zparsestrr…   ÚtupleÚmapÚintr©   )Ú
source_dirrü   Z
wheel_datarä   r"   r"   r#   Úwheel_version8  s    
r  c             C   sb   | st d| ƒ‚| d td kr>t d|djtt| ƒƒf ƒ‚n | tkr^tjddjtt| ƒƒƒ dS )aê  
    Raises errors or warns if called with an incompatible Wheel-Version.

    Pip should refuse to install a Wheel-Version that's a major series
    ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when
    installing a version only minor version ahead (e.g 1.2 > 1.1).

    version: a 2-tuple representing a Wheel-Version (Major, Minor)
    name: name of wheel or package to raise exception about

    :raises UnsupportedWheel: when an incompatible Wheel-Version is given
    z(%s is in an unsupported or invalid wheelr   zB%s's Wheel-Version (%s) is not compatible with this version of piprÈ   z*Installing from a newer Wheel-Version (%s)N)r   ÚVERSION_COMPATIBLEr3   r  ÚstrrÝ   Úwarning)rä   rd   r"   r"   r#   Úcheck_compatibilityK  s    
r  c               @   s:   e Zd ZdZejdejƒZdd„ Zd
dd„Z	ddd	„Z
dS )rE   zA wheel filezŽ^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
        ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
        \.whl|\.dist-info)$c                sž   ˆ j j|ƒ}|std| ƒ‚|ˆ _|jdƒjddƒˆ _|jdƒjddƒˆ _|jdƒjdƒˆ _	|jdƒjdƒˆ _
|jd	ƒjdƒˆ _t‡ fd
d„ˆ j	D ƒƒˆ _dS )zX
        :raises InvalidWheelFilename: when the filename is invalid for a wheel
        z!%s is not a valid wheel filename.rd   rw   rv   ZverZpyverrÈ   ÚabiZplatc             3   s0   | ](}ˆ j D ]}ˆ jD ]}|||fV  qqqd S )N)ÚabisÚplats)rÑ   ÚxÚyÚz)r   r"   r#   ú	<genexpr>ˆ  s    z!Wheel.__init__.<locals>.<genexpr>N)Úwheel_file_rer{   r
   r‰   r|   ry   rd   rä   r©   Z
pyversionsr
  r  r×   Ú	file_tags)r   r‰   Z
wheel_infor"   )r   r#   r$   t  s    
zWheel.__init__Nc                s2   ˆ dkrt j‰ ‡ fdd„| jD ƒ}|r.t|ƒS dS )a"  
        Return the lowest index that one of the wheel's file_tag combinations
        achieves in the supported_tags list e.g. if there are 8 supported tags,
        and one of the file tags is first in the list, then return 0.  Returns
        None is the wheel is not supported.
        Nc                s   g | ]}|ˆ krˆ j |ƒ‘qS r"   )r>   )rÑ   Úc)Útagsr"   r#   rÓ   •  s    z+Wheel.support_index_min.<locals>.<listcomp>)r   Úsupported_tagsr  Úmin)r   r  Zindexesr"   )r  r#   rG   Œ  s    zWheel.support_index_minc             C   s"   |dkrt j}tt|ƒj| jƒƒS )z'Is this wheel supported on this system?N)r   r  Úboolr×   Úintersectionr  )r   r  r"   r"   r#   rF   ˜  s    zWheel.supported)N)N)r(   r)   r*   r+   rÐ   ÚcompileÚVERBOSEr  r$   rG   rF   r"   r"   r"   r#   rE   h  s   
rE   c               @   sH   e Zd ZdZddd„Zddd„Zdd„ Zdd	d
„Zdd„ Zddd„Z	dS )ÚWheelBuilderz#Build wheels from a RequirementSet.Nc             C   s6   || _ || _|jj| _|j| _|p$g | _|p.g | _d S )N)	Úrequirement_setÚfinderZ_wheel_cacher   Ú_cache_rootZwheel_download_dirÚ
_wheel_dirÚbuild_optionsÚglobal_options)r   r  r  r  r   r"   r"   r#   r$   ¢  s    

zWheelBuilder.__init__c             C   sˆ   t jdƒ}zn| j|||d�rlyBtj|ƒd }tjj||ƒ}tjtjj||ƒ|ƒ t	j
d|ƒ |S    Y nX | j|ƒ dS t|ƒ X dS )ziBuild one wheel.

        :return: The filename of the built wheel, or None if the build failed.
        z
pip-wheel-)Ú
python_tagr   zStored in directory: %sN)ÚtempfileZmkdtempÚ_WheelBuilder__build_oner6   r@   r7   r3   r¬   rå   rÝ   ÚinfoÚ
_clean_oner   )r   rÂ   Ú
output_dirr!  ÚtempdrL   Z
wheel_pathr"   r"   r#   Ú
_build_one«  s    

zWheelBuilder._build_onec             C   s   t jddt|j gt| jƒ S )Nz-uz-c)rb   rn   r   Zsetup_pyÚlistr   )r   rÂ   r"   r"   r#   Ú_base_setup_argsÁ  s    
zWheelBuilder._base_setup_argsc             C   sœ   | j |ƒ}d|jf }t|ƒ�t}tjd|ƒ |dd|g | j }|d k	rT|d|g7 }yt||jd|d� dS    |jd	ƒ tj	d
|jƒ dS W d Q R X d S )Nz#Running setup.py bdist_wheel for %szDestination directory: %sZbdist_wheelz-dz--python-tagF)ÚcwdÚshow_stdoutÚspinnerTÚerrorzFailed building wheel for %s)
r*  rd   r   rÝ   rÞ   r  r   Zsetup_py_dirZfinishr.  )r   rÂ   r'  r!  Ú	base_argsZspin_messager-  Z
wheel_argsr"   r"   r#   Z__build_oneÇ  s    



zWheelBuilder.__build_onec             C   sV   | j |ƒ}tjd|jƒ |ddg }yt||jdd� dS    tjd|jƒ dS d S )NzRunning setup.py clean for %sZcleanz--allF)r+  r,  Tz Failed cleaning build dir for %s)r*  rÝ   r$  rd   r   r  r.  )r   rÂ   r/  Z
clean_argsr"   r"   r#   r%  Ü  s    
zWheelBuilder._clean_oneFc             C   sÂ  | j s|r| jst‚| jj| jƒ | jjjƒ }g }xÀ|D ]¸}|jrDq8|j	r^|sðt
jd|jƒ q8|rj|jrjq8|r€|jr€|jj r€q8|rŽ|j rŽq8|ræ|j}|jƒ \}}tjj|d|ƒdkrºq8dtjj| jjt|jƒƒkræt
jd|jƒ q8|j|ƒ q8W |� sþdS t
jddjdd	„ |D ƒƒƒ tƒ ��J g g  }}	�x6|D �],}d}
|�r¬tj}
t| j|jƒ}yt|ƒ W nB tk
�r¨ } z$t
j d
|j|ƒ |	j|ƒ �w6W Y dd}~X nX n| j }| j!|||
d�}|�rX|j|ƒ |�rb|j�rt"j#j$t"j#j|jt%ƒƒ �rtdƒ‚|j&ƒ  |j'| jj(ƒ|_tjj)t*|ƒƒ|_|jj	�s<t‚t+|j|jdd| jj,d� n
|	j|ƒ �q6W W dQ R X |�r”t
jddjdd	„ |D ƒƒƒ |	�r¶t
jddjdd	„ |	D ƒƒƒ t-|	ƒdkS )zÙBuild wheels.

        :param unpack: If True, replace the sdist we built from with the
            newly built wheel, in preparation for installation.
        :return: True if all the wheels built correctly.
        z(Skipping %s, due to already being wheel.Nr:   zCSkipping bdist_wheel for %s, due to binaries being disabled for it.Tz*Building wheels for collected packages: %sz, c             S   s   g | ]
}|j ‘qS r"   )rd   )rÑ   rÂ   r"   r"   r#   rÓ     s    z&WheelBuilder.build.<locals>.<listcomp>z Building wheel for %s failed: %s)r!  zbad source dir - missing markerF)ÚsessionzSuccessfully built %sú c             S   s   g | ]
}|j ‘qS r"   )rd   )rÑ   rÂ   r"   r"   r#   rÓ   Q  s    zFailed to build %sc             S   s   g | ]
}|j ‘qS r"   )rd   )rÑ   rÂ   r"   r"   r#   rÓ   V  s    r   ).r  r  r«   r  Zprepare_filesr  ZrequirementsÚvaluesZ
constraintr;   rÝ   r$  rd   Zeditabler&   r<   r  Úsplitextr=   r>   Zegg_info_matchesr?   r!   r   r2   r3   r   r   Zimplementation_tagr9   r   rA   r  r(  r6   r7   r„   r   Zremove_temporary_sourceZbuild_locationZ	build_dirrI   r   r   r0  rU   )r   ZautobuildingZreqsetZbuildsetrÂ   r&   rý   ZextZbuild_successZbuild_failurer!  r&  rK   Z
wheel_filer"   r"   r#   Úbuildè  sž    






zWheelBuilder.build)NN)N)N)F)
r(   r)   r*   r+   r$   r(  r*  r#  r%  r4  r"   r"   r"   r#   r  Ÿ  s    


r  )r   r   é   )rN   r5  )FNNTNFNN)Qr+   Z
__future__r   rÛ   ræ   rB   rõ   r4   Zloggingr6   Zos.pathrÐ   r¬   r­   rb   r"  rØ   Úbase64r   Zemail.parserr   Zpip._vendor.sixr   r=   Z
pip.compatr   Zpip.downloadr   r   Zpip.exceptionsr	   r
   r   Zpip.locationsr   r   r   rú   r   r   r   r   r   Zpip.utils.uir   Zpip.utils.loggingr   Zpip.utils.setuptools_buildr   Zpip._vendor.distlib.scriptsr   Zpip._vendorr   Zpip._vendor.packaging.utilsr   Zpip._vendor.six.movesr   Z	wheel_extr  Z	getLoggerr(   rÝ   Úobjectr   r9   r%   r]   rh   ru   r  r  rz   r�   rŽ   rï   r÷   rþ   r  r  rE   r  r"   r"   r"   r#   Ú<module>   sn   
)'


 
  '7