a
    !6a-                     @   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"   :lib/python3.9/site-packages/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.)	Z
constraintis_wheelloggerinfonameeditable
source_dir
use_pep517r   )req
need_wheelcheck_binary_allowedr"   r"   r#   _should_build.   s6    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    r2   c                 C   s   t | d|dS )NFr0   )r/   )r,   r.   r"   r"   r#    should_build_for_install_commandg   s    r3   c                 C   s   | j s| jsdS | jrb| jjrb| j r(J | js2J t| jj}|sHJ || jj| jr^dS dS | jslJ | 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*   linkZis_vcsr   Zget_backend_for_schemeZschemeZis_immutable_rev_checkoutZurlsplitextr$   )r,   Zvcs_backendbaseZextr"   r"   r#   _should_cacheq   s    	


r7   c                 C   s>   t |j}| js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_dirr4   r7   Zget_path_for_linkZget_ephem_path_for_link)r,   wheel_cacheZcache_availabler8   r"   r"   r#   _get_cache_dir   s    

r:   c                 C   s   dS )NTr"   )_r"   r"   r#   r1      s    r1   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 u rtdzt|}W n$ ty   d| }t|Y n0 |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_pathZcanonical_namewZdistZdist_verstrZmetadata_version_valuerC   msgr"   r"   r#   _verify_one   s@    



rH   c              
   C   s   zt | W n6 tyB } ztd| j| W Y d}~dS d}~0 0 | j t| |||}W d   n1 sn0    Y  |r|rzt| | W n: tt	fy } ztd| j| W Y d}~dS d}~0 0 |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(   Z	build_env_build_one_inside_envrH   r   r   )r,   
output_dirverifybuild_optionsglobal_optionserE   r"   r"   r#   
_build_one   s&    "rR   c                 C   sp  t ddN}| jsJ | jrp| js(J | js2J |rDtd| j |rVtd| j t| j| j| j|jd}nt	| j| j
| j|||jd}|d ur8tj|}tj||}zPt|\}}	t|| td| j||	|  td| |W W  d    S  ty6 }
 ztd	| j|
 W Y d }
~
n
d }
~
0 0 | jsJt| | W d    d S 1 sb0    Y  d S )
NZwheel)kindz7Ignoring --global-option when building %s using PEP 517z6Ignoring --build-option when building %s using PEP 517)r(   Zbackendmetadata_directorytempd)r(   setup_py_pathr*   rP   rO   rU   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %srI   )r   r(   r+   rT   Zpep517_backendr&   rK   r   r>   r   rV   Zunpacked_source_directoryr=   r?   joinr   shutilZmover'   Z	hexdigest	Exception_clean_one_legacy)r,   rM   rO   rP   Ztemp_dirrE   Z
wheel_nameZ	dest_pathZ
wheel_hashZlengthrQ   r"   r"   r#   rL      s^    


	

rL   c                 C   sX   t | j|d}td| j zt|| jd W dS  tyR   td| j Y dS 0 d S )N)rP   zRunning setup.py clean for %s)cwdTz Failed cleaning build dir for %sF)	r   rV   r&   r'   r(   r   r*   rY   error)r,   rP   Z
clean_argsr"   r"   r#   rZ   &  s    rZ   c           
      C   s  | sg g fS t dddd | D  t | g g  }}| D ]\}t||}t|||||}	|	rtt|	|_|jj	|_
|jjsJ || q>|| q>W d   n1 s0    Y  |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      zbuild.<locals>.<genexpr>NzSuccessfully built %s c                 S   s   g | ]
}|j qS r"   r]   r^   r"   r"   r#   
<listcomp>`  ra   zbuild.<locals>.<listcomp>zFailed to build %sc                 S   s   g | ]
}|j qS r"   r]   r^   r"   r"   r#   rc   e  ra   )r&   r'   rW   r   r:   rR   r   r   r4   Z	file_pathZlocal_file_pathr%   append)
Zrequirementsr9   rN   rO   rP   Zbuild_successesZbuild_failuresr,   r8   Z
wheel_filer"   r"   r#   build6  s<    



*re   )I__doc__Zloggingos.pathr=   rerX   typingr   r   r   r   r   r   Zpip._vendor.packaging.utilsr   r	   Zpip._vendor.packaging.versionr
   r   Zpip._internal.cacher   Zpip._internal.exceptionsr   r   Zpip._internal.metadatar   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.req.req_installr   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.urlsr   Zpip._internal.vcsr   Z	getLogger__name__r&   compile
IGNORECASEr   r   ZBinaryAllowedPredicateZBuildResultr$   r/   r2   r3   r7   r:   r1   rH   rR   rL   rZ   re   r"   r"   r"   r#   <module>   sL    
	0	
! #;