B
    `dv%                 @   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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 erddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z) e e)ge*f Z+e%e"e) e"e) f Z,e-e.Z/e0dej1fddZ2dd Z3dd Z4dd Z5dd Z6dd Z7dd Z8d d! Z9d"d# Z:d$d% Z;d&d' Z<dS )(z;Orchestrator for building wheels from InstallRequirements.
    N)Link)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)vcs)AnyCallableIterableListOptionalPatternTuple)
WheelCache)InstallRequirementz([a-z0-9_.]+)-([a-z0-9_.!+-]+)c             C   s   t || S )zjDetermine whether the string looks like an egg_info.

    :param s: The string to parse. E.g. foo-2.1
    )boolsearch)s_egg_info_re r   ?/tmp/pip-unpacked-wheel-hu9qqap1/pip/_internal/wheel_builder.py_contains_egg_info&   s    r   c             C   sz   | j r
dS | jr&|r"td| j dS |r.dS | js:| js>dS || sXtd| j dS | jsvt svt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.zMUsing 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_build0   s,    
r*   c             C   s   t | dtdS )NT)r(   r)   )r*   _always_true)r'   r   r   r   should_build_for_wheel_command]   s    r,   c             C   s   t | d|dS )NF)r(   r)   )r*   )r'   r)   r   r   r    should_build_for_install_commandf   s    r-   c             C   s   t | td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 \}}t|r|d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.
    )r)   FT)r-   r+   linkis_vcsr$   AssertionErrorr%   r   get_backend_for_schemeschemeis_immutable_rev_checkouturlsplitextr   )r'   vcs_backendbaseextr   r   r   _should_cachep   s    	


r9   c             C   s4   t |j}|r$t| r$|| j}n|| j}|S )zdReturn the persistent or temporary cache directory where the built
    wheel need to be stored.
    )r   	cache_dirr9   get_path_for_linkr.   get_ephem_path_for_link)r'   wheel_cachecache_availabler:   r   r   r   _get_cache_dir   s
    
r?   c             C   s   dS )NTr   )_r   r   r   r+      s    r+   c          
   C   s`   yt | W n2 tk
r> } ztd| j| dS d}~X Y nX | j t| |||S Q R X dS )zaBuild one wheel.

    :return: The filename of the built wheel, or None if the build failed.
    z Building wheel for %s failed: %sN)r   OSErrorr!   warningr#   	build_env_build_one_inside_env)r'   
output_dirbuild_optionsglobal_optionser   r   r   
_build_one   s    
rI   c             C   s   t dd}| jr.t| j| j| j||jd}nt| j| j| j	|||jd}|d k	rt
j|}t
j||}y@t|\}}	t|| td| j||	|  td| |S  tk
r }
 ztd| j|
 W d d }
~
X Y nX | jst| | d S Q R X d S )Nwheel)kind)r#   backendmetadata_directoryrF   tempd)r#   setup_py_pathr%   rG   rF   rN   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %sz Building wheel for %s failed: %s)r   r&   r   r#   pep517_backendrM   pathr   rO   unpacked_source_directoryosbasenamejoinr   shutilmover!   r"   	hexdigest	ExceptionrB   _clean_one_legacy)r'   rE   rF   rG   temp_dir
wheel_path
wheel_name	dest_path
wheel_hashlengthrH   r   r   r   rD      sB    


rD   c             C   sV   t | j|d}td| j yt|| jd dS  tk
rP   td| j dS X d S )N)rG   zRunning setup.py clean for %s)cwdTz Failed cleaning build dir for %sF)	r	   rO   r!   r"   r#   r
   r%   rY   error)r'   rG   
clean_argsr   r   r   rZ      s    rZ   c       	   	   C   s   | sg g fS t dddd | D  t t g g  }}xb| D ]Z}t||}t||||}|rtt||_|jj	|_
|jjst|| q@|| q@W W d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>  s    zbuild.<locals>.<genexpr>NzSuccessfully built %s c             S   s   g | ]
}|j qS r   )r#   )rd   r'   r   r   r   
<listcomp>-  s    zbuild.<locals>.<listcomp>zFailed to build %sc             S   s   g | ]
}|j qS r   )r#   )rd   r'   r   r   r   rg   2  s    )r!   r"   rU   r   r?   rI   r   r   r.   	file_pathlocal_file_pathr    r0   append)	requirementsr=   rF   rG   build_successesbuild_failuresr'   r:   
wheel_filer   r   r   build  s4    



ro   )=__doc__loggingos.pathrS   rerV   pip._internal.models.linkr   $pip._internal.operations.build.wheelr   +pip._internal.operations.build.wheel_legacyr   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.typingr   pip._internal.utils.urlsr   pip._internal.vcsr   typingr   r   r   r   r   r   r   pip._internal.cacher   Zpip._internal.req.req_installr   r   ZBinaryAllowedPredicateZBuildResult	getLogger__name__r!   compileIr   r*   r,   r-   r9   r?   r+   rI   rD   rZ   ro   r   r   r   r   <module>   sB   $
	-	
#1