o
    Wod                     @  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 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rAdd
lmZ G dd deZdS )    )annotations   )ExternalDependencyDependencyExceptionDependencyTypeName   )listify
Popen_safe
split_argsversion_compareversion_compare_many)find_external_program)mlogN)mesonlib)Environmentc                      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< e	
d	Zd5d6 fddZd7ddZd8d9d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>d3d4Z  ZS )?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
    NT.Optional[T.List[str]]toolsT.Optional[str]	tool_namez	--versionskip_versionz^[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   Zstringlistifyfind_configconfigreport_configis_foundr    )	selfr   r   r   r   Zreq_version_rawreq_versiontoolr    	__class__ home/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/dependencies/configtool.pyr"   0   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-   r.   _sanitize_versionG   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ddD ]t}| sq| }zt|| jg dd \}}W n t	t
fy7   Y qw |j|krR| jrQt|| jg d }|j|krPqnq| | }|sa|df  S |rnt||d }|snd}|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.
        )NNF)Zallow_default_for_crossNr   r   r   z> {})r   envZfor_machiner   r   foundZget_commandr	   r   FileNotFoundErrorPermissionErrorr9   r   r6   stripr   r   format)	r(   r7   r9   
best_matchZpotential_binr*   poutr'   r-   r-   r.   r$   P   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:NZNOzfound z
 but need zneed ZYESz({}) )
r   Zboldr   r%   appendZredZgreenrA   joinlog)r(   r    r)   Z	found_msgr-   r-   r.   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%   r9   requiredr   r   r
   )r(   rJ   rK   rC   rD   errr-   r-   r.   get_config_value   s   
z%ConfigToolDependency.get_config_valuevariable_namec                 C  s`   t | jd| g \}}}|jdkr| jrtd|| j| }t	d| d|  |S )Nz--r   z-Could not get variable "{}" for dependency {}zGot config-tool variable z : )
r	   r%   r9   rL   r   rA   r   r@   r   debug)r(   rO   rC   rD   _variabler-   r-   r.   get_configtool_variable   s   
z,ConfigToolDependency.get_configtool_variablec                   C  s   dS )Nr   r-   r-   r-   r-   r.   	log_tried   s   zConfigToolDependency.log_tried)cmake	pkgconfig
configtoolinternaldefault_valuepkgconfig_definerU   rV   rW   rX   rY   rZ   c                C  sf   |r&| j }d| _ zz
| |W W || _ S  ty   Y nw W || _ n|| _ w |d ur,|S td| )NTz?Could not get config-tool variable and no default provided for )rL   rS   r   )r(   rU   rV   rW   rX   rY   rZ   restorer-   r-   r.   get_variable   s   z!ConfigToolDependency.get_variable)N)r   r   r   r   r   r   r   r   )r    r   r/   r   )r   )r7   r8   r9   r:   r/   r;   )r    r   r)   r8   r/   rE   )rJ   r8   rK   r   r/   r8   )rO   r   r/   r   )r/   r   )rU   r   rV   r   rW   r   rX   r   rY   r   rZ   r   r/   r   )__name__
__module____qualname____doc__r   __annotations__r   r   r   recompiler1   r"   r6   r$   r&   rN   rS   staticmethodrT   r\   __classcell__r-   r-   r+   r.   r      s(   
 

	
.

r   )
__future__r   baser   r   r   r   r   r	   r
   r   r   Zprogramsr    r   rb   typingTZ
mesonbuildTYPE_CHECKINGr   r   r   r-   r-   r-   r.   <module>   s   