
    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y)    )annotationsN)Path   )mesonlib)mlog)MachineChoice
OrderedSet)Environment)Interpreterc                     e Zd ZdZdZej                  Z	 	 	 d	 	 	 	 	 ddZddZ	ddZ
ddZdddZedd	       Ze ej"                  d
      dd              Zedd       Zedd       Zd dZd!dZd"dZd#dZd$dZd%dZd&dZddZy)'ExternalProgramz&A program that is found on the system.)exemsccombatcmdNc           
        || _         d | _        d | _        |vt        j                  |      | _        t        j                         r| j
                  d   }| j
                  dd  }| j                  |      }|r||z   | _        nF|g|z   | _        n:|g}	|r|	|z  }	|	D ]+  }
| j                  ||
      | _        | j                         s+ n | j                         rYt        | j
                        D ]-  }|t        j                  j                  |      s&|| _         n | j
                  d   | _        |s| j                         r\t        j                  dt        j                  |      dt        j                   d      ddj#                  | j
                        z         y t        j                  dt        j                  |      dt        j$                  d	             y y )
Nr   r   Programzfound:YESz(%s) NO)namepathcached_versionr   listifycommand
is_windows_shebang_to_cmd_searchfoundreversedosisfiler   logboldgreenjoinred)selfr   r   silent
search_dirextra_search_dirsr   argsretall_search_dirsdargs               5/usr/lib/python3/dist-packages/mesonbuild/programs.py__init__zExternalProgram.__init__+   s    	%)	/3#++G4DL""$ll1o||AB' **3/#&:DL$'54<DL)lO #44$ #||D!4::<
 ::<  - -?rww~~c': #DI-
 !LL,	 zz|DIIdOXtzz%?P#((4<<"88: DIIdOXtxx~N     c                d    | j                         st        j                  d      S | j                  S )Nr   )r!   r   r)   r   r*   s    r3   summary_valuezExternalProgram.summary_value[   s#    zz|88D>!yyr5   c                |    d}|j                  | j                  j                  | j                  | j                        S Nz<{} {!r} -> {!r}>format	__class____name__r   r   r*   rs     r3   __repr__zExternalProgram.__repr__`   ,    xx//DLLIIr5   c                8    dj                  | j                        S )z)Human friendly description of the commandr   )r(   r   r7   s    r3   descriptionzExternalProgram.descriptiond   s    xx%%r5   c                   | j                   s&| j                         dgz   }|rE|j                  | dgfddt        j                         dd      }|j
                  |j                  }}nct        j                  |      \  }}}|j                  dk7  r;t        j                  |      }t        j                  d|d|j                   d      |j                         }|s|j                         }t        j                  d|      }	|	st        j                  d	|      |	j                  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)
r*   interpreterraw_cmdresoepcmd_stroutputmatchs
             r3   get_versionzExternalProgram.get_versionh   s,   ""&&(K=8G!22D;-3H?C=A;C;X;X;Z4\ 48	9
 zz3::1"--g61a<<1$&009G"11HWKG[\]\h\h[iij2kllWWYFII0&9E--0]^e]h.ijj"'++a.D"""r5   c                b    |j                  ||      }|
t               S | j                  ||      S N)lookup_binary_entryNonExistingExternalProgram
from_entry)clsrH   for_machiner   r   s        r3   from_bin_listzExternalProgram.from_bin_list   s5     ))+t<?-//~~dG,,r5   )maxsizec                   dt         j                  vr| S t        t         j                  d         dz  dz  dz  dz  }g }| j                  t         j                        D ]q  }t        |      |k7  r|j                  |       #dt        j                  v s6|j                  t         j                  j                  t        j                               s t         j                  j                  |      S )NUSERPROFILEAppDataLocal	MicrosoftWindowsApps)r#   environr   splitpathsepappendsys
executabler   dirnamer(   )r   appstore_dirpathseachs       r3   _windows_sanitize_pathz&ExternalProgram._windows_sanitize_path   s     

*K BJJ}56BWL{Z]jjJJrzz* 	>DDz\)T"#..0RWW__S^^<=		>
 zzu%%r5   c                &   t        |t              rt        |      dk(  r|d   }t        |t              st        j                  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   isabsstrr   )r   r   s     r3   re   zExternalProgram.from_entry   sy    gt$7|q !!* gt$g(>'3'")"4FF'3'''wt44r5   c                   	 t        | d      5 }|j                         j                         }ddd       j                  d      rj|dd j	                  d      d   j                         j	                  d	      }t        j                         rv|d   j                  d
      r|d   j	                  d
      d   |d<   t        |      dkD  r|d   dk(  r|dd }t        |      dkD  r|d   dk(  rt
        j                  |dd z   }nt        j                         r:|d   dk(  r|dd }t        |      dkD  rv|d   dk(  rnt
        j                  |dd z   }nW|d   dk(  r|d   dk(  rt
        j                  |dd z   }n0|d   j	                  d
      d   dk(  rt
        j                  |dd z   }|| gz   S 	 t        j                  d|        y# 1 sw Y   xY w# t        $ r(}t        j                  t        |             Y d}~Rd}~ww xY w)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   rH   python3z/usr/bin/envzUnusable script )openreadlinerS   
startswithrq   r   r   r   python_commandis_haiku	Exceptionr   debugr   )scriptf
first_linecommandsr[   s        r3   r   zExternalProgram._shebang_to_cmd   s   $	fw/ 21ZZ\//1
2$$T*
 &ab>//4Q7==?EEqEQ&&(  {--c2&.qk&7&7&<R&@8}q(Xa[E-A#+AB<8}q(Xa[I-E#+#:#:Xab\#I&&(  {n4#+AB<8}q(Xa[I-E#+#:#:Xab\#I  {n4!	9Q#+#:#:Xab\#I!!**3/3y@#+#:#:Xab\#I6(**? +D 	

%fZ01K2 2D  	JJs1v	s.   G GFG GG 	H
"HH
c                   t         j                  j                  |      d   j                         dd  }t        j
                  t        j                  z  t        j                  z  }t        j                         r|| j                  v ryyt        j                  |      j                  |z  r t         j                  j                  |       S y)Nr   r   TF)r#   r   splitextlowerstatS_IXUSRS_IXGRPS_IXOTHr   r   windows_extsst_modeisdir)r*   r   suffixexecmasks       r3   _is_executablezExternalProgram._is_executable   s    !!$'+113AB7<<$,,.= ***  WWT]""X-ww}}T***r5   c                r   |y t         j                  j                  ||      }t         j                  j                  |      r%| j	                  |      r|gS | j                  |      S t        j                         r<| j                  D ]-  }| d| }t         j                  j                  |      s*|gc S  y )NrI   )	r#   r   r(   existsr   r   r   r   r   )r*   r   r,   trialext	trial_exts         r3   _search_dirzExternalProgram._search_dir   s    Z.77>>% ""5)w ''..""$,, +C#('3% 0Iww~~i0 ){*+ r5   c                4   |r\t         j                  j                  |      d   }|dd j                         | j                  v r|gS | j                  |      }|r|S dgS t         j                  j                  |      r<| j                  D ]-  }| d| }t         j                  j                  |      s*|gc S  | j                  t         j                  j                  dd            j                  d      }|D ]  }| j                  ||      }|s|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   NrI   PATH ;)r#   r   r   r   r   r   r   r   rz   rp   getrq   r   )r*   r   r   name_extr   r   search_dirsr,   s           r3   _search_windows_special_casesz-ExternalProgram._search_windows_special_cases   s    
 ww''03H|!!#t'8'88y ++G4H6M 77==(( %!F!C5/77>>'*#9$% 11"**..2LMSSTWX% 	 J''j9H	  vr5   c                   | j                  ||      }|r|S t        j                  j                  |      r"t        j                  j	                  |      sdgS t        j
                  j                  dd      }t        j                         r|r| j                  |      }t        j                  ||      }t        j                         r| j                  ||      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   rv   r   rp   r   r   r   rz   shutilwhichr   )r*   r   r,   r   r   r   s         r3   r    zExternalProgram._search)  s    
 ##D*5O77??4 t)<6Mzz~~fd+ T..t4D,,t$/ 55dGDD yr5   c                $    | j                   d   d uS )Nr   r   r7   s    r3   r!   zExternalProgram.found?  s    ||Ad**r5   c                     | j                   d d  S rb   r   r7   s    r3   rJ   zExternalProgram.get_commandB  s    ||Ar5   c                    | j                   S rb   r   r7   s    r3   get_pathzExternalProgram.get_pathE      yyr5   c                    | j                   S rb   )r   r7   s    r3   get_namezExternalProgram.get_nameH  r   r5   )NFNN)
r   r   r   T.Optional[T.List[str]]r+   boolr,   T.Optional[str]r-   r   )returnz T.Union[str, mlog.AnsiDecorator]r   r   rb   )rW   zT.Optional['Interpreter']r   r   )rH   'Environment'rg   r   r   r   r   'ExternalProgram')r   r   r   r   )r   r   r   zT.Union[str, T.List[str]]r   r   )r   r   r   r   )r   r   r   r   )r   r   r,   r   r   zT.Optional[list])r   r   r   r   r   T.List[T.Optional[str]])r   r   r,   r   r   r   r   r   )r   T.List[str])r   r   )r>   
__module____qualname____doc__r   r   BUILDrg   r4   r8   rA   rD   r`   classmethodrh   staticmethod	functools	lru_cacherz   re   r   r   r   r   r    r!   rJ   r   r    r5   r3   r   r   $   s    06L%%KEIEI>B.O.O3B.O$;.O`
J&#0 - - Y&& ' &, 5 5 , ,\&)V,+r5   r   c                  *    e Zd ZdZdddZddZd	dZy)
rd   zA program that will never existc                0    || _         d g| _        d | _        y rb   )r   r   r   )r*   r   s     r3   r4   z#NonExistingExternalProgram.__init__O  s    	v	r5   c                |    d}|j                  | j                  j                  | j                  | j                        S r:   r;   r?   s     r3   rA   z#NonExistingExternalProgram.__repr__T  rB   r5   c                     y)NFr   r7   s    r3   r!   z NonExistingExternalProgram.foundX  s    r5   N)nonexistingprogram)r   r   r   Noner   r   )r>   r   r   r   r4   rA   r!   r   r5   r3   rd   rd   L  s    %
Jr5   rd   c                      e Zd ZdZy)OverrideProgramzA script overriding a program.N)r>   r   r   r   r   r5   r3   r   r   \  s    (r5   r   c              #    K   t        |      }|j                  |       |D ]M  }| j                  ||      }|t        j                  | d| d|        t
        j                  ||        y t        j                  | d       |s#|t        j                  u r| j                  |      s1|D ]+  }	t        j                  d| d|	       t        |	d       - yt        j                  d	       yw)
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	   addrc   r   r   r   re   r   HOSTis_cross_build)
rH   rg   r   display_namedefault_namesallow_default_for_crosspotential_namespotential_namepotential_cmdpotential_paths
             r3   find_external_programr   a  s      !/O) //^L$JJ,|K= A((58 9!,,^]KK  	JJ,_`a {m6H6H'HSM_M_`kMl+ 	?NJJ*<.E~V!.>>	? 	

@As   6C5B<C5)T)rH   r   rg   r   r   r   r   r   r   r   r   r   r   z*T.Generator['ExternalProgram', None, None])
__future__r   r   r#   r   r   rt   rT   typingTpathlibr   r   r   r   r   r	   TYPE_CHECKINGenvironmentr
   rW   r   HoldableObjectr   rd   r   r   r   r5   r3   <module>r      s    # C  	   
 	     /??((eh-- eP	  )o ) ;?B(+B<GB37BCmBr5   