
    e                        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*                  rdd
lmZ ddlmZ  G d de      Zy)    )annotations   )ExternalDependencyDependencyExceptionDependencyTypeName   )listify
Popen_safePopen_safe_logged
split_argsversion_compareversion_compare_many)find_external_program)mlogN)mesonlib)Environment)PkgConfigDefineTypec                       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
j                  d
      Zdd fdZddZd	 ddZddZddZddZedd       Zddddddd	 	 	 	 	 	 	 	 	 ddZ x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
    NzT.Optional[T.List[str]]toolsT.Optional[str]	tool_namez	--versionskip_versionFz^[0-9][0-9.]+c                   t         	|   t        d      |||       || _        t	        |j                  d| j                              | _        | j                  s| j                  d   | _        d|v r
|d   | _        |j                  dd       }|t        j                  |      }ng }| j                  ||j                  dd            \  }}|| _        | j                  ||      | _        | j                  sd | _        y || _        y )Nconfig-tool)languager   r   version_argversionreturncode_value)super__init__r   namer	   getr   r   r   r   stringlistifyfind_configconfigreport_configis_foundr   )
selfr"   environmentkwargsr   req_version_rawreq_versiontoolr   	__class__s
            D/usr/lib/python3/dist-packages/mesonbuild/dependencies/configtool.pyr!   zConfigToolDependency.__init__2   s    +M:KZbc	VZZ<=
~~!ZZ]DNF"%m4D **Y5&"00AKK((fjjASUV6WXg**7K@}}DK    c                    | j                   j                  |      }|r |j                  d      j                  d      S |S )z3Remove any non-numeric, non-point version suffixes.r   .)$_ConfigToolDependency__strip_versionmatchgrouprstrip)r)   r   ms      r0   _sanitize_versionz&ConfigToolDependency._sanitize_versionI   s;      &&w/ 771:$$S))r1   c                   d}t        | j                  | j                  | j                  | j                  | j                  | j
                        D ]  }|j                         s|j                         }	 t        || j                  gz         dd \  }}|j                  |k7  r9| j                  r,t        || j                  gz         d   }|j                  |k7  r| j                  |j                               }|s|dfc S |rt!        ||      d   }|sd}|d   r$t#        |dj%                  |d               s||f}||f} |S # t        t        f$ r Y w xY w)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PermissionError
returncoder   r9   stripr   r   format)	r)   versionsrB   
best_matchpotential_binr.   poutr(   s	            r0   r%   z ConfigToolDependency.find_configR   sm   
 IU
2$**DNN

DD`D`b $	)M !&&( ,,.D#DD,<,<+=$=>rB3 ||z)$$"44+<+<*=#=>qAA||z1 ((5C d|#/X>qA  D!}"3jm(DE"&J"C[
I$	)L = &7 s   5E		EEc                   t        j                  | j                        dg}| j                  W|j	                  t        j
                  d             ||r|j	                  d|d|       nZ|rX|j	                  d|       nC|t        j                  d      dj                  d	j                  | j                              |gz  }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greenrD   joinlog)r)   r   r-   	found_msgs       r0   r'   z"ConfigToolDependency.report_config   s     @Dyy?XZb>c	;;TXXd^,"{  6'J{o!NO  5!89$**U+V]]388DKK;P-QSZ[[I){{$&&r1   c                    t        | j                  |z         \  }}}|j                  dk7  r,| j                  rt	        d| d| j
                   d|       g S t        |      S )Nr   zCould not generate z for z.
)r   r&   rB   requiredr   r"   r   )r)   argsstagerH   rI   errs         r0   get_config_valuez%ConfigToolDependency.get_config_value   sc    'd(:;3<<1}}),?weDII;VYZ]Y^*_``I#r1   c                    d| gS )Nz-- )r)   variable_names     r0   get_variable_argsz&ConfigToolDependency.get_variable_args   s    ]O$%%r1   c                      y)Nr   r\   r\   r1   r0   	log_triedzConfigToolDependency.log_tried   s    r1   )cmake	pkgconfig
configtoolinternaldefault_valuepkgconfig_definec                   |rgt        | j                  | j                  |      z         \  }}}	|j                  dk(  r-|j	                         }
t        j                  d| d|
        |
S ||S t        d|       )Nr   zGot config-tool variable z : z?Could not get config-tool variable and no default provided for )r
   r&   r^   rB   rC   r   debugr   )r)   ra   rb   rc   rd   re   rf   rH   rI   _variables              r0   get_variablez!ConfigToolDependency.get_variable   s     "4;;1G1G
1S#STIAsA||q 99;

6zl#hZPQ$  !$cdhck"lmmr1   )N)r"   strr*   z'Environment'r+   zT.Dict[str, T.Any]r   r   )r   rl   returnrl   )r   )rE   T.List[str]rB   intrm   z1T.Tuple[T.Optional[T.List[str]], T.Optional[str]])r   r   r-   rn   rm   bool)rW   rn   rX   rl   rm   rn   )r]   rl   rm   rn   )rm   rl   )ra   r   rb   r   rc   r   rd   r   re   r   rf   r   rm   rl   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r;   recompiler4   r!   r9   r%   r'   rZ   r^   staticmethodr`   rk   __classcell__)r/   s   @r0   r   r      s    
 &*E")!%I%K$(L/(# bjj!12O.,@,\'$&   8<Z^37UY6:=An!0nCRn$3n (;n GJnr1   r   )
__future__r   baser   r   r   r   r	   r
   r   r   r   r   programsr    r   rv   typingT
mesonbuildTYPE_CHECKINGr*   r   interpreter.type_checkingr   r   r\   r1   r0   <module>r      sC    # M M p p ,  	  ??)?Pn- Pnr1   