
(h(.                 @   s  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 m Z m	 Z	 d d l
 m Z m Z d d l 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 d d l m Z d d l 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) d d l* m+ Z+ d d l, m- Z- e' rd d l. m/ Z/ m0 Z0 m1 Z1 m2 Z2 m3 Z3 m4 Z4 d d l5 m6 Z6 d d l7 m8 Z8 e0 e8 g e9 f Z: e4 e2 e8 e2 e8 f Z; e j< e=  Z> e j? d e j@  ZA d d   ZB d d   ZC d d   ZD d d   ZE d  d!   ZF d" d#   ZG d$ d%   ZH d& d'   ZI d( d)   ZJ d* d+   ZK d, d-   ZL d. d/   ZM d0 d1   ZN d S)2z;Orchestrator for building wheels from InstallRequirements.
    N)canonicalize_namecanonicalize_version)InvalidVersionVersion)Distribution)InvalidWheelFilenameUnsupportedWheel)Link)Wheel)build_wheel_pep517)build_wheel_legacy)
indent_log)
ensure_dir	hash_fileis_wheel_installed)make_setuptools_clean_args)call_subprocess)TempDirectory)MYPY_CHECK_RUNNING)path_to_url)$pkg_resources_distribution_for_wheel)vcs)AnyCallableIterableListOptionalTuple)
WheelCache)InstallRequirementz([a-z0-9_.]+)-([a-z0-9_.!+-]+)c             C   s   t  t j |    S)zjDetermine whether the string looks like an egg_info.

    :param s: The string to parse. E.g. foo-2.1
    )bool_egg_info_research)s r$   :/tmp/pip-build-kmztzv_d/pip/pip/_internal/wheel_builder.py_contains_egg_info+   s    r&   c             C   s   |  j  r d S|  j r3 | r/ t j d |  j  d S| r= d S|  j sP |  j rT d S| |   sw t j d |  j  d S|  j r t   r t j d |  j  d Sd S)zBReturn whether an InstallRequirement should be built into a wheel.Fz(Skipping %s, due to already being wheel.TzCSkipping wheel build for %s, due to binaries being disabled for it.zOUsing legacy 'setup.py install' for %s, since package 'wheel' is not installed.)	
constraintis_wheelloggerinfonameeditable
source_dir
use_pep517r   )req
need_wheelcheck_binary_allowedr$   r$   r%   _should_build4   s,    		

r2   c             C   s   t  |  d d d t S)Nr0   Tr1   )r2   _always_true)r/   r$   r$   r%   should_build_for_wheel_commanda   s    r4   c             C   s   t  |  d d d | S)Nr0   Fr1   )r2   )r/   r1   r$   r$   r%    should_build_for_install_commandj   s    r5   c             C   s   |  j  s |  j r d S|  j r |  j j r |  j  s< t  |  j sK t  t j |  j j  } | sl t  | j |  j j	 |  j  r d Sd S|  j s t  |  j j
   \ } } t |  r d Sd S)z
    Return whether a built InstallRequirement can be stored in the persistent
    wheel cache, assuming the wheel cache is available, and _should_build()
    has determined a wheel needs to be built.
    FT)r,   r-   linkZis_vcsAssertionErrorr   Zget_backend_for_schemeschemeZis_immutable_rev_checkouturlsplitextr&   )r/   vcs_backendbaseextr$   r$   r%   _should_cachet   s    	r>   c             C   s[   t  | j  } |  j s t  | rE t |   rE | j |  j  } n | j |  j  } | S)zdReturn the persistent or temporary cache directory where the built
    wheel need to be stored.
    )r    	cache_dirr6   r7   r>   Zget_path_for_linkZget_ephem_path_for_link)r/   wheel_cacheZcache_availabler?   r$   r$   r%   _get_cache_dir   s    rA   c             C   s   d S)NTr$   )_r$   r$   r%   r3      s    r3   c             C   s   x |  j  |  j  D]u } | j   j d  r | j d d  d j   } y t |  SWq t k
 r d j |  } t	 |   Yq Xq Wt	 d   d  S)Nzmetadata-version::   zInvalid Metadata-Version: {}zMissing Metadata-Version)
get_metadata_linesPKG_INFOlower
startswithsplitstripr   r   formatr   )distlinevaluemsgr$   r$   r%   _get_metadata_version   s    rQ   c             C   s  t  |  j  } t t j j |   } t  | j  | k rW t d j | | j    t j	 | d d  } t
 | | |  } Wd  QRXt | j  t | j  k r t d j | j | j    t |  t d  k rt | j t  rt d j | j    d  S)Nz7Wheel has unexpected file name: expected {!r}, got {!r}
allowZip64Tz1.2z6Metadata 1.2 mandates PEP 440 version, but {!r} is not)r   r+   r
   ospathbasenamer   rL   zipfileZipFiler   r   versionrQ   r   
isinstanceparsed_versionr   )r/   
wheel_pathcanonical_namewzfrM   r$   r$   r%   _verify_one   s$    r_   c          %   C   s   y t  |  Wn? t k
 rO } z t j d |  j |  d SWYd d } ~ Xn X|  j  t |  | | |  } Wd QRX| r | r y t |  |  WnE t t	 f k
 r } z t j d |  j |  d SWYd d } ~ Xn X| S)zaBuild one wheel.

    :return: The filename of the built wheel, or None if the build failed.
    z Building wheel for %s failed: %sNz!Built wheel for %s is invalid: %s)
r   OSErrorr)   warningr+   Z	build_env_build_one_inside_envr_   r   r   )r/   
output_dirverifybuild_optionsglobal_optionser[   r$   r$   r%   
_build_one   s"    
rh   c             C   s  t  d d  } |  j s! t  |  j ro |  j s9 t  t d |  j d |  j d |  j d | d | j  } n9 t d |  j d |  j	 d	 |  j
 d
 | d | d | j  } | d  k	 rut j j |  } t j j | |  } y\ t |  \ } }	 t j | |  t j d |  j | |	 | j    t j d |  | SWn; t k
 rt}
 z t j d |  j |
  WYd  d  }
 ~
 Xn X|  j st |  |  d  SWd  QRXd  S)Nkindwheelr+   backendmetadata_directoryre   tempdsetup_py_pathr-   rf   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %sz Building wheel for %s failed: %s)r   r+   r7   r.   rl   r   Zpep517_backendrT   r   rn   Zunpacked_source_directoryrS   rU   joinr   shutilmover)   r*   	hexdigest	Exceptionra   _clean_one_legacy)r/   rc   re   rf   temp_dirr[   
wheel_nameZ	dest_pathZ
wheel_hashlengthrg   r$   r$   r%   rb      sF    								 	rb   c             C   ss   t  |  j d | } t j d |  j  y t | d |  j d SWn) t k
 rn t j d |  j  d SYn Xd  S)Nrf   zRunning setup.py clean for %scwdTz Failed cleaning build dir for %sF)	r   rn   r)   r*   r+   r   r-   rs   error)r/   rf   
clean_argsr$   r$   r%   rt   (  s    		rt   c       
      C   sG  |  s g  g  f St  j d d j d d   |  D   t    g  g  } } x |  D] } t | |  } t | | | | |  }	 |	 r t t |	   | _ | j j	 | _
 | j j s t  | j |  qT | j |  qT WWd QRX| rt  j d d j d d	   | D   | r=t  j d
 d j d d	   | D   | | f S)zBuild wheels.

    :return: The list of InstallRequirement that succeeded to build and
        the list of InstallRequirement that failed to build.
    z*Building wheels for collected packages: %sz, c             s   s   |  ] } | j  Vq d  S)N)r+   ).0r/   r$   r$   r%   	<genexpr>K  s    zbuild.<locals>.<genexpr>NzSuccessfully built %s c             S   s   g  |  ] } | j   q Sr$   )r+   )r{   r/   r$   r$   r%   
<listcomp>b  s   	 zbuild.<locals>.<listcomp>zFailed to build %sc             S   s   g  |  ] } | j   q Sr$   )r+   )r{   r/   r$   r$   r%   r~   g  s   	 )r)   r*   ro   r   rA   rh   r	   r   r6   	file_pathZlocal_file_pathr(   r7   append)
requirementsr@   rd   re   rf   Zbuild_successesZbuild_failuresr/   r?   
wheel_filer$   r$   r%   build8  s4    

r   )O__doc__loggingos.pathrS   rerp   rV   pip._vendor.packaging.utilsr   r   Zpip._vendor.packaging.versionr   r   Zpip._vendor.pkg_resourcesr   Zpip._internal.exceptionsr   r   Zpip._internal.models.linkr	   Zpip._internal.models.wheelr
   Z$pip._internal.operations.build.wheelr   Z+pip._internal.operations.build.wheel_legacyr   Zpip._internal.utils.loggingr   Zpip._internal.utils.miscr   r   r   Z$pip._internal.utils.setuptools_buildr   Zpip._internal.utils.subprocessr   Zpip._internal.utils.temp_dirr   Zpip._internal.utils.typingr   Zpip._internal.utils.urlsr   Zpip._internal.utils.wheelr   Zpip._internal.vcsr   Ztypingr   r   r   r   r   r   Zpip._internal.cacher   Zpip._internal.req.req_installr   r    ZBinaryAllowedPredicateZBuildResult	getLogger__name__r)   compile
IGNORECASEr!   r&   r2   r4   r5   r>   rA   r3   rQ   r_   rh   rb   rt   r   r$   r$   r$   r%   <module>   sV   .	-	
!#3