o
    uJAf                     @  s*  U d dl mZ 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
Z
d dlZd dlZddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZ ddlmZmZ dd	l m!Z! zd d
l"m#Z$ W n e%yz   dZ$Y nw ej&rddlm'Z'm(Z(m)Z)m*Z* ddlm+Z+m,Z,m-Z- zd dlm.Z. W n e/y   d dl0m.Z. Y nw G dd de.Z1dZ2g Z3de4d< dQddZ5G dd dZ6dRddZ7dSdTd$d%Z8dUd)d*Z9			+dVdWd1d2Z:		+dXdYd5d6Z;dZd9d:Z<d[d=d>Z=d\d?d@Z>d]dCdDZ?d^dEdFZ@G dGdH dHZAd_dKdLZBd`dOdPZCdS )a    )annotations)globN   )buildenvironment)InstallData)	MesonException
Popen_safeRealPathAction
is_windowsis_aixsetup_vsenvpickle_loadis_osx	OptionKey)depfixerdestdir_join)run_exe)__file__)InstallDataBaseInstallEmptyDirInstallSymlinkDataTargetInstallData)FileModeEnvironOrDictExecutableSerialisation)Protocolc                   @  sb   e Zd ZU dZded< ded< ded< ded< ded< ded	< ded
< ded< ded< ded< dS )ArgumentTypez7Typing information for the object returned by argparse.bool
no_rebuildonly_changedprofilequietstrwddestdirdry_runskip_subprojectstagsstripN)__name__
__module____qualname____doc____annotations__ r/   r/   8/usr/lib/python3.10/site-packages/mesonbuild/minstall.pyr   5   s   
 r   a  Warning: trying to copy a symlink that points to a file. This currently copies
the file by default, but will be changed in a future version of Meson to copy
the link instead.  Set follow_symlinks to true to preserve current behavior, or
false to copy the link.T.List[str]selinux_updatesparserargparse.ArgumentParserreturnNonec                 C  s   | j ddtdd | j dddtjd | j d	d
ddd | j dd
ddd | j dd
ddd | j dd dd | j ddddd | j dddddd | j dd dd | j d dd!d d S )"N-Cr$   z#directory to cd into before running)destactionhelpz--profile-self
store_truer!   )r9   r8   r:   --no-rebuildFz!Do not rebuild before installing.)defaultr9   r:   z--only-changedz9Only overwrite files that are older than the copied file.z--quietz+Do not print every file that was installed.z	--destdirz5Sets or overrides DESTDIR environment. (Since 0.57.0))r=   r:   z	--dry-runz-nz8Doesn't actually install, but print logs. (Since 0.57.0))r9   r:   z--skip-subprojects?* z;Do not install files from given subprojects. (Since 0.58.0))nargsconstr=   r:   z--tagszAInstall only targets having one of the given tags. (Since 0.60.0)z--stripzOStrip targets even if strip option was not set during configure. (Since 0.62.0))add_argumentr
   argparseSUPPRESS)r3   r/   r/   r0   add_argumentsM   s<   






rF   c                   @  s6   e Zd ZdddZddddZdddZdddZdS ) DirMakerlfT.TextIOmakedirsT.Callable[..., None]c                 C  s   || _ g | _t | _|| _d S N)rH   dirssetall_dirsmakedirs_impl)selfrH   rJ   r/   r/   r0   __init__d   s   
zDirMaker.__init__Fpathr#   exist_okr   r5   r6   c                 C  s   t j|}| j| g }|t j|kr5|| jv rnt j|s'|| t j|}|t j|ks| j	||d |
  |  j|7  _d S )NrT   )osrS   normpathrO   adddirnamerM   existsappendrP   reverse)rQ   rS   rT   rY   rM   r/   r/   r0   rJ   j   s   

zDirMaker.makedirs
'DirMaker'c                 C  s   | S rL   r/   )rQ   r/   r/   r0   	__enter__   s   zDirMaker.__enter__exception_typeT.Type[Exception]valueT.Any	tracebackc                 C  s&   | j   | j D ]}t| j| qd S rL   )rM   r\   append_to_logrH   )rQ   r_   ra   rc   dr/   r/   r0   __exit__   s   

zDirMaker.__exit__N)rH   rI   rJ   rK   F)rS   r#   rT   r   r5   r6   )r5   r]   )r_   r`   ra   rb   rc   rb   r5   r6   )r*   r+   r,   rR   rJ   r^   rf   r/   r/   r/   r0   rG   c   s
    

rG   fnamer#   r   c                 C  s   t | dtS )Nr   )r   r   )rh   r/   r/   r0   load_install_data   s   ri   FrS   follow_symlinksr   c                 C  s   t tj| |djd@ S )zCChecks whether any of the "x" bits are set in the source file mode.rj   I   )r   rV   statst_mode)rS   rj   r/   r/   r0   is_executable   s   ro   rH   rI   linec                 C  s*   |  | |ds|  d |   d S )N
)writeendswithflush)rH   rp   r/   r/   r0   rd      s   


rd   TuserT.Union[str, int, None]groupdir_fdT.Optional[int]c                   sF   t j ||dd fdd}z|t _t| || W  t _d S  t _w )Nrx   rj   rS   BT.Union[int, str, 'os.PathLike[str]', bytes, 'os.PathLike[bytes]']uidintgidrx   ry   rj   r   r5   r6   c                  s    | ||||d dS )zOverride the default behavior of os.chown

        Use a real function rather than a lambda to help mypy out. Also real
        functions are faster.
        rz   Nr/   )rS   r|   r~   rx   rj   Zreal_os_chownr/   r0   chown   s   zset_chown.<locals>.chown)rS   r{   r|   r}   r~   r}   rx   ry   rj   r   r5   r6   )rV   r   shutil)rS   ru   rw   rx   rj   r   r/   r   r0   	set_chown   s   	
r   moder}   c              
   C  sV   zt j| |||d W d S  tttfy*   t j| s't j| ||d Y d S Y d S w )Nrz   )rx   )rV   chmodNotImplementedErrorOSErrorSystemErrorrS   islink)rS   r   rx   rj   r/   r/   r0   	set_chmod   s   r   umaskT.Union[str, int]c              
   C  s   |dkrd S t |tsJ dt| ddrdnd}|| M }z
t| |dd W d S  tyI } zt| d|d|j d	 W Y d }~d S d }~ww )
Npreservez.umask should only be "preserver" or an integerFrk   i  i  : Unable to set permissions : , ignoring...)
isinstancer}   ro   r   PermissionErrorprintstrerror)rS   r   Z	new_permser/   r/   r0   sanitize_permissions   s   
*r   T.Optional['FileMode']default_umaskc                 C  s  |d u st dd |j|j|jfD rt| | d S t s|jd us'|jd urzt| |j|jdd W nd tyX } zt| d|jd|jd|j	 d W Y d }~nDd }~w t
yo   t| d	|jd
|jd Y n) ty } z|jtjkrt| d|jd
|jd n W Y d }~nd }~ww |jd urzt| |jdd W d S  ty } zt| d|jd|j	 d W Y d }~d S d }~ww t| | d S )Nc                 s  s    | ]}|d u V  qd S rL   r/   ).0mr/   r/   r0   	<genexpr>   s    zset_mode.<locals>.<genexpr>Frk   z: Unable to set owner z and group r   r   z: Nonexistent owner z
 or group z: ignoring...z: Nonexistent numeric owner r   )allperms_sownerrw   r   r   r   r   r   r   LookupErrorr   errnoEINVALr   perms)rS   r   r   r   r/   r/   r0   set_mode   s4   &
2" 
,r   c                  C  s   zt dg W n ttttt jfy   Y dS w tds dS t	s$dS t
g dddd t	D d \} }}| jdkrItd	d
|d|dd dS dS )z|
    Restores the SELinux context for files in @selinux_updates

    If $DESTDIR is set, do not warn if the call fails.
    ZselinuxenabledN
restorecon)r   z-Fz-f-z-0 c                 s  s    | ]}|V  qd S rL   r/   )r   fr/   r/   r0   r      s    z+restore_selinux_contexts.<locals>.<genexpr>r   z7Failed to restore SELinux context of installed files...zStandard output:zStandard error:rq   )sep)
subprocess
check_callFileNotFoundErrorNotADirectoryErrorr   r   CalledProcessErrorr   whichr2   r	   join
returncoder   )procouterrr/   r/   r0   restore_selinux_contexts   s    
(

r   r%   
fullprefixc                 C  s,   t j|rt| |}|S t j||}|S rL   )rV   rS   isabsr   r   )r%   r   rS   outputr/   r/   r0   get_destdir_path  s
   
r   c                 C  s   |  ds
|  dr=t| jdkr;tj| \}}t|d | }t|dkr1td t	
d t|dkr;|d S | S |  dsG|  drxt| jdkrxtj| \}}t|d d	 }t|dkrntd
 t	
d t|dkrx|d S | S )zSome languages e.g. Rust have output files
    whose names are not known at configure time.
    Check if this is the case and return the real
    file instead..soz.dllr   z-*r   z8Stale dynamic library files in build dir. Can't install..az.libz.rlibz7Stale static library files in build dir. Can't install.)rs   rV   rm   st_sizerS   splitextr   lenr   sysexit)rh   basesuffixfilesr/   r/   r0   check_for_stampfile  s(   


r   c                   @  sX  e Zd ZdqddZdrddZdrddZdrddZdrddZdrddZdrddZ	drddZ
drddZdrddZdrddZdrd d!Zdrd"d#Zdsd&d'Zdtd)d*Zdudvd1d2Zdwd6d7Zdxd9d:Zdyd=d>Z	+	+dzd{dCdDZd|dIdJZ	+dud}dUdVZd~dXdYZdd^d_ZddadbZddcddZddedfZddgdhZddidjZddkdlZ ddmdnZ!ddodpZ"d+S )	Installeroptions'ArgumentType'rH   rI   c                 C  sj   d| _ d| _|| _|| _d| _|j| _dd |jdD | _|jr0dd |jdD | _d S d | _d S )NFr   c                 S     g | ]}|  qS r/   r)   r   ir/   r/   r0   
<listcomp>2      z&Installer.__init__.<locals>.<listcomp>,c                 S  r   r/   r   r   r/   r/   r0   r   3  r   )	did_install_somethingprinted_symlink_errorr   rH   preserved_file_countr&   r'   splitr(   )rQ   r   rH   r/   r/   r0   rR   (  s   ,zInstaller.__init__argsrb   kwargsr5   r6   c                 O     | j stj|i | d S d S rL   )r&   rV   removerQ   r   r   r/   r/   r0   r   5     zInstaller.removec                 O  r   rL   )r&   rV   symlinkr   r/   r/   r0   r   9  r   zInstaller.symlinkc                 O  r   rL   )r&   rV   rJ   r   r/   r/   r0   rJ   =  r   zInstaller.makedirsc                 O  r   rL   )r&   r   copyr   r/   r/   r0   r   A  r   zInstaller.copyc                 O  r   rL   )r&   r   copy2r   r/   r/   r0   r   E  r   zInstaller.copy2c                 O  r   rL   )r&   r   copyfiler   r/   r/   r0   r   I  r   zInstaller.copyfilec                 O  r   rL   )r&   r   copystatr   r/   r/   r0   r   M  r   zInstaller.copystatc                 O  r   rL   )r&   r   	fix_rpathr   r/   r/   r0   r   Q  r   zInstaller.fix_rpathc                 O     | j st|i | d S d S rL   )r&   r   r   r/   r/   r0   r   U     zInstaller.set_chownc                 O  r   rL   )r&   r   r   r/   r/   r0   r   Y  r   zInstaller.set_chmodc                 O  r   rL   )r&   r   r   r/   r/   r0   r   ]  r   zInstaller.sanitize_permissionsc                 O  r   rL   )r&   r   r   r/   r/   r0   r   a  r   zInstaller.set_moder%   r#   c                 C  s   | j s
|st  d S d S d S rL   )r&   r   )rQ   r%   r/   r/   r0   r   e  s   

z"Installer.restore_selinux_contextsT.Tuple[int, str, str]c                 O  s*   | j st|i |\}}}|j||fS dS )N)r   r@   r@   )r&   r	   r   )rQ   r   r   por   r/   r/   r0   r	   i  s   zInstaller.Popen_safeNexer   	extra_envT.Optional[T.Dict[str, str]]r}   c                 C  s   | j r|j rt||S dS )Nr   )r&   r   )rQ   r   r   r/   r/   r0   r   o  s   
zInstaller.run_exere   iT.Union[TargetInstallData, InstallEmptyDir, InstallDataBase, InstallSymlinkData, ExecutableSerialisation]r   c                 C  s:   |j r|j | jv sd| jv rdS | jr|j| jvrdS dS )Nr?   FT)
subprojectr'   r(   tag)rQ   re   r/   r/   r0   should_installt  s
   zInstaller.should_installmsgc                 C  s   | j js
t| d S d S rL   )r   r"   r   )rQ   r   r/   r/   r0   log}  s   zInstaller.log	from_fileto_filec                 C  sH   | j jsdS tj|rtj|sdS t|j}t|j}||kS )NF)r   r    rV   rS   r   isfilerm   st_mtime)rQ   r   r   Z	from_timeZto_timer/   r/   r0   should_preserve_existing_file  s   z'Installer.should_preserve_existing_filerJ   T.Optional[T.Tuple[T.Any, str]]rj   T.Optional[bool]c                 C  sX  t j|d }t j|st j|std|t j|rYt j|s/td|d| ||rHt| j	d| d |  j
d7  _
dS | d	| d
|  | | n| d	| d
|  |rq|\}}|j|dd t j|rt j|s| j||dd n|d u rd}tt | j|||d n| || t| t| j	| dS )Nr   z.Tried to install something that isn't a file: Destination z! already exists and is not a filez# Preserving old file rq   r   FzInstalling  to TrU   rk   )rV   rS   r   r   r   r   rZ   r   rd   rH   r   r   r   rJ   r   r   symlink_warningr   r2   r[   )rQ   r   r   rJ   rj   outdirZdirmakerr/   r/   r0   do_copyfile  s6   
zInstaller.do_copyfiletargetlinkfull_dst_dirallow_missingc              	   C  s   |}t j|st j||}nt j|s|st||}t j|s,|s,td| t j|rEt j|s@td|d| | | j	sS| 
d| d|  z| j||t j|d W n ttfyw   | j	sttd d| _	Y d	S w t| j| dS )
Nz)Tried to install symlink to missing file r   z$ already exists and is not a symlinkzInstalling symlink pointing to r   )target_is_directoryzISymlink creation does not work on this platform. Skipping all symlinking.TF)rV   rS   r   r   rZ   r   r   r   r   r   r   r   isdirr   r   r   rd   rH   )rQ   r   r   r%   r   r   Z
abs_targetr/   r/   r0   
do_symlink  s.   

zInstaller.do_symlinkdatar   src_dirdst_direxclude+T.Optional[T.Tuple[T.Set[str], T.Set[str]]]install_mode
'FileMode'dmrG   c                 C  s  t j|std| t j|std| |dur1|\}}	dd |D }dd |	D }	nt  }}	t |D ]\}
}}t j|
sHJ |dd D ]N}t j|
|}t jj||d}t j||}||	v rp|| qNt j	|rwqNt j
|rtd| d	 td
 || | || | ||j qN|D ][}t j|
|}t jj||d}||v rqt j||}t j	|rtd| d td
 t j|}t j	|s|| | t j|| | j|||d | |||j qq;dS )a  
        Copies the contents of directory @src_dir into @dst_dir.

        For directory
            /foo/
              bar/
                excluded
                foobar
              file
        do_copydir(..., '/foo', '/dst/dir', {'bar/excluded'}) creates
            /dst/
              dir/
                bar/
                  foobar
                file

        Args:
            src_dir: str, absolute path to the source directory
            dst_dir: str, absolute path to the destination directory
            exclude: (set(str), set(str)), tuple of (exclude_files, exclude_dirs),
                     each element of the set is a path relative to src_dir.
        zsrc_dir must be absolute, got zdst_dir must be absolute, got Nc                 S     h | ]}t j|qS r/   rV   rS   rW   r   xr/   r/   r0   	<setcomp>      z'Installer.do_copydir.<locals>.<setcomp>c                 S  r  r/   r  r  r/   r/   r0   r	    r
  )startzTried to copy directory ( but a file of that name already exists.r   zTried to copy file z- but a directory of that name already exists.rk   )rV   rS   r   
ValueErrorrN   walkr   relpathr   r   rZ   r   r   r   rJ   r   r   install_umaskrY   r   r   )rQ   r   r   r   r   r  r  rj   exclude_filesexclude_dirsrootrM   r   re   Zabs_srcZfilepartZabs_dstr   Z
parent_dirr/   r/   r0   
do_copydir  sV   





zInstaller.do_copydirdatafilenamec              	   C  s,  t |}| jj}|d u rtjd}|r"tj|s"tj|j	|}|d ur+|tjd< |p.d}t
||j}|jdkrHt|jtsBJ t|j d| _zt| j| j}| |||| | |||| | |||| | |||| | |||| | |||| | |||| | | | ||| | js| d | jjs| jdkr| d | jtj!| jj" W d    W d S W d    W d S W d    W d S 1 sw   Y  W d S  t#y   t$ s|dkst%t&j'( rt%t&j)( s tjdpt*+d	pt*+d
}t*+d}|d u r'|d ur'dtjvr'|}|d urt,d t-. }|/t&j0t-j1 d }	t2dD ])}
t,d| dddd |3dr^t&j04 5d}	nt,   n|	dv rj nqB|	d urut6d|	dkrtj7||t&j8t9gt&j:dd  dt; dR    w )NDESTDIRr@   r   FzNothing to install.r   z6Preserved {} unchanged files, see {} for the full listZMESON_ROOT_CMDZsudoZdoaspkexecZ
PKEXEC_UIDz4Installation failed due to insufficient permissions.   zAttempt to use z$ to gain elevated privileges? [y/n] T)endrt      rq   >   nyzAnswer not one of [y/n]r  r   r7   r<   )<ri   r   r%   rV   environgetrS   r   r   	build_dirr   prefixr  r   r}   r   r   rG   rH   rJ   install_subdirsinstall_targetsinstall_headersinstall_maninstall_emptydirinstall_datainstall_symlinksr   run_install_scriptr   r"   r   formatrW   namer   r   isattyr   stdoutfilenostderrr   r   r   	selectorsDefaultSelectorregisterstdin
EVENT_READrangeselectreadlinerstripr   execlp
executable	main_fileargvgetcwd)rQ   r  re   r%   r   r  Zrootcmdr  sZansZattemptr/   r/   r0   
do_install  s   



&.$
 



zInstaller.do_install	strip_binr1   rh   outnamec                 C  s   |  d|d t r| |dd|g \}}}n| ||g \}}}|dkrDtd td| d td	| d td
 d S d S )NzStripping target .z-Sz-xr   zCould not strip file.
zStdout:
rq   zStderr:
r   )r   r   r	   r   r   r   )rQ   r?  rh   r@  r   stdostder/   r/   r0   do_stripV  s   zInstaller.do_stripr   c              
   C  sv   |j D ]5}| |sqd| _t|||j}| d|j d|  |j|dd | j||j||j	|j
||jd qd S )NTzInstalling subdir r   rU   rk   )r!  r   r   r   install_pathr   rS   rJ   r  r   r  rj   )rQ   re   r  r%   r   r   r   r/   r/   r0   r!  e  s   

zInstaller.install_subdirsc           	      C  sl   |j D ]0}| |sq|j}t|||j}tj|}| j||||f|jdr*d| _	| 
||j|j qd S N)rJ   rj   T)r   r   rS   r   rE  rV   rY   r   rj   r   r   r  r  )	rQ   re   r  r%   r   r   fullfilenameoutfilenamer   r/   r/   r0   r&  p  s   

zInstaller.install_datac                 C  sb   |j D ]+}| |sqt|||j}t|||j}|j|dd | |j||||jr.d| _	qd S )NTrU   )
symlinksr   r   rE  r*  rJ   r   r   r   r   )rQ   re   r  r%   r   r=  r   Zfull_link_namer/   r/   r0   r'  {  s   

zInstaller.install_symlinksc           	      C  sh   |j D ].}| |sq|j}t|||j}tj|}| j||||fdr(d| _| 	||j
|j qd S )NrJ   T)manr   rS   r   rE  rV   rY   r   r   r   r  r  )	rQ   re   r  r%   r   r   Zfull_source_filenamerH  r   r/   r/   r0   r$    s   

zInstaller.install_manc                 C  s   |j D ]=}| |sqd| _t|||j}| d|  tj|r0td| d t	
d |j|dd | ||j|j qd S )NTzInstalling new directory zTried to create directory r  r   rU   )emptydirr   r   r   rS   r   rV   r   r   r   r   rJ   r   r  r  )rQ   re   r  r%   r   r   r   r/   r/   r0   r%    s   


zInstaller.install_emptydirc           
      C  sz   |j D ]7}| |sq|j}tj|}t|||j}tj||}	| j||	||f|j	dr1d| _
| |	|j|j qd S rF  )headersr   rS   rV   basenamer   rE  r   r   rj   r   r   r  r  )
rQ   re   r  r%   r   trG  rh   r   rH  r/   r/   r0   r#    s   

zInstaller.install_headersc           
   	     s^   j  jddd  jD d}| jjrd|d< | jr d|d<  jD ]}| |s+q#|j	d ur4|j	}nd j
i}| }| fd	d
| D  |fdd
| D  d|j}|jrnrn| d| q#d| _| d| z| ||}	W n ty   td| d td Y nw |	dkrtd| d|	 d t|	 q#d S )N c                 S  s   g | ]}t |qS r/   )shlexquoter  r/   r/   r0   r     s    z0Installer.run_install_script.<locals>.<listcomp>)MESON_SOURCE_ROOTMESON_BUILD_ROOTMESONINTROSPECT1ZMESON_INSTALL_QUIETZMESON_INSTALL_DRY_RUNr   c                   s*   i | ]\}}d |   tj j|qS )ZMESON_INSTALL_)upperrV   rS   r   r   r   kv)re   r/   r0   
<dictcomp>  s   * z0Installer.run_install_script.<locals>.<dictcomp>c                   s&   i | ]\}}d |   t |qS )ZMESON_INSTALL_DESTDIR_)rW  r   rX  )r%   r   r/   r0   r[    s   & z6Skipping custom install script because DESTDIR is set TzRunning custom install script zFAILED: install script 'z' could not be run, stopped   r   z' exit code z	, stopped)
source_dirr  r   mesonintrospectr   r"   r&   install_scriptsr   installdir_mapr   r   updateitemscmd_argsskip_if_destdirr   r   r   r   r   r   r   )
rQ   re   r%   r   envr   ZmappZlocalenvr*  rcr/   )re   r%   r   r0   r(    sD   





zInstaller.run_install_scriptc                 C  s  |j D ]V}t r"tj|js"d|jv r"tdd|jdd|_| 	|s(qtj|jsF|j
r=| d|jd qtd|jdd}t|j}t|||j}tj|tj|}	tj|j|jtj|}
|jpv|jov| jj}|j}|j}|j}tj|std|dtj|r| j||	||fd}|r|jd ur|d	r| d
tj| q| |j||	 |drtj|d d }tj|rtj|	d d }| ||}n6tj |rtj|j!|"d}tj|tj|}	|j#|dd | $|||	d || nt%d||rZd| _&z| j'|	|j(||
|dd W n" t)yQ } zt*|j+t,rF|j+dkrFn W Y d }~nd }~ww | -|	||j. qd S )Nr   z$[.][a]([.]?([0-9]+))*([.]?([a-z]+))*r   zFile z not found, skippingz could not be foundFrJ  z.jarzNot stripping jar target: {}z.jsr   z.wasm/TrU   zUnknown file type for )verbose)/targetsr   rV   rS   rZ   rh   resubreplacer   optionalr   r   r   r   r   r   rN  r   r)   	can_stripr   install_rpathinstall_name_mappingsr  r   r   r?  rs   r)  rD  r   r   r  r7  rJ   r  RuntimeErrorr   r   rpath_dirs_to_remove
SystemExitr   coder}   r   r  )rQ   re   r  r%   r   rO  Zfile_copiedrh   r   r@  Z
final_pathshould_stripro  rp  r  Zwasm_sourceZwasm_outputr   r/   r/   r0   r"    sr   




zInstaller.install_targets)r   r   rH   rI   )r   rb   r   rb   r5   r6   )r%   r#   r5   r6   )r   rb   r   rb   r5   r   rL   )r   r   r   r   r5   r}   )re   r   r5   r   )r   r#   r5   r6   )r   r#   r   r#   r5   r   NN)
r   r#   r   r#   rJ   r   rj   r   r5   r   )r   r#   r   r#   r%   r#   r   r#   r   r   r5   r   )r   r   r   r#   r   r#   r   r  r  r  r  rG   rj   r   r5   r6   )r  r#   r5   r6   )r?  r1   rh   r#   r@  r#   r5   r6   )
re   r   r  rG   r%   r#   r   r#   r5   r6   )re   r   r%   r#   r   r#   r5   r6   )#r*   r+   r,   rR   r   r   rJ   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r  r>  rD  r!  r&  r'  r$  r%  r#  r(  r"  r/   r/   r/   r0   r   &  sH    
















	

(
F
D







&r   r$   backendc                   s   |dkrdS |dkrt d dS t }|st d dS d fd	d
}| \}}tj|d g ||dj}|dkrBt d   dS dS )NnoneTninjazKOnly ninja backend is supported to rebuild the project before installation.z%Can't find ninja, can't rebuild test.Fr5   DT.Tuple[T.Optional[EnvironOrDict], T.Optional[T.Callable[[], None]]]c                    s&  t  st dkrdd l} tj }tjdd ur@|d|dd|dd z
| t	j
}W n5 ty?   Y dS w tjdd uri|dz| }W n
 ty^   Y dS w |j|j |j
}ndS ttjdjt	kr|dS |d< ||d	< d fdd}||fS dS )Nr   Z	SUDO_USERZSUDO_UIDZSUDO_GIDrv  Z	DOAS_USERzbuild.ninjaZUSERHOMEr5   r6   c                     sD   t dd  d urtt  d ur tt d S d S )NzDropping privileges to z before running ninja...)r   rV   setgidr}   setuidr/   Zorig_gidZorig_uidZ	orig_userr/   r0   wrapped>  s   z5rebuild_all.<locals>.drop_privileges.<locals>.wrappedr5   r6   )r   rV   geteuidpwdr  r   r  popgetpwuidr}   pw_dirKeyErrorgetpwnampw_uidpw_gidrm   rS   r   st_uid)r  re  homedirZpwdatar  r$   r~  r0   drop_privileges  s<   


z$rebuild_all.<locals>.drop_privilegesr7   )re  
preexec_fnr   zCould not rebuild )r5   rz  )r   r   detect_ninjar   runr   )r$   rw  ry  r  re  r  retr/   r  r0   rebuild_all  s    
-r  optsr   c                 C  sZ  d}t j|}t j|d}t jt j| j|s td | jsRt	
| j}td|jjtd}t| td|jjtd}t| j|sRtd t | j tt j|d	d
dd?}t| |}t|d t|d | jrdd l}	t j|d}
|	jdt t |
d n|| W d    dS W d    dS 1 sw   Y  dS )Nzmeson-private/install.datz../meson-logszAInstall data not found. Run this command in build directory root.r   vsenvr#   rw  zinstall-log.txtwzutf-8)encodingz"# List of files installed by Mesonz5# Does not contain files installed by custom scripts.r   zprofile-installer.logz"installer.do_install(datafilename))filename)rV   rS   rY   r   rZ   r$   r   r   r   r   loadTcastr   coredata
get_optionr   r   r  chdiropenr   rd   r!   cProfilerunctxglobalslocalsr>  )r  r  private_dirlog_dirb
need_vsenvrw  rH   Z	installerr!   rh   r/   r/   r0   r  R  s:   









r  )r3   r4   r5   r6   )rh   r#   r5   r   rg   )rS   r#   rj   r   r5   r   )rH   rI   rp   r#   r5   r6   )NNNT)rS   r#   ru   rv   rw   rv   rx   ry   rj   r   r5   r6   )NT)
rS   r#   r   r}   rx   ry   rj   r   r5   r6   )rS   r#   r   r   r5   r6   )rS   r#   r   r   r   r   r5   r6   r  )r%   r#   r   r#   rS   r#   r5   r#   )rh   r#   r5   r#   )r$   r#   rw  r#   r5   r   )r  r   r5   r}   )D
__future__r   r   rD   r   rV   r/  rQ  r   r   r   typingr  rj  r@   r   r   Zbackend.backendsr   mesonlibr   r	   r
   r   r   r   r   r   r   scriptsr   r   scripts.meson_exer   __main__r   r:  ImportErrorTYPE_CHECKINGr   r   r   r   r   r   r   r   AttributeErrorZtyping_extensionsr   r   r2   r.   rF   rG   ri   ro   rd   r   r   r   r   r   r   r   r   r  r  r/   r/   r/   r0   <module>   sp   ,

&

	



   
lC