U
    LdB.                     @   sV  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
 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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) 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e$ ee$ f Z:e;e<dddZ=e$e<e<dddZ>e$e<dddZ?e$e<dd d!Z@e$e	e< dd"d#ZAe$ee;d$d%d&ZBe$e;dd'd(d)ZCe$e;e<ee; ee; e<e	e; d*d+d,ZDe$e;ee; ee; e<e	e; d-d.d/ZEe$ee; e<d0d1d2ZFee$ ee<ee; ee; e:d3d4d5ZGdS )6z;Orchestrator for building wheels from InstallRequirements.
    N)IterableListOptionalTuple)canonicalize_namecanonicalize_version)InvalidVersionVersion)
WheelCache)InvalidWheelFilenameUnsupportedWheel)FilesystemWheelget_wheel_distribution)Link)Wheel)build_wheel_pep517)build_wheel_editable)build_wheel_legacy)InstallRequirement)
indent_log)
ensure_dir	hash_file)make_setuptools_clean_args)call_subprocess)TempDirectory)path_to_url)vcsz([a-z0-9_.]+)-([a-z0-9_.!+-]+))sreturnc                 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)r    r"   </tmp/pip-install-netrr6me/pip/pip/_internal/wheel_builder.py_contains_egg_info%   s    r$   )req
need_wheelr   c                 C   sJ   | j r
dS | jr&|r"td| j dS |r.dS | js8dS | jrF|  S dS )zBReturn whether an InstallRequirement should be built into a wheel.Fz(Skipping %s, due to already being wheel.T)
constraintis_wheelloggerinfoname
source_direditableZsupports_pyproject_editable)r%   r&   r"   r"   r#   _should_build-   s     r.   )r%   r   c                 C   s   t | ddS )NTr&   r.   r%   r"   r"   r#   should_build_for_wheel_commandN   s    r2   c                 C   s   t | ddS )NFr/   r0   r1   r"   r"   r#    should_build_for_install_commandT   s    r3   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   Zget_backend_for_schemeschemeZis_immutable_rev_checkouturlsplitextr$   )r%   vcs_backendbaseextr"   r"   r#   _should_cacheZ   s    


r=   )r%   wheel_cacher   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_dirr4   r6   r=   get_path_for_linkget_ephem_path_for_link)r%   r>   cache_availabler?   r"   r"   r#   _get_cache_dirz   s    

rC   )r%   
wheel_pathr   c           	      C   s   t | jp
d}ttj|}t |j|kr>td||jtt	||}t
|j}t|t|jkrzt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   r   strversionr   metadata_versionr   r	   r   
isinstance)	r%   rD   canonical_namewdistZdist_verstrZmetadata_version_valuerL   msgr"   r"   r#   _verify_one   s@     
 
rR   )r%   
output_dirverifybuild_optionsglobal_optionsr-   r   c           	   
   C   s   |rdnd}zt | W n: tk
rR } 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.
    r-   wheelzBuilding %s for %s failed: %sNzBuilt %s for %s is invalid: %s)
r   OSErrorr)   warningr+   	build_env_build_one_inside_envrR   r   r   )	r%   rS   rT   rU   rV   r-   ZartifacterD   r"   r"   r#   
_build_one   s4        r]   )r%   rS   rU   rV   r-   r   c                 C   s|  t ddf}| jst| jr| js(t| js2t|rDtd| j |rVtd| j |rtt| j| j| j|j	d}qt
| j| j| j|j	d}nt| j| j| j|||j	d}|d k	rRtj	|}tj	||}zNt|\}	}
t|| td| j||
|	  td| |W W  5 Q R  S  tk
rP } ztd	| j| W 5 d }~X Y nX | jsdt| | W 5 Q R  d S Q R X d S )
NrW   )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,   rV   rU   ra   z3Created wheel for %s: filename=%s size=%d sha256=%szStored in directory: %sz Building wheel for %s failed: %s)r   r+   r6   
use_pep517r`   pep517_backendr)   rY   r   rG   r   r   rb   unpacked_source_directoryrF   rH   joinr   shutilmover*   	hexdigest	Exception_clean_one_legacy)r%   rS   rU   rV   r-   temp_dirrD   
wheel_name	dest_path
wheel_hashlengthr\   r"   r"   r#   r[      sx    


  	

r[   )r%   rV   r   c                 C   s\   t | j|d}td| j zt|d| jd W dS  tk
rV   td| j Y dS X d S )N)rV   zRunning setup.py clean for %szpython setup.py clean)command_desccwdTz Failed cleaning build dir for %sF)	r   rb   r)   r*   r+   r   r,   rj   error)r%   rV   
clean_argsr"   r"   r#   rk     s      rk   )requirementsr>   rT   rU   rV   r   c           
   	   C   s  | sg g fS t dddd | D  t  g g  }}| D ]}|jsLtt||}t||||||jol|j	}	|	r|j
dk	r|||j
 tt|	|_|jj|_|jjst|| q>|| q>W 5 Q R X |rt dddd	 |D  |rt 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>8  s     zbuild.<locals>.<genexpr>NzSuccessfully built %s c                 S   s   g | ]
}|j qS r"   rv   rw   r"   r"   r#   
<listcomp>[  s     zbuild.<locals>.<listcomp>zFailed to build %sc                 S   s   g | ]
}|j qS r"   rv   rw   r"   r"   r#   r{   `  s     )r)   r*   rf   r   r+   r6   rC   r]   r-   Zpermit_editable_wheelsZdownload_infoZrecord_download_originr   r   r4   	file_pathZlocal_file_pathr(   append)
ru   r>   rT   rU   rV   Zbuild_successesbuild_failuresr%   r?   
wheel_filer"   r"   r#   build&  sL    





r   )H__doc__loggingos.pathrF   rerg   typingr   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   r   pip._internal.models.linkr   Zpip._internal.models.wheelr   Z$pip._internal.operations.build.wheelr   Z-pip._internal.operations.build.wheel_editabler   Z+pip._internal.operations.build.wheel_legacyr   pip._internal.req.req_installr   pip._internal.utils.loggingr   pip._internal.utils.miscr   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    ZBuildResultrJ   r   r$   r.   r2   r3   r=   rC   rR   r]   r[   rk   r   r"   r"   r"   r#   <module>   s   
	"!'G