U
    
Ha-                     @   s  d 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	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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% 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l0m1Z1 ddl2m3Z3 e4e5Z6e7dej8Z9ee#ge:f Z;ee
e# e
e# f Z<dd Z=dd Z>dd Z?dd Z@dd ZAd d! ZBd"d# ZCd$d% ZDd&d' ZEd(d) ZFd*d+ ZGd,d- ZHdS ).z;Orchestrator for building wheels from InstallRequirements.
    N)AnyCallableIterableListOptionalTuple)canonicalize_namecanonicalize_version)InvalidVersionVersion)
WheelCache)InvalidWheelFilenameUnsupportedWheel)get_wheel_distribution)Link)Wheel)build_wheel_pep517)build_wheel_legacy)InstallRequirement)
indent_log)
ensure_dir	hash_fileis_wheel_installed)make_setuptools_clean_args)call_subprocess)TempDirectory)path_to_url)vcsz([a-z0-9_.]+)-([a-z0-9_.!+-]+)c                 C   s   t t| 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-unpacked-wheel-tx790h60/pip/_internal/wheel_builder.py_contains_egg_info%   s    r$   c                 C   s~   | j r
dS | jr&|r"td| j dS |r.dS | js:| js>dS | jrHdS || sbtd| j dS t sztd| j dS d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_build.   s8     r0   c                 C   s   t | dtdS )NTr.   r/   )r0   _always_true)r-   r"   r"   r#   should_build_for_wheel_command^   s
      r3   c                 C   s   t | d|dS )NFr1   )r0   )r-   r/   r"   r"   r#    should_build_for_install_commandg   s
      r4   c                 C   s   | j s| jsdS | jrb| jjrb| j r(t| js2tt| jj}|sHt|| jj	| jr^dS dS | jslt| j
 \}}t|rdS d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+   linkis_vcsAssertionErrorr   get_backend_for_schemeschemeis_immutable_rev_checkouturlsplitextr$   )r-   vcs_backendbaseextr"   r"   r#   _should_cacheq   s    	


r@   c                 C   s>   t |j}| jst|r.t| r.|| j}n|| j}|S )zdReturn the persistent or temporary cache directory where the built
    wheel need to be stored.
    )r   	cache_dirr5   r7   r@   get_path_for_linkget_ephem_path_for_link)r-   wheel_cachecache_availablerA   r"   r"   r#   _get_cache_dir   s    

rF   c                 C   s   dS )NTr"   )_r"   r"   r#   r2      s    r2   c           	      C   s   t | jp
d}ttj|}t |j|kr>td||jt||}t	|j
}t|t|j
krvtd||j
|j}|d krtdzt|}W n& tk
r   d| }t|Y nX |tdkrt|j
tstd|d S )N z7Wheel has unexpected file name: expected {!r}, got {!r}zMissing Metadata-VersionzInvalid Metadata-Version: z1.2z6Metadata 1.2 mandates PEP 440 version, but {!r} is not)r   r)   r   ospathbasenamer   formatr   strversionr	   metadata_versionr   r   r
   
isinstance)	r-   
wheel_pathcanonical_namewdistZdist_verstrZmetadata_version_valuerO   msgr"   r"   r#   _verify_one   sD     

 

rV   c              
   C   s   zt | W n8 tk
rD } ztd| j| W Y dS d}~X Y nX | j t| |||}W 5 Q R X |r|rzt| | W n< tt	fk
r } ztd| j| W Y dS d}~X Y nX |S )zaBuild one wheel.

    :return: The filename of the built wheel, or None if the build failed.
     Building wheel for %s failed: %sNz!Built wheel for %s is invalid: %s)
r   OSErrorr'   warningr)   	build_env_build_one_inside_envrV   r   r   )r-   
output_dirverifybuild_optionsglobal_optionserQ   r"   r"   r#   
_build_one   s.        ra   c                 C   s^  t ddH}| jst| jrp| js(t| js2t|rDtd| j |rVtd| j t| j| j| j|j	d}nt
| j| j| j|||j	d}|d k	r4tj	|}tj	||}zNt|\}}	t|| td| j||	|  td| |W W  5 Q R  S  tk
r2 }
 ztd	| j|
 W 5 d }
~
X Y nX | jsFt| | W 5 Q R  d S Q R X d S )
Nwheel)kindz7Ignoring --global-option when building %s using PEP 517z6Ignoring --build-option when building %s using PEP 517)r)   backendmetadata_directorytempd)r)   setup_py_pathr+   r_   r^   rf   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %srW   )r   r)   r7   r,   re   pep517_backendr'   rY   r   rJ   r   rg   unpacked_source_directoryrI   rK   joinr   shutilmover(   	hexdigest	Exception_clean_one_legacy)r-   r\   r^   r_   temp_dirrQ   
wheel_name	dest_path
wheel_hashlengthr`   r"   r"   r#   r[      sh    


  	
   
r[   c                 C   sZ   t | j|d}td| j zt|| jd W dS  tk
rT   td| j Y dS X d S )N)r_   zRunning setup.py clean for %s)cwdTz Failed cleaning build dir for %sF)	r   rg   r'   r(   r)   r   r+   rn   error)r-   r_   
clean_argsr"   r"   r#   ro   &  s    ro   c           
   	   C   s   | sg g fS t dddd | D  t r g g  }}| D ]\}t||}t|||||}	|	rtt|	|_|jj	|_
|jjst|| q>|| q>W 5 Q R X |rt dddd |D  |rt d	d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>I  s     zbuild.<locals>.<genexpr>zSuccessfully built %s c                 S   s   g | ]
}|j qS r"   rx   ry   r"   r"   r#   
<listcomp>`  s     zbuild.<locals>.<listcomp>zFailed to build %sc                 S   s   g | ]
}|j qS r"   rx   ry   r"   r"   r#   r}   e  s     )r'   r(   rj   r   rF   ra   r   r   r5   	file_pathlocal_file_pathr&   r7   append)
requirementsrD   r]   r^   r_   build_successesbuild_failuresr-   rA   
wheel_filer"   r"   r#   build6  sD    

    
r   )I__doc__loggingos.pathrI   rerk   typingr   r   r   r   r   r   pip._vendor.packaging.utilsr   r	   Zpip._vendor.packaging.versionr
   r   pip._internal.cacher   pip._internal.exceptionsr   r   Zpip._internal.metadatar   pip._internal.models.linkr   pip._internal.models.wheelr   $pip._internal.operations.build.wheelr   +pip._internal.operations.build.wheel_legacyr   pip._internal.req.req_installr   pip._internal.utils.loggingr   pip._internal.utils.miscr   r   r   $pip._internal.utils.setuptools_buildr   pip._internal.utils.subprocessr   pip._internal.utils.temp_dirr   pip._internal.utils.urlsr   pip._internal.vcsr   	getLogger__name__r'   compile
IGNORECASEr   r   ZBinaryAllowedPredicateZBuildResultr$   r0   r3   r4   r@   rF   r2   rV   ra   r[   ro   r   r"   r"   r"   r#   <module>   sL    
	0	
! #;