
    e                      d dl mZ d dlmZmZ d dlmZmZ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mZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ejv                  rd dl<m=Z=m>Z> ddlm?Z? ddl@mAZA ddlBmCZC ddl/mDZD ddlEmFZFmGZG ddlHmIZI ddl8mJZJ ddlKmLZL ddlmMZMmNZNmOZO ddlPmQZQ ddlRmSZS ddlTmUZU ej                  d   ZWej                  d   ZXej                  d   ZYej                  eZddd f   Z[ G d! d"e>      Z\d#d$hZ]e5D  ch c]  } |  d%	 c} Z^e^h d&z  Z^h d'Z_d(d)hZ`d*d+hZah d,Zbebe^z  e]z  e_z  e`z  eaz  Zcech d-z  Zdech d.z  Zeecd/d0hz  Zfech d1z  Zgedd2d3hz  Zh	 	 	 	 dd4Zi e
d5      dd6       Zj G d7 d8e      Zk ed9:       G d; d<e             Zl ed9:       G d= d>e             Zm ed9:       G d? d@e             Zn ed9:       G dA dBe             Zo ed9:       G dC dDe             Zp ed9:       G dE dF             Zq G dG dH      Zr ed9:       G dI dJe             Zs ed9:       G dK de             Zt ed9d9L       G dM dNe             Zu ed9:       G dO dPeej                  Q             Zw G dR dSew      Zx G dT dU      Zy G dV dW      Zz G dX dYe      Z{ ed9:       G dZ d[e             Z| G d\ d]ex      Z} G d^ d_ex      Z~ G d` daex      Z G db dce      Z G dd dee      Z G df dg      Z G dh di      Z G dj dkewee      Z G dl dmex      Z G dn doewe      Z G dp dqe      Z G dr dsex      Z ed9:       G dt duee             Z G dv dwe      Z ed9:       G dx dye             Z ed9:       G dz d{e             Z ed9:       G d| d}             Zd~ ZddZddZyc c} w )    )annotations)defaultdictOrderedDict)	dataclassfieldInitVar)	lru_cacheN   )coredatadependencies)mlog)programs)HoldableObjectSecondLevelHolderFileMesonExceptionMachineChoice
PerMachine
OrderedSetlistifyextract_as_listtypeslistifystringlistifyclassify_unity_sourcesget_filenames_templates_dictsubstitute_valueshas_path_sep	OptionKeyPerMachineDefaultableMesonBugExceptionEnvironmentVariablespickle_load)	is_header	is_object	is_sourceclink_langs
sort_clinkall_languagesis_known_suffixdetect_static_linker)
FeatureNewFeatureDeprecated)Literal	TypedDict)environment)ImmutableListProtocol)Backend)Compiler)SourceOutputsInterpreter)Test)
SubProject)StaticLinker)ExecutableSerialisationFileModeFileOrString)ModuleState)BaseNode)WrapMode)CustomTargetCustomTargetIndexGeneratedList)SharedLibraryStaticLibraryr?   r@   )BuildTargetr?   r@   r   ExtractedObjectsGeneratedTypesc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)		DFeaturesboolunittestzT.List[T.Union[str, int]]debugT.List[IncludeDirs]import_dirsversionsN__name__
__module____qualname____annotations__     2/usr/lib/python3/dist-packages/mesonbuild/build.pyrH   rH   C   s    ((((++rU   rH   c_pchcpp_pch_args>   d_debug
d_unittestd_import_dirsd_module_versions>   vala_gir	vala_vapivala_headerrust_crate_typerust_dependency_map	resourcescs_args>   nativegui_appinstallobjectssources	link_args	link_with
link_wholebuild_rpathextra_filesinstall_dirinstall_tagname_prefixname_suffixr   install_modelink_dependsinstall_rpathlink_languagewin_subsystembuild_by_defaultoverride_optionsinclude_directoriesgnu_symbol_visibilityimplicit_include_directories>   pieimplibexport_dynamicvs_module_defs>   versionrust_abi	soversionr   darwin_versionsr   r   >   picprelinkr   
main_classjava_resourcesc                H    | sd g|z  }|S t        |       dk(  r| |z  }|S | }|S )Nr
   )len)rp   num_outputs_install_tags      rV   _process_install_tagr      sI     v+
 	 
[	Q	"[0  #rU   maxsizec                    d| j                   | j                  g}| j                  |j                  d| j                  z          |j                  d       dj	                  |      S )Nz@rpath/..dylib )prefixnamer   appendjoin)ldr   s     rV   #get_target_macos_dylib_install_namer      sO    ryy"''*D	||C",,&'KK774=rU   c                      e Zd Zy)InvalidArgumentsN)rP   rQ   rR   rT   rU   rV   r   r      s    rU   r   F)eqc                  0    e Zd ZU ded<   ded<   dZded<   y)	DependencyOverridezdependencies.Dependencydepz
'BaseNode'nodeTrI   explicitN)rP   rQ   rR   rS   r   rT   rU   rV   r   r      s    	  
HdrU   r   c                  v    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dZddZddZddZddZ	y
)HeadersT.List[File]ri   T.Optional[str]install_subdircustom_install_dir
'FileMode'custom_install_modestr
subprojectNT.Optional[bool]follow_symlinksc                    || _         y Nr   )selfsubdirs     rV   set_install_subdirzHeaders.set_install_subdir   s
    $rU   c                    | j                   S r   r   r   s    rV   get_install_subdirzHeaders.get_install_subdir       """rU   c                    | j                   S r   ri   r   s    rV   get_sourceszHeaders.get_sources       ||rU   c                    | j                   S r   r   r   s    rV   get_custom_install_dirzHeaders.get_custom_install_dir       &&&rU   c                    | j                   S r   r   r   s    rV   get_custom_install_modezHeaders.get_custom_install_mode       '''rU   )r   r   returnNoner   r   r   r   r   r   )
rP   rQ   rR   rS   r   r   r   r   r   r   rT   rU   rV   r   r      sC    ##''##O(,O%,
%#'(rU   r   c                  X    e Zd ZU ded<   ded<   ded<   ded<   ded	<   dd
ZddZddZy)Manr   ri   r   r   r   r   r   r   localec                    | j                   S r   r   r   s    rV   r   zMan.get_custom_install_dir   r   rU   c                    | j                   S r   r   r   s    rV   r   zMan.get_custom_install_mode   r   rU   c                    | j                   S r   r   r   s    rV   r   zMan.get_sources   r   rU   Nr   r   )r   zT.List['File'])rP   rQ   rR   rS   r   r   r   rT   rU   rV   r   r      s.    ''##O'(rU   r   c                  :    e Zd ZU ded<   ded<   ded<   dZded<   y)	EmptyDirr   pathr   rs   r   Nr   rp   )rP   rQ   rR   rS   rp   rT   rU   rV   r   r      s    
IO#'K'rU   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Zd
ed<   dZded<   dZded<   y)
InstallDirr   source_subdirinstallable_subdirro   install_dir_namer   rs   zT.Tuple[T.Set[str], T.Set[str]]excluderI   strip_directoryr   Tfrom_source_dirNr   rp   r   r   )rP   rQ   rR   rS   r   rp   r   rT   rU   rV   r   r      sP    ,,O OT #'K'(,O%,rU   r   c                  >    e Zd ZU ded<   ded<   ded<   ded<   d
dZy	)DepManifestr   r   T.List[str]licensezT.List[T.Tuple[str, File]]license_filesr   c                    | j                   | j                  | j                  D cg c]  }|d   j                          c}dS c c}w )Nr
   )r   r   r   )r   r   r   relative_name)r   ls     rV   to_jsonzDepManifest.to_json   sA    ||||<@<N<NOqad002O
 	
 Ps   AN)r   z&T.Dict[str, T.Union[str, T.List[str]]])rP   rQ   rR   rS   r   rT   rU   rV   r   r      s    L--O
rU   r   c                      e Zd ZdZddZd Zd ZddZddZddZ	d Z
d	 Zdd
ZddZddZddZddZd dZd!dZd"dZd#dZd$dZd%dZd$dZd%dZy)&BuildzYA class that holds the status of one build including
    all dependencies and so on.
    c                   t         j                  | _        d| _        d | _        || _        i | _        t               | _        t               | _	        t        i i       | _        t        i i       | _        t        i i       | _        t        i i       | _        g | _        g | _        g | _        g | _        g | _        g | _        g | _        t        d d       | _        i | _        d| _        g | _        g | _        g | _        g | _        d | _        i | _        t        i i       | _        i | _         d | _!        i | _"        t               | _#        tI        jJ                   |jL                         i i       | _'        g | _(        g | _)        y )Nzname of master projectr   )*r   r   project_nameproject_versionr0   projectsr   targetssettargetnamesr   global_argsglobal_link_argsprojects_argsprojects_link_argstests
benchmarksheadersmanemptydirdatasymlinksstatic_linkersubprojectssubproject_dirinstall_scriptspostconf_scriptsdist_scriptsinstall_dirsdep_manifest_namedep_manifeststdlibstest_setupstest_setup_default_namefind_overridessearched_programsr    defaultis_cross_builddependency_overridesdevenvmodules)r   r0   s     rV   __init__zBuild.__init__   sm   ''4#&Q\Q^58UAKBPRASFPQSUWFXPZ[]_aPbU_`bdfUg%'
*,(* "*,"$	-/7A$7M BDCE?A022668!"b)35'+$vx-0U VkUrUr&K&&("bV2!46$&rU   c                    t               }| j                  j                         D ]  \  }}t        |t              s|||<    |S r   )r   r   items
isinstancerD   )r   build_targetsr   ts       rV   get_build_targetszBuild.get_build_targets!  sE    #||))+ 	(GD!![)&'d#	( rU   c                    t               }| j                  j                         D ]  \  }}t        |t              s|||<    |S r   )r   r   r  r  r?   )r   custom_targetsr   r  s       rV   get_custom_targetszBuild.get_custom_targets(  sE    $||))+ 	)GD!!\*'(t$	) rU   c                   t        | j                        }| j                  j                         D ]R  \  }}t	        |t
        t        t        t        f      r|j                         |j                  |<   D||j                  |<   T |S r   )
r   r0   __dict__r  r  listdictr   r   copyr   otherkvs       rV   r  z
Build.copy/  sn    d&&'MM'') 	&DAq!dD#{;<$%FFHq!$%q!		&
 rU   c                f    |j                   j                         D ]  \  }}|| j                   |<    y r   )r  r  r  s       rV   mergezBuild.merge8  s0    NN((* 	!DAq DMM!	!rU   c                    | j                   |j                     ?|j                         r.t        | j                  |      | j                   |j                  <   y y y r   )r   for_machineneeds_static_linkerr+   r0   )r   compilers     rV   ensure_static_linkerzBuild.ensure_static_linker<  sR    h223;@\@\@^7KDL\L\^f7gDx334 A_;rU   c                     | j                   d   S )Nr   )r   r   s    rV   get_projectzBuild.get_project@  s    }}R  rU   c                    | j                   S r   )r   r   s    rV   get_subproject_dirzBuild.get_subproject_dirC  r   rU   c                    | j                   S r   )r   r   s    rV   get_targetszBuild.get_targetsF  r   rU   c                    | j                   S r   )r   r   s    rV   	get_testszBuild.get_testsI      zzrU   c                    | j                   S r   )r   r   s    rV   get_benchmarkszBuild.get_benchmarksL      rU   c                    | j                   S r   )r   r   s    rV   get_headerszBuild.get_headersO  r   rU   c                    | j                   S r   )r   r   s    rV   get_manzBuild.get_manR      xxrU   c                    | j                   S r   )r   r   s    rV   get_datazBuild.get_dataU      yyrU   c                    | j                   S r   )r   r   s    rV   get_symlinkszBuild.get_symlinksX      }}rU   c                    | j                   S r   )r   r   s    rV   get_emptydirzBuild.get_emptydir[  r:  rU   c                    | j                   S r   )r   r   s    rV   get_install_subdirszBuild.get_install_subdirs^         rU   c                `    | j                   |   }|j                  |j                         g       S r   )r   getget_languager   r"  r   ds       rV   get_global_argszBuild.get_global_argsa  s,    [)uuX**,b11rU   c                    | j                   |   }|j                  |      }|sg S |j                  |j                         g       S r   )r   rA  rB  )r   r"  projectr   rD  argss         rV   get_project_argszBuild.get_project_argse  sA    {+uuW~Ixx--/44rU   c                `    | j                   |   }|j                  |j                         g       S r   )r   rA  rB  rC  s       rV   get_global_link_argszBuild.get_global_link_argsl  s,    !!+.uuX**,b11rU   c                    | j                   |   }|j                  |      }|sg S |j                  |j                         g       S r   )r   rA  rB  )r   r"  rG  r   rD  rj   s         rV   get_project_link_argszBuild.get_project_link_argsp  sA    ##K0EE'N	I}}X224b99rU   N)r0   environment.Environment)r   r   )r  r   r   r   )r"  r3   r   r   )r   z8'T.OrderedDict[str, T.Union[CustomTarget, BuildTarget]]')r   zT.List['Test'])r   zT.List['Headers'])r   zT.List['Man'])r   zT.List['Data'])r   zT.List['SymlinkData'])r   zT.List['EmptyDir'])r   zT.List['InstallDir'])r"  
'Compiler'r   'MachineChoice'r   r   )r"  rO  rG  r   r   rP  r   r   )rP   rQ   rR   __doc__r
  r  r  r  r  r#  r%  r'  r)  r+  r.  r1  r3  r6  r9  r<  r>  rE  rI  rK  rM  rT   rU   rV   r   r      sr    ''R!h!#!252:rU   r   c                  t    e Zd ZU dZded<   ded<   ded<    ee      Zded	<   dd
ZddZ	ddZ
ddZddZy)IncludeDirsz7Internal representation of an include_directories call.r   curdirr   incdirsrI   	is_systemdefault_factoryextra_build_dirsc                |    d}|j                  | j                  j                  | j                  | j                        S )Nz
<{} {}/{}>)format	__class__rP   rT  rU  r   rs     rV   __repr__zIncludeDirs.__repr__  s,    xx//dllKKrU   c                    | j                   S r   )rT  r   s    rV   
get_curdirzIncludeDirs.get_curdir      {{rU   c                    | j                   S r   )rU  r   s    rV   get_incdirszIncludeDirs.get_incdirs  r   rU   c                    | j                   S r   )rY  r   s    rV   get_extra_build_dirsz IncludeDirs.get_extra_build_dirs  s    $$$rU   c                   g }| j                   D ]v  }|j                  t        j                  j	                  || j
                  |             |j                  t        j                  j	                  || j
                  |             x |S )a*  Convert IncludeDirs object to a list of strings.

        :param sourcedir: The absolute source directory
        :param builddir: The absolute build directory, option, build dir will not
            be added if this is unset
        :returns: A list of strings (without compiler argument)
        )rU  r   osr   r   rT  )r   	sourcedirbuilddirstrlistidirs        rV   to_string_listzIncludeDirs.to_string_list  sg      "LL 	FDNN277<<	4;;EFNN277<<$++tDE	F rU   Nr   r   r   r   )ri  r   rj  r   r   r   )rP   rQ   rR   rQ  rS   r   r  rY  r_  ra  rd  rf  rm  rT   rU   rV   rS  rS  y  sD     BKO %*$$?k?L%rU   rS  c                      e Zd ZU dZded<    ee      Zded<    ee      Zded<    ee      Z	d	ed
<   dZ
ded<   dZded<   ddZddZedd       ZddZddZy)rE   zI
    Holds a list of sources for which the objects must be extracted
    z'BuildTarget'targetrW  r   srclistT.List['GeneratedTypes']genlist0T.List[T.Union[str, 'File', 'ExtractedObjects']]objlistTrI   	recursiveFpchc                R    | j                   j                  r| j                          y y r   )rq  is_unitycheck_unity_compatibler   s    rV   __post_init__zExtractedObjects.__post_init__  s     ;;'')  rU   c                    d}|j                  | j                  j                  | j                  j                  | j
                        S )Nz<{0} {1!r}: {2}>)r[  r\  rP   rq  r   rr  r]  s     rV   r_  zExtractedObjects.__repr__  s2    xx//1A1A4<<PPrU   c                    t        |       } |D ](  }|j                         D ]  }| j                  |        * | D cg c]  }t        |      s| c}S c c}w r   )r  get_outputsr   r&   )ri   generated_sourcesgensrcss       rV   r   zExtractedObjects.get_sources  s^     w-' 	"F'') " q!	"	" #3ail333s   AAc                    | j                  ||      }t        | j                  j                  j	                         |      S r   )r   r   rq  	compilersvalues)r   ri   r  sources_s       rV   classify_all_sourcesz%ExtractedObjects.classify_all_sources  s5    ##G->?%dkk&;&;&B&B&DhOOrU   c                >   | j                  | j                  j                  | j                  j                        }| j                  | j                  | j
                        }|j                         D ]*  \  }}t        |      t        ||         k7  s!t        d       y )Nz}Single object files cannot be extracted in Unity builds. You can only extract all the object files for each compiler at once.)	r  rq  ri   	generatedrr  rt  r  r   r   )r   cmpsrcsextracted_cmpsrcscompsrcss        rV   r{  z'ExtractedObjects.check_unity_compatible  s     ++DKK,?,?AVAVW 55dllDLLQ+113 	TJD$4yC..$ &S T T	TrU   Nr   r   rn  )ri   zT.Sequence['FileOrString']r  T.Sequence['GeneratedTypes']r   T.List['FileOrString'])ri   zT.List[FileOrString]r  r  r   z*T.Dict['Compiler', T.List['FileOrString']])rP   rQ   rR   rQ  rS   r   r  rr  rt  rv  rw  rx  r|  r_  staticmethodr   r  r{  rT   rU   rV   rE   rE     s~     !$7G\7(-d(CG%C@EVZ@[G=[ItC*Q 4 4PTrU   )r   orderc                  X    e Zd ZU dZ ed       Zded<   ddZddZddZ	dd	Z
dd
Zy)StructuredSourcesa  A container for sources in languages that use filesystem hierarchy.

    Languages like Rust and Cython rely on the layout of files in the filesystem
    as part of the compiler implementation. This structure allows us to
    represent the required filesystem layout.
    c                      t        t              S r   )r   r  rT   rU   rV   <lambda>zStructuredSources.<lambda>  s    D 1 rU   rW  zYT.DefaultDict[str, T.List[T.Union[File, CustomTarget, CustomTargetIndex, GeneratedList]]]ri   c                    | j                   j                         }|j                   j                         D ]  \  }}||   j                  |        t	        |      S r   )ri   r  r  extendr  )r   r  ri   r  r  s        rV   __add__zStructuredSources.__add__  sQ    ,,##%MM'') 	!DAqAJa 	! ))rU   c                ,    t        | j                        S r   )rI   ri   r   s    rV   __bool__zStructuredSources.__bool__  s    DLL!!rU   c                &    | j                   d   d   S )zXGet the first source in the root

        :return: The first source in the root
        r   r   r   r   s    rV   
first_filezStructuredSources.first_file  s    
 ||B""rU   c                    t        t        j                  j                  | j                  j                                     S r   )r  	itertoolschainfrom_iterableri   r  r   s    rV   as_listzStructuredSources.as_list  s)    IOO11$,,2E2E2GHIIrU   c                    | j                   j                         D ]+  }|D ]$  }t        |t              r|j                  s   y  y - y)a	  Do we need to create a structure in the build directory.

        This allows us to avoid making copies if the structures exists in the
        source dir. Which could happen in situations where a generated source
        only exists in some configurations
        TF)ri   r  r  r   is_built)r   filesfs      rV   
needs_copyzStructuredSources.needs_copy  sK     \\((* 	 E  a&zz# 	  rU   N)r  r  r   r  r   rI   )r   z=T.Union[File, CustomTarget, CustomTargetIndex, GeneratedList])r   zET.List[T.Union[File, CustomTarget, CustomTargetIndex, GeneratedList]])rP   rQ   rR   rQ  r   ri   rS   r  r  r  r  r  rT   rU   rV   r  r    s;     jo1j3Gf 3*"#JrU   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Zded<   dZded<    ee      Zded<   dZ	ded<   e
j                  d-d       Ze
j                  d-d       Zd.dZd/dZd/dZd/dZd/dZd0dZd1dZd2dZd-dZd-d Zd-d!Zed3d"       Zed4d#       Zd-d$Zd5d%Zd6d&Zd7d'Z d8d(Z!ed9d)       Z"d:d*Z#d;d+Z$d:d,Z%y)<Targetr   r   r   z'SubProject'r   rI   rx   r   r   rN  r0   Frg   build_always_stalerW  r   rn   Nz+InitVar[T.Optional[T.Dict[OptionKey, str]]]ry   c                     y r   rT   r   s    rV   typenamezTarget.typename      rU   c                     y r   rT   r   s    rV   type_suffixzTarget.type_suffix  r  rU   c                   |rL|j                         D ci c]0  \  }}|j                  r|j                  | j                        n||2 }}}ni }t	        j
                  | j                  j                  j                  | j                  |      | _        t        | j                        r7t        j                  t        j                  d| j                   d             y y c c}}w )Nmachinez                Target "z" has a path separator in its name.
                This is not supported, it can cause unexpected failures and will become
                a hard error in the future.)r  langevolver   r   OptionsViewr0   optionsr   r   r   r   warningtextwrapdedent)r   	overridesr  r  ovrs        rV   r|  zTarget.__post_init__  s    (02q! :;188D$4$485QI 2C 2 C++D,<,<,E,E,M,Mt`cd		"LL . $,*/ 0 1 #2s   5C"c                p    t        |t              st        S | j                         |j                         k  S r   r  r  NotImplementedget_idr   r  s     rV   __lt__zTarget.__lt__.  )    %(!!{{}u||~--rU   c                p    t        |t              st        S | j                         |j                         k  S r   r  r  s     rV   __le__zTarget.__le__3  )    %(!!{{}..rU   c                p    t        |t              st        S | j                         |j                         kD  S r   r  r  s     rV   __gt__zTarget.__gt__8  r  rU   c                p    t        |t              st        S | j                         |j                         k\  S r   r  r  s     rV   __ge__zTarget.__ge__=  r  rU   c                    t         r   NotImplementedErrorr   s    rV   get_default_install_dirzTarget.get_default_install_dirB      !!rU   c                    t         r   r  r   s    rV   r   zTarget.get_custom_install_dirE  r  rU   c                    | j                         \  }}| j                         }|r,|d   |k7  r$|d   durd}|D cg c]  }t        |dd        }}nd}|r||d<   n|g}|gt        |      z  }|||fS c c}w )Nr   ToptnameF)r  r   getattrr   )r   default_install_dirdefault_install_dir_nameoutdirsr   iinstall_dir_namess          rV   get_install_dirzTarget.get_install_dirH  s    8<8T8T8V55--/wqz%88WQZt=S "&FM NIt!< N N!& 0
./!9 :S\ I)+=== !Os   A3c                    | j                   S r   r   r   s    rV   get_basenamezTarget.get_basename^  r7  rU   c                    | j                   S r   r   r   s    rV   
get_subdirzTarget.get_subdira  rb  rU   c                    | j                   S r   )r  r   s    rV   get_typenamezTarget.get_typenamed  r:  rU   c                    t        j                         }|j                  | j                  dd             |j	                         d d S )Nzutf-8replace)encodingerrors   )hashlibsha256updateencode	hexdigest)	target_idhs     rV   _get_id_hashzTarget._get_id_hashg  sA     NN	!!79!EF {{}Ra  rU   c                    |j                  dd      j                  dd      }t        |      rJ ||z   }| rt        j                  |       }|dz   |z   S |S )zuConstruct target ID from subdir, name and type suffix.

        This helper function is made public mostly for tests./@\z@@)r  r   r  r  )r   r   r  	name_partmy_idsubdir_parts         rV   construct_id_from_pathzTarget.construct_id_from_pathq  sa     LLc*224=	,,,K' --f5K%--rU   c                    | j                   }t        | dd      r|d| j                  z   z  }| j                  | j                  || j                               S )Nname_suffix_setFr   )r   r  suffixr  r   r  r   r   s     rV   r  zTarget.get_id  sR    yy4*E2C$++%%D**KKt//13 	3rU   c                    d|v r/|d   | _         t        | j                   t              st        d      | j                   s|j	                  dd      rd| _         | j                  | j                  |             y )Nrx   z)build_by_default must be a boolean value.rg   FT)rx   r  rI   r   rA  set_option_overridesparse_overridesr   kwargss     rV   process_kwargs_basezTarget.process_kwargs_base  sm    '$*+=$>D!d33T:&'RSS$$Iu)E %)D!!!$"6"6v">?rU   c                   i | j                   _        |j                         D ]^  \  }}|j                  r4|| j                   j                  |j	                  | j
                        <   F|| j                   j                  |<   ` y )Nr  )r  r  r  r  r  r   )r   option_overridesr  r  s       rV   r  zTarget.set_option_overrides  sj    !#$**, 	.DAqvvMN&&qxx8H8Hx'IJ,-&&q)		.rU   c                    | j                   S r   )r  r   s    rV   get_optionszTarget.get_options  r   rU   c                \    t        j                  d| j                  |   j                        S )Nz!T.Union[str, int, bool, WrapMode])Tcastr  value)r   keys     rV   
get_optionzTarget.get_option  s%    
 vv94<<;L;R;RSSrU   c                V   | j                  dg       }t        |t              rt        j                  d|      S i }t        |      }|D ]^  }d|vrt        d      |j                  dd      \  }}t        j                  |j                               }|j                         }|||<   ` |S )Nry   T.Dict[OptionKey, str]=z%Overrides must be of form "key=value"r
   )rA  r  r  r  r  r   r   splitr   from_stringstrip)r  optsresultr  or  r  r	  s           rV   r  zTarget.parse_overrides  s    zz,b1 dD!662D99)+!$'	 	A!|&'NOO773?DAq''	2C	AF3K	 rU   c                     yNFrT   r   s    rV   is_linkable_targetzTarget.is_linkable_target      rU   c                    g S r   rT   r   s    rV   r  zTarget.get_outputs      	rU   c                     yr  rT   r   s    rV   should_installzTarget.should_install  r  rU   rn  )r  z"T.Optional[T.Dict[OptionKey, str]]r   r   )r  objectr   rI   r   zT.Tuple[str, str]r   $T.List[T.Union[str, Literal[False]]])r   zBT.Tuple[T.List[T.Union[str, Literal[False]]], str, Literal[False]])r  r   r   r   )r   r   r   r   r  r   r   r   r  T.Dict[str, T.Any]r   r   )r  r  r   r   )r   zcoredata.OptionsView)r	  z'OptionKey'r   z#T.Union[str, int, bool, 'WrapMode'])r  r!  r   r  r  ro  )&rP   rQ   rR   rS   rg   r  r   r  rn   ry   abcabstractpropertyr  abstractmethodr  r|  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r   r  r  r
  r  r  r  r  rT   rU   rV   r  r    s%    IK((GT$$ %d ;K;DHAH  	 1 .
/
.
/
"">, ! !  $3@.T  &rU   r  )	metaclassc                      e Zd ZU eZded<    edg      Zded<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dG fdZdHdZ	d Z
d	 ZedId
       Zd Zd Zd Zd ZdJdZedKd       Zd ZdLdZd Zd ZdMdZdNdOdZdPdZ ed      dPd       ZdQdZ ed      dQd       Z ed      dRd       Z dSdZ!dTdZ"dUd Z#d! Z$dVd"Z%dWd#Z&dXd$Z'dLd%Z(dYd&Z) ed      dZd'       Z*dNd[d(Z+d) Z,d* Z-d\d+Z.d]d,Z/dId-Z0dId.Z1dYd/Z2d^d0Z3d1 Z4d_d2Z5dId3Z6d`d4Z7dadbd5Z8 ed      dZd6       Z9dcd7Z:daddd8Z;ded9Z<dfd:Z=dgdhd;Z>did<Z?dLd=Z@d> ZAdjd?ZBdkd@ZCdIdAZDdIdBZEdIdCZFdIdDZGdE ZHdldFZI xZJS )mrD   r  ro   )cppcudazT.FrozenSet[T.Tuple[str, str]]_MASK_LANGSc                   t         |   |||d|||
j                  dd             |	| _        t	               | _        g | _        || _        g | _        g | _	        |
j                  d      | _
        g | _        g | _        g | _        g | _        t               | _        d| _        d| _        d| _        d | _        | j&                  g| _        i | _        |
j                  dt/        t0                    | _        g | _        g | _        g | _        |
j                  dg       |
j                  d	g       |
j                  d
g       |
j                  dd      d| _        d| _        d| _        t               | _         | jC                  |       | jE                  |       | jG                  |
       | jI                         | _%        tM        |
d      | j                  z   }tM        |
d      | j                  z   }| j                  jO                          | j                  jO                          | jQ                  |       | jS                  |       tU        | j4                  | j6                  | j                  | j                  | j                  |
jW                  dd      g      stY        jZ                  d| d       | j]                  |
       | j_                          | ja                          y )NTrg   Frg   rv   no_namelanguage_argsrZ   r\   r]   r[   )rK   rM   rN   rJ   rk   rl   _allow_no_sourceszBuild target z has no sources. This was never supposed to be allowed but did because of a bug, support will be removed in a future release of Meson)1superr
  rA  all_compilersr   r  rh   structured_sourcesexternal_depsinclude_dirsrv   link_targetslink_whole_targetsdepend_filesrt   r   
added_depsname_prefix_setr  filenamedebug_filenameoutputsrx  r   r  
extra_argsri   r  rn   
d_featuresr   r}   rpath_dirs_to_removeprocess_sourcelistprocess_objectlistprocess_kwargsprocess_compilersmissing_languagesr   clearlinkrl   anypopr   r  check_unknown_kwargsvalidate_installcheck_module_linking)r   r   r   r   r   ri   r1  rh   r0   r  r  r4  r5  r\  s                rV   r
  zBuildTarget.__init__  s    	vz4k[a[e[efoqv[wx&5@],."4>@35#ZZ8.0ce*,%$$!" -/;A::oWbcgWh;i%'35)+ZZ	2.!::or:

#6;

<7	&
 25%!( 	(F#!%!7!7!9 'v{;d>O>OO,V\BTE\E\\!%%'		,*+DLL$..$,,@W@WY]YpYpJJ2E:< =LL= /P P Q 	!!&)!!#rU   c                j   | j                          | j                  r,t        | j                  | j                  g      rt        d      | j                  rd| j                  vrt        d      | j                         rd| _        d| j                  v r| j                         r| xj                  | j                  | j                  gz  c_
        | xj                  ddgz  c_        | j                  rA| j                  j                  | j                         | j                  j                  d       yyyy)zV Initialisations and checks requiring the final list of compilers to be known
        z6cannot mix structured sources and unstructured sourcesrustz5structured sources are only supported in Rust targetsTvaladevelN)validate_sourcesr1  rF  ri   r  r   r  	uses_rustr   r  r;  r`   r_   rp   r^   r   r   s    rV   	post_initzBuildTarget.post_init"  s     	""sDLL$..+I'J !YZZ""vT^^'C !XYY>> DHT^^#(?(?(ALLT--t~~>>L' 22}}##DMM2  ''0  )B#rU   c                    d}|j                  | j                  j                  | j                         | j                        S N<{0} {1}: {2}>)r[  r\  rP   r  r9  r   repr_strs     rV   r_  zBuildTarget.__repr__5  s.    #t~~66t}}UUrU   c                    | j                    S r   r  r   s    rV   __str__zBuildTarget.__str__9  s    ))rU   c                p    | j                  t        d            }|dk(  xs |dk(  xr | j                  dk7  S )Nunityonr   r   )r
  r   r   )r   	unity_opts     rV   rz  zBuildTarget.is_unity<  s9    OOIg$67	D ZY-%?%YDOOWYDYZrU   c                    | j                   t        j                  u rH| j                  r;| j                  j                         rt        d      t        j                  d       y y y )NzATried to install a target for the build machine in a cross build.zOInstalling target build for the build machine. This will fail in a cross build.)	r   r   BUILDrg   r0   r  r   r   r  r   s    rV   rI  zBuildTarget.validate_installA  sP    }222t||..0&'jkkno	 8D2rU   c                <    | j                  || j                         y r   )check_unknown_kwargs_intknown_kwargsr  s     rV   rH  z BuildTarget.check_unknown_kwargsH  s     	%%fd.?.?@rU   c                    g }|D ]  }|dk(  r	||vs|j                  |         t        |      dkD  r?t        j                  dj	                  | j
                  dj                  |                   y y )Nr-  r   z-Unknown keyword argument(s) in target {}: {}., )r   r   r   r  r[  r   r   )r   r  ra  unknownsr  s        rV   r`  z$BuildTarget.check_unknown_kwargs_intM  sv     	#AO#$"		#
 x=1LLHOOPTPYPY[_[d[dem[nop rU   c                   t        |t              sJ g }|D ]	  }t        |t        t        t        f      rJ| j
                  j                  |       t        |t              rKt        |      rW|j                  |       it        |t        t        t        f      rY|j                         D cg c]  }t        |      r| }}|rt        d|d    d      | j                  j                  |       t        dt        |      j                  d| j                   d       |r)t#        j$                  d|d    dd| j&                         y y c c}w )	NzGenerated file r   z) in the 'objects' kwarg is not an object.zBad object of type  in target r   zSource file z1.3.0)r  r  r   r   rE   rh   r   r%   r?   r@   rA   r  r   r  typerP   r   r-   
single_user   )r   rh   deprecated_non_objectsr  r  non_objectss         rV   r@  zBuildTarget.process_objectlistW  s7   '4(((!# 	lA!c4)9:;##A&!!%56y|*11!4A.?OP*+--/NQ1qNN*_[^<LLw+xyy%%a(&)<T!W=M=M<PP[\`\e\e[hhi'jkk	l "((<8Nq8Q7RR})~)0$//C " Os   -E>Ec                   t               }|D ]{  }t        |t              r2||vs| j                  j	                  |       |j                  |       Et        |t        t        t        f      sa| j                  j	                  |       } y)a  Split sources into generated and static sources.

        Sources can be:
        1. Preexisting source files in the source tree (static)
        2. Preexisting sources generated by configure_file in the build tree.
           (static as they are only regenerated if meson itself is regenerated)
        3. Sources files generated by another target or a Generator (generated)
        N)
r   r  r   ri   r   addr?   r@   rA   r  )r   ri   added_sourcesr  s       rV   r?  zBuildTarget.process_sourcelistj  sp     &)U 	)A!T"M)LL''*!%%a(A.?OP%%a(	)rU   c                h    d}|d d  D ]'  }| j                  |      s|j                  |       d}) |S )NFT)can_compileremove)r"  ri   removedr  s       rV   can_compile_remove_sourcesz&BuildTarget.can_compile_remove_sources|  s@     	A##A&q!	 rU   c                   | j                   D ]  }| j                  |   | j                  |<     | j                  r| j                  gnt        }| j
                  s| j                  rt        j                  | j
                  | j                        D ]^  }t        |t        t        f      r|j                  j                         D ](  \  }}||v s|| j                  vs|| j                  |<   * ` | j                  s3|D ].  }|| j                  v s| j                  |   | j                  |<    n t        t        | j                  j                         d             | _        | j                          y)a$  Processes additional compilers after kwargs have been evaluated.

        This can add extra compilers that might be required by keyword
        arguments, such as link_with or dependencies. It will also try to guess
        which compiler to use if one hasn't been selected already.
        c                    t        | d         S Nr   )r(   )r  s    rV   r  z4BuildTarget.process_compilers_late.<locals>.<lambda>  s    *QqT:J rU   )r	  N)rC  r0  r  rv   r'   r4  r5  r  r  r  r?   r@   r  r   sortedrQ  )r   r  
link_langsr  r   r"  s         rV   process_compilers_latez"BuildTarget.process_compilers_late  sP    ** 	<D#'#5#5d#;DNN4 	< .2-?-?d(()[
  7 7__T%6%68O8OP 8a,0A!BC&'kk&7&7&9 8ND(z)d$...H/7t,88 ~~ # 4---+/+=+=d+CDNN4( %VDNN,@,@,B0J&L MrU   c                   g }t        | j                  | j                  | j                  | j                  g      s|S t        | j                        }| j                  j                         }| j                  ri| j                  j                  j                         D ]B  }|D ];  }t        |t        t        f      r|j                  |       +|j                  |       = D |D ]4  }|j                         D ]  }t        |      r|j                  |       ! 6 | j                  D ];  }|j                  D ]*  }t        |t        t        f      s|j                  |       , = | j                  D ]x  }	t        |	t              s|	j!                  |	j"                  g       }
|
D ]D  }|j$                  dk(  r|j$                  | j&                  vs,|| j&                  |j$                  <   F z |r|D ]  }| j(                  j+                         D ]5  \  }}|j-                  |      s|| j&                  vr|| j&                  |<    T t/        |      sat1        j2                  t        |            j5                         }d| j6                  j9                          d|}t;        |       d| j&                  v r*d| j&                  vr| j(                  d   | j&                  d<   d| j&                  v rHt=        d| j6                  d      }| j?                  |      }	 | j(                  |   | j&                  |<   |S |S # t@        $ r |j                  |       Y |S w xY w)aq  
        Populate self.compilers, which is the list of compilers that this
        target will use for compiling all its sources.
        We also add compilers that were used by extracted objects to simplify
        dynamic linker determination.
        Returns a list of missing languages that we can add implicitly, such as
        C/C++ compiler for cython.
        rM  zNo z machine compiler for ccythonlanguage)r  r  )!rF  ri   r  rh   r1  r  r  r  r  r   r   r   r  r%   r2  rE   r  rr  r|  r  r0  r  ro  r*   pathlibPathas_posixr   get_lower_case_namer   r   r
  KeyError)r   rC  ri   r  r  srcr  r  rD  r  compsrcsr  r  r"  r   mr	  r  s                     rV   rB  zBuildTarget.process_compilers  s    *,DLL$..$,,@W@WXY$$*.t||*<NN'')	"",,44;;= . .C!#T{3s+!((-	..   	&F'') &
 !|NN1%&	& ## 	&AYY &a#t-NN1%&	&  	9Aa!12--aii<H  9 ==F*==648DNN4==19		9   
0&*&8&8&>&>&@ 	0ND(++A.t~~53;DNN40		0 'q)&||CF3<<>!$"2"2"F"F"H!II_`d_gh,Q//
0 T^^#4>>(A"&"4"4S"9DNN3t~~%J0@0@xPCOOC(E0(,(:(:5(Au% !     0!((/  0s   L7 7MMc                     t         j                        dkD  rLt         fddD              r7dj                   j                  j	                               }t        d|       y y )Nr
   c              3  :   K   | ]  }|j                   v   y wr   r  ).0r  r   s     rV   	<genexpr>z/BuildTarget.validate_sources.<locals>.<genexpr>  s     *]d44>>+A*]   )csjavarc  z*Cannot mix those languages into a target: )r   r  rF  r   keysr   )r   langss   ` rV   rO  zBuildTarget.validate_sources  sY    t~~"s*]n*]']IIdnn1134E"%OPUw#WXX (^"rU   c                   t        |      }|D ]  }t        |t              r| j                  j	                  |       /t        |t
              rO| j                  j	                  t        j                  | j                  j                  | j                  |             t        |d      r| j                  j	                  |       t        d       y)a}  Process the link_depends keyword argument.

        This is designed to handle strings, Files, and the output of Custom
        Targets. Notably it doesn't handle generator() returned objects, since
        adding them as a link depends would inherently cause them to be
        generated twice, since the output needs to be passed to the ld_args and
        link_depends.
        r  zTLink_depends arguments must be strings, Files, or a Custom Target, or lists thereof.N)r   r  r   rt   r   r   from_source_filer0   
source_dirr   hasattrr   )r   ri   r  s      rV   process_link_dependsz BuildTarget.process_link_depends  s     '" 	=A!T"!!((+As#!!(())$*:*:*E*Et{{TUVXM*!!((+&<= =	=rU   c                   t        | j                        }t        | j                        }g }g }|D ]9  }t        |t        t
        f      rnt        |t              rt        d| j                  |      }n!t        j                  dd| j                         ||vrt        d| d      |j                  |       t        |t        t        t        f      rwt        j                  dd| j                         t        |t              r|j                  n|}||vr!||vrt        d|j!                          d      |j                  |       t        dt#        |      j$                   d	       t'        | ||      S )
NFz!File argument for extract_objects0.50.0z Tried to extract unknown source r   z%Generated sources for extract_objectsz0.61.0zCObject extraction arguments must be strings, Files or targets (got z).)r   ri   r  r  r   r   r   r,   rh  r   r   r   r?   r@   rA   rq  r  rg  rP   rE   )r   rr  sources_setgenerated_setobj_srcobj_genr  rq  s           rV   extract_objectszBuildTarget.extract_objects  se   $,,'DNN+"$,. 	CC#T{+c3'udkk37C))*MxY]YhYhik)(+KC5PQ)RSSs#C,0A=!QR%%&MxY]YhYhi'1#7H'Ism+m0K(+KFL_L_LaKbbc)dees#$'jkopsktk}k}j~  A  &B  C  C!	C"  gw77rU   c                `    t        | | j                  | j                  | j                  |d      S )NT)rx  )rE   ri   r  rh   )r   rw  s     rV   extract_all_objectszBuildTarget.extract_all_objects7  s(    dllDNNDLL )t5 	5rU   c                "    | j                         S r   get_transitive_link_depsr   s    rV   get_all_link_depszBuildTarget.get_all_link_deps;  s    ,,..rU   Nr   c                R    g }| j                   D ]  }||j                         z  } |S r   )r4  r  r   r  r  s      rV   r  z$BuildTarget.get_transitive_link_deps>  s4    !#"" 	,Aa))++F	,rU   c                $    | j                  |      S r   ) get_transitive_link_deps_mappingr   r   s     rV   get_link_deps_mappingz!BuildTarget.get_link_deps_mappingE  s    44V<<rU   c                    i }| j                   D ]6  }|j                  |      }|j                         }|j                  |       |}8 |S r   )r4  r  r  r  )r   r   r  r  mapping
result_tmps         rV   r  z,BuildTarget.get_transitive_link_deps_mappingH  sQ    #%"" 	 A--f5G Jf%F	  rU   c                    t               }| j                  D ]P  }t        |t              s|j	                  |j                                |j                  |j                                R |S r   )r   r4  r  rC   rl  r  r  get_link_dep_subdirsr  s      rV   r  z BuildTarget.get_link_dep_subdirsS  sV    ",,"" 	4Aa/

1<<>*MM!0023	4 rU   c                :    | j                   j                         dfS )Nz{libdir})r0   
get_libdirr   s    rV   r  z#BuildTarget.get_default_install_dir\      **,j88rU   c                    | j                   S r   ro   r   s    rV   r   z"BuildTarget.get_custom_install_dir_      rU   c                    | j                   S r   rs   r   s    rV   r   z#BuildTarget.get_custom_install_modeb  r?  rU   c                r   | j                  |       || _        | j                  dt        |d             | j                  dt        |d             t	        | t
              r|j                  dd      r_|j                  d| j                  dz         | _        |j                  d	| j                  d
z         | _	        |j                  dd       | _
        t        |d      | _        | j                  D ]  }t	        |t              rt        d       | j                  D ]@  }d|v s|j                  d      st        j                   t#        j$                  d             B | j'                  |j                  dg              t        |d      }| j)                  |       t        |d      }| j+                  |       t-        |j                  dg       t        t.        f      | _        |j                  dd       | _        t5        |j                  dd g            | _        t	        | t
              s8|j                  d      t        d      |j                  d      t        d      t        |d      }|D ]  }t	        |t8              sJ || j:                  v r$t<        j>                  jA                  | jB                  jE                         |jF                  |jH                        }t<        j>                  jK                  |      st        d| d      | j:                  jM                  |        |j                  dd      | _'        t	        | jN                  t              st        d       |j                  d!d      | _(        t	        | jP                  t              st        d"      t        |d#      }|D ]  }	t	        |	t              st        d$      t<        j>                  jA                  | jB                  jE                         | jF                  |	      }t<        j>                  jK                  |      rt        d%|	 d       || _)        |j                  d&      K|d&   }
t	        |
tT              r|
r4t        d'      t	        |
t              st        d(      |
| _+        d)| _,        |j                  d*      [|d*   }t	        |tT              r|rDt        d+      t	        |t              st        d,      |dk(  rt        d-      || _-        d)| _.        t	        | t^              rc| jB                  j`                  | jb                     }|je                         s|jg                         rd)| _4        n| jk                  |d.d/      | _4        t	        | t
              st	        | t^              r]| jh                  sQ| jB                  j`                  | jb                     jm                         rd)| _7        n| jk                  |d0d1      | _7        |j                  d2d)      | _8        t	        | jp                  t.              st        d3      |j                  d4d      | _9        t	        | jr                  t              st        d5      | jr                  dk7  rFg d6}| jr                  |vr4t        d7ju                  | jr                  d8jA                  |                  |j                  d9i       }t	        |tv              st        d:| d;      ty        d< |j{                         D              rt        d:| d=      || _>        y )>Nrz  rW   r'  rX   r   Fr`   z.hr_   z.vapir^   rj   z$Link_args arguments must be strings.z
-Wl,-rpathz-rpathz                    Please do not define rpath with a linker argument, use install_rpath
                    or build_rpath properties instead.
                    This will become a hard error in a future Meson release.
                rt   rz   r   ro   rs   rp   rf   z1Argument gui_app can only be used on executables.rw   z7Argument win_subsystem can only be used on executables.rn   z%Tried to add non-existing extra file r   ru   r   zInstall_rpath is not a string.rm   zBuild_rpath is not a string.rc   z"Resource argument is not a string.z#Tried to add non-existing resource rq   z3name_prefix array must be empty to signify default.zname_prefix must be a string.Trr   z3name_suffix array must be empty to signify default.zname_suffix must be a string.zname_suffix should not be an empty string. If you want meson to use the default behaviour for each platform pass `[]` (empty array)r   b_staticpicr}   b_pier|   z/Implicit_include_directories must be a boolean.r{   z'GNU symbol visibility must be a string.)r  internalhidden	protectedinlineshiddenz+GNU symbol visibility arg {} not one of: {}rc  rb   zInvalid rust_dependency_map "z": must be a dictionary.c              3  >   K   | ]  }t        |t                 y wr   )r  r   )r  r  s     rV   r  z-BuildTarget.process_kwargs.<locals>.<genexpr>  s     L!:a%%Ls   z+": must be a dictionary with string values.)?r   original_kwargsadd_pchr   r  
ExecutablerA  r   r`   r_   r^   rj   r   r   
startswithr   r  r  r  r  add_include_dirsadd_depsr   rI   ro   rs   r   rp   r   rn   rh  r   r   r0   get_source_dirr   fnameisfiler   ru   rm   rc   r  r   r8  r  r  rC   machinesr   	is_darwin
is_windowsr   _extract_pic_pie
is_androidr}   r|   r{   r[  r  rF  r  rb   )r   r  r  r   inclistdeplistrn   trialrc   r^  rq   rr   r  	permittedrb   s                  rV   rA  zBuildTarget.process_kwargse  sO     (%S/&':;UOFI>?$
+vzz:JE/R%zz-T9IJD#ZZTYY5HIDN"JJz48DM(= 	OAa%&'MNN	O  	Aq ALL$:X__ .  	 	!!&**^R"@A "&*?@g&!&.9g (

="(E),d5"JJ~t<(MD6)JK$
+zz)$0&'Z[[zz/*6&'`aa%fm< 	'Aa&&&D$$$GGLL!1!1!@!@!BAHHaggVE77>>%(&)NqcQR'STT##A&	' #)**_b"A$,,c2"#CDD!::mR8$**C0"#ABB#FK8	 	SAa%&'KLLGGLL!1!1!@!@!BDKKQRSE77>>%(&)LQCq'QRR	S #::m$0 /K+t,*+`aa!+s3*+JKK)'+$::m$0 /K+t,*+`aa!+s3*+JKK"$* ,W X X *'+$dM*   ))$*:*:;A{{}00NdJ'Jt],KTXT\T\(()9)9:EEG00H,2JJ7UW[,\)$;;TB"#TUU%+ZZ0G%L"$44c:"#LMM%%+WI)):&'T'['[\`\v\vx|  yB  yB  CL  yM  (N  O  O$jj)>C-t4"%BCVBWWo#pqqL/B/I/I/KLL"%BCVBW  XC  $D  E  E#6 rU   c                R   | j                   d   | j                   d   z   }d|j                         z   |v sd|j                         z   |v r)t        j                  d| d| d| j
                         yt        |      }|j                  |      t        j                  d||         }nR|| j                  j                  j                  v r.| j                  j                  j                  |   j                  }nd	}t        |t              st!        d
| d| j
                  d      |S )Nrz  r'  z-fz	Use the 'z' kwarg instead of passing '-fz' manually to TrI   F	Argument z to z must be boolean)r<  lowerupperr   r  r   r   rA  r  r  r0   r   r  r  r  rI   r   )r   r  argoption	all_flagsr  vals          rV   r  zBuildTarget._extract_pic_pie  s	   OOC(4??5+AA	#))+*dSYY[.@I.MLL9SE)GuN[_[d[dZghif::c?&&&-C$""++333""++33A6<<CC#t$"Yse4		}DT#UVV
rU   c                    | j                   S r   )r9  r   s    rV   get_filenamezBuildTarget.get_filename  r:  rU   c                    | j                   S z
        The name of debuginfo file that will be created by the compiler

        Returns None if the build won't create any debuginfo file
        r:  r   s    rV   get_debug_filenamezBuildTarget.get_debug_filename       """rU   c                    | j                   S r   r;  r   s    rV   r  zBuildTarget.get_outputs  r   rU   c                     | j                   |   S r   r<  r   r|  s     rV   get_extra_argszBuildTarget.get_extra_args  s    x((rU   c                    t               }t        j                  | j                  | j                        D ]:  }||vs|j                  |       t        |t              s*|j                  |       < |S r   )	r   r  r  r4  r5  rl  r  rC   get_dependencies_recurser   r  r  s      rV   get_dependencieszBuildTarget.get_dependencies  sb     0:|!2!2D4K4KL 	7A

1a/..v6		7
 rU   c                J   |xr | j                         }| j                  D ]]  }||v r|j                  dk(  r|s|j                         s|j                  |       t	        |t
              sL|j                  ||       _ | j                  D ]  }|j                  ||        y )N
proc-macro)is_internalr4  ra   rl  r  rC   r  r5  )r   r  include_internalsr  s       rV   r  z$BuildTarget.get_dependencies_recurse  s    
 .D$2B2B2D"" 	FAF{  L0 

1!]+**63DE	F (( 	BA&&v/@A	BrU   c                    | j                   S r   r  r   s    rV   get_source_subdirzBuildTarget.get_source_subdir%  rb  rU   c                    | j                   S r   r   r   s    rV   r   zBuildTarget.get_sources(  r   rU   c                    | j                   S r   )rh   r   s    rV   get_objectszBuildTarget.get_objects+  r   rU   c                    | j                   S r   )r  r   s    rV   get_generated_sourcesz!BuildTarget.get_generated_sources.      ~~rU   c                    | j                   S r   r+  r   s    rV   r  zBuildTarget.should_install1  r   rU   c                ,    t        | j                        S r   )rI   rx  r   s    rV   has_pchzBuildTarget.has_pch4  s    DHH~rU   c                :    | j                   j                  |g       S r   )rx  rA  r  s     rV   get_pchzBuildTarget.get_pch7  s    xx||Hb))rU   c                    | j                   S r   )r3  r   s    rV   get_include_dirszBuildTarget.get_include_dirs:  r?  rU   c                :    t        |      }|D ]	  }| j                  v rt        |t        j                        rw j                  |j                          j                  j                   fd|j                  D                j                  |j                  |j                                 j                  j                  |j                          j                  j                  |j                          j                  j                  |j                          |j#                         s|j%                         rXt        j                  dg |j#                         |j%                         g g g g g i g g g       } j&                  j)                  |        j+                  |j,                         nt        |t        j.                        rd| j&                  vr: j&                  j)                  |        j                  |j1                                 j+                  |j,                         nt        |t2              r&t5        d|j6                   d j6                   d      t9        |d      r|j:                  }t9        |d      st9        |d      rt5        d	      t5        d
t=        |      j>                  d      |j@                  }dD ](  }||v s j@                  |   j                  ||          *  j                  jC                  |        y )Nc              3  @   K   | ]  }|j                   vs|  y wr   )rn   )r  r  r   s     rV   r  z'BuildTarget.add_deps.<locals>.<genexpr>F  s     '`aatO_O_F_'`s   	undefinedzTried to use a build target z as a dependency of target z2.
You probably should put it in link_with instead.held_objectproject_args_frozenglobal_args_frozenzTried to use subproject object as a dependency.
You probably wanted to use a dependency declared in it instead.
Access it by calling get_variable() on the subproject object.z$Argument is of an unacceptable type z.
Must be either an external dependency (returned by find_library() or dependency()) or an internal dependency (returned by declare_dependency()).)rN   rM   )"r   r7  r  r   InternalDependencyr?  ri   rn   r  r  rz   get_include_typerh   r4  	librariesr5  whole_librariesget_compile_argsget_link_argsr2  r   r  ext_deps
Dependencyr   rD   r   r   r  r  rg  rP   r=  rl  )r   depsr   extpartdep_d_featuresfeatures   `     rV   r  zBuildTarget.add_deps=  s   t} 4	%Cdoo%#|>>?''4  '''`3??'``%%c&=&=s?S?S?UV##CKK0!!((7''..s/B/BC'')S->->-@*==k>@>A>R>R>T>A>O>O>Q>@"b"bRTVXZ\^`	bG
 &&--g6cll+C!8!89d000&&--c2++COO,=>cll+C-&)EchhZOjkoktktju vZ (Z [ [ 3.//C3 56'#G[:\* ,k l l ')MdSViN`N`Mc d@ (@ A A
 !^^N6 Mn,OOG,33N74KLM OO$i4	%rU   c                    | j                   S r   )r2  r   s    rV   get_external_depszBuildTarget.get_external_depsu  s    !!!rU   c                     yr  rT   r   s    rV   r  zBuildTarget.is_internalx  r  rU   c                   |D ]D  }t        |t        t        f      sFt        |t        j                        rt        t        j                  d            t        |d      |j                         st        d|d      t        | t              r1| j                  r%|j                         r| j                  |gd       t        | t              rIt        |t              r9|j                  s-d|j                   d| j                   d	}|d
z  }t        |      | j#                  |       | j$                  j'                  |       G y )Na                          An external library was used in link_with keyword argument, which
                        is reserved for libraries built as part of this project. External
                        libraries must be passed using the dependencies keyword argument
                        instead, because they are conceptually "external dependencies",
                        just like those detected with the dependency() function.
                    z is not a target.zLink target 'z' is not linkable.T)promoted"Can't link non-PIC static library  into shared library . 9Use the 'pic' option to static_library to build with PIC.)r  r  r@   r   ExternalLibraryr   r  r  r   r  rC   rg   r  rl   rB   r   r   check_can_link_togetherr4  r   )r   r   r  msgs       rV   rE  zBuildTarget.link{  s)    	(Aa&*;!<=a!=!=>( : *   '!.?'@AA'')&qe;M'NOO$.4<<AMMO d3$.:a3OXYX]X]:166*DYZ^ZcZcYffhiRR&s++((+$$Q'/	(rU   c                   |D ];  }t        |t        t        f      r:|j                         st	        d|d      |j                         rrt	        d      t        |t              st	        |d      t        | t              r9|j                  s-d|j                  d| j                  d}|dz  }t	        |      | j                  |       t        | t              rE| j                  ||       | j                  r'|j                         D ]  }| j                  |d	        | j                  j                  |       > y )
NzCustom target z is not linkable.z<Can only link_whole custom targets that are static archives.z is not a static library.r  r  r  r  T)r  r?   r@   r  r   links_dynamicallyrC   rB   r   r   r  _bundle_static_libraryrg   get_internal_static_librariesr5  r   )r   r   r  r  r  libs         rV   rl   zBuildTarget.link_whole  s.    	.A!l,=>?++-*^A5@Q+RSS&&(*+ijj=1&!.G'HIID-0:166*DYZ^ZcZcYffhiRR&s++((+$. ++Ax8 << >>@ ?33C>?##**1--	.rU   c                <    t               }| j                  |       |S r   )r   %get_internal_static_libraries_recurser   r  s     rV   r  z)BuildTarget.get_internal_static_libraries  s    /9|226:rU   c                    | j                   D ]:  }|j                         s||vs|j                  |       |j                  |       < | j                  D ]$  }|j                         s|j                  |       & y r   )r4  r  rl  r  r5  r  s      rV   r  z1BuildTarget.get_internal_static_libraries_recurse  sq    "" 	@A}}1F?

177?	@ (( 	@A}}77?	@rU   c                   | j                         r| j                  j                  |       y t        |t        t
        f      s|j                         rWd|j                  d| j                  d}|r-|d| j                  d|j                  d|j                  dz  }t        |      | j                  j                  |j                                y )Nz*Cannot link_whole a custom or Rust target z into a static library zY. Instead, pass individual object files with the "objects:" keyword argument if possible.z1 Meson had to promote link to link_whole because z is installed but not z', and thus has to include objects from z to be usable.)
rP  r5  r   r  r?   r@   r   r   rh   r  )r   r  r  r  s       rV   r  z"BuildTarget._bundle_static_library  s    >>##**1-L*;<= >affZG^_c_h_h^k lk kAI$))Vlmnmsmslv w??@vvjX Y"1%%LL 5 5 78rU   c                   t        |t              xr |j                         }| j                         s'|r%t	        d|j
                  d| j
                        | j                  |j                  ur||r|j                  dk7  rjd| j                   d|j                   d| j
                  }| j                  j                         rt	        |dz         t        j                  |dz          y y y )	NzTry to link Rust ABI library z with a non-Rust target r  z$Tried to mix libraries for machines z and rf  z' This is not possible in a cross build.z This will fail in cross build.)r  rD   uses_rust_abirP  r   r   r   ra   r0   r  r   r  )r   r  links_with_rust_abir  s       rV   r  z#BuildTarget.check_can_link_together  s    (K8NQ__=N~~$7"%B166*Ldeienendq#rss1==0:MQRQbQbfrQr89I9I8J%PQP]P]^ijnjsjsivwC..0&s-V'VWWS#DDE Rs0rU   c                   |sy t        |      dk(  r!t        |d         st        d|d    d      t        |      dk(  rt        |d         rt        |d         sOt        d      t        |d         r$t        |d         st        d      |d   |d   g}nt        d|d    d      t        j
                  j                  |d         t        j
                  j                  |d         k7  rt        d      t        j                  d	d
| j                  d       nt        |      dkD  rt        d      |D ]  }t        |t              st        d      t        j
                  j                  t        j
                  j                  | j                  j                   | j"                  |            r{t        d| d       || j$                  |<   y )Nr
   r   zPCH argument z is not a header.   z>PCH definition must contain one header and at most one source.z is of unknown type.z,PCH files must be stored in the same folder.zPCH source filesr  z)Only a single header file should be used.z-PCH definition may have a maximum of 2 files.zPCH arguments must be strings.zFile z does not exist.)r   r$   r   r&   rh  r   dirnamer-   rh  r   r  r   r   r  r   r0   r  r   rx  )r   r|  pchlistr  s       rV   r  zBuildTarget.add_pch  s   \QWQZ(&wqzlBS'TUU\Q$ ,*+kll71:& ,*+kll"1:wqz2&wqzlBV'WXXwwwqz*bggoogaj.II&'UVV(();Xt)TV\A"#RSS 	BAa%$%EFF77>>"'',,t/?/?/J/JDKKYZ"[\$uQC/?%@AA		B
 %rU   c           
     H   g }|D ].  }t        |t              st        d      |j                  |       0 |d}|dk7  rJ|dk(  }|D cg c]:  }t        |j	                         |j                         ||j                               < }}| xj                  |z  c_        y c c}w )NzAInclude directory to be added is not an include directory object.preservesystem)r  rS  r   r   ra  rd  rf  r3  )r   rH  set_is_systemidsarV  xs          rV   r  zBuildTarget.add_include_dirs  s    %' 	Aa-&'jkkJJqM	  &MJ&%1Inqrij;q||~q}}	1KaKaKcdrCrS  ss   ?Bc                    g S r   rT   r   s    rV   get_aliaseszBuildTarget.get_aliases
  r  rU   c                t   g }| j                   D ]9  }|j                  |j                  |vs|j                  |j                         ; t        j                  | j
                  | j                        D ]@  }t        |t        t        f      r|j                  D ]  }||vs|j                  |        B |S )ar  
        Sometimes you want to link to a C++ library that exports C API, which
        means the linker must link in the C++ stdlib, and we must use a C++
        compiler for linking. The same is also applicable for objc/objc++, etc,
        so we can keep using clink_langs for the priority order.

        See: https://github.com/mesonbuild/meson/issues/1653
        )r2  r|  r   r  r  r4  r5  r  r?   r@   r  )r   r  r   link_targetr|  s        rV   get_langs_used_by_depsz"BuildTarget.get_langs_used_by_deps  s       %% 	+C||#||5(S\\*		+ %??4+<+<d>U>UV 	+K+6G'HI'11 +5(LL*+	+ rU   c           	     .   | j                   r| j                  | j                      }|S t        D ]$  }|| j                  v s	 | j                  |   }|c S  t        d| j                  d      # t        $ r t        d| j                  d| d      w xY w)Nz2Could not get a prelinker linker for build target z$. Requires a compiler for language "&", but that is not a project language.z"Could not determine prelinker for r   )rv   r0  r'   r  r  r   r   )r   r  r   	prelinkers       rV   get_prelinkerzBuildTarget.get_prelinker)  s    %%d&8&89DK 		!ADNN"/ $ 2 21 5I ! 		! A$))aPQQ   /(LTYYM Z==>C @../ //s   A..&Bc           	        | j                   r6| j                  | j                      }||j                  | j                        fS | j                  j                  j
                  | j                     }| j                         }t        D ];  }|| j
                  v s||v s	 ||   }| j                  |j                        }||fc S  t        D ]0  }	 | j                  |   }||j                  | j                        fc S  t        d| j                        # t        $ r t        d| j                  d| d      w xY w# t        $ r Y w xY w)a  
        We use the order of languages in `clink_langs` to determine which
        linker to use in case the target has sources compiled with multiple
        compilers. All languages other than those in this list have their own
        linker.
        Note that Vala outputs C code, so Vala sources can use any linker
        that can link compiled C. We don't actually need to add an exception
        for Vala here because of that.
        z0Could not get a dynamic linker for build target z". Requires a linker for language "r6  )rv   r0  language_stdlib_only_link_flagsr0   r   r  r   r4  r'   r  r   r   get_used_stdlib_argsr|  AssertionError)r   r  r0  	dep_langsr   linkerstdlib_argss          rV   $get_clink_dynamic_linker_and_stdlibsz0BuildTarget.get_clink_dynamic_linker_and_stdlibs9  sw    %%d&8&89D==d>N>NOOO
 ((11;;D<L<LM //1	  	+ADNN"a9n/*1-F ,0+D+DV__+U {**	+   	A))!,TAA$BRBRSSS	 OPTPYPY}]^^'   /(J499- X;;<# >../ //   s   D+D>&D;>	E
	E
c                ^   | j                   j                  j                  | j                     }t	        | j                        j                  | j                               }g }|D ]F  }||k7  s	||f| j                  vs|j                  ||   j                  | j                                H |S r   )
r0   r   r  r   r   unionr4  r)  r  r:  )r   rv   r0  	all_langsr?  dls         rV   r;  z BuildTarget.get_used_stdlib_argsj  s    ((11;;D<L<LM'--d.I.I.KL	#% 	hB]"M':$BRBR'R ""=#4#T#TUYUeUe#fg	h rU   c                    d| j                   v S )NrL  r  r   s    rV   rP  zBuildTarget.uses_rustv  s    ''rU   c                B    | j                         xr | j                  dv S )N>   rlibdylibr  )rP  ra   r   s    rV   r#  zBuildTarget.uses_rust_abiy  s     ~~[D$8$8<[$[[rU   c                    d| j                   v S )Nfortranr  r   s    rV   uses_fortranzBuildTarget.uses_fortran|  s    DNN**rU   c                    | j                         r| j                  d   }n| j                         \  }}|xr |j                         dv S )a&  
        Check if the dynamic linker is MSVC. Used by Executable, StaticLibrary,
        and SharedLibrary for deciding when to use MSVC-specific file naming
        and debug filenames.

        If at least some code is built with MSVC and the final library is
        linked with MSVC, we can be sure that some debug info will be
        generated. We only check the dynamic linker here because the static
        linker is guaranteed to be of the same type.

        Interesting cases:
        1. The Vala compiler outputs C code to be compiled by whatever
           C compiler we're using, so all objects will still be created by the
           MSVC compiler.
        2. If the target contains only objects, process_compilers guesses and
           picks the first compiler that smells right.
        rL  >   lld-linkrE  xilinkoptlink)rP  r0  r@  get_linker_id)r   r"  _s      rV   get_using_msvczBuildTarget.get_using_msvc  sJ    & >>))&1HCCEKHaaH2248aaarU   c                H   | j                   D ]  }t        |t              s|j                  r"| j                  j
                  | j                     j                         r&t        d| j                   d|j                   d      | j                  j
                  | j                     j                         rt        | t              rd|_        t        j                  d| j                   d|j                   d|j                   d|j                   d	       d|_         y)	zR
        Warn if shared modules are linked with target: (link_with) #2865
        ztarget z links against shared module z. This is not permitted on OSXTzk, which is incorrect.
             This will be an error in the future, so please use shared_library() for z7 instead.
             If shared_module() was used for z because it has references to undefined symbols,
             use shared_library() with `override_options: ['b_lundef=false']` instead.N)r4  r  SharedModuleforce_sonamer0   r  r   r  r   r   r  r   deprecation)r   r3  s     rV   rJ  z BuildTarget.check_module_linking  s&     ,, 	4K+|4[=U=U##,,T-=-=>HHJ(!$)),I+JZJZI[[yz| |%%..t/?/?@KKMR\]acoRp 04K,$$wtyyk9VWbWgWgVh ipp{  qA  qA  pB BHHSHXHXGY Zs	&s t 04K,%	4rU   c                @   |j                  d      y |d   }t        |t              rut        j                  j                  |      rt        j                  |      | _        nt        j                  | j                  j                  | j                  |      | _        nqt        |t              r|| _        nYt        |t        t        f      r8t        j                  |j!                         |j#                               | _        nt%        d      | j'                  |       y )Nr   z`vs_module_defs must be either a string, a file object, a Custom Target, or a Custom Target Index)rA  r  r   rh  r   isabsr   from_absolute_filer   r  r0   r  r   r?   r@   from_built_filer  r  r   r  )r   r  r   s      rV   process_vs_module_defs_kwz%BuildTarget.process_vs_module_defs_kw  s    ::&'/DJK[D\dC ww}}T"&*&=&=d&C#&*&;&;D<L<L<W<WY]YdYdfj&k#d#"&D|->?@"&"6"6t7H$J[J[J]"^D"KL L 	!!$'rU   )r   r   r   r   r   r7   r   r   ri   T.List['SourceOutputs']r1  T.Optional[StructuredSources]rh   T.List[ObjectTypes]r0   rN  r  T.Dict[str, 'Compiler']r  r!  r  r  )ri   r\  r   r   )r"  rO  ri   r  r   rI   ro  )rr  z1T.List[T.Union['FileOrString', 'GeneratedTypes']]r   rE   T)rw  rI   r   rE   )r   z'ImmutableListProtocol[BuildTargetTypes]r   r   r   zT.Mapping[str, str]r   zT.AbstractSet[str]r  r  r   zT.Optional['FileMode'])r  r!  r  r   r  r   r   rI   rn  r   )r|  r   r   r   r   OrderedSet[BuildTargetTypes]r  re  r  rI   r   r   )r   ru  r   rs  )r   zT.List['IncludeDirs'])r   T.List[dependencies.Dependency])r   T.List[BuildTargetTypes]r   r   )F)r   ri  r  rI   r   r   r  re  r   r   )r  zT.Union[BuildTargetTypes]r  rI   r   r   )r  BuildTargetTypesr   r   )r|  r   r(  r   r   r   r   )rH  zT.Sequence['IncludeDirs']r,  r   r   r   r   zT.List[T.Tuple[str, str, str]])r   z T.Tuple['Compiler', T.List[str]])rv   r   r   r   r   )KrP   rQ   rR   known_build_target_kwargsra  rS   	frozensetr)  r
  rQ  r_  rX  propertyrz  rI  rH  r`  r@  r?  r  rr  rx  rB  rO  r  r  r  r  r	   r  r  r  r  r  r   r   rA  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  rE  rl   r  r  r  r  r  r  r1  r4  r8  r@  r;  rP  r#  rK  rR  rJ  r[  __classcell__r\  s   @rV   rD   rD     sk   ,L55 3<= 3K/ 
K$K$ K$ #	K$
 'K$ -K$ !>K$ )K$ 1K$ /K$ 'K$Z1&V [ [pA
qC&)$  $LU!nY
=.825/ t = t  t 9 !y7v&#) t B$*!6%p"(4.2 t 
@9,	F%>!8R /_b
(\+b440(rU   rD   c                       e Zd ZdZddZddZy)FileInTargetPrivateDirzRepresents a file with the path '/path/to/build/target_private_dir/fname'.
       target_private_dir is the return value of get_target_private_dir which is e.g. 'subdir/target.p'.
    c                    || _         y r   r  )r   r  s     rV   r
  zFileInTargetPrivateDir.__init__  	    
rU   c                    | j                   S r   ru  r   s    rV   rX  zFileInTargetPrivateDir.__str__  r,  rU   N)r  r   rn  )rP   rQ   rR   rQ  r
  rX  rT   rU   rV   rs  rs    s    rU   rs  c                  B    e Zd ZdZddZed	d       Zd
dZddZd	dZ	y)FileMaybeInTargetPrivateDirz1Union between 'File' and 'FileInTargetPrivateDir'c                    || _         y r   )inner)r   r{  s     rV   r
  z$FileMaybeInTargetPrivateDir.__init__  rv  rU   c                .    | j                   j                  S r   )r{  r  r   s    rV   r  z!FileMaybeInTargetPrivateDir.fname  s    zzrU   c                    t        | j                  t              r4t        j                  j                  || j                  j                        S | j                  j                  |      S r   )r  r{  rs  rh  r   r   r  rel_to_builddir)r   build_to_srctarget_private_dirs      rV   r~  z+FileMaybeInTargetPrivateDir.rel_to_builddir  sF    djj"8977<< 2DJJ4D4DEEzz)),77rU   c                    t        | j                  t              rt        d      | j                  j	                  ||      S )NzUnreachable code)r  r{  rs  RuntimeErrorabsolute_path)r   srcdirrj  s      rV   r  z)FileMaybeInTargetPrivateDir.absolute_path  s4    djj"89122zz''99rU   c                    | j                   S r   ru  r   s    rV   rX  z#FileMaybeInTargetPrivateDir.__str__  r,  rU   N)r{  z%T.Union[File, FileInTargetPrivateDir]rn  )r  r   r  r   r   r   )r  r   rj  r   r   r   )
rP   rQ   rR   rQ  r
  ro  r  r~  r  rX  rT   rU   rV   ry  ry    s-    ;    8
:
rU   ry  c                      e Zd Zdddd d	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZdd	Ze	dd
       Z
	 	 	 d	 	 	 	 	 	 	 	 	 ddZy)	GeneratorNF)depfilecapturedependsr   c               n    || _         || _        || _        |xs g | _        || _        || _        || _        y r   )exer  r  r  arglistr;  r   )r   r  	argumentsoutputr  r  r  r   s           rV   r
  zGenerator.__init__  s:     EL]PR 	rU   c                f    d}|j                  | j                  j                  | j                        S )Nz
<{0}: {1}>)r[  r\  rP   r  rU  s     rV   r_  zGenerator.__repr__  s&    t~~66AArU   c                    | j                   S r   )r  r   s    rV   get_exezGenerator.get_exe  r4  rU   c                   t         j                  j                  |      }t         j                  j                  |      d   }| j                  D cg c]$  }|j                  d|      j                  d|      & }}|S c c}w Nr   
@BASENAME@@PLAINNAME@)rh  r   basenamesplitextr;  r  )r   inname	plainnamer  r/  basess         rV   get_base_outnameszGenerator.get_base_outnames  sl    GG$$V,	77##I.q1^b^j^jkYZ<2::=)Tkk ls   )A=c                
   | j                   t        d      t        j                  j	                  |      }t        j                  j                  |      d   }| j                   j                  d|      j                  d|      S )NzJTried to get dep name for rule that does not have dependency file defined.r   r  r  r  r   rh  r   r  r  r  )r   r  r  r  s       rV   get_dep_outnamezGenerator.get_dep_outname  sj    <<"#oppGG$$V,	77##I.q1||##L(;CCMS\]]rU   c                   t         j                  j                  |      }t         j                  j                  |      d   }| j                  D cg c]$  }|j                  d|      j                  d|      & c}S c c}w r  )rh  r   r  r  r  r  )r   r  r  r  r/  s        rV   get_arglistzGenerator.get_arglist  sb    GG$$V,	77##I.q1]a]i]ijXY		,199-Sjjjs   )A<c                n    t        j                  |      j                  |       }|j                  d   dk7  S )Nr   z..)r}  PurePathrelative_toparts)parentr  relpaths      rV   is_parent_pathzGenerator.is_parent_path  s1    ""5)55f=}}Q4''rU   c                f   t        | |j                  |||ng ||n	t                     }|D ]  }t        |t              r|j
                  j                  |       t        |t              r%|j
                  j                  |j                         t        |t        t        f      rW|j
                  j                  |       |j                         D cg c]"  }t        j                  |j                  |      $ }	}nt        |t               rO|rt        d      |j
                  j                  |       |j                         D cg c]  }t        |       }	}nJt        |t              r7t        j                  |j                   j"                  |j                  |      g}	n|g}	|	D ]x  }|rW|j%                  |j                   j"                  |j                   j&                        }
| j)                  ||
      st        d      t+        |      }|j-                  ||       z  |S c c}w c c}w )N)r<  envzZgenerator.process: 'preserve_path_from' is not allowed if one input is a 'generated_list'.zmgenerator.process: When using preserve_path_from, all input files must be in a subdirectory of the given dir.)rA   r   r"   r  r?   r  rl  r@   rq  r  r   rZ  r   rs  r   r  r0   r  r  	build_dirr  ry  add_file)r   r  statepreserve_path_fromr<  r  r  er  fsabs_fs              rV   process_fileszGenerator.process_files  s   
 LL%/%;z,@,BD  	*A!\*""1%!./""188,!l,=>?""1%EF]]_Ud**5<<;UUA}-%*  ,H  I  I""1%9:IA,Q/IIAs#++E,=,=,H,H%,,XYZ[S *%OOE,=,=,H,H%J[J[JeJefE../A5I.  0_  `  `/25)*%	*2 % V
 Js   'H)H.)r  /T.Union['Executable', programs.ExternalProgram]r  r   r  r   r  r   r  rI   r  z8T.Optional[T.List[T.Union[BuildTarget, 'CustomTarget']]]r   r   rn  )r   r  )r  r   r   r   )r  r   r  r   r   rI   )NNN)r  zTT.Iterable[T.Union[str, File, 'CustomTarget', 'CustomTargetIndex', 'GeneratedList']]r  %T.Union['Interpreter', 'ModuleState']r  r   r<  zT.Optional[T.List[str]]r   T.Optional[EnvironmentVariables]r   z'GeneratedList')rP   rQ   rR   r
  r_  r  r  r  r  r  r  r  rT   rU   rV   r  r    s     -1!&UY('$
 *  S "B^k
 ( ( =A<@>B	%B%*9% #:% <	% HW	%rU   r  c                      e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ddZddZddZddZddZ	ddZ
ddZddZddZy)rA   z The output of generator.process.r  	generatorr   r   r   r  r   r<  r  r  c                   | j                   j                  | _        t               | _        g | _        g | _        i | _        g | _        g | _	        | j                  g | _
        | j                  t               | _        t        | j                   j                  t        j                        r| j                   j                  j!                         st#        d      | j                   j                  j%                         }t&        j(                  j+                  |      r/| j                  j-                  t/        j0                  |             y y y )Nz4Tried to use not-found external program as generator)r  r  r   r   r  
infilelistoutfilelistoutmapextra_dependsr6  r<  r  r"   r  r   ExternalProgramfoundr   get_pathrh  r   rX  r   r   rY  )r   r   s     rV   r|  zGeneratedList.__post_init__L  s    NN&&	.1e?A(*HJ*,??"+-DO88-A-CDHdnn(((*B*BC>>%%++-&']^^>>%%..0Dww}}T" !!(()@)@)FG #	 DrU   c                   g }|j                  |j                  j                  |j                  j                        }t        j
                  j                  | j                        sJ t        j
                  j                  || j                        }t        j
                  j                  |      }|D ]1  }|j                  t        j
                  j                  ||             3 |S r   )r  r0   r  r  rh  r   rX  r  r  r'  r   r   )	r   infileoutfilesr  r  in_absrelpath_segmentofs	            rV   add_preserved_path_segmentz(GeneratedList.add_preserved_path_segmentd  s     %%e&7&7&B&BEDUDUD_D_`ww}}T44555ggoofd&=&=>wws+ 	:BMM"'',,|R89	:rU   c                
   | j                   j                  |       | j                  j                  |j                        }| j
                  r| j                  |||      }| xj                  |z  c_        || j                  |<   y r   )	r  r   r  r  r  r  r  r  r  )r   newfiler  r  s       rV   r  zGeneratedList.add_filen  sh    w'>>33GMMB""66w%PHH$'GrU   c                    | j                   S r   )r  r   s    rV   
get_inputszGeneratedList.get_inputsv  r/  rU   c                    | j                   S r   )r  r   s    rV   r  zGeneratedList.get_outputsy  r  rU   c                     | j                   |   S r   )r  )r   r9  s     rV   get_outputs_forzGeneratedList.get_outputs_for|  s    {{8$$rU   c                    | j                   S r   )r  r   s    rV   get_generatorzGeneratedList.get_generator  r  rU   c                    | j                   S r   r  r   s    rV   r  zGeneratedList.get_extra_args  r/  rU   c                    | j                   S r   r  r   s    rV   r  zGeneratedList.get_subdir  rb  rU   Nr  )r  ry  r  r   r  r  r   r   )r  ry  r  r  r   r   )r   z#T.List[FileMaybeInTargetPrivateDir]ro  )r9  ry  r   r   )r   z'Generator'rn  )rP   rQ   rR   rQ  rS   r|  r  r  r  r  r  r  r  r  rT   rU   rV   rA   rA   A  sR     +K''	))H0( %rU   rA   c                       e Zd ZeZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZ fdZddZ	d Z
d ZddZdd	Zd
 ZddZddZddZ xZS )r  
executablec                r   t        d      }d|
vr>||j                  j                  v r&|j                  j                  |   j                  |
d<   t        |   |||||||||	|

       |
j                  d      xs d| _        |
j                  dd      | _        t        | j                  t              st        d      |
j                  d      | _        t        | j                  t        t        t        d       f      st        d	      | j                  | _        d| _        d | _        | j%                  |
       y )
Nr  r}   rw   consoler   Fz3"export_dynamic" keyword argument must be a booleanr~   z="export_dynamic" keyword argument must be a boolean or string)r   r   r  r  r/  r
  rA  rw   r   r  rI   r   r~   r   rg  is_linkwithablewas_returned_by_find_programr   r[  )r   r   r   r   r   ri   r1  rh   r0   r  r  r	  r\  s               rV   r
  zExecutable.__init__  s     3+*>*>*F*F#F'0088=CCF5Mvz;I[]d$i	9#ZZ8EI$jj)95A$--t4"#XYYjj*$++c4:'>?"#bcc#22,1)04&&v.rU   c                   t         |           | j                  j                  | j                     }t        | d      sd| _        t        | d      s|j                         s|j                         sd| j                  v r	d| _
        nH|j                  j                  d      s|j                  dk(  r	d| _
        nd	| j                  v r,| j                  d	   j                         j                  d
      s:d| j                  v r5| j                  d   j                         j                  d
      r	d| _
        nd	| j                  v r,| j                  d	   j                         j                  d      s:d| j                  v r5| j                  d   j                         j                  d      r	d| _
        nd	| j                  v r4| j                  d	   j                         j                  d      rd| _
        nd	| j                  v r| j                  d	   j                         dv s-d| j                  v r'| j                  d   j                         dv rd| _
        nwd	| j                  v r| j                  d	   j                         dv s-d| j                  v r'| j                  d   j                         dv rd| _
        n|j                         | _
        | j                  | _        | j                  r"| xj                   d| j                  z   z  c_        | j                   | j"                  d<   d | _        d | _        | j(                  r{| j                  dz   }t+        | j,                  t.              r| j,                  }|j                         s|j                         r&| j1                         r| d| _        nd| d| _        |j                         xrb d| j                  v xs" | j3                         xs | j1                         xr. | j                  j4                  j7                  t9        d            }|r9| j                  }t;        | dd      dk7  r|d| j                  z   z  }|dz   | _        y y )Nr   r   r  r  r  wasm
emscriptenjsrz  armclangr'  axfccrxabsxc16elf>   tic2000out>   mwccarmmwcceppcnefr   r   z.exe.libr  .arK   rQ  .pdb)r/  rQ  r0   r  r   r  r   r  	is_cygwinr  r  r+  r  r  get_exe_suffixr   r9  r;  import_filenamer:  r   r  r~   r   rR  rP  r   r
  r   r  )r   r  implib_basenamecreate_debug_filer   r\  s        rV   rQ  zExecutable.post_init  s   ""++D,<,<= tX&DKtX&!!#w'8'8':ddnn>T#**62gnn6T"'DNN3,?,F,F,H,S,ST^,_4>>)dnnU.C.J.J.L.W.WXb.c#'DNN3,?,F,F,H,S,STZ,[4>>)dnnU.C.J.J.L.W.WX^._#'DNN3,?,F,F,H,S,STZ,[#'DNN3,?,F,F,HO,[4>>)dnnU.C.J.J.LP_._#'DNN3,?,F,F,HLc,c4>>)dnnU.C.J.J.LPg.g#%446		;;MMS4;;..M--Q  $" "ii&0O$++s+"&++!!#w'8'8':&&(.=->d+CD(-00A+DD(   I'T4>>+;Tt?R?R?TI   ))44Yw5GH	 	 
 99DtXu-6dkk))"&-D rU   c                    t         |   |       |j                  d      xs d| _        | j                  dk7  rt	        d      y )Nra   binz7Invalid rust_crate_type: must be "bin" for executables.)r/  rA  rA  ra   r   )r   r  r\  s     rV   rA  zExecutable.process_kwargs  sF    v&%zz*;<E5("#\]] )rU   c                :    | j                   j                         dfS )Nz{bindir})r0   
get_bindirr   s    rV   r  z"Executable.get_default_install_dir  r  rU   c                    | j                   S )z,Human friendly description of the executabler  r   s    rV   descriptionzExecutable.description  s    yyrU   c                     y)Nz@exerT   r   s    rV   r  zExecutable.type_suffix      rU   c                    | j                   S z
        The name of the import library that will be outputted by the compiler

        Returns None if there is no import library required for this platform
        r  r   s    rV   get_import_filenamezExecutable.get_import_filename       ###rU   c                    | j                   S r  r  r   s    rV   r  zExecutable.get_debug_filename
  r  rU   c                    | j                   S r   )r  r   s    rV   r  zExecutable.is_linkable_target  s    ###rU   c                    | j                   S )zProvides compatibility with ExternalProgram.

        Since you can override ExternalProgram instances with Executables.
        r  r   s    rV   get_commandzExecutable.get_command  s    
 ||rU   c                j    t         j                  j                  | j                  | j                        S ),Provides compatibility with ExternalProgram.)rh  r   r   r   r9  r   s    rV   r  zExecutable.get_path  s    ww||DKK77rU   c                     y)r  TrT   r   s    rV   r  zExecutable.found   s    rU   r   r   r   r   r   r7   r   r   ri   r\  r1  r]  rh   r^  r0   rN  r  r_  r  r  r   )r   z'ImmutableListProtocol[str]'rn  r  )rP   rQ   rR   known_exe_kwargsra  r  r
  rQ  rA  r  r  r  r  r  r  r  r  r  rp  rq  s   @rV   r  r    s    #LH// / #	/
 '/ -/ !>/ )/ 1/ //B@0D^9$#$8rU   r  c                       e Zd ZeZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZd fdZddZddZ	d Z
 fdZd Zdd	Z xZS )rC   zstatic libraryc                    t        j                  d|
j                  dd            | _        t        |   |||||||||	|

       y )NrI   r   F)r  r  rA  r   r/  r
  r   r   r   r   r   ri   r1  rh   r0   r  r  r\  s              rV   r
  zStaticLibrary.__init__*  sF     vvffjjE&BCvz;I[]d$i	9rU   c                &    t                    d j                  v rt        d       j	                         r j
                  dk(  r:t         fddD              r&t        d j                   d j
                   d       j
                  d	k(  rU j                  d
   }t        j                  dg g |j                  g g g g g i g g g       } j                  j                  |       t         d      sd _        t         d      sE j	                         r. j
                  dk(  rd _        n j
                  d	k(  rd _        nd _         j                   j                  z   dz    j                  z    _         j                    j"                  d<   y )Nr  z&Static libraries not supported for C#.rG  c              3  :   K   | ]  }|j                   v   y wr   r  r  rz  r   s     rV   r  z*StaticLibrary.post_init.<locals>.<genexpr>@  s     5^a499n5^r  - r   Rust crate  type  does not allow spaces, periods or dashes in the library name due to a limitation of rustc. Replace them with underscores, for example	staticlibrL  r  r   r  r  r.  r   r   )r/  rQ  r  r   rP  ra   rF  r   r   r   native_static_libsr2  r   r  r   r  r9  r;  )r   rustcrD  r\  s   `  rV   rQ  zStaticLibrary.post_init:  st   4>>!"#KLL>>##v-#5^o5^2^&TYYKvdFZFZE[ \T (T U U ##{2 v. 33KR494L4L46BBBPRTVX ""))!, tX&DKtX&~~''61"(DK))[8"%DK!dii/#5C--QrU   c                    i S r   rT   r  s     rV   r  z#StaticLibrary.get_link_deps_mappingd  r  rU   c                :    | j                   j                         dfS )Nz{libdir_static})r0   get_static_lib_dirr   s    rV   r  z%StaticLibrary.get_default_install_dirg      2246GGGrU   c                     y)Nz@starT   r   s    rV   r  zStaticLibrary.type_suffixj  r  rU   c                    t         |   |       |j                  d      }|j                  d      }|r5|rt        d      |dk(  rd| _        y |dv r|| _        y t        d|d      |d	k(  rd
nd| _        y )Nr   ra   4rust_abi and rust_crate_type are mutually exclusive.r  rG  >   rG  r  Crate type z< invalid for static libraries; must be "rlib" or "staticlib"rz  r  )r/  rA  rA  r   ra   r   r  r   ra   r\  s       rV   rA  zStaticLibrary.process_kwargsm  s    v&::j) **%67&']^^%''-$ $99'6$&_4G  HD  (E  F  F2:c/;vD rU   c                     yNTrT   r   s    rV   r  z StaticLibrary.is_linkable_target~      rU   c                    | j                    S r   r+  r   s    rV   r  zStaticLibrary.is_internal  s    <<rU   r  r  ra  r  r  )rP   rQ   rR   known_stlib_kwargsra  r  r
  rQ  r  r  r  rA  r  r  rp  rq  s   @rV   rC   rC   %  s    %LH99 9 #	9
 '9 -9 !>9 )9 19 /9 ((THN" rU   rC   c                       e Zd ZeZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZddZ	ddZ
d Z fdZdd	Zdd
Zd ZddZd Zd Z xZS )rB   zshared libraryTc                    d | _         d | _        d | _        d | _        d | _        d | _        d| _        t        | !  |||||||||	|

       y r  )	r   	ltversionr   r   r  r:  shared_library_onlyr/  r
  r	  s              rV   r
  zSharedLibrary.__init__  s_     +/*.>B"#"#( vz;I[]d$i	9rU   c                P    t                     j                         rI j                  dk7  r:t	         fddD              r&t        d j                   d j                   d      t         d      sd  _        t         d      sd  _	        d	 _
         j                          y )
Ncdylibc              3  :   K   | ]  }|j                   v   y wr   r  r  s     rV   r  z*SharedLibrary.post_init.<locals>.<genexpr>  s     7`1TYY7`r  r  r  r  r  r   r  {0.prefix}{0.name}.{0.suffix})r/  rQ  rP  ra   rF  r   r   r  r   r  basic_filename_tpldetermine_filenames)r   r\  s   `rV   rQ  zSharedLibrary.post_init  s    >>##x/C7`P_7`4`&TYYKvdFZFZE[ \T (T U U tX&DKtX&DK"A  "rU   c                "   i }| j                  |      }t        |       }||vr[| j                         }| j                         \  }}}t        j
                  j                  ||d   |      }|j                  ||i       |j                  |       |S ru  )r  r   r  r  rh  r   r   r  )	r   r   r  mappingsoldr  r  rQ  news	            rV   r  z#SharedLibrary.get_link_deps_mapping  s    #%88@1$7h%%'E 002MGQ'',,vwqz59CMM3*%rU   c                :    | j                   j                         dfS )Nz{libdir_shared})r0   get_shared_lib_dirr   s    rV   r  z%SharedLibrary.get_default_install_dir  r  rU   c                   d}d}d}| j                   | _        d}d| j                  v rd}d}d| _        d}n| j                  j                  | j
                     j                         rd}| j                         r3d}d}| j                  j                  j                  t        d	            }nG| j                         r3d}d
}| j                  j                  j                  t        d	            }nd}d}| j                  r	d| _        n:d| _        n1| j                  j                  | j
                     j                         r?d}d}| j                  | j                  nd}|dz   }| j                  rd| _        nd| _        n| j                  j                  | j
                     j                         r d}d}| j                  rd| _        nxd| _        np| j                  j                  | j
                     j!                         rd}d}d| _        n3d}d}| j"                  rd| _        n| j                  rd| _        nd| _        | j                  || _        | j$                  || _        | j                  j'                  |       | _        |r|j'                  |       | _        | j(                  | j,                  d<   |r5t.        j0                  j3                  | j(                        d   dz   | _        yy)ax  
        See https://github.com/mesonbuild/meson/pull/417 for details.

        First we determine the filename template (self.filename_tpl), then we
        set the output filename (self.filename).

        The template is needed while creating aliases (self.get_aliases),
        which are needed while generating .so shared libraries for Linux.

        Besides this, there's also the import library name (self.import_filename),
        which is only used on Windows since on that platform the linker uses a
        separate library called the "import library" during linking instead of
        the shared library (DLL).
        r   FNr  dllr+  Tz{0.prefix}{0.name}.dll.librK   z{0.prefix}{0.name}.libr  z{0.prefix}{0.name}.dll.az+{0.prefix}{0.name}-{0.soversion}.{0.suffix}cygz{0.name}.dll.arH  z+{0.prefix}{0.name}.{0.soversion}.{0.suffix}soz+{0.prefix}{0.name}.{0.suffix}.{0.ltversion}z+{0.prefix}{0.name}.{0.suffix}.{0.soversion}r   r  )r,  filename_tplr  r0   r  r   r  rP  r   r
  r   rR  r   r  r   r  r  r&  r  r[  r9  r  r;  rh  r   r  r:  )r   r   r  r  import_filename_tplimport_prefixs         rV   r-  z!SharedLibrary.determine_filenames  s    ! 33" 4>>!FF ?D $ &&t'7'78CCEF~~&B#$($4$4$=$=$H$HSZI[$\!$$&&>#$($4$4$=$=$H$HSZI[$\! &@#~~$Q!$C!&&t'7'78BBDF F+/;;+BDKKM"/2B"B~~$Q!$C!&&t'7'78BBDFF~~$Q! %D!&&t'7'78CCEFF ?DFF~~$Q!$Q! %D!;; DK;; DK))006#6#=#=d#CD  --Q"$''"2"24=="A!"Dv"MD rU   c                R   t         |   |       | j                  j                  | j                     j                         st        j                  d|j                  d            | _	        t        j                  d|j                  d            | _
        | j                  /| j                  #| j                  j                  d      d   | _
        t        j                  d|j                  d            | _        | j                  )| j                  | j                  | j                  f| _        | j                  |       |j                  d      }|j                  d	      }|r5|rt        d
      |dk(  rd| _        y |dv r|| _        y t        d|d      |dk(  rdnd| _        y )Nr   r   r   r   r   zT.Optional[T.Tuple[str, str]]r   r   ra   r  r  rH  >   rH  r)  r  r  zH invalid for shared libraries; must be "dylib", "cdylib" or "proc-macro"rz  r)  )r/  rA  r0   r  r   r  r  r  rA  r&  r   r  r   r[  r   ra   r  s       rV   rA  zSharedLibrary.process_kwargs2	  sv   v&(()9)9:EEGVV$5vzz)7LMDNVV$5vzz+7NODN~~%$..*D "&!5!5c!:1!=#$66*I6::VgKh#iD ##+0J(,'G$ 	&&v.::j) **%67&']^^%''.$ $EE'6$&_4G  HP  (Q  R  R/738GD rU   c                    | j                   S r  r  r   s    rV   r  z!SharedLibrary.get_import_filenameU	  r  rU   c                    | j                   S r  r  r   s    rV   r  z SharedLibrary.get_debug_filename]	  r  rU   c                *    | g| j                         z   S r   r  r   s    rV   r  zSharedLibrary.get_all_link_depse	  s    v55777rU   c                    g }| j                   dvs| j                  s|S | j                   dk(  r| j                  rx| j                  | j                  k7  r_| j                  j	                  dd      }|j                  |       }| j                  d   xs d}|j                  || j                  |f       n| j                  }| j                  d   xs d}|j                  | j                  j                  |       ||f       |S )a#  
        If the versioned library name is libfoo.so.0.100.0, aliases are:
        * libfoo.so.0 (soversion) -> libfoo.so.0.100.0
        * libfoo.so (unversioned; for linking) -> libfoo.so.0
        Same for dylib:
        * libfoo.dylib (unversioned; for linking) -> libfoo.0.dylib
        )r7  rH  r7  r&  r   r   runtimerN  )
r  r   r&  r8  r  r[  rp   r   r9  r,  )r   aliases	alias_tplltversion_filenametags        rV   r1  zSharedLibrary.get_aliasesh	  s     35 ;;o-T^^N
 ;;$4>>dnn6V))11+{KI!*!1!1$!7""1%2CNN.sCD "& q!,W//66t<>PRUVWrU   c                     y)Nz@sharT   r   s    rV   r  zSharedLibrary.type_suffix	  r  rU   c                     yr   rT   r   s    rV   r  z SharedLibrary.is_linkable_target	  r!  rU   r  r  ra  r  r   rl  )rP   rQ   rR   known_shlib_kwargsra  r  aix_so_archiver
  rQ  r  r  r-  rA  r  r  r  r1  r  r  rp  rq  s   @rV   rB   rB     s    %LH N99 9 #	9
 '9 -9 !>9 )9 19 /94# 
HkNZ!LF$#8@rU   rB   c                  X     e Zd ZeZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZ	S )rT  zshared moduleFc                    d|
v rt        d      d|
v rt        d      t        | 	  |||||||||	|

       d| _        y )Nr   z2Shared modules must not specify the version kwarg.r   z4Shared modules must not specify the soversion kwarg.F)r   r/  r
  rU  r	  s              rV   r
  zSharedModule.__init__	  sZ      !UVV&  !WXXvz;+Wk9f	V "rU   c                :    | j                   j                         dfS )Nz{moduledir_shared})r0   get_shared_module_dirr   s    rV   r  z$SharedModule.get_default_install_dir	  s    5579MMMrU   r  r  )
rP   rQ   rR   known_shmod_kwargsra  r  rH  r
  r  rp  rq  s   @rV   rT  rT  	  sw    %LH N"" " #	"
 '" -" !>" )" 1" /",NrU   rT  c                  $    e Zd ZddZddZddZy)BothLibrariesc                d    d| _         || _        || _        | j                  j                  | _        y )Nshared)_preferred_libraryrQ  staticr   )r   rQ  rS  s      rV   r
  zBothLibraries.__init__	  s)    "*++00rU   c                `    dt        | j                         dt        | j                         dS )Nz<BothLibraries: static=z	; shared=>)reprrS  rQ  r   s    rV   r_  zBothLibraries.__repr__	  s,    (dkk):(;9T$++EVDWWXYYrU   c                    | j                   dk(  r| j                  S | j                   dk(  r| j                  S t        d| j                    d      )NrQ  rS  zself._preferred_library == "z#" is neither "shared" nor "static".)rR  rQ  rS  r!   r   s    rV   get_default_objectz BothLibraries.get_default_object	  sO    ""h.;;$$0;;">t?V?V>WWz {||rU   N)rQ  rB   rS  rC   r   r   rn  )r   rD   )rP   rQ   rR   r
  r_  rX  rT   rU   rV   rO  rO  	  s    1Z}rU   rO  c                  8    e Zd ZU ded<   ded<   ded<   	 	 d	dZy)
CommandBaser   r6  ,T.List[T.Union[BuildTarget, 'CustomTarget']]r   r   r   c           	     d   t        |      }g }|D ]  }t        |t              r|j                  |       &t        |t              r-| j
                  j                  |       |j                  |       ct        |t        j                        r|j                         st        d      |j                         }t        j                  j                  |      r.| j
                  j                  t	        j                  |             ||j                         z  }
t        |t         t"        f      r.| j$                  j                  |       |j                  |       Nt        |t&              rt)        j*                  dd| j,                         | j$                  j                  |j.                         || j1                  t	        j2                  |j5                         |j7                                     z  }t        |t8              r|| j1                  |      z  }t        d|d       |S )Nz4Tried to use not-found external program in "command"z&CustomTargetIndex for command argumentz0.60r  z in "command" is invalid)r   r  r   r   r   r6  r   r  r  r   r  rh  r   rX  rY  r  rD   r?   r   r@   r,   rh  r   rq  flatten_commandrZ  r  r  r  )r   cmd	final_cmdrz  r   s        rV   r]  zCommandBase.flatten_command	  s   clMO	 	RA!S!  #At$!!((+  #Ax778wwy*+abbzz|77==& %%,,T-D-DT-JKQ]]_,	A\:;!!((+  #A01%%&NPVX\XgXgh!!((2T11$2F2Fq||~WXWeWeWg2hii	At$T11!44	&1%7O'PQQ3	R4 rU   N)r^  zJT.Sequence[T.Union[str, File, programs.ExternalProgram, BuildTargetTypes]]r   z7T.List[T.Union[str, File, BuildTarget, 'CustomTarget']])rP   rQ   rR   rS   r]  rT   rU   rV   rZ  rZ  	  s     >>OCrU   rZ  c                  .    e Zd ZdZdZdddZd	dZd
dZy)CustomTargetBasez Base class for CustomTarget and CustomTargetIndex

    This base class can be used to provide a dummy implementation of some
    private methods to avoid repeating `isinstance(t, BuildTarget)` when dealing
    with custom targets.
    r   c                     y r   rT   )r   r  r  s      rV   r  z)CustomTargetBase.get_dependencies_recurse	      rU   c                    t               S r   r   r   s    rV   r  z.CustomTargetBase.get_internal_static_libraries	  
    |rU   c                     y r   rT   r  s     rV   r  z6CustomTargetBase.get_internal_static_libraries_recurse	  rc  rU   Nr`  rf  rd  rj  )rP   rQ   rR   rQ  ra   r  r  r  rT   rU   rV   ra  ra  	  s     OrU   ra  c                  r    e Zd ZdZddddddddddddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d# fdZd$dZd Zd%d	Zd&d
Zd Z	d'dZ
d(dZd)dZd*dZd+dZd,dZd-dZd-dZd Zd.dZd'dZd'dZd/dZd0dZd Zd'dZd1dZd Zd2dZd Zd  Zd! Zd3d"Z  xZ!S )4r?   customFNz#Generating {} with a custom command)r  rx   r  r  r6  r  r  r  feedrg   ro   rs   rp   absolute_pathsbackendr  c          
        t         |   |||dt        j                  |||       t	        |      | _        t        |t        t        ||      g             | _	        |	|	n|| _
        |
| _        || _        t	        |xs g       | _        g | _        | j                  |      | _        || _        |xs
 t%               | _        t	        |xs g       | _        || _        t	        |xs g       | _        || _        t1        |t3        | j                              | _        |r|n| j                  d   | _        || _        || _        y )NFr   )r/  r
  r   HOSTr  ri   r   r   get_sources_string_namesr;  rx   r  r  r6  r   r]  commandr  r"   r  r  rj  ro   rs   r   r   rp   r   r  rk  )r   r   r   r   r0   rp  ri   r;  r  rx   r  r  r6  r  r  r  rj  rg   ro   rs   rp   rk  rl  r  r\  s                           rV   r
  zCustomTarget.__init__	  s.   > 	vz5-:L:Lk "4	6G}(1(': 5E4P 0V] !34HJ++G40.0!-"526	 1r2(/S=NO Ddll1o	& -rU   c                     y)N)NNrT   r   s    rV   r  z$CustomTarget.get_default_install_dir9
      rU   c                    d}|j                  | j                  j                  | j                         | j                        S rS  r[  r\  rP   r  rp  rU  s     rV   r_  zCustomTarget.__repr__<
  s.    #t~~66t||TTrU   c                H   g }|j                  | j                         |j                  | j                         | j                  D ]Z  }t	        |t
              r|j                  |j                         /t	        |t        j                        rJ|j                  |       \ |S r   )
r  r   r  ri   r  r@   r   rq  r   r  )r   r  rz  s      rV   get_target_dependenciesz$CustomTarget.get_target_dependencies@
  s{    46D%%&D&&' 	A!./AHH%8#;#;<A		
 rU   c                    t               }| j                         }|D ]T  }t        |t              r|j	                  |       %t        |t
              s6|j                  |j                                V |S )a  
        Recursively fetch the build targets that this custom target depends on,
        whether through `command:`, `depends:`, or `sources:` The recursion is
        only performed on custom targets.
        This is useful for setting PATH on Windows for finding required DLLs.
        F.ex, if you have a python script that loads a C module that links to
        other DLLs in your project.
        )r   rv  r  rD   rl  r?   r   get_transitive_build_target_deps)r   bdepsr  rD  s       rV   rx  z-CustomTarget.get_transitive_build_target_depsK
  sf     >AU++- 	CA![)		!A|,Q??AB		C
 rU   c                    | j                   S r   r   r   s    rV   r  zCustomTarget.get_dependencies]
  r?  rU   c                    | j                   S r   r+  r   s    rV   r  zCustomTarget.should_install`
  r   rU   c                    | j                   S r   r  r   s    rV   r   z#CustomTarget.get_custom_install_dirc
  r  rU   c                    | j                   S r   r  r   s    rV   r   z$CustomTarget.get_custom_install_modef
  r?  rU   c                    | j                   S r   r  r   s    rV   r  zCustomTarget.get_outputsi
  r   rU   c                     | j                   d   S ru  r  r   s    rV   r  zCustomTarget.get_filenamel
  s    ||ArU   c                    | j                   S r   r   r   s    rV   r   zCustomTarget.get_sourceso
  r   rU   c                p    g }| j                   D ]$  }t        |t              s|j                  |       & |S r   )ri   r  rA   r   )r   genlistsrz  s      rV   get_generated_listsz CustomTarget.get_generated_listsr
  s7    *, 	#A!]+"	# rU   c                "    | j                         S r   )r  r   s    rV   r  z"CustomTarget.get_generated_sourcesy
  s    ''))rU   c                z   | j                   t        d      |rpt        j                  j	                  |d         }t        j                  j                  |      d   }| j                   j                  d|      j                  d|      S d| j                   v sd| j                   v rt        d      | j                   S )NzOTried to get depfile name for custom_target that does not have depfile defined.r   r  r  zKSubstitution in depfile for custom_target that does not have an input file.r  )r   infilenamesr  r  s       rV   r  zCustomTarget.get_dep_outname|
  s    <<"#tuu((Q8Iww''	215H<<''h?GGW`aat||+}/L&'tuu<<rU   c                V    |j                  d      ryt        j                  d|      ryy)N)r  z.dllr  z.sor   Tz\.so(\.\d+)*$F)endswithresearch)r   r  s     rV   is_linkable_outputzCustomTarget.is_linkable_output
  s'    ??BC99%v.rU   c                p    t        | j                        dk7  ry| j                  | j                  d         S )Nr
   Fr   )r   r;  r  r   s    rV   r  zCustomTarget.is_linkable_target
  s/    t||!&&t||A77rU   c                h    t         j                  j                  | j                  d         d   }|dvS )Whether this target links dynamically or statically

        Does not assert the target is linkable, just that it is not shared

        :return: True if is dynamically linked, otherwise False
        r      r  r  )rh  r   r  r;  r   sufs     rV   r  zCustomTarget.links_dynamically
  s0     ggt||A/3.((rU   c                    i S r   rT   r  s     rV   r  z"CustomTarget.get_link_deps_mapping
  r  rU   c                    t               S r   re  r   s    rV   r  z!CustomTarget.get_link_dep_subdirs
  rf  rU   c                    g S r   rT   r   s    rV   r  zCustomTarget.get_all_link_deps
  r  rU   c                    t        | j                        dk7  ryt        | | j                  d         j                         S )zI
        Returns True if this is a not installed static library.
        r
   Fr   )r   r;  r@   r  r   s    rV   r  zCustomTarget.is_internal
  s6     t||! t||A7CCEErU   c                "    | j                         S r   )r  r   s    rV   r  z CustomTarget.extract_all_objects
  s    !!rU   c                     y)Nz@cusrT   r   s    rV   r  zCustomTarget.type_suffix
  r  rU   c                4    t        | | j                  |         S r   )r@   r;  r   indexs     rV   __getitem__zCustomTarget.__getitem__
  s     t||E':;;rU   c                    t         r   r  )r   r  r  s      rV   __setitem__zCustomTarget.__setitem__
  r  rU   c                    t         r   r  r  s     rV   __delitem__zCustomTarget.__delitem__
  r  rU   c              #  J   K   | j                   D ]  }t        | |        y wr   )r;  r@   )r   r  s     rV   __iter__zCustomTarget.__iter__
  s&      	-A#D!,,	-s   !#c                ,    t        | j                        S r   )r   r;  r   s    rV   __len__zCustomTarget.__len__
  s    4<<  rU   ).r   r   r   r   r   r   r0   rN  rp  zYT.Sequence[T.Union[str, BuildTargetTypes, GeneratedList, programs.ExternalProgram, File]]ri   zkT.Sequence[T.Union[str, File, BuildTargetTypes, ExtractedObjects, GeneratedList, programs.ExternalProgram]]r;  r   r  rI   rx   r   r  rI   r  rI   r6  z$T.Optional[T.Sequence[FileOrString]]r  z3T.Optional[T.Sequence[T.Union[str, SourceOutputs]]]r  r   r  r  rj  rI   rg   rI   ro   z0T.Optional[T.List[T.Union[str, Literal[False]]]]rs   zT.Optional[FileMode]rp   #T.Optional[T.List[T.Optional[str]]]rk  rI   rl  zT.Optional['Backend']r  r   r  )r   z#T.List[T.Union[SourceOutputs, str]])r   z+T.Set[T.Union[BuildTarget, 'CustomTarget']]r  r  rc  ro  rn  )r   zcT.List[T.Union[str, File, BuildTarget, GeneratedTypes, ExtractedObjects, programs.ExternalProgram]])r   zT.List[GeneratedList])r  r   r   rI   ra  rb  r   z(T.List[T.Union[str, 'ExtractedObjects']])r  intr   z'CustomTargetIndex')r   r  )"rP   rQ   rR   r  r
  r  r_  rv  rx  r  r  r   r   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rp  rq  s   @rV   r?   r?   	  s   H -26:!&!&FJVZ,09=#!&QU6:DH(-26$I98-&8-8- !8- 6	8-
68-?8- &8- &*8- $48- 8-  !8-"  D#8-$ !T%8-& *'8-( 7)8-* +8-, -8-. O/8-0  418-2 B38-4 "&58-6 078-8 "98-tU	$! !*
 8
)F"<""-!rU   r?   c                  v     e Zd ZdZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZed	d       Zd
dZ	 xZ
S )CompileTargetz|
    Target that only compile sources without linking them together.
    It can be used as preprocessor, or transpiler.
    compilec                   |j                         |i}d|j                  |	i|
|d}t        |   ||||j                  |d g |||
       || _        || _        || _        g | _        i | _	        | j                  D ]  }| j                  |        | j                  D ]N  }|j                         D ]9  }|j                  | ||      }| j                  t        j                   |             ; P y )NF)rx   r-  rz   r   )rB  r|  r/  r
  r   r9  r"  output_templr;  sources_mapri   _add_outputr  r  get_target_generated_dirr   from_built_relative)r   r   r   r   r0   ri   r  r"  rl  compile_argsrz   r   r  r  r  r  r  rel_srcr\  s                     rV   r
  zCompileTarget.__init__
  s    **,h7	 %&//>#6(	
 	vz83G3G $KF	L (.0 	 AQ	 nn 	DF'') D!::4K  !9!9'!BCD	DrU   c                     y)Nz@compilerT   r   s    rV   r  zCompileTarget.type_suffix
  rr  rU   c                     yr  rT   r   s    rV   rz  zCompileTarget.is_unity
  s    rU   c                F   t         j                  j                  |j                        }t         j                  j	                  |      d   }| j
                  j                  d|      j                  d|      }| j                  j                  |       || j                  |<   y r  )
rh  r   r  r  r  r  r  r;  r   r  )r   r  r  r  r  s        rV   r  zCompileTarget._add_output
  s{    GG$$QWW-	77##I.q1%%lH=EEmU^_ArU   )r   r   r   r   r   r   r0   rN  ri   r\  r  r   r"  r3   rl  r2   r  r   rz   rL   r   rh  rn  r  )r  r   r   r   )rP   rQ   rR   rQ  r  r
  r  ro  rz  r  rp  rq  s   @rV   r  r  
  s    
 HDDD !D 6	D
 2D  #D $D "D  +D ':D  ?DB   rU   r  c                       e Zd ZdZ	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZddZddZ	ddZ
dd	Zdd
Z xZS )	RunTargetrunc	                    t         	|   |||dt        j                  |       || _        g | _        | j                  |      | _        d| _        || _	        || _
        y r  )r/  r
  r   r^  r   r6  r]  rp  rk  r  default_env)
r   r   rp  r   r   r   r0   r  r  r\  s
            rV   r
  zRunTarget.__init__  s[     	vz5-:M:M{[(++G4#&rU   c                    d}|j                  | j                  j                  | j                         | j                  d         S )NrT  r   rt  rU  s     rV   r_  zRunTarget.__repr__  s3    #t~~66t||TUWWrU   c                    | j                   S r   r   r   s    rV   r  zRunTarget.get_dependencies  r?  rU   c                    g S r   rT   r   s    rV   r  zRunTarget.get_generated_sources  r  rU   c                    g S r   rT   r   s    rV   r   zRunTarget.get_sources  r  rU   c                     yr  rT   r   s    rV   r  zRunTarget.should_install   r  rU   c                    | j                   S r   r  r   s    rV   r  zRunTarget.get_filename#  r7  rU   c                    t        | j                  t              r| j                  gS t        | j                  t              r| j                  S t	        d      )NzBRunTarget: self.name is neither a list nor a string. This is a bug)r  r   r   r  r  r   s    rV   r  zRunTarget.get_outputs&  s@    dii%II;		4(99cddrU   c                     y)Nz@runrT   r   s    rV   r  zRunTarget.type_suffix.  r  rU   r   )r   r   rp  zJT.Sequence[T.Union[str, File, BuildTargetTypes, programs.ExternalProgram]]r   zT.Sequence[Target]r   r   r   r   r0   rN  r  z"T.Optional['EnvironmentVariables']r  rI   rn  )r   r[  rg  r   r  ro  )rP   rQ   rR   r  r
  r_  r  r  r   r  r  r  r  rp  rq  s   @rV   r  r  
  s    H <@%)'d'1' ' !	'
 6' 9' #'"X!erU   r  c                  6     e Zd ZdZ	 	 	 	 	 	 d fdZd Z xZS )AliasTargetaliasc                .    t         |   |g ||||       y r   )r/  r
  )r   r   r   r   r   r0   r\  s         rV   r
  zAliasTarget.__init__5  s    r<[QrU   c                n    d}|j                  | j                  j                  | j                               S )Nz	<{0} {1}>)r[  r\  rP   r  rU  s     rV   r_  zAliasTarget.__repr__9  s(    t~~66FFrU   )
r   r   r   zT.Sequence['Target']r   r   r   r   r0   rN  )rP   rQ   rR   r  r
  r_  rp  rq  s   @rV   r  r  1  s/    HRR*-R<SRGrU   r  c                  l     e Zd ZeZdZ	 	 	 	 	 	 	 	 d fdZd Zd Zd Z	ddZ
d Zd Zd	 Zdd
Z xZS )Jarjarc                   t         |   |||||||||	|

       | j                  D ]"  }|j                  d      rt	        d| d       | j
                  D ]!  }t        |t              rt	        d| d       | j                  rt	        d      | j                  dz   | _
        | j                  g| _        | j                  d   | _        |
j                  d	d
      | _        |
j                  dd       | _        y )Nz.javazJar source z is not a java file.zLink target z is not a jar target.z5structured sources are not supported in Java targets.z.jarr  r   r   r   )r/  r
  ri   r  r   r4  r  r  r1  r   r9  r;  r<  	java_argsrA  r   r   )r   r   r   r   r   ri   r1  rh   r0   r  r  r  r  r\  s                rV   r
  zJar.__init__B  s    	vz;I[]d$i	9 	NA::g&&QC7K'LMM	N "" 	PAa%&aS8M'NOO	P """#Z[[		F*0 **\26=CZZHXZ^=_rU   c                    | j                   S r   )r   r   s    rV   get_main_classzJar.get_main_classV  r/  rU   c                     y)Nz@jarrT   r   s    rV   r  zJar.type_suffixY  r  rU   c                    | j                   S r   )r  r   s    rV   get_java_argszJar.get_java_args\  r  rU   c                    | j                   S r   )r   r   s    rV   get_java_resourceszJar.get_java_resources_  r   rU   c                     y r   rT   r   s    rV   rI  zJar.validate_installb  r  rU   c                     yr   rT   r   s    rV   r  zJar.is_linkable_targetf  r!  rU   c                :   | j                   D cg c]>  }t        j                  j                  |j	                         |j                               @ }}t        j                  j                  |      }|r!dt        j                  j                  |      gS g S c c}w )Nz-cp)r4  rh  r   r   r  r  pathsep)r   r   cp_paths	cp_strings       rV   get_classpath_argszJar.get_classpath_argsi  so    LPL]L]^qBGGLL1AB^^JJOOH-	2::??8455		 _s   ABc                :    | j                   j                         dfS )Nz{jardir})r0   get_jar_dirr   s    rV   r  zJar.get_default_install_dirp  s    ++-z99rU   )r   r   r   r   r   r   r   r   ri   zT.List[SourceOutputs]r1  zT.Optional['StructuredSources']r0   rN  r  r_  )r   r]  r  )rP   rQ   rR   known_jar_kwargsra  r  r
  r  r  r  r  rI  r  r  r  rp  rq  s   @rV   r  r  =  s_    #LH`/`Ed`'>`Kb`(#:rU   r  c                      e Zd ZU dZdZded<   ded<   ded<   dd	Zedd
       Zd Z	ddZ
ddZddZddZd ZddZddZddZddZddZddZd dZd!dZy)"r@   zA special opaque object returned by indexing a CustomTarget. This object
    exists in Meson, but acts as a proxy in the backends, making targets depend
    on the CustomTarget it's derived from, but only adding one source file to
    the sources.
    ri  zT.ClassVar[str]r  z$T.Union[CustomTarget, CompileTarget]rq  r   r  c                :    | j                   j                  | _        y r   )rq  r   r   s    rV   r|  zCustomTargetIndex.__post_init__  s    ;;22rU   c                N    | j                   j                   d| j                   dS )N[])rq  r   r  r   s    rV   r   zCustomTargetIndex.name  s$    ++""#1T[[M33rU   c                N    dj                  | j                  | j                        S )Nz<CustomTargetIndex: {!r}[{}]>)r[  rq  r  r   s    rV   r_  zCustomTargetIndex.__repr__  s    .55dkk4;;OOrU   c                    | j                   gS r   r  r   s    rV   r  zCustomTargetIndex.get_outputs  s    }rU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  zCustomTargetIndex.get_subdir  s    {{%%''rU   c                    | j                   S r   r  r   s    rV   r  zCustomTargetIndex.get_filename  rb  rU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  zCustomTargetIndex.get_id  s    {{!!##rU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  z#CustomTargetIndex.get_all_link_deps  s    {{,,..rU   c                8    | j                   j                  |      S r   )rq  r  r  s     rV   r  z'CustomTargetIndex.get_link_deps_mapping  s    {{0088rU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  z&CustomTargetIndex.get_link_dep_subdirs  s    {{//11rU   c                L    | j                   j                  | j                        S r   )rq  r  r  r   s    rV   r  z$CustomTargetIndex.is_linkable_target  s    {{--dkk::rU   c                b    t         j                  j                  | j                        d   }|dvS )r  r  r  )rh  r   r  r  r  s     rV   r  z#CustomTargetIndex.links_dynamically  s,     ggt{{+B/.((rU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  z CustomTargetIndex.should_install  s    {{))++rU   c                    t         j                  j                  | j                        d   }|dv xr | j	                          S )zH
        Returns True if this is a not installed static library
        r  r  )rh  r   r  r  r  r  s     rV   r  zCustomTargetIndex.is_internal  s=     ggt{{+B/n$BT-@-@-B)BBrU   c                6    | j                   j                         S r   )rq  r  r   s    rV   r  z%CustomTargetIndex.extract_all_objects  s    {{..00rU   c                6    | j                   j                         S r   )rq  r   r   s    rV   r   z(CustomTargetIndex.get_custom_install_dir  s    {{1133rU   Nr  rn  ro  ra  rb  r  r  r  )rP   rQ   rR   rQ  r  rS   r|  ro  r   r_  r  r  r  r  r  r  r  r  r  r  r  r  r   rT   rU   rV   r@   r@   s  s     !)Ho(00K3 4 4P($/92;),C14rU   r@   c                  L     e Zd Z	 dd fdZd	dZd
dZddZddZddZ xZ	S )ConfigurationDatac           	         t         |           |r8|j                         D ci c]  \  }}|t        |t              r|n|d f c}}ni | _        d| _        y c c}}w r  )r/  r
  r  r  tupler  used)r   initial_valuesr  r  r\  s       rV   r
  zConfigurationData.__init__  sX     	`n^EYEYE[\TQQZ5)4y8\tv 		 ]s   !Ac                ,    t        | j                        S r   )rV  r  r   s    rV   r_  zConfigurationData.__repr__      DKK  rU   c                    || j                   v S r   r  )r   r  s     rV   __contains__zConfigurationData.__contains__  s    ##rU   c                ,    t        | j                        S r   )rI   r  r   s    rV   r  zConfigurationData.__bool__  r  rU   c                     | j                   |   S r   r  r  s     rV   rA  zConfigurationData.get  s    {{4  rU   c                6    | j                   j                         S r   )r  r  r   s    rV   r  zConfigurationData.keys  s    {{!!rU   r   )r  zyT.Optional[T.Union[T.Dict[str, T.Tuple[T.Union[str, int, bool], T.Optional[str]]], T.Dict[str, T.Union[str, int, bool]]]]rn  )r  r   r   rI   r  )r   r   r   z1T.Tuple[T.Union[str, int, bool], T.Optional[str]])r   zT.Iterator[str])
rP   rQ   rR   r
  r_  r  r  rA  r  rp  rq  s   @rV   r  r    s&      !$!!"rU   r  c                      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<   d	Zded<   ddZy	)Datar   ri   r   ro   r   r   rs   r   Nr   renamer   rp   	data_typer   r   c                    | j                   G| j                  D cg c]+  }t        j                  j	                  |j
                        - c}| _         y y c c}w r   )r  ri   rh  r   r  r  )r   r  s     rV   r|  zData.__post_init__  s=    ;;>BllK277++AGG4KDK Ks   0Ar  )	rP   rQ   rR   rS   r  rp   r  r   r|  rT   rU   rV   r  r    sN    OFK#'K'Is(,O%,LrU   r  c                  L    e Zd ZU ded<   ded<   ded<   ded<   dZded<   d
d	Zy)SymlinkDatar   rq  r   ro   r   Nr   rp   c                    | j                   t        j                  j                  | j                         k7  rt	        d| j                    d      y )NzLink name is "zX", but link names cannot contain path separators. The dir part should be in install_dir.)r   rh  r   r  r   r   s    rV   r|  zSymlinkData.__post_init__  sK    99((33"^DII; ?L $L M M 4rU   r  )rP   rQ   rR   rS   rp   r|  rT   rU   rV   r  r    s'    K
IO#'K'MrU   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)	TestSetupr   exe_wrapperrI   gdbr  timeout_multiplierr"   r  exclude_suitesNrO   rT   rU   rV   r	  r	    s    	I	rU   r	  c                   g }| D ]  }t        |t              r|j                  |       %t        |t        t        t
        t        f      r||j                         z  }Yt        |t              r||j                  |      z  }~t        |t              r|j                  |j                         t        d|       |S )zw
    For the specified list of @sources which can be strings, Files, or targets,
    get all the output basenames.
    zUnknown source type: )r  r   r   rD   r?   r@   rA   r  rE   determine_ext_objsr   r  r<  )ri   rl  namesr  s       rV   ro  ro    s    
 E 
@aLLOK7H-XYQ]]_$E+,W//22E4 LL! #8!>??
@ LrU   c                    t         j                  j                  | dd      }	 t        |dt              }t        j                  |       |j                  _        |S # t        $ r t        d|d      w xY w)Nzmeson-privatez	build.datz
Build datazNo such build data file as r   )
rh  r   r   r#   r   r   loadr0   FileNotFoundErrorr   )r  r9  bs      rV   r  r    sl    ww||IDHJ,6!)y!9 J:8,aHIIJs   6A A3c                   | j                   j                  }d | j                   _        	 t        |d      5 }t        j                  | |       d d d        || j                   _        y # 1 sw Y   xY w# || j                   _        w xY w)Nwb)r0   r   openpickledump)objr9  cdatar  s       rV   saver    sn    OO$$E#COO)(D! 	 QKKQ	  $) 	  	  $) s"   A2 A&A2 &A/+A2 2B)rp   r  r   r  r   zT.List[T.Optional[str]]rn  )r  r   r   r   )r  r   r9  r   r   r   )
__future__r   collectionsr   r   dataclassesr   r   r   	functoolsr	   r"  r  r  r}  rh  r  r  r  typingr  r   r   r   r   r   mesonlibr   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(   r)   r*   r+   interpreterbaser,   r-   TYPE_CHECKINGtyping_extensionsr.   r/   r0   _typingr1   backend.backendsr2   r3   interpreter.interpreterr4   r5   interpreter.interpreterobjectsr6   r7   linkers.linkersr8   r9   r:   r;   r	  r<   mparserr=   wrapr>   UnionrF   LibTypesrk  r   ObjectTypesrH   
pch_kwargslang_arg_kwargsvala_kwargsrust_kwargs	cs_kwargsbuildtarget_kwargsrm  r  rG  rM  r#  r  r   r   r   r   r   r   r   r   r   r   rS  rE   r  ABCMetar  rD   rs  ry  r  rA   r  rC   rB   rT  rO  rZ  ra  r?   r  r  r  r  r@   r  r  r  r	  ro  r  r  )r  s   0rV   <module>r7     s   # 0 1 1  
   	  	              ;??4.)#C4+-II$!WWQRNww\]HwwQR''#v'9;KKLK,I , y!
.;<ddV5><    7 "78)$	 :   	
   -/dd .1zz .2BJ1OO .1OO #|5E&FF 	&)	.E	 4 	~ 	 e  
 e(n ( (6 e.  " e(~ ( ( e- - - e
 
 
D: D:L e$. $ $L e3T~ 3T 3Tl e5!- - "-` e|^s{{ | ||~(& ~(@ 	 	 .U Up eDN D DNY Yx] K ] ~HK HXN= NB}% }"$ $L &I!6+[ I!V5 K 5 p1 1f
G) 
G4:+ 4:l eG4(. G4 G4R" "6 eL> L L e
M. 
M 
M e     &J)_^ =s   P
