
    e                    J   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! 	 d d
l"m#Z$ ejL                  r(ddlm'Z'm(Z(m)Z)m*Z* ddlm+Z+m,Z,m-Z- 	 d dlm.Z.  G d de.      Z1dZ2g Z3de4d<   d$dZ5 G d d      Z6d%dZ7d&d'dZ8d(dZ9	 	 	 d)	 	 	 	 	 	 	 d*dZ:	 	 d+	 	 	 d,dZ;d-dZ<d.dZ=d/dZ>d0dZ?d1dZ@ G d  d!      ZAd2d"ZBd3d#ZCy# e%$ r dZ$Y w xY w# e/$ r	 d dl0m.Z. Y w xY w)4    )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                  v    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<   y)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__     5/usr/lib/python3/dist-packages/mesonbuild/minstall.pyr   r   5   s:    E	r2   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_updatesc                   | j                  ddt        d       | j                  dddt        j                         | j                  d	d
dd       | j                  dd
dd       | j                  dd
dd       | j                  dd d       | j                  dddd       | j                  ddddd       | j                  dd d       | j                  d dd!       y )"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)parsers    r3   add_argumentsrG   M   s(   
4B  D
(I%..  0
l@  B
(%X  Z
	5J  L
TT  V
T,X  Z
,CsBZ  \
$`  b
	,n  pr2   c                  .    e Zd ZddZdddZd	dZd
dZy)DirMakerc                L    || _         g | _        t               | _        || _        y N)lfdirssetall_dirsmakedirs_impl)selfrL   makedirss      r3   __init__zDirMaker.__init__d   s!    !#	$'E%r2   c                2   t         j                  j                  |      }| j                  j	                  |       g }|t         j                  j                  |      k7  r|| j                  v rnrt         j                  j                  |      s|j                  |       t         j                  j                  |      }|t         j                  j                  |      k7  r| j                  ||       |j                          | xj                  |z  c_        y )Nexist_ok)ospathnormpathrO   adddirnamerM   existsappendrP   reverse)rQ   rX   rV   r[   rM   s        r3   rR   zDirMaker.makedirsj   s    ''""4('"11$))# 77>>'*G$ggoog.G 11 	4(3 			T	r2   c                    | S rK   r1   )rQ   s    r3   	__enter__zDirMaker.__enter__   s    r2   c                    | j                   j                          | j                   D ]  }t        | j                  |        y rK   )rM   r^   append_to_logrL   )rQ   exception_typevalue	tracebackds        r3   __exit__zDirMaker.__exit__   s3    		 	&A$''1%	&r2   N)rL   T.TextIOrR   zT.Callable[..., None]F)rX   r%   rV   r    returnNone)rj   z
'DirMaker')rc   zT.Type[Exception]rd   T.Anyre   rl   rj   rk   )r,   r-   r.   rS   rR   r`   rg   r1   r2   r3   rI   rI   c   s    &,&r2   rI   c                $    t        | dt              S )Nr   )r   r   )fnames    r3   load_install_dataro      s    um[99r2   c                \    t        t        j                  | |      j                  dz        S )zCChecks whether any of the "x" bits are set in the source file mode.follow_symlinksI   )r    rW   statst_mode)rX   rr   s     r3   is_executablerv      s#    o>FFNOOr2   c                    | j                  |       |j                  d      s| j                  d       | j                          y )N
)writeendswithflush)rL   lines     r3   rb   rb      s-    HHTN==
HHJr2   c                    t         j                  ||d	 	 	 	 	 	 	 	 	 dfd}	 |t         _        t        j                  | ||       t         _        y # t         _        w xY w)Ndir_fdrr   c                     | ||||       y)zOverride the default behavior of os.chown

        Use a real function rather than a lambda to help mypy out. Also real
        functions are faster.
        r~   Nr1   )rX   uidgidr   rr   real_os_chowns        r3   chownzset_chown.<locals>.chown   s     	dCV_Ur2   )rX   zBT.Union[int, str, 'os.PathLike[str]', bytes, 'os.PathLike[bytes]']r   intr   r   r   T.Optional[int]rr   r    rj   rk   )rW   r   shutil)rX   usergroupr   rr   r   r   s         @r3   	set_chownr      sv     HHM @F&5VV V-<V#V:>V!T4' =s   "A A!c                    	 t        j                  | |||       y # t        t        t        f$ r< t         j
                  j                  |       st        j                  | ||       Y y Y y w xY w)Nr~   )r   )rW   chmodNotImplementedErrorOSErrorSystemErrorrX   islink)rX   moder   rr   s       r3   	set_chmodr      sT    0
tFOL+6 0ww~~d#HHT4/ $0s    AA,+A,c           	         |dk(  ry t        |t              sJ d       t        | d      rdnd}|| z  }	 t        | |d       y # t        $ r(}t        | d|d|j                   d	       Y d }~y d }~ww xY w)
Npreservez.umask should only be "preserver" or an integerFrq   i  i  : Unable to set permissions : , ignoring...)
isinstancer   rv   r   PermissionErrorprintstrerror)rX   umask	new_permses       r3   sanitize_permissionsr      s     
eS!S#SS!&tUCI%I_$	59 _4YMAJJ<}]^^_s   A 	A6A11A6c                   |3t        d |j                  |j                  |j                  fD              rt	        | |       y t               s<|j                  |j                  $	 t        | |j                  |j                  d       |j                  	 t        | |j                  d       y t	        | |       y # t        $ r?}t        | d|j                  d|j                  d|j                   d       Y d }~vd }~wt        $ r+ t        | d|j                  d	|j                  d
       Y t        $ rR}|j                  t        j                  k(  r)t        | d|j                  d	|j                  d
       n Y d }~d }~ww xY w# t        $ r2}t        | d|j                  d|j                   d       Y d }~y d }~ww xY w)Nc              3  $   K   | ]  }|d u  
 y wrK   r1   ).0ms     r3   	<genexpr>zset_mode.<locals>.<genexpr>   s     U19Us   Frq   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ownerr   r   r   r   r   r   r   LookupErrorr   errnoEINVALr   perms)rX   r   default_umaskr   s       r3   set_moder      s   |sUt||TZZ.TUUT=1<TZZ3tzz7M
	dDJJ

EJ ||	fdDJJ> 	T=1%  	wTH24::.DJJ>Y[\]\f\f[ggtuvv 	fTH0jVcde 	ww%,,& <TZZN*UYU_U_Tbbopq r	  	fTH88H1::,Vcdee	fsC   &#B< F <	F5C??4F5F=AF

F	G(GGc                 h   	 t        j                  dg       t        j                  d      syt        syt        g ddj                  d t        D              dz         \  } }}| j                  dk7  rt        dd	|d
|d       yy# t        t        t        t
        t         j                  f$ r Y yw xY w)z|
    Restores the SELinux context for files in @selinux_updates

    If $DESTDIR is set, do not warn if the call fails.
    selinuxenabledN
restorecon)r   z-Fz-f-z-0 c              3      K   | ]  }|  y wrK   r1   )r   fs     r3   r   z+restore_selinux_contexts.<locals>.<genexpr>   s     MiTUaMis   r   z7Failed to restore SELinux context of installed files...zStandard output:zStandard error:rx   )sep)
subprocess
check_callFileNotFoundErrorNotADirectoryErrorr   r   CalledProcessErrorr   whichr5   r
   join
returncoder   )procouterrs      r3   restore_selinux_contextsr      s    /01 <<% ADIIMiYhMiDilpDprND#s!G #$	0  17OZMjMjk  	s   B (B10B1c                    t         j                  j                  |      rt        | |      }|S t         j                  j	                  ||      }|S rK   )rW   rX   isabsr   r   )r'   
fullprefixrX   outputs       r3   get_destdir_pathr     s@    	ww}}Tgt, M j$/Mr2   c                   | j                  d      s| j                  d      rt        j                  |       j                  dk(  rtt        j                  j                  |       \  }}t        |dz   |z         }t        |      dkD  r t        d       t        j                  d       t        |      dk(  r|d   S | S | j                  d      s| j                  d      rt        j                  |       j                  dk(  rtt        j                  j                  |       \  }}t        |dz   d	z         }t        |      dkD  r t        d
       t        j                  d       t        |      dk(  r|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.)rz   rW   rt   st_sizerX   splitextr   lenr   sysexit)rn   basesuffixfiless       r3   check_for_stampfiler     s(   
 ~~ev 6775>!!Q&WW--e4NT6v-.E5zA~PQ5zQQx L 
	!7775>!!Q&WW--e4NT6w./E5zA~OP5zQQxLr2   c                  8   e Z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
d#d	Zd#d
Zd#dZd#dZd#dZd$dZd%dZd&d'dZ	 	 d(dZd)dZd*dZ	 	 d+	 	 	 	 	 d,dZd-dZ	 d&	 	 	 	 	 	 	 	 	 d.dZd/dZd0dZd1dZd1dZd1dZd1dZd1dZd1dZ d2d Z!d1d!Z"y)3	Installerc                   d| _         d| _        || _        || _        d| _        |j
                  | _        |j                  j                  d      D cg c]  }|j                          c}| _        |j                  r=|j                  j                  d      D cg c]  }|j                          c}| _	        y d | _	        y c c}w c c}w )NFr   ,)
did_install_somethingprinted_symlink_erroroptionsrL   preserved_file_countr(   r)   splitr+   r*   )rQ   r   rL   is       r3   rS   zInstaller.__init__(  s    %*"%*"$%! 5<4L4L4R4RSV4W Xq XDKLL(:(:3(?@1QWWY@	VZ	 !Y@s   CCc                H    | j                   st        j                  |i | y y rK   )r(   rW   removerQ   argskwargss      r3   r   zInstaller.remove5  s    ||IIt&v& r2   c                H    | j                   st        j                  |i | y y rK   )r(   rW   symlinkr   s      r3   r   zInstaller.symlink9  s    ||JJ'' r2   c                H    | j                   st        j                  |i | y y rK   )r(   rW   rR   r   s      r3   rR   zInstaller.makedirs=  s    ||KK(( r2   c                H    | j                   st        j                  |i | y y rK   )r(   r   copyr   s      r3   r   zInstaller.copyA  s    ||KK(( r2   c                H    | j                   st        j                  |i | y y rK   )r(   r   copy2r   s      r3   r   zInstaller.copy2E  s    ||LL$)&) r2   c                H    | j                   st        j                  |i | y y rK   )r(   r   copyfiler   s      r3   r   zInstaller.copyfileI      ||OOT,V, r2   c                H    | j                   st        j                  |i | y y rK   )r(   r   copystatr   s      r3   r   zInstaller.copystatM  r   r2   c                H    | j                   st        j                  |i | y y rK   )r(   r   	fix_rpathr   s      r3   r   zInstaller.fix_rpathQ  s!    ||// r2   c                4    | j                   st        |i | y y rK   )r(   r   r   s      r3   r   zInstaller.set_chownU      ||t&v& r2   c                4    | j                   st        |i | y y rK   )r(   r   r   s      r3   r   zInstaller.set_chmodY  r   r2   c                4    | j                   st        |i | y y rK   )r(   r   r   s      r3   r   zInstaller.sanitize_permissions]  s    || $1&1 r2   c                4    | j                   st        |i | y y rK   )r(   r   r   s      r3   r   zInstaller.set_modea  s    ||d%f% r2   c                8    | j                   s|st                y y y rK   )r(   r   )rQ   r'   s     r3   r   z"Installer.restore_selinux_contextse  s    ||G$& %,|r2   c                X    | j                   st        |i |\  }}}|j                  ||fS y)N)r   r@   r@   )r(   r
   r   )rQ   r   r   por   s         r3   r
   zInstaller.Popen_safei  s2    || $1&1GAq!<<A%%r2   Nc                L    | j                   r|j                   rt        ||      S y)Nr   )r(   r   )rQ   exe	extra_envs      r3   r   zInstaller.run_exeo  s    3	**r2   c                    |j                   r'|j                   | j                  v sd| j                  v ry| j                  r|j                  | j                  vryy)Nr?   FT)
subprojectr)   r*   tag)rQ   rf   s     r3   should_installzInstaller.should_installt  sH     <<Q\\T-B-BBcTMbMbFb99dii/r2   c                H    | j                   j                  st        |       y y rK   )r   r$   r   )rQ   msgs     r3   logzInstaller.log}  s    ||!!#J "r2   c                4   | j                   j                  syt        j                  j	                  |      r t        j                  j                  |      syt        j                  |      j                  }t        j                  |      j                  }||k  S )NF)r   r"   rW   rX   r   isfilert   st_mtime)rQ   	from_fileto_file	from_timeto_times        r3   should_preserve_existing_filez'Installer.should_preserve_existing_file  sg    ||((77>>)$RWW^^I-FGGI&//	'''"++G##r2   c                "   t         j                  j                  |      d   }t         j                  j                  |      s-t         j                  j	                  |      st        d|      t         j                  j                  |      rt         j                  j                  |      st        d|d      | j                  ||      r0t        | j                  d| d       | xj                  dz  c_
        y| j                  d	| d
|        | j                  |       n1| j                  d	| d
|        |r|\  }}|j                  |d       t         j                  j	                  |      r\t         j                  j                  |      s| j                  ||d       n:|d}t        t                | j#                  |||       n| j#                  ||       t$        j'                  |       t        | j                  |       y)Nr   z.Tried to install something that isn't a file: Destination z! already exists and is not a filez# Preserving old file rx   r   FzInstalling  to TrU   rq   )rW   rX   r   r  r   r	   r\   r	  rb   rL   r   r  r   rR   r   r   symlink_warningr   r5   r]   )rQ   r  r  rR   rr   outdirdirmakers          r3   do_copyfilezInstaller.do_copyfile  s    w'*ww~~i(	1J #RS\R_!`aa 77>>'"77>>'*$|G;>_%`aa11)WEdgg)?y'KL))Q.)HH{9+T&:;KK HH{9+T&:;#+ &!!&4!877>>)$77>>),		)VU	C"*&*O/*

9g
OJJy'*w'dggw'r2   c                8   |}t         j                  j                  |      s!t         j                  j                  ||      }n-t         j                  j	                  |      s|st        ||      }t         j                  j	                  |      s|st        d|       t         j                  j	                  |      r?t         j                  j                  |      st        d|d      | j                  |       | j                  s| j                  d| d|        	 | j                  ||t         j                  j                  |             t!        | j"                  |       y# t        t        f$ r! | j                  st        d       d| _	        Y y	w xY w)
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)rW   rX   r   r   r\   r   r	   r   r   r   r  r   isdirr   r   r   rb   rL   )rQ   targetlinkr'   full_dst_dirallow_missing
abs_targets          r3   
do_symlinkzInstaller.do_symlink  s@   
ww}}V$lF;J
+M%gz:Jww~~j)- #LZL!YZZ77>>$77>>$'$|D8;_%`aaKK))HH6vhd4&IJ	LL277==;TLU 	dggt$ $W- 	-- 1 2-1*	s   !1E) )-FFc                2   t         j                  j                  |      st        d|       t         j                  j                  |      st        d|       |^|\  }}	|D 
ch c]!  }
t         j                  j	                  |
      # }}
|	D 
ch c]!  }
t         j                  j	                  |
      # }	}
nt               x}}	t        j                  |      D ]  \  }}}t         j                  j                  |      sJ |dd D ]  }t         j                  j                  ||      }t         j                  j                  ||      }t         j                  j                  ||      }||	v r|j                  |       {t         j                  j                  |      rt         j                  j                  |      r$t        d| d       t        j                  d       |j                  |       | j!                  ||       | j#                  ||j$                          |D ][  }t         j                  j                  ||      }t         j                  j                  ||      }||v rJt         j                  j                  ||      }t         j                  j                  |      r$t        d| d	       t        j                  d       t         j                  j'                  |      }t         j                  j                  |      s@|j                  |       | j!                  t         j                  j'                  |      |       | j)                  |||
       | j+                  |||j$                         ^  yc c}
w c c}
w )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 N)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.rq   )rW   rX   r   
ValueErrorrY   rN   walkr   relpathr   r  r\   r   r   r   rR   r   r   install_umaskr[   r  r   )rQ   datasrc_dirdst_direxcludeinstall_modedmrr   exclude_filesexclude_dirsxrootrM   r   rf   abs_srcfilepartabs_dstr   
parent_dirs                       r3   
do_copydirzInstaller.do_copydir  s   2 ww}}W%=gYGHHww}}W%=gYGHH*1'M<:GHQRWW--a0HMH9EFABGG,,Q/FLF+.50ML!#!1 !	ID$77==&&&!W G'',,tQ/77??7'?B'',,w9|+KKN77==)77>>'*4WI=efgHHQKG$gw/))'43E3EFG   I'',,tQ/77??7'?B},'',,w977==)/y8efgHHQKWW__W5
ww}}Z0KK
+MM"''//'":JG  '? Sg|T5G5GHI%!	I	 IFs   &&N&Nc           	     v	   t        |      }| j                  j                  }|t        j                  j                  d      }|rIt        j                  j                  |      s*t        j                  j                  |j                  |      }||t        j                  d<   |xs d}t        ||j                        }|j                  dk7  r;t        |j                  t              sJ t        j                  |j                         d| _        	 t#        | j$                  | j&                        5 }| j)                  ||||       | j+                  ||||       | j-                  ||||       | j/                  ||||       | j1                  ||||       | j3                  ||||       | j5                  ||||       | j7                  |       | j9                  |||       | j                   s| j;                  d       | j                  j<                  sk| j>                  dkD  r\| j;                  djA                  | j>                  t        j                  jC                  | j$                  jD                                     d d d        y # 1 sw Y   y xY w# tF        $ r tI               sg|dk7  sbt        jJ                  tL        jN                  jQ                               r1t        jJ                  tL        jR                  jQ                               s t        j                  j                  d      xs, tU        jV                  d	      xs tU        jV                  d
      }tU        jV                  d      }||dt        j                  vr|}|(tY        d       t[        j\                         }|j_                  tL        j`                  tZ        jb                         d }	te        d      D ]e  }
tY        d| ddd       |jg                  d      r.tL        j`                  ji                         jk                  d      }	ntY                 n|	dv se n |	tm        d      |	dk(  rTt        jn                  ||tL        jp                  tr        gtL        jt                  dd  dt        jv                         d   w xY w)NDESTDIRr@   r   FzNothing to install.r   z6Preserved {} unchanged files, see {} for the full listMESON_ROOT_CMDsudodoaspkexec
PKEXEC_UIDz4Installation failed due to insufficient permissions.   zAttempt to use z$ to gain elevated privileges? [y/n] T)endr{      rx   >   nyzAnswer not one of [y/n]r;  r   r7   r<   )<ro   r   r'   rW   environgetrX   r   r   	build_dirr   prefixr   r   r   r   r   rI   rL   rR   install_subdirsinstall_targetsinstall_headersinstall_maninstall_emptydirinstall_datainstall_symlinksr   run_install_scriptr  r$   r   formatrY   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   datafilenamerf   r'   r   r&  rootcmdr5  sansattempts              r3   
do_installzInstaller.do_install  s   l+,,&&?jjnnY/G277==1ggll1;;8G $+BJJy!-R!'1884
??j(aoos333HHQ__%%*".	$''4==1 aR$$QGZ@$$QGZ@$$QGZ@  B<%%aWjA!!!R*=%%aWjA--g6''7J?11HH23||))d.G.G!.KHHU$fT%>%>@P@PQUQXQXQ]Q]@^_aa a a  	|w"}BIIcjj>O>O>Q4RZ\ZcZcdgdndndududwZxjjnn%56f&,,v:NfRXR^R^_eRfG\\(+F6#5,bjj:X "LM--/

399i&:&:;$Qx HGOG94XY_aimnxx|!ii00299$?j(H ,-FGG#:IIgw	 ACHHUVUWL A"A$&IIKA1?A=	s3    J 1EJ	 J 	JJ J F7R8A+R8c                4   | j                  d|d       t               r| j                  |dd|gz         \  }}}n| j                  ||gz         \  }}}|dk7  r?t        d       t        d| d       t        d	| d       t	        j
                  d
       y y )NzStripping target .z-Sz-xr   zCould not strip file.
zStdout:
rx   zStderr:
r   )r  r   r
   r   r   r   )rQ   	strip_binrn   outnamer   stdostdes          r3   do_stripzInstaller.do_stripV  s    $UIQ/08 &*__Y$gAV5V%W"Jd%)__Y'5J%K"Jd?+,IdV2&'IdV2&'HHQK	 r2   c           
     n   |j                   D ]  }| j                  |      sd| _        t        |||j                        }| j                  d|j                   d|        |j                  |d       | j                  ||j                  ||j                  |j                  ||j                          y )NTzInstalling subdir r  rU   rq   )r@  r   r   r   install_pathr  rX   rR   r/  r$  r%  rr   )rQ   rf   r&  r'   r   r   r  s          r3   r@  zInstaller.install_subdirse  s    "" 	?A&&q))-D&+GZPLHH)!&&l^DEKKtK4OOAqvv|QYYPR,-,=,=  ?	?r2   c                l   |j                   D ]  }| j                  |      s|j                  }t        |||j                        }t
        j                  j                  |      }| j                  ||||f|j                        rd| _	        | j                  ||j                  |j                          y N)rR   rr   T)r!  r   rX   r   rj  rW   r[   r  rr   r   r   r%  r   )	rQ   rf   r&  r'   r   r   fullfilenameoutfilenamer  s	            r3   rE  zInstaller.install_datap  s     	HA&&q)66L*7JOKWW__[1FkRLbcbsbst-1*MM+q~~qG	Hr2   c                .   |j                   D ]  }| j                  |      st        |||j                        }t        |||j                        }|j                  |d       | j                  |j                  ||||j                        sd| _	         y )NTrU   )
symlinksr   r   rj  rI  rR   r  r  r  r   )rQ   rf   r&  r'   r   r^  r  full_link_names           r3   rF  zInstaller.install_symlinks{  s     	2A&&q)+GZPL-gz166JNKKtK4qxx,PQP_P_`-1*	2r2   c                V   |j                   D ]  }| j                  |      s|j                  }t        |||j                        }t
        j                  j                  |      }| j                  ||||f      rd| _        | j                  ||j                  |j                          y )NrR   T)manr   rX   r   rj  rW   r[   r  r   r   r%  r   )	rQ   rf   r&  r'   r   r   full_source_filenamern  r  s	            r3   rC  zInstaller.install_man  s     	HA&&q)#$66 *7JOKWW__[1F 4kRQWLY-1*MM+q~~qG	Hr2   c                   |j                   D ]  }| j                  |      sd| _        t        |||j                        }| j                  d|        t        j                  j                  |      r$t        d| d       t        j                  d       |j                  |d       | j                  ||j                  |j                          y )NTzInstalling new directory zTried to create directory r  r   rU   )emptydirr   r   r   rX   r  rW   r  r   r   r   rR   r   r%  r   )rQ   rf   r&  r'   r   r   r  s          r3   rD  zInstaller.install_emptydir  s     
	IA&&q))-D&+GZHLHH0?@ww~~l+2<.@hijKKtK4MM,H
	Ir2   c                   |j                   D ]  }| j                  |      s|j                  }t        j                  j	                  |      }t        |||j                        }t        j                  j                  ||      }	| j                  ||	||f|j                        rd| _
        | j                  |	|j                  |j                          y rl  )headersr   rX   rW   basenamer   rj  r   r  rr   r   r   r%  r   )
rQ   rf   r&  r'   r   trm  rn   r  rn  s
             r3   rB  zInstaller.install_headers  s     
	HA&&q)66LGG$$\2E%gz1>>JF'',,vu5KkRL010A0A   C-1*MM+q~~qG
	Hr2   c                   |j                   |j                  dj                  |j                  D cg c]  }t	        j
                  |       c}      d}| j                  j                  rd|d<   | j                  rd|d<   |j                  D ]  }| j                  |      s|j                  |j                  }nd|j                  i}|j                         }|j                  |j                         D 	
ci c]A  \  }	}
d|	j!                         z   t"        j$                  j                  |j                  |
      C c}
}	       |j                  |j                         D 	
ci c]$  \  }	}
d|	j!                         z   t'        |||
      & c}
}	       dj                  |j(                        }|j*                  r|r| j-                  d	|       Gd
| _        | j-                  d|       	 | j1                  ||      }dk7  s|t5        d| d| d       t7        j8                  |        y c c}w c c}
}	w c c}
}	w # t2        $ r' t5        d| d       t7        j8                  d       Y rw xY w)N )MESON_SOURCE_ROOTMESON_BUILD_ROOTMESONINTROSPECT1MESON_INSTALL_QUIETMESON_INSTALL_DRY_RUNr?  MESON_INSTALL_MESON_INSTALL_DESTDIR_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   mesonintrospectshlexquoter   r$   r(   install_scriptsr   installdir_mapr?  r   updateitemsupperrW   rX   r   cmd_argsskip_if_destdirr  r   r   r   r   r   r   )rQ   rf   r'   r   r)  envr   mapplocalenvkvrI  rcs                r3   rG  zInstaller.run_install_script  s:   $%LL#$;;"%((ADUDU+VqEKKN+V"W <<),C%&<<+.C'("" 	A&&q)+'' !((+xxzHOO_c_i_i_klW[WXZ[-aggi7ahhPQ9RRlmOOvz  wA  wA  wC  Dnrnoqr5aggi?AQRY[eghAii  D  E88AJJ'D  WQRVQYZ[)-D&HH5dX>?\\!X.
 Qw1$}RD	RS5	 ,W  m D  1$7STUs$   H48AH9$)H?0I-I54I5c           	     	   |j                   D ]  }t               rmt        j                  j	                  |j
                        sDd|j
                  v r6t        j                  dd|j
                  j                  dd            |_        | j                  |      st        j                  j	                  |j
                        sE|j                  r | j                  d|j
                  d       t        d|j
                  d      d}t        |j
                        }t        |||j                        }t        j                  j!                  |t        j                  j#                  |            }	t        j                  j!                  |j$                  |j                  t        j                  j#                  |            }
|j&                  xs$ |j(                  xr | j*                  j&                  }|j,                  }|j.                  }|j0                  }t        j                  j	                  |      st        d|d      t        j                  j3                  |      r | j5                  ||	||f      }|ry|j6                  m|j9                  d	      r?| j                  d
j;                  t        j                  j#                  |                   | j=                  |j6                  ||	       |j9                  d      rJt        j                  j?                  |      d   dz   }t        j                  j	                  |      rt        j                  j?                  |	      d   dz   }| j5                  ||      }nt        j                  jA                  |      rt        j                  j!                  |jB                  |jE                  d            }t        j                  j!                  |t        j                  j#                  |            }	|jG                  |d       | jI                  |||	d ||       ntK        d|      |sMd| _&        	 | jO                  |	|jP                  ||
|d       | j[                  |	||j\                          y # tR        $ r5}tU        |jV                  tX              r|jV                  dk(  rn Y d }~Zd }~ww xY w)Nr   z$[.][a]([.]?([0-9]+))*([.]?([a-z]+))*r   zFile z not found, skippingz could not be foundFrs  z.jarzNot stripping jar target: {}z.jsr   z.wasm/TrU   zUnknown file type for )verbose)/targetsr   rW   rX   r\   rn   resubreplacer   optionalr  r	   r   r   r  r   rz  r?  r+   	can_stripr   install_rpathinstall_name_mappingsr%  r  r  rd  rz   rH  rh  r   r  r>  rV  rR   r/  RuntimeErrorr   r   rpath_dirs_to_remove
SystemExitr   coder   r   r   )rQ   rf   r&  r'   r   r{  file_copiedrn   r  re  
final_pathshould_stripr  r  r%  wasm_sourcewasm_outputr   s                     r3   rA  zInstaller.install_targets  s    <	FA
 xww~~agg.5AGG3C ff%KTSTSZSZSbSbchjnSopAG&&q)77>>!''*::HHuQWWK/CDE(5;N)OPPK'0E%gz188DFggll6277+;+;E+BCGahh"'':J:J5:QRJ77Jq{{'It||7I7ILOOM$%$;$;!>>L77>>%($uUI5H%IJJ&"..ugV.UAKK$;~~f-!?!F!FrwwGWGWX]G^!_` MM!++ug>>>%( #%''"2"25"9!"<w"FKww~~k2&(gg&6&6w&?&BW&L&*&6&6{K&Pu%Q[[%,,s2CD'',,vrww/?/?/FGFT25'4rJ"%;E9#EFF-1*NN7A,B,BMS]#8% # I g|Q__Ey<	Fl " !!&&#.166Q; s   "!R$$	S"-+SS")r   'ArgumentType'rL   rh   )r   rl   r   rl   rj   rk   )r'   r%   rj   rk   )r   rl   r   rl   rj   zT.Tuple[int, str, str]rK   )r   r   r   zT.Optional[T.Dict[str, str]]rj   r   )rf   ziT.Union[TargetInstallData, InstallEmptyDir, InstallDataBase, InstallSymlinkData, ExecutableSerialisation]rj   r    )r   r%   rj   rk   )r  r%   r  r%   rj   r    NN)
r  r%   r  r%   rR   zT.Optional[T.Tuple[T.Any, str]]rr   T.Optional[bool]rj   r    )r  r%   r  r%   r'   r%   r  r%   r  r    rj   r    )r!  r   r"  r%   r#  r%   r$  z+T.Optional[T.Tuple[T.Set[str], T.Set[str]]]r%  z
'FileMode'r&  rI   rr   r  rj   rk   )r\  r%   rj   rk   )rd  r4   rn   r%   re  r%   rj   rk   )
rf   r   r&  rI   r'   r%   r   r%   rj   rk   )rf   r   r'   r%   r   r%   rj   rk   )#r,   r-   r.   rS   r   r   rR   r   r   r   r   r   r   r   r   r   r   r
   r   r   r  r	  r  r  r/  ra  rh  r@  rE  rF  rC  rD  rB  rG  rA  r1   r2   r3   r   r   &  s   ['())*--0''2&'
EI$ AE8<&=&%5&AE&P6 `dDIGDI!+DI19DIL\DIhlDILBH	?	H2	HIH$L=Fr2   r   c                    |dk(  ry|dk7  rt        d       yt        j                         }|st        d       yd fd} |       \  }}t        j                  |d gz   ||	      j
                  }|d
k7  rt        d         yy)NnoneTninjazKOnly ninja backend is supported to rebuild the project before installation.z%Can't find ninja, can't rebuild test.Fc                 V   t               s|t        j                         dk(  rddd l} t        j                  j                         }t        j                  j                  d      [|j                  d      |j                  dd      |j                  dd      	 | j                  t                    j                  }nht        j                  j                  d      H|j                  d      	 | j                        }|j                  |j                  |j                  }nyt        j                  t        j                   j#                  d            j$                  t              k7  ry|d<   ||d	<   dfd
}||fS y# t        $ r Y yw xY w# t        $ r Y yw xY w)Nr   	SUDO_USERSUDO_UIDSUDO_GIDr  	DOAS_USERzbuild.ninjaUSERHOMEc                     t        dd        t        j                  t                      t        j                  t                     y y )NzDropping privileges to z before running ninja...)r   rW   setgidr   setuid)orig_gidorig_uid	orig_users   r3   wrappedz5rebuild_all.<locals>.drop_privileges.<locals>.wrapped>  sG    /	}<TUV'IIc(m,'IIc(m, (r2   rj   rk   )r   rW   geteuidpwdr<  r   r=  popgetpwuidr   pw_dirKeyErrorgetpwnampw_uidpw_gidrt   rX   r   st_uid)	r  r  homedirpwdatar  r  r  r  r&   s	        @@@r3   drop_privilegesz$rebuild_all.<locals>.drop_privileges  sW   |

 1**//#Czz~~k*6GGK0	77:q177:q1&!ll3x=9@@G ,8GGK0	& \\)4F "==!== --!wwrww||B67>>#h-O!#CK!CK- <A   &%&   &%&s$   $F 5F 	FF	F('F(r7   )r  
preexec_fnr   zCould not rebuild )rj   zDT.Tuple[T.Optional[EnvironOrDict], T.Optional[T.Callable[[], None]]])r   r   detect_ninjar   runr   )r&   backendr  r  r  r  rets   `      r3   rebuild_allr    s    &'[\$$&E56+Z &'OC
..$+
L
W
WC
ax"2$'(r2   c                   d}t         j                  j                  |      }t         j                  j                  |d      }t         j                  j	                  t         j                  j                  | j
                  |            st        j                  d       | j                  st        j                  | j
                        }t        j                  d|j                  j                  j                  t!        d                  }t#        |       t        j                  d|j                  j                  j                  t!        d                  }t%        | j
                  |      st        j                  d       t        j&                  | j
                         t)        t         j                  j                  |d	      d
d      5 }t+        | |      }t-        |d       t-        |d       | j.                  rJdd l}	t         j                  j                  |d      }
|	j3                  dt5               t7               |
       n|j9                  |       d d d        y# 1 sw Y   yxY w)Nzmeson-private/install.datz../meson-logszAInstall data not found. Run this command in build directory root.r    vsenvr%   r  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)rW   rX   r[   r   r\   r&   r   r   r!   r   loadTcastr   coredata
get_optionr   r   r  chdiropenr   rb   r#   cProfilerunctxglobalslocalsra  )optsr\  private_dirlog_dirb
need_vsenvr  rL   	installerr#   rn   s              r3   r  r  R  s   .L''//,/Kggll;8G77>>"'',,tww=>TU??JJtwwVVFAMM$:$:$E$EiPWFX$YZ
J&& 6 6 A A)IBV WX477G,HHRLHHTWW	bggll7$56g	N 	/RTdB'	b>?bQR<<&GGLL.EFENN?FH_dNe  .	/ 	/ s   BI##I,)rF   zargparse.ArgumentParserrj   rk   )rn   r%   rj   r   ri   )rX   r%   rr   r    rj   r    )rL   rh   r|   r%   rj   rk   )NNNT)rX   r%   r   T.Union[str, int, None]r   r  r   r   rr   r    rj   rk   )NT)
rX   r%   r   r   r   r   rr   r    rj   rk   )rX   r%   r   T.Union[str, int]rj   rk   )rX   r%   r   zT.Optional['FileMode']r   r  rj   rk   r  )r'   r%   r   r%   rX   r%   rj   r%   )rn   r%   rj   r%   )r&   r%   r  r%   rj   r    )r  r  rj   r   )D
__future__r   r   rD   r   rW   rN  r  r   r   r   typingr  r  r@   r   r   backend.backendsr   mesonlibr	   r
   r   r   r   r   r   r   r   scriptsr   r   scripts.meson_exer   __main__r   rY  ImportErrorTYPE_CHECKINGr   r   r   r   r   r   r   r   AttributeErrortyping_extensionsr   r  r5   r0   rG   rI   ro   rv   rb   r   r   r   r   r   r   r   r   r  r  r1   r2   r3   <module>r     sd   #    	     
  	   )L L L + &. ??  KJ/#x   " !p,#& #&L:P
 :>/3FJ!,!%!?C!OS!8 ?C&*0#0/30_2<064gF gFR@F]   I  /./s$   )D D DDD"!D"