o
    uJAf B  ã                   @  sÜ   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rLddlmZ dd	lmZ G d
d„ dejƒZG dd„ deƒZG dd„ deƒZ	d d!dd„ZdS )"é    )ÚannotationsN)ÚPathé   )Úmesonlib)Úmlog)ÚMachineChoiceÚ
OrderedSet)ÚEnvironment)ÚInterpreterc                   @  sê   e Zd ZdZdZejZ			d@dAdd„ZdBdd„Z	dCdd„Z
dCdd„ZdDdEdd„ZedFd!d"„ƒZeejdd#dGd%d&„ƒƒZedHd(d)„ƒZedId+d,„ƒZdJd-d.„ZdKd0d1„ZdLd3d4„ZdMd5d6„ZdNd7d8„ZdOd:d;„ZdPd<d=„ZdCd>d?„ZdS )QÚExternalProgramz&A program that is found on the system.)ÚexeZmscÚcomZbatÚcmdNFÚnameÚstrÚcommandúT.Optional[T.List[str]]ÚsilentÚboolÚ
search_dirúT.Optional[str]Úextra_search_dirsc              
   C  sD  || _ d | _d | _|d ur7t |¡| _t ¡ r6| jd }| jdd … }|  |¡}|r0|| | _n"|g| | _n|g}	|r@|	|7 }	|	D ]}
|  ||
¡| _|  	¡ rQ nqB|  	¡ rst
| jƒD ]}|d urltj |¡rl|| _ nq[| jd | _|s |  	¡ rt dt |¡dt d¡dd | j¡ ¡ d S t dt |¡dt d	¡¡ d S d S )
Nr   r   éÿÿÿÿZ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ÚretZall_search_dirsÚdÚarg© r0   ú8/usr/lib/python3.10/site-packages/mesonbuild/programs.pyÚ__init__+   sF   

€ÿ€ÿ ùzExternalProgram.__init__Úreturnú T.Union[str, mlog.AnsiDecorator]c                 C  s   |   ¡ s	t d¡S | jS )Nr   )r"   r   r*   r   ©r+   r0   r0   r1   Úsummary_value[   s   
zExternalProgram.summary_valuec                 C  ó   d}|  | jj| j| j¡S ©Nz<{} {!r} -> {!r}>©ÚformatÚ	__class__Ú__name__r   r   ©r+   Úrr0   r0   r1   Ú__repr__`   ó   zExternalProgram.__repr__c                 C  s   d  | j¡S )z)Human friendly description of the commandr   )r)   r   r5   r0   r0   r1   Údescriptiond   s   zExternalProgram.descriptionÚinterpreterúT.Optional['Interpreter']c           
      C  sÌ   | j sc|  ¡ dg }|r$| | dgfddt ¡ dœd¡}|j|j}}nt |¡\}}}|jdkrCt 	|¡}t 
d|›d|j› d¡‚| ¡ }|sM| ¡ }t d|¡}	|	s]t 
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_commandZrun_command_implr   ÚEnvironmentVariablesÚstdoutÚstderrÚ
Popen_safeÚ
returncodeÚ	join_argsÚMesonExceptionÚstripÚreÚsearchÚgroup)
r+   rB   Zraw_cmdÚresÚoÚeÚpZcmd_strÚoutputÚmatchr0   r0   r1   Úget_versionh   s.   þü

zExternalProgram.get_versionrF   ú'Environment'Úfor_machiner   ú'ExternalProgram'c                 C  s&   |  ||¡}|d u rtƒ S |  ||¡S ©N)Úlookup_binary_entryÚNonExistingExternalProgramÚ
from_entry)ÚclsrF   r\   r   r   r0   r0   r1   Úfrom_bin_list€   s   zExternalProgram.from_bin_list)Úmaxsizer   c                 C  s„   dt jvr| S tt jd ƒd d d d }g }|  t j¡D ]}t|ƒ|kr,| |¡ qdtjv r;| t j 	tj¡¡ qt j 
|¡S )NÚUSERPROFILEZAppDataZLocalÚ	MicrosoftZWindowsApps)r$   Úenvironr   ÚsplitÚpathsepÚappendÚsysÚ
executabler   Údirnamer)   )r   Zappstore_dirÚpathsÚeachr0   r0   r1   Ú_windows_sanitize_path‹   s   


€z&ExternalProgram._windows_sanitize_pathúT.Union[str, T.List[str]]c                 C  sl   t |tƒrt|ƒdkr|d }t |tƒstj |¡r)t |tƒr"|g}t| |ddS t |tƒs0J ‚t|ddS )Nr   r   T)r   r   ©r   )Ú
isinstanceÚlistÚlenr$   r   Úisabsr   r   )r   r   r0   r0   r1   ra   £   s   

zExternalProgram.from_entryÚscriptc              
   C  sØ  zÈt | dd}| ¡  ¡ }W d  ƒ n1 sw   Y  | d¡rÇ|dd…  d¡d  ¡ jdd	}t ¡ rq|d  d
¡rI|d  d
¡d |d< t|ƒdkr[|d dkr[|dd… }t|ƒdkrp|d dkrptj|dd…  }nPt 	¡ r—|d dkr|dd… }t|ƒdkr–|d dkr–tj|dd…  }n*|d dkr­|d dkr­tj|dd…  }n|d  d
¡d dkrÁtj|dd…  }|| g W S W n t
yá } zt t|ƒ¡ W Y d}~nd}~ww t 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   rF   Úpython3z/usr/bin/envzUnusable script )ÚopenÚreadlinerP   Ú
startswithrh   r   r   ru   Úpython_commandÚis_haikuÚ	Exceptionr   Údebugr   )rw   ÚfÚ
first_lineÚcommandsrV   r0   r0   r1   r    ²   s@   ÿ
"€€á €ÿzExternalProgram._shebang_to_cmdc                 C  sj   t j |¡d  ¡ dd … }tjtjB tjB }t 	¡ r$|| j
v r"dS dS t  |¡j|@ r3t j |¡ S dS )Nr   r   TF)r$   r   ÚsplitextÚlowerÚstatÚS_IXUSRÚS_IXGRPÚS_IXOTHr   r   Úwindows_extsÚst_modeÚisdir)r+   r   ÚsuffixZexecmaskr0   r0   r1   Ú_is_executableá   s   
þzExternalProgram._is_executableúT.Optional[list]c                 C  s|   |d u rd S t j ||¡}t j |¡r |  |¡r|gS |  |¡S t ¡ r<| jD ]}|› d|› }t j |¡r;|g  S q'd S )NrG   )	r$   r   r)   Úexistsr’   r    r   r   rŽ   )r+   r   r   ÚtrialÚextZ	trial_extr0   r0   r1   Ú_search_dirë   s   



ÿzExternalProgram._search_dirúT.List[T.Optional[str]]c                 C  sÆ   |r$t j |¡d }|dd…  ¡ | jv r|gS |  |¡}|r!|S dgS t j |¡rB| jD ]}|› d|› }t j |¡rA|g  S q-|  t j	 
dd¡¡ d¡}|D ]}|  ||¡}|r_|  S qQd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   NrG   ÚPATHÚ ú;)r$   r   rˆ   r‰   rŽ   r    rv   r”   rp   rg   Úgetrh   r—   )r+   r   r   Zname_extr‡   r–   Zsearch_dirsr   r0   r0   r1   Ú_search_windows_special_casesþ   s*   


ÿÿz-ExternalProgram._search_windows_special_casesc                 C  s~   |   ||¡}|r
|S tj |¡rtj |¡sdgS tj dd¡}t ¡ r+|r+|  	|¡}t
j||d}t ¡ 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   rm   rv   rg   rœ   r   r   rp   ÚshutilÚwhichr   )r+   r   r   r‡   r   r   r0   r0   r1   r!   )  s   
zExternalProgram._searchc                 C  s   | j d d uS )Nr   ©r   r5   r0   r0   r1   r"   ?  ó   zExternalProgram.foundúT.List[str]c                 C  s   | j d d … S r^   r¡   r5   r0   r0   r1   rH   B  r¢   zExternalProgram.get_commandc                 C  ó   | j S r^   rž   r5   r0   r0   r1   Úget_pathE  ó   zExternalProgram.get_pathc                 C  r¤   r^   )r   r5   r0   r0   r1   Úget_nameH  r¦   zExternalProgram.get_name)NFNN)
r   r   r   r   r   r   r   r   r   r   )r3   r4   ©r3   r   r^   )rB   rC   r3   r   )rF   r[   r\   r   r   r   r3   r]   )r   r   r3   r   )r   r   r   rq   r3   r]   )rw   r   r3   r   )r   r   r3   r   )r   r   r   r   r3   r“   )r   r   r   r   r3   r˜   )r   r   r   r   r3   r˜   ©r3   r   )r3   r£   )r3   r   )r<   Ú
__module__Ú__qualname__Ú__doc__rŽ   r   ÚBUILDr\   r2   r6   r?   rA   rZ   Úclassmethodrc   ÚstaticmethodÚ	functoolsÚ	lru_cacherp   ra   r    r’   r—   r   r!   r"   rH   r¥   r§   r0   r0   r0   r1   r   $   s:    þ
0




.



+


r   c                   @  s0   e Zd ZdZdddd„Zdd	d
„Zddd„ZdS )r`   zA program that will never existÚnonexistingprogramr   r   r3   ÚNonec                 C  s   || _ d g| _d | _d S r^   )r   r   r   )r+   r   r0   r0   r1   r2   O  s   
z#NonExistingExternalProgram.__init__c                 C  r7   r8   r9   r=   r0   r0   r1   r?   T  r@   z#NonExistingExternalProgram.__repr__r   c                 C  s   dS )NFr0   r5   r0   r0   r1   r"   X  s   z NonExistingExternalProgram.foundN)r²   )r   r   r3   r³   r¨   r©   )r<   rª   r«   r¬   r2   r?   r"   r0   r0   r0   r1   r`   L  s
    
r`   c                   @  s   e Zd ZdZdS )ÚOverrideProgramzA script overriding a program.N)r<   rª   r«   r¬   r0   r0   r0   r1   r´   \  s    r´   TrF   r[   r\   r   r   r   Údisplay_nameÚdefault_namesr£   Úallow_default_for_crossr   r3   ú*T.Generator['ExternalProgram', None, None]c           
      c  sÆ    t |ƒ}| |¡ |D ]#}|  ||¡}|dur/t |› d|› d|› ¡ t ||¡V   dS qt |› d¡ |sD|tju rD|  	|¡s\|D ]}	t d|› d|	¡ t|	ddV  qFdS t 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 atTrr   z+Default target is not allowed for cross use)
r   Úaddr_   r   r„   r   ra   r   ÚHOSTÚis_cross_build)
rF   r\   r   rµ   r¶   r·   Zpotential_namesZpotential_nameZpotential_cmdZpotential_pathr0   r0   r1   Úfind_external_programa  s&   €
ÿúþr¼   )T)rF   r[   r\   r   r   r   rµ   r   r¶   r£   r·   r   r3   r¸   )Ú
__future__r   r°   r$   rŸ   rŠ   rk   rQ   ÚtypingÚTÚpathlibr   rš   r   r   r   r   ÚTYPE_CHECKINGÚenvironmentr	   rB   r
   ÚHoldableObjectr   r`   r´   r¼   r0   r0   r0   r1   Ú<module>   s.     *þ