o
    uJAfŸL  ã                   @  sÚ   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mZmZ dd
lmZmZmZ ddlmZmZmZmZ d dlZejrcddlmZ ddlmZmZ ddlmZ G dd„ deƒZ dS )é    )Úannotationsé   )Úextract_required_kwargé   )Úmlog)Údependencies)Úbuild)ÚWrapMode)Ú	OptionKeyÚextract_as_listÚstringlistifyÚversion_compare_manyÚlistify)Ú
DependencyÚDependencyExceptionÚNotFoundDependency)ÚMesonInterpreterObjectÚ
FeatureNewÚInterpreterExceptionÚInvalidArgumentsN)ÚInterpreter)ÚTYPE_nkwargsÚ	TYPE_nvar)ÚSubprojectHolderc                      sÊ   e Zd Z		dFdG‡ fdd„ZdHdd„ZdIdd„ZdJdd„ZdJdd „ZdJd!d"„ZdJd#d$„Z	dKd&d'„Z
dLd(d)„ZdMd+d,„ZdNd/d0„ZdOd3d4„ZdPd5d6„ZdQd8d9„ZedRd=d>„ƒZdSd@dA„ZdTdUdDdE„Z‡  ZS )VÚDependencyFallbacksHolderNÚinterpreterú'Interpreter'ÚnamesúT.List[str]Úallow_fallbackúT.Optional[bool]Údefault_optionsú"T.Optional[T.Dict[OptionKey, str]]ÚreturnÚNonec                   sî   t ƒ j|jd || _|j| _|j| _|j| _|j| _|jj| _|| _d | _	d | _
d|p-i i| _g | _d| _d| _|D ]+}|sCtdƒ‚d|v sOd|v sOd|v rStdƒ‚|| jv r`td	|›d
ƒ‚| j |¡ q;| jrr| jd | _d S d| _d S )N)Ú
subprojectr!   Fz1dependency_fallbacks empty name '' is not allowedú<ú>ú=z„Characters <, > and = are forbidden in dependency names. To specifyversion
 requirements use the 'version' keyword argument instead.zdependency_fallbacks name z is duplicatedr   z(anonymous))ÚsuperÚ__init__r%   r   Úcoredatar   ÚenvironmentÚwrap_resolverr   Úsubproject_nameÚsubproject_varnameÚsubproject_kwargsr   ÚforcefallbackÚ
nofallbackr   r   ÚappendÚ_display_name)Úselfr   r   r   r!   Úname©Ú	__class__© úO/usr/lib/python3.10/site-packages/mesonbuild/interpreter/dependencyfallbacks.pyr*      s.   

 z"DependencyFallbacksHolder.__init__Úfbinfoú%T.Optional[T.Union[T.List[str], str]]c                 C  s–   |d u rd S | j d urtdƒ‚t|ƒ}t|ƒdkrd| _ d S t|ƒdkr4t dd| j¡ |d d }}nt|ƒdkr?|\}}ntdƒ‚|  ||¡ d S )	Nz@"fallback" and "allow_fallback" arguments are mutually exclusiver   Fr   zFallback without variable namez0.53.0r   z)Fallback info must have one or two items.)	r   r   r   Úlenr   Ú
single_user%   r   Ú_subproject_impl)r5   r;   Ú	subp_nameÚvarnamer9   r9   r:   Úset_fallback0   s   

z&DependencyFallbacksHolder.set_fallbackr@   ÚstrrA   c                 C  s   | j d u sJ ‚|| _ || _d S ©N)r.   r/   )r5   r@   rA   r9   r9   r:   r?   D   s   
z*DependencyFallbacksHolder._subproject_implÚkwargsr   Ú	func_argsr   Úfunc_kwargsúT.Optional[Dependency]c                 C  s&   |d }|   ||¡}|r|  |¡ |S ©Nr   )Ú_get_cached_depÚ_verify_fallback_consistency)r5   rE   rF   rG   r6   Ú
cached_depr9   r9   r:   Ú_do_dependency_cacheI   s
   
z.DependencyFallbacksHolder._do_dependency_cachec                 C  s^   |d }|   |¡ t || j|¡}| ¡ r-| j |¡}t ||¡}| jj	|  
||¡ |S d S rI   )Ú_handle_featurenew_dependenciesr   Úfind_external_dependencyr,   Úfoundr   Úmachine_from_native_kwargÚget_dep_identifierr+   ÚdepsÚput)r5   rE   rF   rG   r6   ÚdepÚfor_machineÚ
identifierr9   r9   r:   Ú_do_dependencyP   s   
z(DependencyFallbacksHolder._do_dependencyc                 C  s.   |d }| j }|r|  |¡r|  |||¡S d S rI   )r/   Ú_get_subprojectÚ_get_subproject_dep)r5   rE   rF   rG   r@   rA   r9   r9   r:   Ú_do_existing_subproject_   s
   z1DependencyFallbacksHolder._do_existing_subprojectc           	      C  s  | j rt dt | j¡d¡ n| jrt dt | j¡d¡ d S t dt | j¡¡ | d¡}| di ¡}|d urTd|vrT|r@dnd}t d	|› ¡ ||tdƒ< ||d< | j}| j	}| 
d
g ¡ d|v rst|d tƒrst|d ƒ|d< | j ||¡ |  |||¡S )Nz4Looking for a fallback subproject for the dependencyz0because:
Use of fallback dependencies is forced.z8Not looking for a fallback subproject for the dependencyz2because:
Use of fallback dependencies is disabled.Ústaticr!   Údefault_libraryÚsharedz2Building fallback subproject with default_library=Úversion)r1   r   ÚlogÚboldr4   r2   Úgetr
   r.   r/   Ú
setdefaultÚ
isinstancerC   r   r   Údo_subprojectrZ   )	r5   rE   rF   rG   r\   r!   r]   r@   rA   r9   r9   r:   Ú_do_subprojectf   s4   ÿÿ
ÿ
z(DependencyFallbacksHolder._do_subprojectúT.Optional[SubprojectHolder]c                 C  s"   | j j |¡}|r| ¡ r|S d S rD   )r   Úsubprojectsrb   rP   )r5   r@   Úsubr9   r9   r:   rY   …   s   z)DependencyFallbacksHolder._get_subprojectc           
      C  sö  |   |¡}|s!t dt | j¡dt |¡dt d¡t d¡¡ d S d }| jD ]}|  ||¡}|r2 nq&|r<|  	|¡ |S |sO| jD ]}| j
 ||¡}|rN nqA|swt d|›d| j›d¡ t dt | j¡dt |j¡dt d¡¡ |  ¡ S |  ||¡p€|  ¡ }| ¡ sœt dt | j¡dt |j¡dt d¡¡ |S t| d	g ¡ƒ}| ¡ }	|  ||	¡sÙt dt | j¡dt |j¡dt d¡d
t |	¡dt d dd„ |D ƒ¡¡¡
 |  ¡ S t dt | j¡dt |j¡dt d¡|	röt |	¡¡ |S d ¡ |S )Nr   zfrom subprojectúfound:ÚNOz (subproject failed to configure)zSubproject z did not override z* dependency and no variable name specifiedr_   rP   ú	but need:ú, c                 S  ó   g | ]}d |› d ‘qS ©ú'r9   ©Ú.0Úer9   r9   r:   Ú
<listcomp>Â   ó    zADependencyFallbacksHolder._get_subproject_dep.<locals>.<listcomp>ÚYES)rY   r   r`   ra   r4   ÚredÚbluer   rJ   rK   r-   Úget_varnameÚwarningÚsubdirÚ_notfound_dependencyÚ_get_subproject_variablerP   r   rb   Úget_versionÚ_check_versionÚnormal_cyanÚjoinÚgreen)
r5   r@   rA   rE   r%   rL   r6   Úvar_depÚwantedrP   r9   r9   r:   rZ   ‹   sf   
þ
ÿ

ÿÿÿýþÿþz-DependencyFallbacksHolder._get_subproject_depr6   c           
      C  sp  | j  |¡}t ||¡}t| dg ¡ƒ}| jj|  |¡}|rGt 	|j
r&dnd¡g}|j}| ¡ sFtjdt | j¡dt d¡g|¢R Ž  |S n| jrP| jrPd }nt 	d¡g}| jj|  |¡}|r¶| ¡ }	|  ||	¡s—|sod S tjdt |¡dt d¡dt |	¡dt d	 d
d„ |D ƒ¡¡g|¢R Ž  |  ¡ S |	r¡t |	¡g|¢}tjdt | j¡dt d¡g|¢R Ž  |S d S )Nr_   z(overridden)z(cached)r   rj   rk   rP   rl   rm   c                 S  rn   ro   r9   rq   r9   r9   r:   rt   î   ru   z=DependencyFallbacksHolder._get_cached_dep.<locals>.<listcomp>rv   )r   rQ   r   rR   r   rb   r   Údependency_overridesr   rx   ÚexplicitrU   rP   r`   ra   r4   rw   r1   r.   r+   rS   r~   r   r€   r   r|   r‚   )
r5   r6   rE   rV   rW   Zwanted_versÚoverrideÚinforL   Z
found_versr9   r9   r:   rJ   Ê   sR   
ÿÿý
ýü
ÿÿz)DependencyFallbacksHolder._get_cached_depr%   r   c                 C  sj   z	|  |gi ¡}W n ty   d }Y nw t|tƒs3t d|›d|j›d|d u r.d¡ d S d¡ d S |S )Nz	Variable z in the subproject z isz	not foundznot a dependency object)Úget_variable_methodr   rd   r   r   rz   r{   )r5   r%   rA   rƒ   r9   r9   r:   r}   ø   s   ÿ

ÿÿÿz2DependencyFallbacksHolder._get_subproject_variablerL   r   c                 C  sf   | j }| j}|  |¡}|r)|r+|  ||¡}|r-| ¡ r/||kr1t d|›¡ d S d S d S d S d S d S )NzSInconsistency: Subproject has overridden the dependency with another variable than )r.   r/   rY   r}   rP   r   rz   )r5   rL   r@   rA   r%   rƒ   r9   r9   r:   rK     s   
ýz6DependencyFallbacksHolder._verify_fallback_consistencyc                 C  s   |dkrt  dd| j¡ dS |dkrt  dd| j¡ dS |dkr*t  dd| j¡ dS |dkr8t  d	d
| j¡ dS |dkrFt  dd| j¡ dS dS )z:Do a feature check on dependencies used by this subprojectÚmpizMPI Dependencyz0.42.0ÚpcapzPcap DependencyÚvulkanzVulkan DependencyÚlibwmfzLibWMF Dependencyz0.44.0ÚopenmpzOpenMP Dependencyz0.46.0N)r   r>   r%   )r5   r6   r9   r9   r:   rN     s   ÿz9DependencyFallbacksHolder._handle_featurenew_dependenciesr   c                 C  s"   t | jr| jd | jƒS d| jƒS )Nr   Ú )r   r   r,   )r5   r9   r9   r:   r|     s   "z.DependencyFallbacksHolder._notfound_dependencyr„   rP   Úboolc                 C  s"   | sdS |dkpt || ƒd   S )NTÚ	undefinedr   )r   )r„   rP   r9   r9   r:   r     s   z(DependencyFallbacksHolder._check_versionúuT.List[T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, TYPE_nkwargs], T.Optional[Dependency]], TYPE_nvar, TYPE_nkwargs]]c                 C  s   g }| j D ]}| | j|gi f¡ q| jr!| | j| jg| jf¡ | jr'| js7| j D ]}| | j|gi f¡ q*| jrF| | j| jg| jf¡ |S rD   )	r   r3   rM   r.   r[   r0   r1   rX   rf   )r5   Ú
candidatesr6   r9   r9   r:   Ú_get_candidates"  s   

z)DependencyFallbacksHolder._get_candidatesFÚforce_fallbackc                   sz  t |dƒ}|r|  jd d dd„ |D ƒ¡¡7  _t|| jƒ\}}}|r8t dt | j¡dt |¡d¡ |  	¡ S | j
 td	ƒ¡}t|tƒsIJ d
ƒ‚| j
 tdƒ¡‰ tˆ tƒsZJ d
ƒ‚|tjk| _|pw|tjkpwt‡ fdd„| jD ƒƒpw| jˆ v | _| js±| jdur±| jD ],}| j |¡\}	}
|	r°|  j|	ˆ v O  _| js¨| jdu s¨|s¨|  |	¡r®|  |	|
¡  nq„|  ¡ }|s½|r½tdƒ‚t|ƒd }t|ƒD ]q\}}|\}}}|oÕ||k|d< |oÝ||k|d< ||||ƒ}|r| ¡ r| jD ]'}| j  |¡}t! "||¡}|| j#j$| vrt#j%|| jj&dd| j#j$| |< qñ|  S |r1|s(||kr1t'd| j›dƒ‚|r8|  S qÇ|  	¡ S )NÚmodulesz (modules: {})rm   c                 s  s    | ]}t |ƒV  qd S rD   )rC   )rr   Úir9   r9   r:   Ú	<genexpr>6  ó   € z3DependencyFallbacksHolder.lookup.<locals>.<genexpr>r   zskipped: featureÚdisabledÚ	wrap_modezfor mypyÚforce_fallback_forc                 3  s    | ]}|ˆ v V  qd S rD   r9   )rr   r6   ©rœ   r9   r:   r˜   E  r™   FTz-Dependency is required but has no candidates.r   Úrequired)r†   zDependency z is required but not found.)(r   r4   Úformatr   r   r%   r   r`   ra   r|   r+   Ú
get_optionr
   rd   r	   Úlistr2   r1   Úanyr   r.   r   r-   Úfind_dep_providerrY   r?   r”   r   r=   Ú	enumeraterP   r   rQ   r   rR   r   r…   ÚDependencyOverrideÚcurrent_noder   )r5   rE   r•   Úmodsrš   rž   Úfeaturer›   r6   r@   rA   r“   Úlastr—   ÚitemÚfuncrF   rG   rU   rV   rW   r9   r   r:   Úlookup3  sh   
$ ÿþý
ü

ÿ€þz DependencyFallbacksHolder.lookup)NN)
r   r   r   r   r   r    r!   r"   r#   r$   )r;   r<   r#   r$   )r@   rC   rA   rC   r#   r$   )rE   r   rF   r   rG   r   r#   rH   )r@   rC   r#   rg   )r@   rC   rA   rC   rE   r   r#   rH   )r6   rC   rE   r   r#   rH   )r%   r   rA   rC   r#   rH   )rL   r   r#   r$   )r6   rC   r#   r$   )r#   r   )r„   r   rP   rC   r#   r   )r#   r’   )F)rE   r   r•   r   r#   r   )Ú__name__Ú
__module__Ú__qualname__r*   rB   r?   rM   rX   r[   rf   rY   rZ   rJ   r}   rK   rN   r|   Ústaticmethodr   r”   r¬   Ú__classcell__r9   r9   r7   r:   r      s*    ÿ








?
.

	

r   )!Ú
__future__r   Úinterpreterobjectsr   r   r   r   r   Úwrapr	   Úmesonlibr
   r   r   r   r   r   r   r   Úinterpreterbaser   r   r   r   ÚtypingÚTÚTYPE_CHECKINGr   r   r   r   r   r   r9   r9   r9   r:   Ú<module>   s    