o
    uJAf                     @  s   d dl mZ ddlmZmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ d dlZd dlZd d	lmZ ejrIdd
lmZ ddlmZ G dd deZdS )    )annotations   )ExternalDependencyDependencyExceptionDependencyTypeName   )listify
Popen_safePopen_safe_logged
split_argsversion_compareversion_compare_many)find_external_program)mlogN)mesonlib)Environment)PkgConfigDefineTypec                      s   e Zd ZU dZdZded< dZded< dZdZded< d	Z	e
d
Zd7d8 fddZd9ddZd:d;ddZd<d"d#Zd=d&d'Zd>d)d*Zed?d+d,Zddddddd-d@d5d6Z  ZS )AConfigToolDependencyaZ  Class representing dependencies found using a config tool.

    Takes the following extra keys in kwargs that it uses internally:
    :tools List[str]: A list of tool names to use
    :version_arg str: The argument to pass to the tool to get it's version
    :skip_version str: The argument to pass to the tool to ignore its version
        (if ``version_arg`` fails, but it may start accepting it in the future)
        Because some tools are stupid and don't accept --version
    :returncode_value int: The value of the correct returncode
        Because some tools are stupid and don't return 0
    NzT.Optional[T.List[str]]toolsT.Optional[str]	tool_namez	--versionskip_versionFz^[0-9][0-9.]+namestrenvironment'Environment'kwargsT.Dict[str, T.Any]languagec           	        s   t  jtd|||d || _t|d| j| _| js"| jd | _d|v r+|d | _|dd }|d ur;t	
|}ng }| ||dd\}}|| _| ||| _| js[d | _d S || _d S )Nconfig-tool)r   r   r   version_argversionZreturncode_value)super__init__r   r   r   getr   r   r    r   stringlistifyfind_configconfigreport_configis_foundr!   )	selfr   r   r   r   Zreq_version_rawreq_versiontoolr!   	__class__ G/usr/lib/python3.10/site-packages/mesonbuild/dependencies/configtool.pyr#   2   s$   

zConfigToolDependency.__init__r!   returnc                 C  s$   | j |}|r|ddS |S )z3Remove any non-numeric, non-point version suffixes.r   .)$_ConfigToolDependency__strip_versionmatchgrouprstrip)r*   r!   mr/   r/   r0   _sanitize_versionI   s   z&ConfigToolDependency._sanitize_versionr   versionsT.List[str]
returncodeint1T.Tuple[T.Optional[T.List[str]], T.Optional[str]]c           	   
   C  s  d}t | j| j| j| j| j| jdD ]t}| sq| }zt|| j	g dd \}}W n t
tfy8   Y qw |j|krS| jrRt|| jg d }|j|krQqnq| | }|sb|df  S |rot||d }|sod}|d rt|d|d r||f}q||f}q|S )zHelper method that searches for config tool binaries in PATH and
        returns the one that best matches the given version requirements.
        )NN)allow_default_for_crossNr   r   r   z> {})r   envfor_machiner   r   r>   foundget_commandr	   r    FileNotFoundErrorPermissionErrorr;   r   r8   stripr   r   format)	r*   r9   r;   Z
best_matchZpotential_binr,   poutr)   r/   r/   r0   r&   R   sB   
 


z ConfigToolDependency.find_configr+   boolc                 C  s   t | jdg}| jdu r2|t d |dur'|r'|d|d| n|r1|d| n|t ddd	| j|g7 }t j	|  | jduS )
z/Helper method to print messages about the tool.zfound:NNOzfound z
 but need zneed YESz({}) )
r   boldr   r'   appendredgreenrF   joinlog)r*   r!   r+   	found_msgr/   r/   r0   r(      s   
"

z"ConfigToolDependency.report_configargsstagec                 C  sL   t | j| \}}}|jdkr"| jr td| d| j d| g S t|S )Nr   zCould not generate z for z.
)r
   r'   r;   requiredr   r   r   )r*   rT   rU   rG   rH   errr/   r/   r0   get_config_value   s   
z%ConfigToolDependency.get_config_valuevariable_namec                 C  s   d| gS )Nz--r/   )r*   rY   r/   r/   r0   get_variable_args   s   z&ConfigToolDependency.get_variable_argsc                   C  s   dS )Nr   r/   r/   r/   r/   r0   	log_tried   s   zConfigToolDependency.log_tried)cmake	pkgconfig
configtoolinternaldefault_valuepkgconfig_definer\   r]   r^   r_   r`   ra   r   c                C  sd   |r%t | j| | \}}}	|jdkr%| }
td| d|
  |
S |d ur+|S td| )Nr   zGot config-tool variable z : z?Could not get config-tool variable and no default provided for )r	   r'   rZ   r;   rE   r   debugr   )r*   r\   r]   r^   r_   r`   ra   rG   rH   _variabler/   r/   r0   get_variable   s   
z!ConfigToolDependency.get_variable)N)r   r   r   r   r   r   r   r   )r!   r   r1   r   )r   )r9   r:   r;   r<   r1   r=   )r!   r   r+   r:   r1   rI   )rT   r:   rU   r   r1   r:   )rY   r   r1   r:   )r1   r   )r\   r   r]   r   r^   r   r_   r   r`   r   ra   r   r1   r   )__name__
__module____qualname____doc__r   __annotations__r   r    r   r>   recompiler3   r#   r8   r&   r(   rX   rZ   staticmethodr[   re   __classcell__r/   r/   r-   r0   r      s*   
 

	
.

r   )
__future__r   baser   r   r   r   r   r	   r
   r   r   r   programsr    r   rk   typingT
mesonbuildTYPE_CHECKINGr   r   Zinterpreter.type_checkingr   r   r/   r/   r/   r0   <module>   s    