
    ew                      d dl mZ d dlmZ d dlmZmZ d dlmZ 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mZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ejP                  r}ddl)m*Z* ddl+m,Z, ddlm-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddlm5Z5m6Z6 d dl7m8Z8 ejr                  ejt                  e ejv                  ejx                  ejz                  f      Z> G d de8      Z?dZ@ ed       G d d             ZA G d d ej                        ZC ed       G d! d"             ZD ed       G d# d$             ZE ed       G d% d&             ZF ed       G d' d(             ZG ed       G d) d*             ZH ed       G d+ d,             ZI G d- d.eH      ZJ ed       G d/ d0             ZKd5d6d1ZLd5d7d2ZM G d3 d4      ZNy)8    )annotations)OrderedDict)	dataclassInitVar)	lru_cache)chain)PathN   )build)dependencies)programs)mesonlib)mlog)LANGUAGES_USING_LDFLAGSdetect)FileMachineChoiceMesonException
OrderedSetclassify_unity_sources	OptionKey	join_argsExecutableSerialisation)ImmutableListProtocol)CompilerArgs)Compiler)Environment)InterpreterTest)StaticLinker)FileModeFileOrString)	TypedDictc                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	TargetIntrospectionDatastrlanguageT.List[str]compiler
parameterssourcesgenerated_sourcesN__name__
__module____qualname____annotations__     =/usr/lib/python3/dist-packages/mesonbuild/backend/backends.pyr%   r%   8   s    &&r3   r%   )dfortranvalaF)eqc                  ,    e Zd ZU ded<   ded<   ded<   y)	RegenInfor&   
source_dir	build_dirr(   depfilesNr-   r2   r3   r4   r:   r:   F   s    ONr3   r:   c                  6    e Zd ZdZdZdZdZedd       Zd	dZ	y)
TestProtocolr      r
      c                    |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S |dk(  r| j                  S t	        d|       )Nexitcodetapgtestrustzunknown test format )EXITCODETAPGTESTRUSTr   )clsstrings     r4   from_strzTestProtocol.from_strS   sZ    Z<<u_77Nw99v88O3F8<==r3   c                t    t        |       }| |j                  u ry| |j                  u ry| |j                  u ryy)NrC   rE   rF   rD   )typerG   rI   rJ   )selfrK   s     r4   __str__zTestProtocol.__str___   s;    4j3<<SYYSXXr3   N)rL   r&   returnz'TestProtocol')rR   r&   )
r.   r/   r0   rG   rH   rI   rJ   classmethodrM   rQ   r2   r3   r4   r?   r?   L   s-    H
CED	> 	>r3   r?   c                  &    e Zd ZU dZded<   ded<   y)
CleanTreesz
    Directories outputted by custom targets that have to be manually cleaned
    because on Linux `ninja clean` only deletes empty directories.
    r&   r<   r(   treesN)r.   r/   r0   __doc__r1   r2   r3   r4   rU   rU   j   s     Nr3   rU   c                  f    e Zd ZU 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dZy)InstallDatar&   r;   r<   prefixlibdirr(   	strip_binzT.Union[str, int]install_umaskmesonintrospectversionc                t    g | _         g | _        g | _        g | _        g | _        g | _        g | _        g | _        y N)targetsheadersmanemptydirdatasymlinksinstall_scriptsinstall_subdirsrP   s    r4   __post_init__zInstallData.__post_init__   s<    2402,.13-/	46@B:<r3   NrR   Noner.   r/   r0   r1   rk   r2   r3   r4   rY   rY   s   s4    ONKK %$  L=r3   rY   c                      e Zd ZU 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Zded<   dZded<   dZded<   ddZy)TargetInstallDatar&   fnameoutdirzInitVar[T.Optional[str]]outdir_nameboolstripzT.Mapping[str, str]install_name_mappingszT.Set[bytes]rpath_dirs_to_removeinstall_rpathzT.Optional['FileMode']install_mode
subprojectFoptionalNT.Optional[str]tag	can_stripc                    |*t         j                  j                  d| j                        }t         j                  j                  |t         j                  j	                  | j
                              | _        y )N{prefix})ospathjoinrr   basenamerq   out_name)rP   rs   s     r4   rk   zTargetInstallData.__post_init__   sI    '',,z4;;?K["''2B2B4::2NOr3   )rs   r|   rR   rm   )r.   r/   r0   r1   r{   r}   r~   rk   r2   r3   r4   rp   rp      sX    JK))K..&&((OHdCItPr3   rp   c                  :    e Zd ZU ded<   ded<   ded<   dZded<   y)	InstallEmptyDirr&   r   
'FileMode'ry   rz   Nr|   r}   )r.   r/   r0   r1   r}   r2   r3   r4   r   r      s    
IOCr3   r   c                  j    e Zd ZU ded<   ded<   ded<   ded<   ded<   dZd	ed
<   dZd	ed<   dZded<   y)InstallDataBaser&   r   install_pathinstall_path_namer   ry   rz   Nr|   r}   	data_typeT.Optional[bool]follow_symlinks)r.   r/   r0   r1   r}   r   r   r2   r3   r4   r   r      s=    
IOC!%I%(,O%,r3   r   c                  R    e Zd ZU ded<   ded<   ded<   ded<   dZded<   d	Zd
ed<   y)InstallSymlinkDatar&   targetnamer   rz   Nr|   r}   Frt   allow_missing)r.   r/   r0   r1   r}   r   r2   r3   r4   r   r      s+    K
IOCM4r3   r   c                  <     e Zd Z	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZ xZS )SubdirInstallDatac
           
     @    t         
|   ||||||||	       || _        y ra   )super__init__exclude)rP   r   r   r   ry   r   rz   r}   r   r   	__class__s             r4   r   zSubdirInstallData.__init__   s+     	|->jZ]_hjyzr3   )NNN)r   r&   r   r&   r   r&   ry   r   r   zT.Tuple[T.Set[str], T.Set[str]]rz   r&   r}   r|   r   r|   r   r   )r.   r/   r0   r   __classcell__)r   s   @r4   r   r      sI     ]a59)4S '6JY #3 r3   r   c                      e Zd ZU 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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ed<   d!dZy )"TestSerialisationr&   r   project_namer(   suiterq   rt   is_cross_builtz$T.Optional[programs.ExternalProgram]exe_wrapperneeds_exe_wrapperis_parallelcmd_argsmesonlib.EnvironmentVariablesenvshould_failzT.Optional[int]timeoutr|   workdirextra_pathsr?   protocolintprioritycmd_is_built
cmd_is_exedependsr_   verbosec                j    | j                   't        | j                   t        j                        sJ y y ra   )r   
isinstancer   ExternalProgramrj   s    r4   rk   zTestSerialisation.__post_init__   s/    'd..0H0HIII (r3   Nrl   rn   r2   r3   r4   r   r      s    
I55	&&MLMJr3   r   c                   | dk(  rddl m} |j                  ||      S | dk(  rddl m} |j	                  ||      S | dk(  rddl m} |j                  ||      S | dk(  rddl m} |j                  ||      S | d	k(  rdd
l m} |j                  ||      S | dk(  rddl m
} |j                  ||      S | dk(  rddl m} |j                  ||      S | dk(  rddl m}	 |	j                  ||      S | dk(  rddl m}
 |
j#                  ||      S | dk(  rddl m} |j'                  ||      S | dk(  rddl m} |j+                  ||      S y )Nninjar@   )ninjabackendvs)vs2010backendvs2010vs2012)vs2012backendvs2013)vs2013backendvs2015)vs2015backendvs2017)vs2017backendvs2019)vs2019backendvs2022vs2022backendxcode)xcodebackendnone)nonebackend) r   NinjaBackendr   autodetect_vs_versionVs2010Backendr   Vs2012Backendr   Vs2013Backendr   Vs2015Backendr   Vs2017Backendr   Vs2019Backendr   Vs2022Backendr   XCodeBackendr   NoneBackend)backendr   interpreterr   r   r   r   r   r   r   r   r   r   s                r4   get_backend_from_namer      sN   '"((<<	D#225+FF	H	#**5+>>	H	#**5+>>	H	#**5+>>	H	#**5+>>	H	#**5+>>	H	#**5+>>	H	#**5+>>	G	"((<<	F	!&&uk::r3   c                B    | dk(  rddl m} |j                  ||d      S y )Nr   r@   r   T)gen_lite)r   r   r   )	genvsnamer   r   r   s       r4   get_genvslite_backendr     s(    H#**5+$*OOr3   c                     e Zd ZU ded<   dZdadZdbdcdZdd	ddd
ZdedZdfdZ	dfdZ
dddgdZdddgdZdhdZ ed      ded       ZdidZdjdZdkdZdkdZ ed      	 	 	 	 	 	 	 	 dld       Z	 	 	 	 	 	 dmdZdndZedod       Zdp	 dqdZdpdrdZ	 	 	 	 	 	 dsdZedtd       Zdud Z	 	 	 	 	 	 	 	 dv	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dwd!Z	 	 	 	 	 	 	 dx	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dyd"Zdzd#Z d{d$Z!ed|d%       Z"d}d&Z#ed~d'       Z$ ed      ddd(       Z%	 	 dd)Z&edd*       Z'dd+Z(dd,Z)dd-Z*dd.Z+dd/Z,dtd0Z-edd1       Z.dd2Z/ddd3Z0dd4Z1dud5Z2e ed      dd6              Z3e4 ed      d}d7              Z5	 	 	 	 	 	 dd8Z6dd9Z7dd:Z8dd;Z9dd<Z:dd=Z;dd>Z<dd?Z=dd@Z>ddAZ?ddBZ@ddCZAddDZBddEZCdddFZD ed      ddG       ZE ed      ddH       ZFddIZGdddJZHdedKZI ed      ddL       ZJdd	 	 	 ddMZKdd	 	 	 	 	 	 	 ddNZL	 d	 	 	 	 	 ddOZMddPZNddQZOddRZPddSZQdddTZRddUZSddVZTddWZUddXZVddYZWddZZXdd[ZYdd\ZZdd]Z[dd^Z\	 	 	 	 	 	 	 	 dd_Z]dd`Z^y)BackendzT.Optional['Environment']environmentz	<UNKNOWN>c                   |d | _         y || _        || _        |j                   | _         t               | _        | j                   j                         | _        | j                   j                         | _        t        j                  | j                   j                         | j                   j                               | _        t        j                  | j                   j                         | j                   j                               | _        y ra   )r   r   r   setprocessed_targetsget_build_dirr<   get_source_dirr;   r   relpathbuild_to_srcsrc_to_build)rP   r   r   s      r4   r   zBackend.__init__  s     =#D
& ,,-0U))779**99;$,,T-=-=-L-L-N-1-=-=-K-K-MO$,,T-=-=-K-K-M-1-=-=-L-L-NPr3   FNc                D    t        dt        |       j                         )Nzgenerate is not implemented in )RuntimeErrorrO   r.   )rP   capture
vslite_ctxs      r4   generatezBackend.generate,  s     <T$Z=P=P<QRSSr3   Twarn_multi_outputc                  t        |t        j                        rb|rLt        |j	                               dk7  r0t        j                  d|j                  d|j                   d       |j	                         d   }n_t        |t        j                        r|j	                         d   }n1t        |t        j                        sJ |       |j                         }t        j                  j                  | j                  |      |      S )Nr@   zcustom_target z@ has more than one output! Using the first one. Consider using `z[0]`.r   )r   r   CustomTargetlenget_outputsr   warningr   CustomTargetIndexBuildTargetget_filenamer   r   r   get_target_dir)rP   tr   filenames       r4   get_target_filenamezBackend.get_target_filename/  s    a++, S%9Q%>~affZ 8EEFVVHES T}}q)H5223}}q)Ha!2!236Q63~~'Hww||D//2H==r3   c                    t         j                  j                  | j                  j	                         | j                  |            S ra   )r   r   r   r   r   r   rP   r   s     r4   get_target_filename_abszBackend.get_target_filename_abs<  s2    ww||D,,::<d>V>VW]>^__r3   c                    t        |t        j                        sJ |       |j                         r?|j                         }t        j
                  j                  | j                  |      |      S y ra   )r   r   r   get_debug_filenamer   r   r   r   )rP   r   debug_filenames      r4   get_target_debug_filenamez!Backend.get_target_debug_filename?  sZ    &%"3"34<f<4$$&#668N77<< 3 3F ;^LLr3   c                    t        |t        j                        sJ |       |j                         sy t        j
                  j                  | j                  j                         | j                  |            S ra   )
r   r   r   r  r   r   r   r   r   r  r   s     r4   get_target_debug_filename_absz%Backend.get_target_debug_filename_absG  s\    &%"3"34<f<4((*ww||D,,::<d>\>\]c>deer3   absolute_pathc                   |j                         }|r| j                  }n| j                  }t        j                  j                  t        j                  j                  ||            }|j                  |d      S )NF)
get_subdirr;   r   r   r   normpathr   get_include_args)rP   r   r)   r  curdirleadtmppaths          r4   get_source_dir_include_argsz#Backend.get_source_dir_include_argsM  s]    ""$??D$$D''""277<<f#=>((%88r3   c                   |r9t         j                  j                  | j                  |j	                               }n|j	                         }|dk(  rd}|j                  |d      S )Nr   .F)r   r   r   r<   r
  r  )rP   r   r)   r  r  s        r4   get_build_dir_include_argsz"Backend.get_build_dir_include_argsV  sS    WW\\$..&2C2C2EFF&&(F|((77r3   c                   t        |t        j                        r|j                         xs |j	                         }t        j                         r3|j                  r't        j                  dd|j                  dd            }t        | j                  |      |      j                         S t        |t        j                        r7t        | j                  |      |j	                               j                         S t        |t        j                  t        j                   f      r`|j#                         st%        d|j&                   d      t        | j                  |      |j	                               j                         S t        |t        j(                        rD|j*                  r7t        | j                  |      |j                               j                         S y t-        d|d      )Nz$[.][a]([.]?([0-9]+))*([.]?([a-z]+))*.a.soz%Tried to link against custom target "z", which is not linkable.zBUG: Tried to link to z which is not linkable)r   r   SharedLibraryget_import_filenamer   r   is_aixaix_so_archiveresubreplacer	   r   as_posixStaticLibraryr   r   is_linkable_targetr   r   
Executableimport_filenameAssertionError)rP   r   link_libs      r4   get_target_filename_for_linkingz'Backend.get_target_filename_for_linking_  s   
 fe112113Lv7J7J7LH V%:%:66"H$PXP`P`afhlPmn++F3X>GGII 3 34++F3V5H5H5JKTTVV!3!3U5L5L MN,,.$'LV[[MYr%stt++F3V5H5H5JKTTVV 0 01%%D//79S9S9UV__aa5fZ?UVWWr3   )maxsizec                    t        |t        j                        rd}|S | j                  j                  j                  t        d            dk(  r|j                         }|S d}|S )Nr   layoutmirror	meson-out)r   r   	RunTargetr   coredata
get_optionr   r
  )rP   r   dirnames      r4   r   zBackend.get_target_dirw  sc    feoo.G
 	 &&11)H2EF(R'')G  "Gr3   c                ^   t         j                  j                  | j                  j	                         | j                  |            }t         j                  j                  | j                  j	                         | j                  |            }t         j                  j                  ||      S )z7Get a target dir relative to another target's directory)r   r   r   r   r   r   r   )rP   r   o
target_dir
othert_dirs        r4   get_target_dir_relative_toz"Backend.get_target_dir_relative_to  su    WW\\$"2"2"@"@"BDDWDWXYDZ[
WW\\$"2"2"@"@"BDDWDWXYDZ[
wwz:66r3   c                    | j                  |      }|r*t        j                  j                  | j                  |      S | j                  S ra   )r   r   r   r   r   )rP   r   r1  s      r4   get_target_source_dirzBackend.get_target_source_dir  s<    ((0
77<< 1 1:>>   r3   c                h    t         j                  j                  | j                  |d      dz         S )NFr   z.p)r   r   r   r   r   s     r4   get_target_private_dirzBackend.get_target_private_dir  s+    ww||D44Vu4UX\\]]r3   c                    t         j                  j                  | j                  j	                         | j                  |            S ra   )r   r   r   r   r   r7  r   s     r4   get_target_private_dir_absz"Backend.get_target_private_dir_abs  s2    ww||D,,::<d>Y>YZ`>abbr3   c                   t        |t        j                  t        j                  f      r/t        j
                  j                  | j                  |      |      S t        j
                  j                  | j                  |      |      S )z
        Takes a BuildTarget, a generator source (CustomTarget or GeneratedList),
        and a generated source filename.
        Returns the full path of the generated source relative to the build root
        )	r   r   r   r   r   r   r   r   r7  )rP   r   gensrcsrcs       r4   get_target_generated_dirz Backend.get_target_generated_dir  sa     fu1153J3JKL77<< 3 3F ;SAA ww||D77?EEr3   c                    |j                    d| d| }t        j                  j                  | j	                  |      |      S )Nz-unityr  )r   r   r   from_built_filer7  )rP   r   suffixnumberosrcs        r4   get_unity_source_filezBackend.get_unity_source_file  sA     ++fVHAfX6}},,T-H-H-PRVWWr3   c                &    g g t        j                  j                         |      }j                  t	        d            }t        |t              sJ d       d	 fd}|j                         D ]w  \  }}|dz   }d}	d }
|D ]Q  }||k\  r0|
r|
j                           ||j                         |	      }
|	dz  }	d}|
j                  d| d       |dz  }S |
sh|
j                          y D ]  }t        j                  ||dz           S )
N
unity_sizefor mypyc                   j                  	| |      }|j                  j                  j                         j                  j	                               }|dz   }j                  |       t        j                  j                  |      }t        j                  j                  |      st        j                  |       j                  |       t        |dd      S )N.tmpwutf-8encoding)rC  r  r   r   r   appendr   r   r.  existsmakedirsopen)
r@  unity_file_number	unity_src
outfileabsoutfileabs_tmpoutfileabs_tmp_dir	abs_filesresultrP   r   s
         r4   init_language_filez8Backend.generate_unity_files.<locals>.init_language_file  s    2266CTUI"001A1A1P1P1R151A1A1O1O1QSJ'&0NZ(!#!@77>>"45./MM)$g>>r3   r@   r   z	#include<z>
rH  )r@  r&   rQ  r   rR   zT.TextIO)r   	compilersvaluesr-  r   r   r   itemscloseget_default_suffixwriter   replace_if_different)rP   r   rR  compsrcsrE  rX  compsrcsfiles_in_currentrQ  ofiler<  xrV  rW  s   ``           @@r4   generate_unity_fileszBackend.generate_unity_files  s1   !#	(*)&*:*:*A*A*CYO&&y'>?
*c*6J6*
	? 
	? #..* 	JD$)A~ ! E &#z1.t/F/F/HJ[\E%*%'($iuC01 A% & !	$  	9A))!QZ8	9r3   c                    t         j                  j                  t         j                  j                  d|       t         j                  j                  d|            S )Ndummyprefixdir)r   r   r   r   )todirfromdirs     r4   r   zBackend.relpath  s>    wwrww||,<eD!ww||,<gFH 	Hr3   c                    | j                  ||j                         |      \  }}t        t        j	                  |            |fS ra   )_flatten_object_listget_objectslistdictfromkeys)rP   r   proj_dir_to_build_rootobj_listdepss        r4   flatten_object_listzBackend.flatten_object_list  s=    2266;M;M;OQgh$DMM(+,d22r3   c                    | j                  |j                  |g|      \  }}t        t        j	                  |            S ra   )rl  r   rn  ro  rp  )rP   objectsrq  rr  _s        r4   determine_ext_objszBackend.determine_ext_objs  s5    //	Kab!DMM(+,,r3   c                   g }g }|D ]  }t        |t              rLt        j                  j	                  || j
                  |j                         |      }|j                  |       `t        |t        j                        r|j                  rKt        j                  j	                  ||j                  | j
                              }|j                  |       t        j                  j	                  || j
                        }|j                  |j                  |             t        |t        j                        r|j                  rL| j                  |j                   |j"                  |      \  }}	|j%                  |       |j%                  |	       |j%                  | j'                  ||             |j                  |j                          t)        d       ||fS )Nz!Unknown data type in object list.)r   r&   r   r   r   r   r
  rM  r   r   is_builtrel_to_builddirr   ExtractedObjects	recursiverl  r   objlistextend_determine_ext_objsr   )
rP   r   rv  rq  rr  rs  objr0  objsr5   s
             r4   rl  zBackend._flatten_object_list  sr    !#/1 	JC#s#GGLL!7!%!2!2F4E4E4GN"C/<<%;%(%8%89J9J%KMAOOA&%;%)%6%68AOOC$7$7$:;C!7!78=="77

CKKQghGD!OOD)KKN 8 8>T UVCJJ'$%HII-	J. ~r3   c                L    | j                   D ]  }|j                  d      s y y)NswiftTF)r+   endswith)r   ss     r4   is_swift_targetzBackend.is_swift_target  s)     	Azz'"	 r3   c                l    g }|j                   D ]"  }|j                  | j                  |             $ |S ra   )link_targetsrM  r9  )rP   r   rW  ls       r4   determine_swift_dep_dirsz Backend.determine_swift_dep_dirs
  s8     $$ 	>AMM$99!<=	>r3   c
                   |^}
}t        |
t        j                        r|
j                         }|
j                  }nt        |
t
        j                        r| j                  |
      g}|
j                  }nt        |
t
        j                        r#| j                  |
      g}t        j                  }ndt        |
t        j                        r7|
j                  | j                  j                        g}t        j                  }n|
g}t        j                  }g }|D ]  }t        |t        j                        r4|j!                         }t        |t"              sJ |j%                  |       Qt        |t
        j                  t
        j                  f      r!|j%                  | j                  |             t        |t        j                        r5|j%                  |j                  | j                  j                               |j%                  |        | j                  j&                  |   }|j)                         s|j+                         r| j-                  |
|xs g       }ng }| j                  j&                  j/                  |       }|rS| j                  j1                         r9| j                  j3                         }|r|j5                         sd}t7        |      |d   j9                  d      rddg|z   }nV|d   j9                  d      rBt        j(                         s.t        j*                         st        j:                         sdg|z   }d }|xs | j                  j=                         }t?        ||z   |||||||||	
      S )NzxAn exe_wrapper is needed but was not found. Please define one in cross file and check the command and/or add it to PATH.r   z.jarjavaz-jarz.exemono) r   r   r   get_commandfor_machiner   r   r   r   r   BUILDr   r   r{  r   r;   get_pathr&   rM  machines
is_windows	is_cygwindetermine_windows_extra_pathsmatches_build_machineneed_exe_wrapperget_exe_wrapperfoundr   r  is_wslr   r   )rP   cmdr   extra_bdepsr   feedr   r}   r   installdir_mapexeraw_cmd_argsexe_cmdexe_for_machiner   cpmachiner   r   r   msgs                         r4   get_executable_serialisationz$Backend.get_executable_serialisation  s    !lc8334oo'G!ooOU../33C89G!ooOU//0 33C89G+11OX]]+**4+;+;+F+FGHG+11OeG+11O " 
	#A!X556JJL!!S)))"A 1 153E3EFG < <Q ?@Ax}}- 1 1$2B2B2M2M NO"
	# ""++O<7#4#4#6<<S+BSQSTKK!--66LL_]]d..??A**::<Kk&7&7&9S$S))qz""6*!6*W4$$V,h6I6I6KxOaOaOcgogvgvgx!(W,K=T--;;=&w'93'2G'2GT3Q_a 	ar3   c
           	        g }
|
j                  |       |
j                  |       | j                  |
||||||	      }g }|j                  r|j                  d       |j                  r|j                  d       |r|j                  d       t        d |j                  D              r|j                  d       |r|j                  r|j                  d       | }|xs t        |      }|r|j                  d       |r|j                  d	       |r~|dgk(  rxt        j                  d
      rcg }|j                  i       j                         D ]  \  }}|j                  | d|         d
g|z   |j                  z   dj                  |      fS |sj|s|s|j                  dfS g }|r|d|gz  }|r|d|gz  }| j                  j                         ddgz   |z   dgz   |j                  z   dj                  |      fS t!        |t"        j$                  t&        j(                  t&        j*                  f      r*t,        j.                  j1                  |j2                        }nct!        |t4        j6                        r*t,        j.                  j1                  |j8                        }nt,        j.                  j1                  |      }t;        j<                         }|j>                  r|j>                  jA                  |       |jC                  tE        tG        |j                        d             |jC                  tE        tG        |jH                        d             |jC                  tE        tG        |      d             |jC                  tE        tG        |      d             |jK                         }d| d| d}t,        j.                  j                  | j                  jM                         |      }tO        |d      5 }tQ        jR                  ||       ddd       | j                  j                         ddd|gz   dj                  |      fS # 1 sw Y   ;xY w)zY
        Serialize an executable for running with a generator or a custom target
        )r   zto set PATHzto use exe_wrapperzto set workdirc              3  $   K   | ]  }d |v  
 yw)
Nr2   ).0r  s     r4   	<genexpr>z/Backend.as_meson_exe_cmdline.<locals>.<genexpr>r  s     .Qtqy.s   z!because command contains newlinesz
to set envzto capture outputzto feed inputr   =z, r   z	--capturez--feedz
--internalr  z--rJ  rK  
meson_exe_rw  z.datwbNz
--unpickle)*rM  r  r  r   r   anyr   varnamesrt   shutilwhichget_envr[  r   r   get_build_commandr   r   r   r   r   r   r   r   r   r   r   r   rq   hashlibsha1r   hashupdatebytesr&   r   	hexdigestget_scratch_dirrP  pickledump)rP   r  r   r   r  r   r  force_serializer   r   r  esreasonscan_use_envenvlistkvargsr   hasherdigestscratch_fileexe_datafs                           r4   as_meson_exe_cmdlinezBackend.as_meson_exe_cmdlineX  s    uw

3

8..sG['SWY\fm.n!>>NN=)>>NN/0NN+,."++..NN>?3<<NN<( *)):T']NN./NN?+7|n4e9LGB--/ +1!AaSz*+7W$r{{2DIIg4FFF4{{B& "Dg..4((   224e7LLtSW[V\\_a_j_jj		'" 
 cH44!--u/A/AC Dww''1HX]]+ww''		2Hww'',H 66FFKKeC,w?@eC

Og>?eCL7;<eCI89!!##H:Qvhd;77<< 0 0 @ @ BLQ(D! 	QKKA	  224e\[c7dd		'"$ 	$	 	s   QQc                   t         j                  j                  | j                  j	                         d      }t        |d      5 }| j                  |       d d d        t         j                  j                  | j                  j	                         d      }t        |d      5 }| j                  |       d d d        ||fS # 1 sw Y   kxY w# 1 sw Y   ||fS xY w)Nzmeson_test_setup.datr  zmeson_benchmark_setup.dat)r   r   r   r   r  rP  write_test_filewrite_benchmark_file)rP   	test_datadatafilebenchmark_datas       r4   serialize_testszBackend.serialize_tests  s    GGLL!1!1!A!A!CE[\	)T" 	+h  *	+d&6&6&F&F&HJef.$' 	08%%h/	0.((	+ 	+	0.((s   C#CC
Cc                    t        |t        j                        r%| j                  j                  |j                     g fS |j                         \  }}||fS )z
        If we're building a static library, there is only one static linker.
        Otherwise, we query the target for the dynamic linker.
        )r   r   r  static_linkerr  $get_clink_dynamic_linker_and_stdlibs)rP   r   r  stdlib_argss       r4    determine_linker_and_stdlib_argsz(Backend.determine_linker_and_stdlib_args  sP    
 fe112::++F,>,>?CCDDF;+~r3   c                    t         j                  j                  |       } |j                         D ]  }| |j	                  |      v s y y)NTF)r   r   r  rZ  get_library_dirs)r[   rY  r   ccs       r4   _libdir_is_systemzBackend._libdir_is_system  sI    !!&)""$ 	B,,S11	 r3   c                $   g }t         D ]f  }	 | j                  j                  j                  |j                  |      }t        |t              r|j                  |       n|j                  |       h | j                  |      S # t        $ r Y w xY wra   )r   r   r,  get_external_link_argsr  r   r&   rM  r  	Exceptionget_rpath_dirs_from_link_args)rP   r   r  langes        r4   get_external_rpath_dirszBackend.get_external_rpath_dirs  s    + 	D$$--DDVEWEWY]^a%KKNKKN	 11$77  s   A#B	BBc                   t               }t        j                  d      }t        j                  d      }t        j                  d      }| D ]  }|j                  |      }|r6|j	                  d      j                  d      D ]  }|j                  |        |j                  |      }|rP|j	                  d      j                  d      D ]-  }t        |      j                         s|j                  |       / |j                  |      }	|	s|	j	                  d      j                  d      D ]*  }t        |      j                         st        d| d        |S )Nz-Wl,-rpath[=,]([^,]+)z-Wl,-R[,]?([^,]+)z-Wl,--just-symbols[=,]([^,]+)r@   :z Invalid arg for --just-symbols, z is a directory.)
r   r  compilematchgroupsplitaddr	   is_dirr   )
r  dirsrpath_regexrunpath_regexsymbols_regexargrpath_matchdirrunpath_matchsymbols_matchs
             r4   r  z%Backend.get_rpath_dirs_from_link_args  sM   5 jj!9: 

#78 

#CD 	gC%++C0K&,,Q/55c: "CHHSM")//4M(..q177< &CCy'')& *//4M(..q177< gCCy''),/OPSuTd-effg	g" r3   c                
   t               }| j                  j                         }|j                  D ]  }|j                  dvr|j
                  D ]  }t        j                  j                  |      s$t        j                  j                  |      }|r(| j                  ||j                  | j                        rm|| j                  |      v rt        j                  j                  |      d   dv s4t        j                  dt        j                  j!                  |            s	 t        j                  j#                  ||f      }||k(  rv|t'        |      dz   d  }	t        j                  j                  |	      rJ d|	 d       |j)                  t        j                  j+                  | j,                  |	             v|j)                  |        |j/                  | j1                  |j
                                t3        |j4                  |j6                        D ]>  }
t9        |
t:        j<                        s|j?                  | jA                  |
|             @ tC        |      S # t$        $ r d}Y 6w xY w)N>   cmakelibrary	pkgconfigr@   >   .lib.dylibr  .dllz.+\.so(\.|$)r   zrel_to_src: z is absolute)"r   r   r   external_deps	type_name	link_argsr   r   isabsr.  r  rY  r  splitextr  r  r   
commonpath
ValueErrorr   r  r   r   difference_updater  r   r  link_whole_targetsr   r   r   r  /rpaths_for_non_system_absolute_shared_librariesrn  )rP   r   exclude_systempathssrcdirdeplibpathr[   r  
rel_to_srcis              r4   r  z7Backend.rpaths_for_non_system_absolute_shared_libraries  s   !+!!002'' $	WC}}$EE== &ww}}W-1!d&<&<VVEUEUW[WgWg&hT99&AA GG$$W-a04UUxx1A1A'1JK$!#!3!3VV4D!EJ '!'Fa(8!9J!ww}}Z8aLT`:aa8IIbggll4+<+<jIJIIf%?&B ##D$F$Fs}}$UVI$	WJ v**F,E,EF 	fA!U../TQQRSUcde	f E{ " $!#J$s   *!I33JJc                   | j                   j                  j                  t        d            dk(  rt	        |j                               }nt	               }|j                  d       t        |t        j                        rX|j                  | j                  |             |j                  j                  |D cg c]  }|j                  d       c}       t        |      S c c}w )Nr(  r)  r*  rJ  )r   r,  r-  r   r   get_link_dep_subdirsr  r   r   r   r  r  rw   encodetuple)rP   r   rW  r5   s       r4   determine_rpath_dirszBackend.determine_rpath_dirs3  s     $$//	(0CDP ; ; =>F\FJJ{#fe//0MM$NNvVW''..6/Ra0A/RSV} 0Ss   :C$c                R   t        |       j                  }d}t        |      dkD  redj                  |dd        }t        |       t        |      dz   kD  r7t	        j
                  | j                  d            j                         dz   }|} dD ]  }| j                  |d      }  || z   S )	Nr      /)   rJ  rw  )r  \r  )	r	   partsr   r   r  r  r  r  r  )rq   r  hashedtempchs        r4   canonicalize_filenamezBackend.canonicalize_filenameA  s    U!!u:>88E"#J'D5zCIN* ell7&;<FFH3N" 	+BMM"c*E	+~r3   c                   t        |t        j                        sJ t        |t        j                        r|j
                  |   S | j                  j                         }|j                  | j                        }|j                  d      r|j                  r`t        j                  j                  |      r|t        |      dz   d  }t        j                  j!                  || j#                  |            }nt        j                  j%                  |      }d|d d z   dz   }n|j                  ret        j                  j                  |      r|t        |      dz   d  }| j#                  |      }dt        j                  j!                  ||      z   }nt        j                  j                  |      r|}nt        j                  j!                  t        j                  j'                  ||      t        j                  j'                  | j                  j)                         |j+                                     }| j                  j,                  |j.                     }| j1                  |      dz   |j3                         z   S )N)z.valaz.gsr@   zmeson-generated_r  z.cr  )r   r   r   r   CompileTargetsources_mapr   r   r{  r   r  rz  r   r   r   r   r   r7  r   r   r   r
  r  r  r  get_object_suffix)rP   r   sourcer<   rel_src
gen_source	targetdirr  s           r4   object_filename_from_sourcez#Backend.object_filename_from_sourceO  s   &(--000fe112%%f--$$224	(():):; ,-77==)%c)nq&8&9:G''//'43N3Nv3VW''**73+gcrl:TAJ__ww}}W%!#i.1"4"5633F;I+bggoogy.QQJww}}W%$
WW__RWW\\)W-M-/WW\\$:J:J:Y:Y:[]c]n]n]p-qs
""++F,>,>?))*5;g>W>W>YYYr3   c           	        g }| j                  |j                        }t        |j                        }|j                  D ]r  }|j                         D ]]  }| j                  |j                  ||      }t        j                  j                  |      \  }	}
|j                  t        d|	|
             _ t g }|D ]j  }| j                  j                  |      r|j                  |       0| j                  j                  |      sL|j                  |j                                l |j                   r| j#                  |j                        r|j                  j                   j%                         D ]t  \  }}|j                  j&                  |   }|j)                         dk(  s3| j+                  ||      }|j                  t        j                  j-                  |||             v |s|S |j                  j.                  rt1        |j                  j&                  j3                         |      }g }|j                  j5                  t7        d            }t9        |t:              sJ d       |j%                         D ]{  \  }}|j<                  t>        v r||z  }tA        tC        |      |z   dz
  |z        D ]>  }| jE                  |j                  |jG                         |      }|j                  |       @ } |D ]P  }| jI                  |j                  |      }t        j                  j-                  |||      }|j                  |       R |S )NTmsvcrE  rF  r@   )%r7  r   rn  srclistgenlistr   r=  r   r   r  rM  r   r   	is_source	is_objectrelative_namepchtarget_uses_pchr[  rY  get_argument_syntaxget_msvc_pch_objnamer   is_unityr   rZ  r-  r   r   r   r'   LANGS_CANT_UNITYranger   rC  r]  r&  )rP   extobjrq  rW  r%  raw_sourcesr;  rr   dirpart	fnamepartr+   r  r  r.  r)   objnamer`  rE  ra  rb  r  _srcrB  objpaths                            r4   r  zBackend._determine_ext_objsq  s    //>	 6>>*nn 	CF'') C44V]]FAN%'WW]]4%8"""4gy#ABC	C +- 	1A))!,q!!!++A.aoo/0		1 ::$..v}}=#]]..446 \	c!==2248//1V;"77cBGMM"'',,/EyRY"Z[	\ M
 ==!!-fmm.E.E.L.L.NPWXHG11)L2IJJj#.:
:.&nn. )
d==$44tOGD	J 6 :zIJ )A55fmm6:6M6M6OQRTDNN4()	)  	#D66v}}dKGggll#99gNGMM'"	#
 r3   c                    g }| j                  |      }|j                  |d      }|j                  |j                               }|r||j	                  ||d         z  }||z   S )NFr   )r7  r  get_pchget_languageget_pch_use_args)rP   r)   r   r  pchpathincludeargsr  s          r4   get_pch_include_argszBackend.get_pch_include_args  si    --f5//?NN80023H--gqt<<DT!!r3   c                z    t        |      dk(  rd| dS t        j                  j                  |d         d   dz   S )Nr@   
meson_pch-z.objr   )r   r   r   r  )rP   r  r.  s      r4   r1  zBackend.get_msvc_pch_objname  s?    s8q=vT**wwA'*V33r3   c                   d| d| }t         j                  j                  | j                  |      |      }t         j                  j                  | j                  |      }t        j
                  t         j                  j                  |      d       dt         j                  j                  |       d}|dz   }t        |dd	
      5 }	|	j                  |       d d d        t        j                  ||       |S # 1 sw Y   !xY w)NrE  r  T)exist_okz
#include ""rH  rI  rJ  rK  )r   r   r   r7  r<   rO  r.  r   rP  r^  r   r_  )
rP   r   r  
pch_header	impl_namepch_rel_to_buildpch_filecontentpch_file_tmpr  s
             r4   create_msvc_pch_implementationz&Backend.create_msvc_pch_implementation  s     !av.	77<<(C(CF(KYW 77<<0@A
BGGOOH-=rww//
;<A>&(,g6 	!GGG	%%h=	 	s   C>>Dc                ~    	 t        j                  d|j                  t        d                  S # t        $ r Y yw xY w)Nrt   b_pchF)Tcastr-  r   KeyErrorr   s     r4   r/  zBackend.target_uses_pch  s:    	66&&"3"3Ig4F"GHH 		s   -0 	<<c                    g }| D ]6  }|j                  d      r|j                  dd      }|j                  |       8 |S )N)z-Dz/Dr  z\\)
startswithr  rM  )r  
extra_argsr  s      r4   escape_extra_argszBackend.escape_extra_args  sJ     #%
 	#C~~l+kk$/c"	#
 r3   c                    |j                   | j                  j                  |j                     v r|j	                         S g S ra   )r'   r   stdlibsr  get_no_stdinc_args)rP   r   r)   s      r4   get_no_stdlib_argszBackend.get_no_stdlib_args  s9    

 2 263E3E FF..00	r3   c                ^	   |j                         }|j                         }|| j                  ||      z  }||j                         z  }|r||j	                         z  }n@||j                  t        j                  d|j                  t        d                        z  }|j                  t        d            r||j                         z  }||j                  |      z  }|j                  t        d            }t        |t              sJ d       ||j                  |      z  }|j                  t        d            }t        |t              sJ d       ||j                  |      z  }|j                  t        d            }t        |t               sJ d       ||j#                  |      z  }|| j$                  j'                  ||j(                  |j*                        z  }|| j$                  j-                  ||j*                        z  }|| j.                  j0                  j3                  |j*                  |j5                               z  }d|v rd	|v sd
|v r|j7                  d       t        |t$        j8                        r||j;                         z  }t        |t$        j<                        r |j>                  r||j;                         z  }nIt        |t$        j<                  t$        j@                  f      r|jB                  r||jE                         z  }tG        |jI                               D ]  }	|	jK                         s|jL                  dk(  r|	jN                  dk(  rwt        |	tP        jR                        sJ |	jT                  dk(  r:|	jV                  .|	jV                  D ]  }
|
jY                  d      s|d|
dd  gz  } n |d|	jT                  gz  }nCt        |	tP        jZ                        r)||	j]                  d      z  }n||j_                  |	      z  }t        |t$        j@                        s	||	ja                  |      z  } |jL                  dk(  rKtc        |jd                  |jf                        D ](  }| ji                  |      }||jk                  |d      z  }* |S )Nr&   warning_levelwerror	buildtyperF  optimizationdebugz/Ziz/ZIz/Z7r7   r  zglib-2.0)z>=z==z--target-glibr
   z--pkgr6   F)6compiler_argsget_optionsr\  get_always_argsget_no_warn_argsget_warn_argsrR  rS  r-  r   get_werror_argsget_option_compile_argsr   r&   get_buildtype_argsget_optimization_argsrt   get_debug_argsr   get_project_argsrz   r  get_global_argsr   r,  get_external_argsr?  remover  get_pic_argsr  picr!  pieget_pie_argsreversedget_external_depsr  r'   r  r   ExternalDependencyr   version_reqsrV  ExternalLibraryget_link_argsget_dependency_compile_argsget_exe_argsr   r  r  r7  r  )rP   r   r)   no_warn_argscommands
copt_proxyr`  ra  rb  r
  reqltpriv_dirs                r4   generate_basic_compiler_argsz$Backend.generate_basic_compiler_args  s?    ))+'')
 	D++FH==H,,.. 1133H ..qvveV=N=NyYhOi=j/kllH
 Yx010022H 	H44Z@@ %%i&<=	)S)5:5)H//	::((>)BC,,8j8,H22<@@!!)G"45%&2
2&H++E22 	DJJ//&:K:KVM_M_`` 	DJJ..x9K9KLL 	D$$--??@R@RT\TiTiTkll XUh%6EX<MOOE"fe112--//Hfe112vzz--//H!4!4e6F6F GHVZZ--//H
 F4467 	7C99;  F*==K/%c<+J+JKKKxx:-#2B2B2N#&#3#3 &C"~~l; (_c!"g,F F %& #(( 33H\%A%AB 1 1& 99HH@@EE &%"2"23C,,X66)	70 	)F//1J1JK G66r:H55hFFG r3   c                   g }|D ]  }|j                         st        d|j                          d      | j                  |      }|sD|j	                         dk(  rd|z   }n|j                         |z   }|j                  |        |S )Nz)Tried to link with a non-library target "z".r5   z-Wl,)r   r   get_basenamer%  r?  get_linker_lib_prefixrM  )rP   r)   rs  r  r5   r  s         r4   build_target_link_argumentsz#Backend.build_target_link_argumentsD  s     
	A'')"%Nq~~O_N``b#cdd66q9C$$&#-sl446<KK
	 r3   c                   t               }| j                  j                  |j                     j	                         }|r/|j                  t        j                  j                  |d             | j                  j                  |j                     j                         }|r/|j                  t        j                  j                  |d             t        |t        j                        rs|j                  j                         D ]V  }|j                  |j!                  | j                               |j                  |j#                  | j                               X t%        |      S )Nbin)r   r   
propertiesr  get_rootr  r   r   r   get_sys_rootr   r   r   rY  rZ  r  get_program_dirsr  rn  )rP   r   r  rootsys_rootr  s         r4   get_mingw_extra_pathszBackend.get_mingw_extra_pathsS  s   !+**6+=+=>GGIIIbggll4/0##..v/A/ABOOQIIbggll8U34fe//0&&--/ DR001A1ABCR001A1ABCD E{r3   c                   | j                  d      r| dd  } t        |       }|j                         sy 	 |j                  d      }|j
                  j                  d      D ]  }t        |j
                        c S  |j                         r|j
                  }t        dj                  |j                         j                  dd	                  }|j                  d      D ]  }t        |      c S  y # t        $ r Y y w xY w)
N)z-lz-Lr
   T)strictz*.dllz/binz/libr@   )maxsplit)rV  r	   is_absoluteresolveFileNotFoundErrorparentglobr&   is_filer   r  rsplit)link_argr  r  binpathrw  s        r4   search_dll_pathzBackend.search_dll_pathd  s     |,|HN}}				&A w' 	!Aqxx= 	! 99;Av{{1::<#6#6v#6#JKLg& 	 Aw<	   ! 		s   C4 4	D ?D c           
        t               }|j                  D ]q  }|j                  dk(  r'|j                  dd      }|r|j	                  |       9|j                  t        dt        | j                  |j                                     s t        |j                  |j                        D ]=  }t        |t        j                        s|j                  | j!                  |             ? |S )a:  Find paths to all DLLs needed for a given target, since
        we link against import libs, and we don't know the actual
        path of the DLLs.

        1. If there are DLLs in the same directory than the .lib dir, use it
        2. If there is a sibbling directory named 'bin' with DLLs in it, use it
        r  bindirr   )r  default_valueN)r   r  r  get_variabler  r  filtermapr  r  r   r  r  r   r   r   extract_dll_paths)rK   r   resultsr
  r  r  s         r4   r  zBackend.extract_dll_paths  s     %'' 		RC}}+))HB)OKK'NN6$C,?,?(OPQ		R v**F,E,EF 	9A!U../s44Q78	9 r3   c                &   t               }t               }t        |t        j                        r?|j	                  |j                                |j	                  | j                  |             |D ]M  }|j                  |       t        |t        j                        s/|j	                  |j                                O |D ]Z  }t        j                  j                  | j                  j                         | j                  |            }|j                  |       \ t        |t        j                        rO| j                  j                  j                  |j                         s |j	                  | j#                  |             t%        |      S )zOn Windows there is no such thing as an rpath.

        We must determine all locations of DLLs that this exe
        links to and return them so they can be used in unit
        tests.
        )r   r   r   r   r  get_transitive_link_depsr  r  r   r   r   r   r   r   r  r  r  r  rn  )rP   r   r  rW  prospectivesbdeplddirsegs           r4   r  z%Backend.determine_windows_extra_paths  s5    !U69efe//0 ? ? ABMM$0089 	EDT"$ 1 12##D$A$A$CD	E
  	BWW\\$"2"2"@"@"BDDWDWXZD[\FJJv	 vu001$$--CCFDVDVWMM$44V<=F|r3   c                X    | j                  | j                  j                         |       y ra   )write_test_serialisationr   get_benchmarksrP   r  s     r4   r  zBackend.write_benchmark_file  s    %%djj&?&?&A8Lr3   c                X    | j                  | j                  j                         |       y ra   )r  r   	get_testsr  s     r4   r  zBackend.write_test_file  s    %%djj&:&:&<hGr3   c                   g }t        |d       D ]0  }|j                         }t        |t        j                        r|j                         }nHt        j                  j                  | j                  j                         | j                  |            g}t        |t        j                  t        j                  f      r|j                  }nt        j                   }|j"                  D ]K  }t        |t        j                        s|j                  t        j$                  u s;t        j$                  } n | j                  j'                  |      }| j                  j)                         }	| j                  j*                  |j                     }
|
j-                         s|
j/                         rg }t        |t        j0                        rt3        |j5                               }| j7                  ||      }|j"                  D ]J  }t        |t        j                        s| j7                  |g       D ]  }||vs|j9                  |        L ng }g }t;        |j<                        }t        |t        j>                        r|jA                  |       |j"                  D ]d  }t        |t        j>                        r|jA                  |       n5t        |t        jB                        r|jA                  |jD                         t        |tF        jH                        rct        j                  j                  | j                  j                         |jK                  | jL                              }|j9                  |       t        |tN              r|j9                  |       t        |t        j>                  t        jB                  f      r-|jQ                  | jS                  ||jT                               \tW        d       tY        jZ                  |j\                        }|
j-                         s|
j/                         s|
j_                         st;               }|D ]  }t        |t        j                        s|ja                         D ]r  }t        |t        jb                        s|jA                  t        j                  j                  | j                  j                         |je                                      t  |r|jg                  dt3        |      d       ti        |jk                         |jl                  |jn                  |||	| j                  jq                         |jr                  |||jt                  |jv                  |jT                  ||jx                  |jz                  t        |t        j>                        t        |t        j|                        |D cg c]  }|j                          c}| j                  j                  j                  |j                        }|j9                  |       3 |S c c}w )Nc                     d| j                   z  S )N)r   )tsts    r4   <lambda>z3Backend.create_test_serialisation.<locals>.<lambda>  s    rCLL/@ r3   )keyzBad object in test command.LD_LIBRARY_PATHr  )Csortedget_exer   r   r   r  r   r   r   r   r   r   r   r   r  r   r  r   HOSTis_cross_buildr  r  r  r  r   rn   get_transitive_build_target_depsr  rM  r   r   Targetr  r   r   r   r   r{  r   r&   r  construct_target_rel_pathsr   r   copydeepcopyr   	is_darwinget_all_link_depsr  r
  prependr   get_namer   r   r  r   r   r   r   r   r!  get_idr,  r_   r   )rP   testsarrr   r  r  test_for_machineais_crossr   r  r  r   r  r   r   t_envld_lib_pathr5   r  re  tss                         r4   create_test_serialisationz!Backend.create_test_serialisation  s   )+#@A N	A))+C#x778oo'ww||D$4$4$B$B$DdF^F^_bFcde# 1 183K3KLM#&??  $1#6#6  ZZ a!2!23}}(:(::+8+=+=(	 ''667GHH**::<K&&//@G!!#w'8'8':VXc5#5#56"&s'K'K'M"NK"@@kR 6A!!U%6%67!%!C!CAr!J 6A 3 + 2 21 566 !$&H+.qyy>G#u||,C ZZ Ha.KKN5#:#:;KK)a/T%5%5%C%C%EqGXGXY]YjYjGklAOOA&3'OOA&ELL%2I2I#JKOOD$C$CAqyy$QR()FGGH  MM!%%(E%%'0A0A0CGL]L]L_*-%  pA!!U%6%67!"!4!4!6 pA)!U-@-@A +T=M=M=[=[=]_`_k_k_m0n opp
 MM"3T+5FL"1::<#x#.0@0@0Q0Q0S#$==(E#$==!))QYY#.

AJJ#-c5<<#@#-c53C3C#D8?#@1AHHJ#@#'#3#3#<#<#D#D#$99	.B JJrN]N	^ 
	 $As   )Y.c                N    t        j                  | j                  |      |       y ra   )r  r  r  )rP   r  r  s      r4   r  z Backend.write_test_serialisation  s    D22598Dr3   c                   | j                  |      }t        |t        j                        r||xs d}t        |t        j                        r|j                         g}n<t        |t        j                  t        j                  f      sJ |j                         }|D cg c]"  }t        j                  j                  ||      $ }}|t        j                  j                  |      sJ |D cg c]:  }t        j                  j                  | j                  j                         |      < }}|D cg c]"  }t        j                  j                  ||      $ }}|S c c}w c c}w c c}w Nr  )r   r   r   r!  r   r   r   r   r   r   r   r   r   r   r   r   )rP   r   r   r1  outputsre  s         r4   r  z"Backend.construct_target_rel_paths  s    ((+
a))*w#*sJa**+~~'(Ga%"4"4e6M6M!NOOOmmoG8?@1277<<
A.@@77==)))RYZQrww||D$4$4$B$B$DaHZGZ<CDqrwwq'2DGD A [Ds    'E 0?E%5'E*c                l   | j                   j                  }|i| j                  j                  j	                  t        d            }t        |t              sJ d       |r!t        j                  j                  |d      }ny t        j                  j                  | j                  j                         d      }t        j                  j                  | j                  j                         |      }t        j                  j                  | j                  j                         t        j                  j                  |            }t        j                  j                  d|      }t        j                  j                  dt        j                  j                  |            }dd| j                   j                  j                         D 	
ci c]  \  }	}
|	|
j!                          c}
}	d}t#        |dd	
      5 }|j%                  t'        j(                  |             d d d        |j*                  j-                  t/        |||d ddd             | j                   j                  j1                         D ]  }|j2                  D ]  \  }}t        j                  j                  ||j5                               }t        j                  j                  ||j5                               }|j*                  j-                  t/        |||d |j6                  dd               y c c}
}	w # 1 sw Y   
xY w)N
licensedirrF  z
depmf.jsonr   zdependency manifestz1.0)rO   r_   projectsrI  rJ  rK  r   develdepmf)r}   r   )r   dep_manifest_namer   r,  r-  r   r   r&   r   r   r   r   
get_prefixr.  dep_manifestr[  to_jsonrP  r^  jsondumpsrf   rM  r   rZ  license_filesr-  rz   )rP   r5   
depmf_path
option_dir	ifilename	ofilenameodirnamer   out_dirr  r  mfobjr  mr   s                  r4   generate_depmf_installzBackend.generate_depmf_install(  sZ   ZZ11
))22==i>UVJj#.:
:.WW\\*lC
GGLL!1!1!?!?!A<P	GGLL!1!1!<!<!>
K	77<< 0 0 ; ; =rwwz?Z[77<<
J7'',,z277??:+FG.59=9P9P9V9V9XYAanY[)S73 	'qGGDJJu%&	' 	
oiHdB*1WF 	G((//1 	]A#$?? ]	4GGLL43E3E3GH	77<<1C1C1EFoiHd./llSZ\ ]]	] Z	' 	's   L#
<%L))L3c           
        t        | j                  j                         D cg c]#  }t        t	        | j
                        |z        % c}      }| j                  j                         r/|j                  | j                  j                  j                         |j                  | j                  j                  j                         |j                  d       | j                  |       t        |      S c c}w )zcList of all files whose alteration means that the build
        definition needs to be regenerated.zmeson-private/coredata.dat)r   r   get_build_def_filesr&   r	   r   r   r  r  r,  cross_filesconfig_filesr  check_clock_skewrn  )rP   dfrs  s      r4   get_regen_filelistzBackend.get_regen_filelistD  s     %)%5%5%I%I%KM! tD$5$56;< M N**,KK((11==>D$$--::;-.d#DzMs   (C6c                |   | j                         }t        | j                  j                         | j                  j	                         |      }t
        j                  j                  | j                  j                         d      }t        |d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)Nzregeninfo.dumpr  )r  r:   r   r   r   r   r   r   r  rP  r  r  )rP   rs  	regeninfor   r  s        r4   generate_regen_infozBackend.generate_regen_infoP  s    &&(d..==?"..<<>"$	 77<< 0 0 @ @ B 02(D! 	&QKK	1%	& 	& 	&s   B22B;c                "   dd l }|j                         }|D ]v  }t        j                  j                  | j                  j                         |      }t        j                  j                  |      }||z
  }|dkD  set        d| d|dd       y )Nr   gMbP?zClock skew detected. File z has a time stamp z.4fzs in the future.)timer   r   r   r   r   getmtimer   )rP   	file_listr  nowr  absfftimedeltas           r4   r  zBackend.check_clock_skewZ  s     	iik 	wA77<< 0 0 > > @!DDGG$$T*ECKE u}$'A$GYZ_`cYddt%uvv	wr3   c                    t        |t        j                        rJt        j                  j                  | j                  j                         | j                  |            g}|S |j                         }|S ra   )
r   r   r   r   r   r   r   r   r   r  )rP   btr  s      r4   build_target_to_cmd_arrayz!Backend.build_target_to_cmd_arrayj  s^    b%++,77<< 0 0 > > @$BZBZ[]B^_`C 
 .."C
r3   c                l    g }|D ],  }|dk(  r||j                         z  }|j                  |       . |S )Nz@EXTRA_ARGS@)get_extra_argsrM  )rP   r  r*  
final_argsr  s        r4   replace_extra_argszBackend.replace_extra_argsq  sG    "$
 	%AN"g4466
!!!$		%
 r3   c           	     X   g }t        j                  d      }|D ]  }|j                  |      }|gt        |j	                  d            }d| d}	|j                  |	t        j                  j                  |||               }|j                  |      }|g|j                  |        |S )Nz@OUTPUT(\d+)@r@   z@OUTPUT@)
r  r  searchr   r  r  r   r   r   rM  )
rP   r  private_diroutput_listnewargsregexr  r  indexr<  s
             r4   replace_outputszBackend.replace_outputsz  s    !

+, 	 CS!A-AGGAJwa(kk#rww||KUAS'TULL%	 -
 NN3	  r3   c                    t               }| j                  j                         j                         D ]  \  }}|j                  s|||<    |S ra   )r   r   get_targetsr[  build_by_default)rP   rW  r   bs       r4   get_build_by_default_targetsz$Backend.get_build_by_default_targets  sL    WbWdzz--/557 	!GD!!! t	! r3   c                d   t               }|r| j                  j                         n| j                  j                         }|D ]  }|j                  }t        |t        j                  t        j                  f      r|||j                         <   |j                  D ]@  }t        |t        j                  t        j                  f      s.|||j                         <   B |j                  D ]A  }t        |t        j                  t        j                  f      sJ |||j                         <   C  |S ra   )r   r   r  r  r  r   r   r   r  r   r   )rP   	benchmarkrW  rb   r   r  r  r
  s           r4   get_testlike_targetszBackend.get_testlike_targets  s    U`Ub1:$**++-

@T@T@V 
	+A%%C# 2 2E4E4EFG'*szz|$zz +!#(:(:E<M<M'NO'*szz|$+ yy +!#(:(:E<M<M'NOOO'*szz|$+
	+ r3   c                    g }|j                         D ]\  }| j                  j                  |      s|j                  t        j
                  j                  | j                  |      |             ^ |S ra   )r   r   
is_libraryrM  r   r   r   r   )rP   generated_sourcelibsr  s       r4   .get_custom_target_provided_by_generated_sourcez6Backend.get_custom_target_provided_by_generated_source  sd    !--/ 	TA**1-BGGLL)<)<=M)NPQRS	T r3   c                    g }|j                         D ]=  }t        |t        j                        s|j	                  | j                  |             ? |S ra   )get_generated_sourcesr   r   r   r  r  )rP   r   r  r   s       r4   $get_custom_target_provided_librariesz,Backend.get_custom_target_provided_libraries  sR    --/ 	PAa!3!34KKKKANO	P r3   c           	        g }|j                         D ]C  }t        |t              r8t        j                  j                  | j                  |j                  |      g}nt        |t        j                        r| j                  |      g}ntt        |t        j                  t        j                  f      rK|j                         D cg c]1  }t        j                  j                  | j                  |      |      3 }}nt        |t        j                        rK|j                         D cg c]1  }t        j                  j                  | j!                  |      |      3 }}nt        |t        j"                        r| j%                  |      }nnt        |t&        j(                        r8|j+                         sJ d       |j                  J d       |j                  g}n|j-                  | j                        g}|j.                  rE|D cg c]:  }t        j                  j                  | j0                  j3                         |      < }}||z  }F |S c c}w c c}w c c}w )z
        Custom target sources can be of various object types; strings, File,
        BuildTarget, even other CustomTargets.
        Returns the path to them relative to the build root directory.
        zThis shouldn't be possiblerF  )get_sourcesr   r&   r   r   r   r   subdirr   r   r   r   r   r   get_custom_target_output_dirGeneratedListr7  r|  rx  r   r   r  r{  absolute_pathsr   r   )rP   r   rb  r  rq   r  r  s          r4   get_custom_target_sourcesz!Backend.get_custom_target_sources  s    ##% 	A!S!d&7&7JKAu00111!45A 2 2E4K4KLMXYXeXeXghSTd&G&G&JANhhAu223WXWdWdWfgRSd&A&A&&I1MggAu556//2Ax778wwy>">>yvv)5:5)**4+<+<=>$$TYZqd&6&6&D&D&FJZZEMD'	(  ig [s   	6I.6I!?I&c                   g }|j                   D ]5  }t        |t        j                        r|rR|j	                  |j                  | j                  j                         | j                  j                                      r|j	                  |j                  | j                               |rS|j	                  t        j                  j                  | j                  j                         |j                  |             |j	                  t        j                  j                  | j                  |j                  |             8 |S ra   )depend_filesr   r   r   rM  r  r   r   r   r{  r   r   r   r   r  )rP   r   r   rs  r  s        r4   get_target_depend_fileszBackend.get_target_depend_files  s    $$ 	SA!X]]+!KK0@0@0O0O0Q040@0@0N0N0P!R S KK 1 1$2C2C DE!KKT-=-=-L-L-NPVP]P]_` abKKT->->q QR	S r3   c                $    | j                  |      S ra   )r   r   s     r4   r  z$Backend.get_custom_target_output_dir  s     ""6**r3   c                @    t         j                  j                  |      S ra   )r   r   r  )rP   r"  s     r4   get_normpath_targetzBackend.get_normpath_target  s    ww''r3   c               r   g }|j                         D ]  }t        |t        j                  t        j                  f      s.| j                  | j                  |            }|sd}|r8t        j                  j                  | j                  j                         |      }||vs|j                  |        |S r  )r  r   r   r   r   r'  r  r   r   r   r   r   rM  )rP   r   r)   r  custom_target_include_dirsr  idirs          r4   get_custom_target_dirszBackend.get_custom_target_dirs  s    24"--/ 	8A a%"4"4e6M6M!NO++D,M,Ma,PQDww||D$4$4$B$B$DdK55*11$7	8 *)r3   c               f    g }| j                  |||      D ]  }||j                  |d      z  } |S )Nr  F)r+  r  )rP   r   r)   r  incsr  s         r4   "get_custom_target_dir_include_argsz*Backend.get_custom_target_dir_include_args  sF     ,,VX],[ 	8AH--a77D	8r3   c           	     N   | j                   }d}| j                  |      }|rl| j                  j                         }| j                  j	                         }t
        j                  j                  | j                  j	                         |      }|j                         D cg c]"  }t
        j                  j                  ||      $ }}| j                  |      }g }	|j                  D ]a  }t        |t        j                        r|	| j                  |      z  }	3t        |t        j                        rD|j                         d   }
t
        j                  j                  | j                  |      |
      }nt        |t         j"                        rd|j%                  | j                         }|j&                  s|r|t
        j                  j                  | j                  j	                         |      }nBt        |t(              rd|v r|j+                  d|      }d|v r|j+                  d|      }d|v r:|j+                  dt
        j                  j                  ||j,                              }d|v rc|j.                  d|j0                  d}t3        |      t
        j                  j                  ||j.                        }|j+                  d|      }d	|v r\|j&                  r| j5                  |      }n| j7                  |      }|j+                  d	|      }nt9        d
| dt;        |             |	j=                  |       d t!        j>                  ||      }t!        j@                  |	|      }	|	D cg c]  }|j+                  dd       }	}|||	fS c c}w c c}w )Nr  r   z@SOURCE_ROOT@z@BUILD_ROOT@z@CURRENT_SOURCE_DIR@	@DEPFILE@zCustom target z/ has @DEPFILE@ but no depfile keyword argument.z@PRIVATE_DIR@z	Argument z is of unknown type r  r  )!r   r  r   r   r   r   r   r   r   r!  commandr   r   r   r  r   r   r   r{  r   r&   r  r  depfiler   r   r9  r7  r   rO   rM  get_filenames_templates_dictsubstitute_values)rP   r   absolute_outputssource_root
build_rootrr   r  r  inputsr  tmpr  	dfilenamepdirrZ  s                  r4   eval_custom_target_commandz"Backend.eval_custom_target_command  s   
 ''
226:**99;K))779JWW\\$"2"2"@"@"BFKF4:4F4F4HIq277<<*II//7 %	A!U../t55a88Au112 mmoa(GGLL!B!B1!EsKAx}}-%%d&7&78((,<T%5%5%C%C%EqIA As#"a'		/;?A!Q&		.*=A)Q.		"8"'',,{TZTaTa:bcA!#~~- .v{{o >2 2,S11 "VV^^ DI		+y9A"a',,#>>vF#::6B		/48A"Yqc1Ed1gY#OPPJJqMK%	N 66vwG((f5& .11qyys#11w##A J~ 2s    'N=N"c                   |j                   r|j                   nt        j                         }|j                  rt	        | j
                  j                         dgz         }|j                  d| j
                  j                         g       |j                  d| j
                  j                         g       |j                  d|j                  g       |j                  d|g       |S )N
introspectMESON_SOURCE_ROOTMESON_BUILD_ROOTMESON_SUBDIRMESONINTROSPECT)r   r   EnvironmentVariablesdefault_envr   r   r  r   r   r   r  )rP   r   r   introspect_cmds       r4   get_run_target_envzBackend.get_run_target_envS  s    "JJfjjH,I,I,K&t'7'7'I'I'K|n'\]NGG'$*:*:*I*I*K)LMGG&)9)9)G)G)I(JKGGNV]]O4GG%'78
r3   c                x   ddl m} t        | j                  j	                         dgz         }| j                  j                         | j                  j                         |d}| j                  j                  D ]>  }dj                  |j                        }t        j                  d|        |||       @ y )Nr
   )run_exer>  )r?  r@  rB   zRunning postconf script )scripts.meson_exerH  r   r   r  r   r   r   postconf_scriptsr   r   r   log)rP   rH  rE  r   r  r   s         r4   run_postconf_scriptszBackend.run_postconf_scripts]  s    /"4#3#3#E#E#G<.#XY$($4$4$C$C$E#'#3#3#A#A#C"0
 ,, 	A88AJJ'DHH/x89AsO	r3   c           
        | j                   j                  t        j                  d      }|G| j                   j	                         rt        j                  d       nt        j                  d   d   g}| j                   j                  j                  t        d            }t        |t        t        f      sJ d       t        | j                   j!                         | j                   j#                         | j                   j%                         | j                   j'                         ||| j                   j)                         dgz   | j                   j                  j*                        }| j-                  |       | j/                  |       | j1                  |       | j3                  |       | j5                  |       | j7                  |       | j9                  |       | j;                  |       | j=                  |       |S )Nru   zFCross file does not specify strip binary, result will not be stripped.r   r]   rF  r>  )r   lookup_binary_entryr   r  r  r   r   r   defaultsr,  r-  r   r   r&   r   rY   r   r   r  
get_libdirr  r_   r  generate_target_installgenerate_header_installgenerate_man_installgenerate_emptydir_installgenerate_data_installgenerate_symlink_installgenerate_custom_install_scriptgenerate_subdir_install)rP   r\   umaskr5   s       r4   create_install_datazBackend.create_install_dataj  s   $$889K9KWU	..0ef $__W5a89	  ))44Y5OP%#s,8j8,((779((668((335((335!((::<~M((1199; 	##A&$$Q'$$Q'!!!$&&q)""1%%%a(++A.$$Q'r3   c                    t         j                  j                  | j                  j	                         d      }t        |d      5 }t        j                  | j                         |       d d d        y # 1 sw Y   y xY w)Nzinstall.datr  )	r   r   r   r   r  rP  r  r  r[  )rP   install_data_filerd  s      r4   create_install_data_filesz!Backend.create_install_data_files  s_    GGLL)9)9)I)I)K][#T* 	;eKK002E:	; 	; 	;s   %A33A<c                <   | j                   j                         }t        || j                   j                               }t        || j                   j	                               }t        || j                   j                               }| j                   j                  j                  t        j                  d            }t        |t              sJ d       t        ||      }|r t        ||t        |      j                        nt        ||      }	||	j                  v ry||	j                  v r|	j                  dv ry|	j                  dv r=y||	j                  v ry||	j                  v ryd|	j                  v ry	d
|	j                  v ry
t!        j"                  d|	       y )N	localedirrF  runtime>   .pcr  r  >   r  r  i18nzinstalled-testsr  	systemtapzFailed to guess install tag for)r   r  r	   
get_bindirrQ  get_includedirr,  r-  r   r   r   r&   r   parentsr@  r  r   rb  )
rP   rq   rr   rZ   r  r[   incdir_ldirr`  	dest_paths
             r4   guess_install_tagzBackend.guess_install_tag  sf   !!,,.fd..99;<fd..99;<fd..==?@  ))44X5G5G5TU%%1z1%'	>DDe)9)9:$vW\J]	Y&&&y(((=0!!_4 y((()+++)//1IOO+

4i@r3   c                   | j                   j                         j                         D ]  }|j                         s|j	                         \  }}}t        |      t        |j                               }}|d|hvr7d}t        |j                  |j                  ||j                         |            t        |j                        |k(  sJ |j                         }	|d   }
|d   }t        |t         j                        rt        |t         j                         }|xr |j                  t!        d            }t        |t"              sJ d       |
dur||j                  d   xs t        |t         j                        rdnd}|j%                  |j&                        }t)        | j+                  |      |
||||j,                  |j.                  |	|j0                  ||	      }|j2                  j5                  |       |j7                         D ]\  \  }}}t8        j:                  j=                  |
|      }t?        |||
|j0                  |d
      }|j@                  j5                  |       ^ t        |t         jB                  t         jD                  t         jF                  f      r+|jI                         r|r|
}n| jJ                  jM                         }t)        | jO                  |      ||di tQ               d|	|j0                  t        |t         jD                        d      }|j2                  j5                  |       |s|jS                         rt8        j:                  j=                  | jU                  |      |jS                               }t)        ||
|di tQ               d|	|j0                  d
d      }|j2                  j5                  |       |dkD  stW        |j                         dd  |dd  |dd  |j                  dd        D ]}  \  }}}}|du rt8        j:                  j=                  | jU                  |      |      }t)        |||di tQ               d |	|j0                  |
      }|j2                  j5                  |        et        |t         jX                        s|dk(  r|dkD  r|
dustW        |j                         |j                        D ]  \  }}|xs | j[                  ||
      }t8        j:                  j=                  | jU                  |      |      }t)        ||
|di tQ               d |	|j0                  |j\                   |      }|j2                  j5                  |        RtW        |j                         |||j                        D ]  \  }}}}|du r|xs | j[                  ||      }t8        j:                  j=                  | jU                  |      |      }t)        |||di tQ               d |	|j0                  |j\                   |      }|j2                  j5                  |         y )Nr@   zTarget {!r} has {} outputs: {!r}, but only {} "install_dir"s were found.
Pass 'false' for outputs that should not be installed and 'true' for
using the default installation directory for an output.r   ru   rF  Fr  ra  )r}   r~   T)r   r   )r{   r}   r}   )/r   r  rZ  should_installget_install_dirr   r   r   formatr   install_tagget_custom_install_moder   r   r  r-  r   rt   get_link_deps_mappingrZ   rp   r   rw   rx   rz   rb   rM  get_aliasesr   r   r   r   rg   r  SharedModuler!  r  r   get_import_lib_dirr%  r   r  r   zipr   rk  r  )rP   r5   r   outdirsinstall_dir_namescustom_install_dirnum_outdirsnum_outr  ry   first_outdirfirst_outdir_namer~   should_stripr}   mappingsr  aliastor  implib_install_dir
debug_fileoutputrr   rs   r  s                             r4   rR  zBackend.generate_target_install  s   '')002 {	,A##%=>=N=N=P:G&(:#&w<Q]]_1EK1g,.N %QXXaffgq}}P[%\]]q}}%000446L"1:L 1! 4 !U../ !+1e.A.A BB	(MQ\\)G:L-M!,5AzA5  u,--*l*QH[H[:\wbkC 66qxx@H)$*B*B1*E|*;*6!BXBX*+//<.1Y	HA
 II$$Q'*+--/ -r3 "\5 A.r5,VYimn

))!,-
 "!e&9&95;M;MuO_O_%`a 0021 6B 2595E5E5X5X5Z 2 1$2V2VWX2Y2DFW27SUB23,,TUW\WiWiIj6=	!?A
 II,,Q/+0D0D0F)+d6I6I!6LaNbNbNd)eJ 1*l2C27SUB2>;?W	!NA
 II,,Q/?<?PQPR@SU\]^]_U`bstutvbwyz  zG  zG  HI  HJ  zK  =L ,8S!U?$GGLL)<)<Q)?H-aeRQTQVX\.:ALL257 		((+, Au112 !#!#50+.q}}+N 0KFC"%"U)?)?)UC "T-@-@-CV LA 1!\CT27SUD,23,,QM_M_I_69!;A II,,Q/0 =@QXZkmnmzmz<{ 
,8S!U?$!KT%;%;FF%KGGLL)<)<Q)?H-a.3Rl./llI[I[E[257 		((+
,c{	,r3   c                    | j                   j                  |_        |j                  D ]>  }|j                  rt        j                  ddj                  |j                               @ y )Nz/Failed to guess install tag for install script:rI  )r   rh   r}   r   rb  r   r   )rP   r5   r  s      r4   rX  z&Backend.generate_custom_install_script'  sQ     JJ66"" 	dA55

LchhWXWaWaNbc	dr3   c                   | j                   j                         }| j                  j                         }| j                   j	                         }| j                   j                         }|D ]  }|j                         x}}|W|j                         }	|	|}d}n@t        j                  j                  ||	      }t        j                  j                  d|	      }|j                         D ]c  }
|
j                  ||      }t        ||||j                         |j                  d|j                         }|j"                  j%                  |       e  y )Nz{includedir}r  )r}   r   )r   rf  r   get_headersr   r   get_custom_install_dirget_install_subdirr   r   r   r  r  r   rr  rz   r   rc   rM  )rP   r5   incrootrc   r	  builddirhrr   rs   r  r  abspathr  s                r4   rS  zBackend.generate_header_install-  s0   ""113**((*!!002##113 	$A#$#;#;#==F[~--/>$F"0KWW\\'6:F"$'',,~v"FK]]_ $//&(;#GV[!B[B[B]_`_k_kqx  KL  K\  K\  ]		  #$	$r3   c           
        | j                   j                         }| j                  j                         }|D ]  }|j	                         D ]  }|j                  d      d   }|j                         }|^|j                  r/t        j                  j                  d|j                  d|z         }n#t        j                  j                  dd|z         }|j                  }|j                  r|j                  d|j                   d      }|j                  | j                   j                         | j                   j                               }	t        j                  j                  |t        j                  j!                  |            }
|
j                  d|      }t#        |	||
|j%                         |j&                  d      }|j(                  j+                  |         y )Nr  r  z{mandir}rd   r   rm  )r   
get_mandirr   get_manr  r  r  localer   r   r   rq   r  r  r   r   r   r   rr  rz   rd   rM  )rP   r5   manrootrd   r  r  numr  rq   srcabsdstnamedstabsr  s                r4   rT  zBackend.generate_man_installC  sm   ""--/jj  " 	 A]]_  ggcl2&113>xx!#j!((ECK!P!#j%#+!F88!MMAahhZ."=E)9)9)H)H)JDL\L\LjLjLlm'',,vrww/?/?/FG W=#FFGQ=V=V=XZ[ZfZflqrQ 	 r3   c                &   | j                   j                         }|D ]r  }|j                  xs | j                  |j                        }t        |j                  |j                  |j                  |      }|j                  j                  |       t y ra   )
r   get_emptydirrq  rk  r   r   ry   rz   re   rM  )rP   r5   re   r  r}   r  s         r4   rU  z!Backend.generate_emptydir_installX  sn    +/::+B+B+D 	!A--A4#9#9!&&#ACcJAJJa 	!r3   c                ,   | j                   j                         }| j                  j                         }| j                  j	                         }|D ]@  }t        |t         j                        sJ |j                  }|j                  }t        |j                  |j                        D ]  \  }}	t        |t        j                        sJ t        j                  j!                  ||	      }
t        j                  j!                  ||	      }|j"                  xs | j%                  |
      }t'        |j)                  ||      |
||j*                  |j,                  ||j.                  |j0                        }|j2                  j5                  |        C y )N)r}   r   r   )r   get_datar   r   r   r   Datainstall_dirinstall_dir_namerw  r+   renamer   r   r   r   r   rq  rk  r   r  ry   rz   r   r   rf   rM  )rP   r5   rf   r	  r  der  subdir_namesrc_filedst_namedst_absdstdir_namer}   r  s                 r4   rV  zBackend.generate_data_install_  s=   zz""$!!002##113 	!Bb%**---^^F--K&)"**bii&@ !"(!(HMM:::'',,vx8 ggll;AnnG(>(>w(G#H$:$:68$LgWb$&OOR]]WYWcWc464F4FH a !		!r3   c                   | j                   j                         }|D ]  }t        |t         j                        sJ |j                  }t
        j                  j                  ||j                        }|j                  xs | j                  |      }t        |j                  |||j                  |      }|j                  j                  |        y ra   )r   get_symlinksr   SymlinkDatar  r   r   r   r   rq  rk  r   r   rz   rg   rM  )rP   r5   linksr  r  name_absr}   r  s           r4   rW  z Backend.generate_symlink_installq  s    +/::+B+B+D 	!Aa!2!2333--Kww||K8H--C4#9#9(#CC"188X{ALLRUVAJJa 	!r3   c                   | j                   j                         D ]<  }|j                  r| j                  j	                         }n| j                  j                         }t        j                  j                  ||j                  |j                        j                  d      }t        j                  j                  | j                  j                         |j                        }t        j                  j                  d|j                        }|j                  |j                  k7  r|j                  }|j                  szt        j                  j                  |t        j                  j!                  |            }t        j                  j                  |t        j                  j!                  |            }|j"                  xs9 | j%                  t        j                  j                  |j                  d            }t'        ||||j(                  |j*                  |j,                  ||j.                        }|j0                  j3                  |       ? y )Nr  r   dummy)r   )r   get_install_subdirsfrom_source_dirr   r   r   r   r   r   source_subdirinstallable_subdirrstripr  r  r  strip_directoryr   rq  rk  r   ry   r   rz   r   ri   rM  )	rP   r5   sdfrom_dirsrc_dirdst_dirr  r}   r  s	            r4   rY  zBackend.generate_subdir_install{  s   **002 	(B!!++::<++99;ggll8#%#3#3#%#8#8::@&+  ggll4#3#3#>#>#@#%>>3Gww||J?H~~!4!44..%%'',,w0@0@0IJ77<<"''2B2B72KL..aD$:$:277<<X_;`$aC!'7Hboorzz[][h[hjm242D2DFA$$Q''	(r3   c           
        t        |t        j                  t        j                  f      r=|j                  }g }|D ]
  }t        |t
        j                        r+||j                  | j                  | j                        gz  }It        |t              r/|t        j                  j                  | j                  |      gz  }t        |t        j                  t        j                  f      s||j                         D cg c];  }t        j                  j                  | j                  |j                         |      = c}z  } |D cg c]!  }t        j                  j!                  |      # }}g }t        |t        j                        r|j"                  }	|	D ]  }t        |t
        j                        r+||j                  | j                  | j                        gz  }Ht        |t              r||gz  }_t        |t        j                  t        j                  f      r||j                         z  }t%        dt'        |      j(                   d       d|g |g dgS g S c c}w c c}w )aK  
        Returns a list of source dicts with the following format for a given target:
        [
            {
                "language": "<LANG>",
                "compiler": ["result", "of", "comp.get_exelist()"],
                "parameters": ["list", "of", "compiler", "parameters],
                "sources": ["list", "of", "all", "<LANG>", "source", "files"],
                "generated_sources": ["list", "of", "generated", "source", "files"]
            }
        ]

        This is a limited fallback / reference implementation. The backend should override this method.
        zType "z;" is not supported in get_introspection_data. This is a bugunknown)r'   r)   r*   r+   r,   )r   r   r   r   r+   r   r   r  r;   r<   r&   r   r   r   r   r
  r  r1  r   rO   r.   )
rP   	target_idr   source_list_rawsource_listjr0  r  r)   tmp_compilers
             r4   get_introspection_datazBackend.get_introspection_data  s    fu1153D3DEF$nnOK$ na/AOODOOT^^$T#UUK3'BGGLL!$D#EEKE$6$68I8I#JK]^]j]j]l#mXYBGGLLQR$S#mmKn 9DD1277++A.DKD$&H&%"4"45%~~% CA!!X]]3 Q__T__dnn%U$VV#As+ QC#A(9(95;M;M'NO AMMO3*VDG4D4D3E  FA  ,B  C  CC &$ &%'   	1 $nDs   A I+&I0c                |   t        j                         }t               }t               }| j                  j                  t
        j                     }| j                  j                  t
        j                     }|j                          xr |j                         }| j                  j                         j                         D ]+  }|j                         xr |j                         d    }|j                  t
        j                  k7  s|sJt        j                   j#                  | j                  j%                         | j'                  |            }	t)        |t        j*                        rT|j-                  |	       |j                         s|j/                         s|j1                  | j3                  |g              t)        |t        j4                        s|j-                  |	       . |r|j1                  |       |r|r|j7                  dt9        |      d       ny|j                         s|j/                         r|j1                  |       nG|j;                         r|j7                  dt9        |             n|j7                  dt9        |             |r|j7                  dt9        |             |S )Nr
   WINEPATH;)	separatorDYLD_LIBRARY_PATHr  PATH)r   rC  r   r   r  r   r  r  r  r   r  rZ  rn  ro  r  r   r   r   r   r   r   r!  r  r  r  r  r  r  rn  r  )
rP   r   r   library_pathsbuild_machinehost_machine	need_winer   in_default_dirtdirs
             r4   
get_devenvzBackend.get_devenv  s   ++-e((11-2E2EF''001C1CD%0022P|7N7N7P	'')002 	(A--/N8I8I8KA8N4NN}} 2 22.77<< 0 0 > > @$BUBUVWBXYD!U--. %**,0F0F0H "(()K)KAr)RSAu223 !!$'%	(& 
   -J](;sK((*l.D.D.F""=1'')/m1DE-tM/BCKK[ 12
r3   c                D   |j                         }t        j                  |d         }|dd }| j                  ||      }||j	                  dd      z  }||j                  d      z  }||j                         dgz   z  }|| j                  ||      z  }|| j                  ||      z  }|| j                  |j                  |j                                     z  }t        j                  |||j                         z   |gd      }	|	j                  || j                         S )	z
        Some backends don't support custom compilers. This is a convenience
        method to convert a Compiler to a Generator.
        r   r@   Nz@OUTPUT@r0  z@INPUT@z@PLAINNAME@.d)r2  )get_exelistr   r   r  get_dependency_gen_argsget_output_argsget_compile_only_argsr  r  rX  r  r?  r   	Generator	to_nativeprocess_filesr   )
rP   r   r)   r+   output_templexelistr  r  r~  	generators
             r4   compiler_to_generatorzBackend.compiler_to_generator  s     &&(&&wqz2qr{44VXFH44ZMMH,,Z88H224	{BBD44VXFFD33FHEE 	D**6+@+@AVAVAX+YZZOOC0B0B0D)D|n^mn	&&w0@0@AAr3   c                    t        j                  d|j                        t        j                  d|j                        z   }| j	                  ||j
                  ||j                        S )N_ALL_SOURCES_TYPE)rR  rS  r+   	generatedr  r)   r  )rP   r   all_sourcess      r4   compile_target_to_generatorz#Backend.compile_target_to_generator  sQ    ff0&..AAFFK^`f`p`pDqq))&&//;PVPcPcddr3   )r   T.Optional[build.Build]r   T.Optional['Interpreter'])FN)r   rt   r   ro  rR   zT.Optional[dict])r   .T.Union[build.Target, build.CustomTargetIndex]r   rt   rR   r&   )r   r  rR   r&   )r   build.BuildTargetrR   r|   )r   r  r)   
'Compiler'r  rt   rR   r(   )r   r  rR   r|   )r   build.Targetr0  r  rR   r&   )r   r  rR   r&   )r   GT.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]rR   r&   )r   r  r;  zIT.Union[build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]r<  r&   rR   r&   )r   r  r@  r&   rA  r   rR   zmesonlib.File)r   r  rR  r&   rR   zT.List[mesonlib.File])ri  r&   rj  r&   rR   r&   )r   )r   r  rq  r&   rR   4T.Tuple[T.List[str], T.List[build.BuildTargetTypes]])rv  zbuild.ExtractedObjectsrq  r&   rR   r(   )r   r  rv  z8T.Sequence[T.Union[str, 'File', build.ExtractedObjects]]rq  r&   rR   r  )r   r  rR   rt   )r   r  rR   r(   )NNNNNNFN)r  z_T.Sequence[T.Union[programs.ExternalProgram, build.BuildTarget, build.CustomTarget, File, str]]r   r|   r  %T.Optional[T.List[build.BuildTarget]]r   r|   r  r|   r   )T.Optional[mesonlib.EnvironmentVariables]r}   r|   r   rt   r  zT.Optional[T.Dict[str, str]]rR   z'ExecutableSerialisation')NNNNFNF)r  z\T.Union[str, mesonlib.File, build.BuildTarget, build.CustomTarget, programs.ExternalProgram]r   zhT.Sequence[T.Union[str, mesonlib.File, build.BuildTarget, build.CustomTarget, programs.ExternalProgram]]r   r|   r  r  r   r|   r  r|   r  rt   r   r  r   rt   rR   zTT.Tuple[T.Sequence[T.Union[str, File, build.Target, programs.ExternalProgram]], str])rR   zT.Tuple[str, str])r   r  rR   z9T.Tuple[T.Union['Compiler', 'StaticLinker'], T.List[str]])r[   r&   rY  zT.Mapping[str, 'Compiler']r   z'Environment'rR   rt   )r   r  rR   
T.Set[str])r  r(   rR   r  )T)r   r  r  rt   rR   'ImmutableListProtocol[str]')r   r  rR   zT.Tuple[str, ...])rq   r&   rR   r&   )r   r  r"  z'FileOrString'rR   r&   )r5  z'build.ExtractedObjects'rq  r&   rR   r(   )r)   r  r   r  rR   r(   )r  r&   r.  r(   rR   r&   )r   r  r  r&   rI  r&   rR   r&   )r  r(   rR   r(   )r   z'build.BuildTarget'r)   r  rR   r(   )F)r   r  r)   r  r}  rt   rR   z'CompilerArgs')r)   r  rs  zT.List[build.Target]rR   r(   )r  r&   rR   r|   )r   z\T.Union[build.BuildTarget, build.CustomTarget, programs.ExternalProgram, mesonlib.File, str]r  z:T.Sequence[T.Union[build.BuildTarget, build.CustomTarget]]rR   r(   )r  
T.BinaryIOrR   rm   )r  T.List['Test']rR   zT.List[TestSerialisation])r  r  r  r  rR   rm   )r   r  r   r|   rR   r(   )r5   rY   rR   rm   )rR   r(   rl   )r  zT.Iterable[str]rR   rm   )r  z4T.Union[build.BuildTarget, programs.ExternalProgram]rR   r(   )r  r(   r*  z'build.GeneratedList'rR   r(   )r  r(   r  r&   r  r(   rR   r(   )rR   zD'T.OrderedDict[str, T.Union[build.BuildTarget, build.CustomTarget]]')r  rt   rR   zBT.OrderedDict[str, T.Union[build.BuildTarget, build.CustomTarget]])r  build.CustomTargetrR   r  )r   z.T.Union[build.BuildTarget, build.CustomTarget]rR   r  )r   r  rR   r(   )r   z.T.Union[build.CustomTarget, build.BuildTarget]r   rt   rR   r(   )r"  r&   rR   r&   )r   r  r)   r  r  rt   rR   r(   )r   r  r5  rt   rR   z.T.Tuple[T.List[str], T.List[str], T.List[str]])r   zbuild.RunTargetrR   r   )rR   rY   ra   )rq   r&   rr   r|   rR   r|   )r  r&   r   r  rR   z!T.List['TargetIntrospectionData'])rR   r   )
r   r  r)   r  r+   r  r  r&   rR   build.GeneratedList)r   zbuild.CompileTargetrR   r  )_r.   r/   r0   r1   r   r   r   r   r   r  r  r  r  r%  r   r   r3  r5  r7  r9  r=  rC  rf  staticmethodr   rt  rx  rl  r  r  r  r  r  r  r  r  r  r  r  r  r&  r  rC  r1  rO  r/  rX  r\  r  r  r  r  rS   r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r!  r$  r  r'  r+  r.  r<  rF  rM  r[  r^  rk  rR  rX  rS  rT  rU  rV  rW  rY  r  r  r  r  r2   r3   r4   r   r     s   **DP2T sw >`f uz 9 ty 8X0 t 7!^c tFaF]F F F F X&)X36X;HX(T H H3!U3
-&^58=q<   (,AE'+$(=A#'!;?FavFa$Fa ?Fa %	Fa
 "Fa ;Fa !Fa Fa 9Fa E^FaT 9=RV8<595:NR-2_$ (P_$&5_$ +P_$ '6	_$
 $3_$ /3_$ #L_$ '+_$ 8L_$B)  8  B t, ,^"3   ZD8t"4 "  
aF" t  4 t  4vSXc:MHQfE&]8
&w   t  t : + t( ( 6;*.2*?J*( #(,8B,7 HML$,L$@DL$:L$\>;
6|,|d$, *!!$!(,0d+ZB(2B'8B -0B 5HB0er3   r   )NN)r   r&   r   r  r   r  rR   T.Optional['Backend'])r   r&   r   r  r   r  rR   r  )O
__future__r   collectionsr   dataclassesr   r   	functoolsr   	itertoolsr   pathlibr	   r  enumr  r   r  r  r  typingrR  r  r   r   r   r   r   r   rY  r   r   r   r   r   r   r   r   r   r   TYPE_CHECKING_typingr   arglistr   r   r   r   r   r   r   linkers.linkersr    r!   r"   typing_extensionsr#   ListUnionr   r   r  r  r%   r3  r:   Enumr?   rU   rY   rp   r   r   r   r   r   r   r   r   r2   r3   r4   <module>r     s   # # *       	  	         7   ??/&$)/.1+qwwtU-?-?AXAXZ_ZmZm'mno') ' , 
e  
499 < e   e= = =, eP P P( e      e- - - e       eJ J J8"J|e |er3   