
    eB                       d dl mZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
mZ ddlmZ ddlmZ ddlmZmZ e	j        rddlmZ dd	lmZ  G d
 dej                  Z G d de          Z G d de          Z	 dd dZdS )!    )annotationsN)Path   )mesonlib)mlog)MachineChoice
OrderedSet)Environment)Interpreterc                  $   e Zd ZdZdZej        Z	 	 	 d/d0dZd1dZ	d2dZ
d2dZd3d4dZed5d            Ze ej        d          d6d                        Zed7d!            Zed8d#            Zd9d$Zd:d&Zd;d(Zd<d)Zd=d*Zd>d,Zd?d-Zd2d.ZdS )@ExternalProgramz&A program that is found on the system.)exemsccombatcmdNFnamestrcommandT.Optional[T.List[str]]silentbool
search_dirT.Optional[str]extra_search_dirsc           
        || _         d | _        d | _        |vt          j        |          | _        t          j                    rI| j        d         }| j        dd          }|                     |          }|r||z   | _        nL|g|z   | _        n@|g}	|r|	|z  }	|	D ]3}
|                     ||
          | _        | 	                                r n4| 	                                rSt          | j                  D ],}|(t          j                            |          r	|| _         n-| j        d         | _        |s| 	                                rYt          j        dt          j        |          dt          j        d          dd                    | j                  z             d S t          j        dt          j        |          dt          j        d	                     d S d S )
Nr   r   Programzfound:YESz(%s) NO)r   pathcached_versionr   listifyr   
is_windows_shebang_to_cmd_searchfoundreversedosisfiler   logboldgreenjoinred)selfr   r   r   r   r   r   argsretall_search_dirsdargs               8/usr/lib/python3.11/site-packages/mesonbuild/programs.py__init__zExternalProgram.__init__+   s    	%)	/3#+G44DL"$$ 
0l1o|ABB' **3// 0#&:DLL$'54<DL)lO  5#44$  #||D!44::<< E ::<< 		-  -- - -?rw~~c':':? #DIE L,	 	O zz|| ODIdOOXtz%?P?P#((4<"8"88: : : : : DIdOOXtx~~NNNNN	O 	O    return T.Union[str, mlog.AnsiDecorator]c                `    |                                  st          j        d          S | j        S )Nr!   )r(   r   r0   r"   r1   s    r7   summary_valuezExternalProgram.summary_value[   s(    zz|| 	"8D>>!yr9   c                \    d}|                     | j        j        | j        | j                  S Nz<{} {!r} -> {!r}>format	__class____name__r   r   r1   rs     r7   __repr__zExternalProgram.__repr__`   &    xx/DLIIIr9   c                6    d                     | j                  S )z)Human friendly description of the commandr    )r/   r   r=   s    r7   descriptionzExternalProgram.descriptiond   s    xx%%%r9   interpreterT.Optional['Interpreter']c                b   | j         s!|                                 dgz   }|r>|                    | dgfddt          j                    dd          }|j        |j        }}nWt          j        |          \  }}}|j        dk    r4t          j	        |          }t          j
        d|d|j         d          |                                }|s|                                }t          j        d|          }	|	st          j
        d	|          |	                    d
          | _         | j         S )Nz	--versionT)capturecheckenvr   zCommand z failed with status .z([0-9][0-9\.]+)z-Could not find a version number in output of r   )r#   get_commandrun_command_implr   EnvironmentVariablesstdoutstderr
Popen_safe
returncode	join_argsMesonExceptionstripresearchgroup)
r1   rK   raw_cmdresoepcmd_stroutputmatchs
             r7   get_versionzExternalProgram.get_versionh   sO   " 	1&&((K=8G m!22D;-3H?C=A;C;X;Z;Z4\ 4\ 48	9 9
 z3:1"-g661a<1$$&099G"12kW2k2k\]\h2k2k2klllWWYYF #I0&99E k-.i^e.i.ijjj"'++a..D""r9   rP   'Environment'for_machiner   'ExternalProgram'c                z    |                     ||          }|t                      S |                     ||          S N)lookup_binary_entryNonExistingExternalProgram
from_entry)clsrP   ri   r   r   s        r7   from_bin_listzExternalProgram.from_bin_list   s>     ))+t<<?-///~~dG,,,r9   )maxsizer"   c                   dt           j        vr| S t          t           j        d                   dz  dz  dz  dz  }g }|                     t           j                  D ]u}t          |          |k    r|                    |           +dt          j        v r<|                    t           j        	                    t          j                             vt           j        
                    |          S )NUSERPROFILEAppDataLocal	MicrosoftWindowsApps)r*   environr   splitpathsepappendsys
executabler"   dirnamer/   )r"   appstore_dirpathseachs       r7   _windows_sanitize_pathz&ExternalProgram._windows_sanitize_path   s     
**K BJ}566BWL{Z]jjJJrz** 	> 	>DDzz\))T""""#.00RW__S^<<===zu%%%r9   T.Union[str, T.List[str]]c                n   t          |t                    rt          |          dk    r|d         }t          |t                    st          j                            |          r*t          |t                    r|g}t          | |d          S t          |t                    sJ t          |d          S )Nr   r   T)r   r   r   )
isinstancelistlenr*   r"   isabsr   r   )r   r   s     r7   ro   zExternalProgram.from_entry   s    gt$$ 	%7||q  !!* gt$$ 	Gg(>(> 	G'3'' $")"4FFFF'3'''''wt4444r9   scriptc                   	 t          | d          5 }|                                                                }ddd           n# 1 swxY w Y   |                    d          r|dd                             d          d                                                             d	          }t          j                    r|d                             d
          r$|d                             d
          d         |d<   t          |          dk    r|d         dk    r
|dd         }t          |          dk    r#|d         dk    rt
          j        |dd         z   }nt          j	                    rM|d         dk    r
|dd         }t          |          dk    r#|d         dk    rt
          j        |dd         z   }nl|d         dk    r$|d         dk    rt
          j        |dd         z   }n<|d                             d
          d         dk    rt
          j        |dd         z   }|| gz   S n8# t          $ r+}t          j        t          |                     Y d}~nd}~ww xY wt          j        d|            dS )z
        Check if the file has a shebang and manually parse it to figure out
        the interpreter to use. This is useful if the script is not executable
        or if we're on Windows (which does not understand shebangs).
        zutf-8)encodingNz#!   #r   r   )maxsplit/r   rP   python3z/usr/bin/envzUnusable script )openreadliner[   
startswithrz   r   r%   r   python_commandis_haiku	Exceptionr   debugr   )r   f
first_linecommandsrb   s        r7   r&   zExternalProgram._shebang_to_cmd   s   $	fw/// 21ZZ\\//11
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2$$T** +
 &abb>//44Q7==??EEqEQQ&(( J  {--c22 A&.qk&7&7&<&<R&@8}}q((Xa[E-A-A#+ABB<8}}q((Xa[I-E-E#+#:Xabb\#I&(( J  {n44#+ABB<8}}q((Xa[I-E-E#+#:Xabb\#I  {n44!	9Q9Q#+#:Xabb\#I!!**3//3y@@#+#:Xabb\#I6(**?+@  	 	 	Js1vv	
0f00111ts:   H5 'AH5 A

H5 A
G%H5 5
I*?!I%%I*c                   t           j                            |          d                                         dd          }t          j        t          j        z  t          j        z  }t          j	                    r|| j
        v rdS n<t          j        |          j        |z  r t           j                            |           S dS )Nr   r   TF)r*   r"   splitextlowerstatS_IXUSRS_IXGRPS_IXOTHr   r%   windows_extsst_modeisdir)r1   r"   suffixexecmasks       r7   _is_executablezExternalProgram._is_executable   s    !!$''+1133ABB7<$,.=   	+***t +WT]]"X- 	+w}}T****ur9   T.Optional[list]c                v   |d S t           j                            ||          }t           j                            |          r-|                     |          r|gS |                     |          S t          j                    r5| j        D ]-}| d| }t           j                            |          r|gc S .d S )NrQ   )	r*   r"   r/   existsr   r&   r   r%   r   )r1   r   r   trialext	trial_exts         r7   _search_dirzExternalProgram._search_dir   s    4Z..7>>%   	+""5)) w ''..."$$ +, + +C#( 0 03 0 0Iw~~i00 + ){***+tr9   T.List[T.Optional[str]]c                P   |rgt           j                            |          d         }|dd                                         | j        v r|gS |                     |          }|r|S dgS t           j                            |          r5| j        D ]-}| d| }t           j                            |          r|gc S .|                     t           j	        
                    dd                                        d          }|D ]}|                     ||          }|r|c S dgS )a  
        Lots of weird Windows quirks:
        1. PATH search for @name returns files with extensions from PATHEXT,
           but only self.windows_exts are executable without an interpreter.
        2. @name might be an absolute path to an executable, but without the
           extension. This works inside MinGW so people use it a lot.
        3. The script is specified without an extension, in which case we have
           to manually search in PATH.
        4. More special-casing for the shebang inside the script.
        r   NrQ   PATH ;)r*   r"   r   r   r   r&   r   r   r   ry   getrz   r   )r1   r   r   name_extr   r   search_dirsr   s           r7   _search_windows_special_casesz-ExternalProgram._search_windows_special_cases   sP     	
 w''003H|!!##t'888y ++G44H  6M 7== 	%( % %!//C//7>>'** %#9$$$%
 11"*..2L2LMMSSTWXX% 	  	 J''j99H   vr9   c                   |                      ||          }|r|S t          j                            |          r"t          j                            |          sdgS t          j                            dd          }t          j                    r|r| 	                    |          }t          j        ||          }t          j                    r|                     ||          S |gS )zz
        Search in the specified dir for the specified executable by name
        and if not found search in PATH
        Nr   r"   )r   r*   r"   r   r   ry   r   r   r%   r   shutilwhichr   )r1   r   r   r   r"   r   s         r7   r'   zExternalProgram._search)  s    
 ##D*55 	O7??4   	t)<)< 	6Mz~~fd++   	5T 	5..t44D,t$///   	E55dGDDD yr9   c                     | j         d         d uS )Nr   r   r=   s    r7   r(   zExternalProgram.found?  s    |Ad**r9   T.List[str]c                     | j         d d          S rl   r   r=   s    r7   rR   zExternalProgram.get_commandB  s    |AAAr9   c                    | j         S rl   r   r=   s    r7   get_pathzExternalProgram.get_pathE  
    yr9   c                    | j         S rl   )r   r=   s    r7   get_namezExternalProgram.get_nameH  r   r9   )NFNN)
r   r   r   r   r   r   r   r   r   r   )r:   r;   r:   r   rl   )rK   rL   r:   r   )rP   rh   ri   r   r   r   r:   rj   )r"   r   r:   r   )r   r   r   r   r:   rj   )r   r   r:   r   )r"   r   r:   r   )r   r   r   r   r:   r   )r   r   r   r   r:   r   )r   r   r   r   r:   r   r:   r   )r:   r   )r:   r   )rD   
__module____qualname____doc__r   r   BUILDri   r8   r>   rG   rJ   rg   classmethodrq   staticmethod	functools	lru_cacher   ro   r&   r   r   r   r'   r(   rR   r   r    r9   r7   r   r   $   s       006L%KEIEI>B.O .O .O .O .O`   
J J J J& & & &# # # # #0 - - - [- Y&&&& & & '& \&, 5 5 5 \5 , , , \,\      &) ) ) )V   ,+ + + +           r9   r   c                  ,    e Zd ZdZdddZddZdd
ZdS )rn   zA program that will never existnonexistingprogramr   r   r:   Nonec                2    || _         d g| _        d | _        d S rl   )r   r   r"   )r1   r   s     r7   r8   z#NonExistingExternalProgram.__init__O  s    	v			r9   c                \    d}|                     | j        j        | j        | j                  S r@   rA   rE   s     r7   rG   z#NonExistingExternalProgram.__repr__T  rH   r9   r   c                    dS )NFr   r=   s    r7   r(   z NonExistingExternalProgram.foundX  s    ur9   N)r   )r   r   r:   r   r   r   )rD   r   r   r   r8   rG   r(   r   r9   r7   rn   rn   L  s_        %%    
J J J J     r9   rn   c                      e Zd ZdZdS )OverrideProgramzA script overriding a program.N)rD   r   r   r   r   r9   r7   r   r   \  s        ((((r9   r   TrP   rh   ri   r   r   r   display_namedefault_namesr   allow_default_for_crossr   r:   *T.Generator['ExternalProgram', None, None]c              #  
  K   t          |          }|                    |           |D ]V}|                     ||          }|<t          j        | d| d|            t
                              ||          V   dS Wt          j        | d           |s#|t          j        u r| 	                    |          s3|D ].}	t          j        d| d|	           t          |	d          V  /dS t          j        d	           dS )
zKFind an external program, checking the cross file plus any default options.Nz binary for z7 specified from cross file, native file, or env var as z@ binary missing from cross or native file, or env var undefined.zTrying a default z fallback atTr   z+Default target is not allowed for cross use)
r	   addrm   r   r   r   ro   r   HOSTis_cross_build)
rP   ri   r   r   r   r   potential_namespotential_namepotential_cmdpotential_paths
             r7   find_external_programr   a  si      !//O)  //^LL$J, 8 8K 8 8(58 8 9 9 9!,,^]KKKKK FF % 	J,```aaa  B{m6H'H'HSM_M_`kMlMl'H+ 	? 	?NJE<EEE~VVV!.>>>>>>>	? 	? 	
@AAAAAr9   )T)rP   rh   ri   r   r   r   r   r   r   r   r   r   r:   r   )
__future__r   r   r*   r   r   r}   r\   typingTpathlibr   r   r   r   r   r	   TYPE_CHECKINGenvironmentr
   rK   r   HoldableObjectr   rn   r   r   r   r9   r7   <module>r      s   # " " " " " C     				   



 				                       / / / / / / / /? )((((((((((((e e e e eh- e e eP	        ) ) ) ) )o ) ) ) ;?B B B B B B Br9   