
    ea                      d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dl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mZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl m#Z# ddl$m%Z%m&Z& ddlm'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddlm0Z0m1Z1m2Z2 d	dlm3Z3 ddlm4Z4m5Z5 ejl                  rQd dl7m8Z8 ddl9m:Z: ddlm;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZE ej                  ej                  deHf      ZIe8d    ZJd!ZKd"ZLd#ZMd$ZNdBd%ZOdCd&ZP ej                         reOZRd'd(gZSg d)ZTne/ZRg ZSg d*ZTdDd+ZU eU       ZVh d,ZW ej                  d-      ZY ej                  d.      ZZdEdFd/Z[ G d0 d1      Z\e G d2 d3e             Z] G d4 d      Z^e G d5 d6             Z_ G d7 d8      Z` G d9 d:      Zae G d; d<             Zbe G d= d>             Zc G d? d@ej                        ZedGdAZfy)H    )annotations)OrderedDict)	dataclass)Enumunique)	lru_cache)PurePathPath)dedentN   )backends   )modules)environmentmesonlib)build)mlog)	compilers)CompilerArgs)Compiler)ArLikeLinkerRSPFileSyntax)	FileLibTypeMachineChoiceMesonBugExceptionMesonException
OrderedSet
PerMachineProgressBar	quote_arg)get_compiler_for_sourcehas_path_sep	OptionKey)
CleanTrees)GeneratedListInvalidArguments)Literal)ImmutableListProtocol)ExtractedObjectsLibTypes)Interpreter)DynamicLinkerStaticLinker)
CsCompiler)FortranCompilerNinjaCommandArg)201520182021z$^\s*#?include\s*['\"](\w+\.\w+)['\"]z#^\s*\bmodule\b\s+(\w+)\s*(?:!+.*)*$z*^\s*\bsubmodule\b\s*\((\w+:?\w+)\)\s*(\w+)z0^\s*use,?\s*(?:non_intrinsic)?\s*(?:::)?\s*(\w+)c                r    t        j                  dd |       } t        j                  dd |       } d|  d} | S )Nz(\\*)"c                N    dt        | j                  d            dz  dz   z  dz   S )N\r   r   "lengroupms    A/usr/lib/python3/dist-packages/mesonbuild/backend/ninjabackend.py<lambda>zcmd_quote.<locals>.<lambda>H   s&    dc!''!*o.AA.E&F&L     z(\\*)$c                B    dt        | j                  d            dz  z  S )Nr7   r   r   r9   r<   s    r>   r?   zcmd_quote.<locals>.<lambda>J   s    dc!''!*o.A&B r@   r8   )resub)args    r>   	cmd_quoterE   C   s<    
 &&Lc
RC
&&BC
HCcU!*CJr@   c                P    | j                  dd      } t        j                  |       S )Nr7   \\)replaceshlexquotess    r>   gcc_rsp_quoterM   P   s"     	
		$A;;q>r@   cmd/c)delz/fz/sz/q{}&&)rmz-frQ   rR   c                     t        j                         rd} nd} | dz  } t        t        j                  j                  d|             S )zReturn a conservative estimate of the commandline size in bytes
    above which a response file should be used.  May be overridden for
    debugging by setting environment variable MESON_RSP_THRESHOLD.i    i   r   MESON_RSP_THRESHOLD)r   
is_windowsintosenvironget)limits    r>   get_rsp_thresholdr\   f   sB    
  
 QJErzz~~3U;<<r@   >   DESCpooldyndep	targetdepdescriptionDEPFILE_UNQUOTEDz[$ :\n]z[$ \n]c                    |rt         }nt        }|j                  |       s| S d| v rd|  d}t        |      |j	                  d|       S )N
z<Ninja does not support newlines in rules. The content was:

zE

Please report this error with a test case to the Meson bug tracker.z$\g<0>)NINJA_QUOTE_BUILD_PATNINJA_QUOTE_VAR_PATsearchr   rC   )textis_build_linequote_reerrmsgs       r>   ninja_quoterl      s]    (&??4 t| DG
 V$$<<	4((r@   c                      e Zd ZddZy)TargetDependencyScannerInfoc                     || _         || _        y N)private_dirsource2object)selfrq   rr   s      r>   __init__z$TargetDependencyScannerInfo.__init__   s    &*r@   N)rq   strrr   zT.Dict[str, str])__name__
__module____qualname__rt    r@   r>   rn   rn      s    +r@   rn   c                      e Zd ZdZdZdZdZy)Quotingr   r   r      N)rv   rw   rx   bothnotShellnotNinjanonery   r@   r>   r{   r{      s    DHHDr@   r{   c                  F    e Zd Zej                  fddZddZedd       Zy)r1   c                     || _         || _        y rp   )rL   quoting)rs   rL   r   s      r>   rt   zNinjaCommandArg.__init__   s    r@   c                    | j                   S rp   rK   rs   s    r>   __str__zNinjaCommandArg.__str__   s    vvr@   c                @    | D cg c]  }t        ||       c}S c c}w rp   )r1   )lqis      r>   listzNinjaCommandArg.list   s    /01!1%111s   N)rL   ru   r   r{   returnNone)r   ru   )r   T.List[str]r   r{   r   zT.List[NinjaCommandArg])	rv   rw   rx   r{   r}   rt   r   staticmethodr   ry   r@   r>   r1   r1      s'    29,,  2 2r@   c                       e Zd ZU ded<   ddZy)NinjaCommentru   commentc                    | j                   j                  d      D ]5  }|j                  d       |j                  |       |j                  d       7 |j                  d       y )Nrd   z# )r   splitwrite)rs   outfiler   s      r>   r   zNinjaComment.write   sR    ##D) 	 AMM$MM!MM$	  	dr@   Nr   zT.TextIOr   r   )rv   rw   rx   __annotations__r   ry   r@   r>   r   r      s    Lr@   r   c                  l    e Zd Zddddej                  f	 	 	 	 	 	 	 	 	 	 	 ddZeefd       ZddZ	d Z
y)		NinjaRuleFNc
                T   dd}
|| _         |D cg c]
  } |
|       c}| _        |D cg c]
  } |
|       c}| _        || _        || _        || _        || _        || _        d| _        d| _	        |	| _
        | j
                  dk(  r| xj
                  dz  c_        y y c c}w c c}w )Nc                ^   t        | t              r| S | dk(  rt        | t        j                        S | j	                  d      rat        j                  d|       j                  d      }|t        vrt        | t        j                        S t        | t        j                        S t        |       S )NrR   $z\$\{?(\w*)\}?r   )
isinstancer1   r{   r~   
startswithrB   rg   r;   	raw_namesr   r   )cvars     r>   strToCommandArgz+NinjaRule.__init__.<locals>.strToCommandArg   s    !_- Dy&q'*:*:;;||C ii 0!4::1=i' +1gll;; +1g.>.>??"1%%r@   r   $DEPFILE	_UNQUOTED)r   zT.Union[NinjaCommandArg, str]r   r1   )namecommandargsra   depsdepfileextrarspablerefcountrsprefcountrspfile_quote_style)rs   ruler   r   ra   r   r   r   r   r   r   r   as                r>   rt   zNinjaRule.__init__   s    
	&, 	MT0U1C0UJN-OQoa.@-O	&	
#6 <<:%LLK'L & 1V-Os
   B B%c                j   t        | t              r| j                  t        j                  k(  r| j
                  S | j                  t        j                  k(  r || j
                        S | j                  t        j                  k(  rt        | j
                        S t         |t        |                   S rp   )
r   r1   r   r{   r   rL   r   r~   rl   ru   )xqfs     r>   _quoterzNinjaRule._quoter   sx    a)yyGLL(ss
g...!##wg..."133''2c!f:&&r@   c                l     j                   } j                  t        j                  u r;t        }|D cg c])  }|j
                  dk(  rt        d|j                        n|+ }}nt        } fd} |       D ]&  }|j                  d j                   | d       |dk(  r|j                  dj                  dj                   j                  D cg c]  } j                  |       c}                   |j                  d	       |j                  d
j                  dj                  |D cg c]  } j                  ||       c}                   nc|j                  dj                  dj                   j                   j                   z   D cg c]  } j                  |       c}                    j                  r|j                  d j                   d        j                   r|j                  d j                    d       |j                  d j"                   d        j$                  rS j$                  j'                  d      D ]5  }|j                  d       |j                  |       |j                  d       7 |j                  d       ) y c c}w c c}w c c}w c c}w )N$inz$in_newlinec               3  P   K    j                   rd  j                  rd y y w)N _RSP)r   r   r   s   r>   	rule_iterz"NinjaRule.write.<locals>.rule_iter   s&     }}  s   #&zrule rd   r   z command = {} @$out.rsp
 z rspfile = $out.rsp
z rspfile_content = {}
z command = {}
z deps = z depfile = z description = )r   r   r   MSVCrE   rL   r1   r   rM   r   r   formatjoinr   r   r   r   ra   r   r   )	rs   r   rspfile_argsrspfile_quote_funcrD   r   rspr   r   s	   `        r>   r   zNinjaRule.write   sE   yy##}'9'99!*nz{gj355TY>OM3;;G_bb{L{!.	 ; 	 CMME$))SE45f}9@@dhdpdpJq_`4<<XY?JqArst567>>sxx  wC  IDqrVWYkIl  ID  @E  F  G/66sxxZ^ZfZfimirirZr@sUVa@s7tuvyy267||DLL><=MMOD,<,<+=R@Azz))$/ (AMM#&MM!$MM$'( MM$%	  | Kr ID@ss   .J"J'-J,J1c                ~   i }|D ]  }|\  }}|||<    | j                   |d<   | j                  |d<   ||d<   ||d<   dj                  | j                  | j                  z   D cg c]  }| j                  |       c}      }	t        |	      }
t        j                  d|	      D ]  }|j                  d      dk7  s|
|j                  d      |j                  d      z
  dz   z  }
|j                  d      }|d   d	k(  r|d
d }n|dd  }|j                  |g       }|
t        dj                  |            z  }
 |
S c c}w )Nr   r   inoutr   z(\${\w+}|\$\w+)?[^$]*r   {r   )r   r   r   r   r   r   r:   rB   finditerstartendr;   rZ   )rs   infilesoutfileselems
ninja_varser   valuer   r   estimater=   chunks                r>   length_estimatezNinjaRule.length_estimate  sG    
 	%AMT5$Jt	% "YY
6 $
9"
4$
5 ((T\\DII5MNDLLONOw<5w? 		1AwwqzRAEE!Hqwwqz1A55
8s?!!BKE!!"IE"ub1C00		1  Os   "D:)r   ru   r   CommandArgOrStrr   r   ra   ru   r   boolr   T.Optional[str]r   r   r   r   r   r   r   )rv   rw   rx   r   GCCrt   r   
quote_funcr   r   r   ry   r@   r>   r   r      sp    38RV,046C6G6G((!((,0((@O(()((9H(( '4((T " 	' 	'  Dr@   r   c                  D    e Zd Zd
ddZddZd ZddZd Zd Zd Z	d	 Z
y)NinjaBuildElementNc                2   |xs g | _         t        |t              r	|g| _        n|| _        t        |t              sJ || _        t        |t              r	|g| _        n|| _        t               | _        t               | _        g | _	        || _
        d| _        y Nr   )implicit_outfilenamesr   ru   outfilenamesrulenameinfilenamesr   r   	orderdepsr   all_outputsoutput_errors)rs   r   r   r   r   implicit_outss         r>   rt   zNinjaBuildElement.__init__0  s    %2%8b"lC(!-D ,D(C((( k3' +}D*DL	#
&r@   c                    t        |t              r| j                  j                  |       y | j                  j	                  |       y rp   )r   r   r   updateaddrs   deps     r>   add_depzNinjaBuildElement.add_depB  s.    c4 IIS!IIMM#r@   c                    t        |t              r| j                  j                  |       y | j                  j	                  |       y rp   )r   r   r   r   r   r   s     r>   add_orderdepzNinjaBuildElement.add_orderdepH  s0    c4 NN!!#&NNs#r@   c                    t        |t              r|j                         }t        |t              r|g}| j                  j                  ||f       |dk(  r!| j                  j                  |dz   |f       y y )NDEPFILEr   )r   r   	to_nativeru   r   append)rs   r   r   s      r>   add_itemzNinjaBuildElement.add_itemN  sj     e\*OO%EeS!GE

4-(9JJtk159: r@   c           	        | j                   dk(  ry| j                  j                  sydj                  | j                  D cg c]  }t        |d       c}      }dj                  | j                  D cg c]  }t        |d       c}      }| j                  j                  ||| j                        t        k\  S c c}w c c}w )NphonyFr   T)
r   r   r   r   r   rl   r   r   r   rsp_threshold)rs   r   r   r   s       r>   _should_use_rspfilez%NinjaBuildElement._should_use_rspfileZ  s    ==G#yy  hhd>N>NOAt 4OPxxt?P?P Q!Q!5 QRyy(()5)-58EF 	F  P Qs   B<4Cc                    | j                   dk7  rP| j                         r | j                  xj                  dz  c_        y | j                  xj                  dz  c_        y y )Nr   r   )r   r   r   r   r   r   s    r>   count_rule_referencesz'NinjaBuildElement.count_rule_referencesi  sI    ==G#'')		%%*%		""a'"	 $r@   c                   | j                   rt        | j                         dj                  | j                  D cg c]  }t	        |d       c}      }dj                  | j
                  D cg c]  }t	        |d       c}      }dj                  | j                  D cg c]  }t	        |d       c}      }|rd|z   }| j                         }|r3| j                  dz   }t        j                  d| j
                   d       n| j                  }d| | d| d| }t        | j                        d	kD  rB|ddj                  t        | j                        D 	cg c]  }	t	        |	d       c}	      z   z  }t        | j                        d	kD  rZ| j                  D 	cg c]  }	t        |	       }
}	|d
dj                  t        |
      D 	cg c]  }	t	        |	d       c}	      z   z  }|dz  }|j!                  dd      }t#        j$                         r'dj                  d |j'                  d      D              }|j)                  |       |r4| j*                  j,                  t.        j0                  u rt2        }nt4        }nt6        }| j8                  D ]  }|\  }}|t:        v}d| d}g }|D ]D  }|r|dk(  r|j=                  t	        |             %|j=                  t	         ||                   F |dj                  |      z  }|dz  }|j)                  |        |j)                  d       y c c}w c c}w c c}w c c}	w c c}	w c c}	w )Nr   Tz | r   zCommand line for building z is long, using a response filezbuild z: r   z || rd   r7   /c              3  h   K   | ]*  }|j                  d       r|j                  d dd      n| , yw)z//rG   r   N)r   rH   ).0r   s     r>   	<genexpr>z*NinjaBuildElement.write.<locals>.<genexpr>  s5       01||D/A4+qHs   02z = rR   )r   r   r   r   rl   r   r   r   r   r   debugr:   r   sortedr   ru   rH   r   rV   r   r   r   r   r   r   rE   rM   r   r   r   r   )rs   r   r   insoutsr   use_rspfiler   liner   r   r   r   r   r   should_quotenewelemss                    r>   r   zNinjaBuildElement.writep  s    !3!344hhd6F6FGAt,GHxxt7H7HI!Q-IJ@Z@Z![1+a"6![\!M1M..0}}v-HJJ3D4E4E3FFefg}}Hvm_Bxj#?tyy>AECHHF499DU%Vqk!T&:%VWWWDt~~")-8AQ8I8FSXXVIEV&W{1d';&WXXXD ||D#&  88 C D 	dyy,,0B0BB"B 	 AMT5y0LtfC=DH 8#qDyOOKN3OOK1$67	8
 CHHX&&DDLDMM$	  	dm HI![ &W8&Ws#   L6.L;!M M M
Mc                    | j                   D ]6  }|| j                  v rd| d| _        | j                  j                  |       8 y )Nz%Multiple producers for Ninja target "z". Please rename your targets.)r   r   r   r   )rs   ns     r>   check_outputszNinjaBuildElement.check_outputs  sK    "" 	$AD$$$'LQCOm%n"  #	$r@   rp   )r   z
T.Set[str])r   zT.Union[str, T.List[str]]r   r   )r   ru   r   z'T.Union[str, T.List[str, CompilerArgs]]r   r   )rv   rw   rx   rt   r   r   r   r   r   r   r  ry   r@   r>   r   r   /  s,     $$
;F(9v$r@   r   c                  *    e Zd ZU ded<   ded<   ddZy)RustDepru   r   rW   cratec                4    | j                   | j                  dS )Nr
  r   r  r   s    r>   to_jsonzRustDep.to_json  s    ZZII
 	
r@   Nr   zT.Dict[str, object])rv   rw   rx   r   r  ry   r@   r>   r	  r	    s     I J
r@   r	  c                  t    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dZy)	RustCraterW   orderru   display_nameroot_moduleRUST_EDITIONSeditionT.List[RustDep]r   r   cfgr   is_proc_macrois_workspace_memberNr   proc_macro_dylib_pathc           
     .   | j                   | j                  | j                  | j                  | j                  | j
                  D cg c]  }|j                          c}d}| j                  r"| j                  J d       | j                  |d<   |S c c}w )N)r  r  r  r  r  r   zThis shouldn't happenr  )r  r  r  r  r  r   r  r  )rs   drets      r>   r  zRustCrate.to_json  s     --++||88!//*.))4QQYY[4$
 --9R;RR9+/+E+EC'(
 5s   Br  )rv   rw   rx   r   r  r  ry   r@   r>   r  r    sE    
 J
	 -1?1r@   r  c                  b    e Zd Zd fdZddZd ZdddZddZd Zd Z	dd	Z
dd
Zd Z	 d	 ddZddZd ZddZ	 	 	 	 ddZd Zd Zd Zd ZddZd ZddZd ZddZddZd Zd Zd ZddZddZ dd Z!dd!Z"dd"Z#dd#Z$dd$Z%dd%Z&d& Z'dd'Z(d( Z)d) Z*d* Z+d+ Z,	 	 dd,Z-	 	 dd-Z.	 	 dd.Z/dd/Z0dd0Z1	 	 	 	 	 	 	 	 dd1Z2dd2Z3dd3Z4e5dd4       Z6e7ddd5       Z8e7dd6       Z9e7dd7       Z:d8 Z;d9 Z<d: Z=d; Z>d< Z?d= Z@dd>ZAd? ZBd@ ZCdA ZDddBZEdC ZFddDZGdE ZHdF ZIddGZJddHZKdI ZLdJ ZMdK ZNdL ZOdM ZPdN ZQddOZRddPZSdQ ZTddRZUdS ZVdT ZWddUZXdV ZYdW ZZ e[dX      	 	 ddY       Z\	 d	 	 	 ddZZ]dd[Z^ e[dX      	 d	 	 	 dd\       Z_dd]Z`	 	 	 	 d	 	 	 	 	 	 	 dd^Zadd_Zbdd`Zcda ZdddbZedc Zfdd Zgde Zhdf ZiddgZjdh Zkdi Zldj Zmdk Zndl Zodm Zp e[dX      ddn       Zqdo Zrdp ZsdddqZtdr Zuds ZvddtZwdduZxdv ZyddwZzddxZ{dddyZ|ddzZ}dd{Z~dd|Zdd}Zdd~Zd fdZ xZS )NinjaBackendc                    t         |   ||       d| _        d| _        i | _        t               | _        i | _        t        dd      | _	        i | _
        g | _        y )Nninjabuild.ninjaF)superrt   r   ninja_filenamefortran_depssetr   introspection_datar   created_llvm_ir_rulerust_cratesimplicit_meson_outs)rs   r   interpreter	__class__s      r>   rt   zNinjaBackend.__init__  sZ    ,	+'*u"$$.ue$<!35#% r@   c                    |j                  d      rt        d|      d| }t        | j                  |d|      }| j	                  |       t        | j                  |||      S )aL  
        We need to use aliases for targets that might be used as directory
        names to workaround a Ninja bug that breaks `ninja -t clean`.
        This is used for 'reserved' targets such as 'test', 'install',
        'benchmark', etc, and also for RunTargets.
        https://github.com/mesonbuild/meson/issues/1644
        zmeson-internal__z*Invalid usage of create_phony_target with r   )r   AssertionErrorr   r   	add_build)rs   dummy_outfiler   phony_infilenameto_nameelems         r>   create_phony_targetz NinjaBackend.create_phony_target  sm     ##$67 #MmM^!_``$]O4 !1!1='7St !1!17HFVWWr@   c                   | j                   j                  j                  j                  j	                         D ]Y  }|j
                  dv r|j                  dk(  r$t        j                         rt        dd      c S |j                         dk(  sY n t        dd      S dt        j                  |j
                     d   z   }t        j                  j                  | j                   j                         |      }t        |d	d      5 }|j!                  t#        d
             ddd       t%        j&                  |j)                         dd|gz   | j                   j                         t$        j*                  t$        j*                        }|j-                         \  }}t/        j0                  d      fd}	 |	|      xs  |	|      }
|
r|
S t3        d| d|       # 1 sw Y   xY w)z_VS writes its dependency in a locale dependent format.
        Detect the search prefix to use.>   masmfortranpgir   utf-8encodingmsvcz
incdetect.r   wzI                #include<stdio.h>
                int dummy;
            Nz/showIncludesrO   )cwdstdoutstderrs(   ^(.*\s)([a-zA-Z]:[\\/]|[\\\/]).*stdio.h$c                   t        j                  d|       D ]`  }j                  |      }|st        d      5 }|j	                  d|j                  d      z   dz          d d d        t        dd      c S  y # 1 sw Y   xY w)	Ns   \r?\nabs   msvc_deps_prefix = r      
r   r9  r:  )rB   r   matchopenr   r;   )r   r  rD  binfilematchretempfilenames       r>   detect_prefixz8NinjaBackend.detect_vs_dep_prefix.<locals>.detect_prefix3  s    C0 Ed+lD1 WW&<u{{1~&MPU&UVWcGDDE W Ws   'A<<B	z=Could not determine vs dep dependency prefix string. output: r   )r   coredatar   hostvalueslanguageidr   rV   rE  get_argument_syntaxlang_suffixesrX   pathr   get_scratch_dirr   r   
subprocessPopenget_exelistPIPEcommunicaterB   compiler   )rs   rH  compilerfilebasefilenamefpcr?  r@  rI  resultrG  s    `         @r>   detect_vs_dep_prefixz!NinjaBackend.detect_vs_dep_prefix  s    ((11;;@@GGI 	=H   $77{{e#(;(;(=L#@@++-7	= cG<<)"9"9(:K:K"LQ"OO77<< 0 0 @ @ B (*(C'2 	aGGF   	 h224.h?@"&"2"2"B"B"D%/__Z__N >>+ **IJ	 v&?-*?M\]c\ddeflemnooY	 	s   G''G0Nc                X   |rt        d      t        j                  d      }| j                  j                  j	                  t        d            rt        | j                  j                               }	 |j                  t        j                               }t        j                  t        j                               }t        j                          t        j                  d       t        j                  | d|        |t!        d      |\  | _        | _        t&        j(                  j+                  | j                  j                         | j,                        }|dz   }t/        |d	d
      5 }|j1                  d| j2                  j5                          d       |j1                  d       |j1                  d       |j1                  d       | j                  j                  j6                  t        d         j8                  }	|	dkD  r|j1                  d|	 d       d d d        | j;                  |      5 }| j=                          g | _        | jA                          | jC                  tE        d             |rli }
| j2                  jG                         jI                         D ]?  }tK        |t2        jL                        s| jO                  |      |
|jQ                         <   A tS        | j2                  jG                         jI                         d      D ]  }| jU                  |        t        jV                  d       | jC                  tE        d             | jY                          t        jV                  d       | jC                  tE        d             | j[                          t        jV                  d       | j]                          t        jV                  d       t        d      }|| j                  j                  j6                  v r| j                  j                  j6                  |   j8                  rxt        j^                         \  }}}}}}|s|rD|rB| jC                  tE        d             | ja                  ||       t        jV                  d        nt        jb                  d!       | jC                  tE        d"             | je                          t        jV                  d#       | jg                          | ji                  |       | jk                  |       d$}|j1                  |       d d d        t'        jl                  ||       t        jn                  |       t        jp                  | j$                  d%      rt&        j(                  js                  t&        j(                  j+                  | j                  jt                  d&            rttw        jx                  | j"                  d'd(gz   | j                  jt                  )       tw        jx                  | j"                  d'd*gz   | j                  jt                  )       | j{                          | j}                          |r
S y # t        $ r Y w xY w# 1 sw Y   oxY w# 1 sw Y   \xY w)+NzCWe do not expect the ninja backend to be given a valid 'vslite_ctx'T)logvsenvzYVisual Studio environment is needed to run Ninja. It is recommended to use Meson wrapper:z compile -C z&Could not detect Ninja v1.8.2 or newer~r=  r9  r:  z&# This is the build file for project "z"
z1# It is autogenerated by the Meson build system.
z# Do not edit by hand.

z ninja_required_version = 1.8.2

backend_max_linksr   zpool link_pool
  depth = z

zBuild rules for targetszGenerating targetsdesczTargets generatedz
Test ruleszTests generatedzInstall ruleszInstall generatedzDist generated
b_coveragezCoverage ruleszCoverage rules generatedz;Need gcovr or lcov/genhtml to generate any coverage reportsSuffixzUtils generatedzdefault all

>=1.10.0z
.ninja_log-trestatr>  	cleandead)?r   r    detect_ninja_command_and_versionrJ  
get_optionr$   r
   get_build_dirrelative_tor>  
ValueErrorr   	join_argsget_meson_commandr   ra  r   ninja_commandninja_versionrX   rQ  r   r$  rE  r   r   get_projectoptionsr   r_  generate_rulesbuild_elementsgenerate_phonyadd_build_commentr   get_targetsrL  r   BuildTarget)generate_common_compile_args_per_src_typeget_idr    generate_targetlog_timestampgenerate_testsgenerate_installgenerate_distfind_coverage_toolsgenerate_coverage_ruleswarninggenerate_utilsgenerate_endingwrite_ruleswrite_buildsrH   cmd_ci_includeversion_compareexists	build_dirrS  callgenerate_compdbgenerate_rust_project_json)rs   capture
vslite_ctxr!  builddirmeson_commandoutfilenamerH  r   	num_pools captured_compile_args_per_targettargettkey	gcovr_exegcovr_versionlcov_exelcov_versiongenhtml_exe_defaults                        r>   generatezNinjaBackend.generateD  sh    $$kll<<F$$//	'0BCD,,::<=H $//
; %..x/I/I/KLMHHJHHpqHHl8*=>= !IJJ380	T/ggll4#3#3#A#A#CTEXEXY"S(,g6 	'MMB4::CYCYC[B\\_`aMMNOMM67MM>?((1199)DW:XY__I1} #+  	 &&|4 .	#!"$D!""<0I#JK 350"jj446==? CF!&%*;*;<LPLzLz  |B  MC8IC !!7!7!9!@!@!BI]^ ($$Q'(23""<#=>!01""<#@A!!#23 /0L)Ct''00888$$--55c:@@S^SrSrStP	=(L+qk**<8H+IJ00MJ&&'AB LL!^_""<#9:!01  "W%g&'GMM'"].	#b 	

<-K(##D$6$6
CWYW^W^WcWcdhdtdtd~d~  AM  XN  IOOOD..$1AAtGWGWGaGabOOD..$1DD$JZJZJdJde'')33 e  	 	.	# .	#s3   6#Z 4B1Z>BZ
I;Z	ZZZZ)c           	     &   | j                   syt        t        j                  j	                  | j
                  j                         d      dd      5 }t        j                  t        j                  j	                  | j
                  j                  j                  j                  d   j                         d      | j                   j                         D cg c]  }|j                          c}d|d	
       ddd       yc c}w # 1 sw Y   yxY w)z;Generate a rust-analyzer compatible rust-project.json file.Nzrust-project.jsonr=  r9  r:  rustzlib/rustlib/src/rust/library/)sysroot_srccrates   )indent)r)  rE  rX   rQ  r   r   rp  jsondumprJ  r   rK  get_sysrootrL  r  )rs   r\  r   s      r>   r  z'NinjaBackend.generate_rust_project_json  s    "'',,t//==?ATU) 	,-II#%77<<0@0@0I0I0S0S0X0XY_0`0l0l0n0O$Q484D4D4K4K4MNqqyy{N
 !	 	 O	 	s   BDD-DDDc           
     *   g }t         D ]  }| j                  j                  j                  |   j	                         D ]b  }|| j                  |      fD cg c]  }dD ]  }| | 
  c}}z  }|| j                  |      fD cg c]  }dD ]  }| | 
  c}}z  }d  t        j                  | j                  d      rdgng }| j                  ddgz   |z   |z   }| j                  j                         }	 t        j                  ||      }	t        t        j                   j#                  |d      d      5 }
|
j%                  |	       d d d        y c c}}w c c}}w # 1 sw Y   y xY w# t&        $ r t)        j*                  d	d
       Y y w xY w)N)r   r   z>=1.9-xrj  compdbrl  zcompile_commands.jsonwbz&Could not create compilation database.F)fatal)r   r   rJ  r   rL  compiler_to_rule_namecompiler_to_pch_rule_namer   r  rv  ru  rp  rS  check_outputrE  rX   rQ  r   r   	Exceptionr   r  )rs   rulesfor_machinerY  r   extcompdb_optionsninja_compdbr  jsondbr\  s              r>   r  zNinjaBackend.generate_compdb  s    ) 	3K ,,55??LSSU 3d6P6PQY6Z5[ 3T%13! "F3%. 3. 3 3d6T6TU]6^5_ 3T%13! "F3%. 3. 3 33	3 $,#;#;D<N<NPW#X$^`))T8,<<~MPUU##113	P,,\xHFbggll8-DEtL  PQ   33    	PLLAO	Ps=   EE;AE/ <E#E/ #E,(E/ ,E/ / FFc           	        t        |d      r|j                  S g }|j                         D ]  }t        |t        j
                  t        j                  f      r.|j                         D ]@  }| j                  j                  |      s|j                  | j                  |||             B  d|j                  v rZt        |t        j                        s@t        j                  | j!                  |      |j"                        }|j                  |       t%        j&                  |j(                  |j*                        D ]A  }t        |t        j,                  t        j.                  f      s.|| j1                  |      z  }C ||_        |S )Ncached_generated_headersvala)hasattrr  get_generated_sourcesr   r   CustomTargetCustomTargetIndexget_outputsr   	is_headerr   get_target_generated_dirr   
Executabler   from_built_fileget_target_dirvala_header	itertoolschainlink_targetslink_whole_targetsStaticLibrarySharedLibraryget_generated_headers)rs   r  header_depsgenlistsrcr  r   s          r>   r  z"NinjaBackend.get_generated_headers  sX   656222335 	\G'E$6$68O8O#PQ**, \##--c2&&t'D'DVWVY'Z[\	\ V%%%jAQAQ.R..t/B/B6/JFL^L^_K{+??6#6#68Q8QR 	?C# 3 3U5H5HIJt99#>>	? +6'r@   c                    t               }|j                         D ]B  }|j                         D ]-  }| j                  |||      }t	        j
                  |      ||<   / D |S )z
        Returns a dictionary with the keys being the path to the file
        (relative to the build directory) and the value being the File object
        representing the same path.
        )r   r  r  r  r   from_built_relative)rs   r  srcsgensrcrL   rel_srcs         r>   get_target_generated_sourcesz)NinjaBackend.get_target_generated_sources  sn     -8M224 	BF'') B77J $ 8 8 AWB	B r@   c                    t               }|j                         D ]A  }t        |t              st	        d|d      |j                  | j                        }|||<   C |S )NAll sources in target z must be of type mesonlib.File)r   get_sourcesr   r   r'   rel_to_builddirbuild_to_src)rs   r  r  rL   r\  s        r>   get_target_sourceszNinjaBackend.get_target_sources  si    ,7M##% 	A a&&)?uDb'cdd!!$"3"34ADG	 r@   c                   t        |t              r|j                  }| j                  j	                  |      s| j                  j                  |      ryt        j                  j                  |      d   dd  j                         }t        j                  D ].  }||j                  vr||j                  |   j                  v s. y y)NFr   T)r   r   fnamer   
is_llvm_iris_assemblyrX   rQ  splitextlowerr   LANGS_CANT_UNITYr   file_suffixes)rs   r  sourcesuffixlangs        r>   get_target_source_can_unityz(NinjaBackend.get_target_source_can_unity  s    fd#\\F&&v.''/!!&)!,QR0668-- 	D6+++))$/===		
 r@   c                    |j                         }|j                         } j                  |   }	|t        |      f}
|	j	                  |
d      }|Zt        |t              r|j                  d      }|j                  | j                        }||j                         |g g g d}||	|
<   d fd|d   j                  fd|D               |d   j                  fd	|D               |r|d
   j                  fd|D               yy)a  
        Adds the source file introspection information for a language of a target

        Internal introspection storage format:
        self.introspection_data = {
            '<target ID>': {
                <id tuple>: {
                    'language: 'lang',
                    'compiler': ['comp', 'exe', 'list'],
                    'parameters': ['UNIQUE', 'parameter', 'list'],
                    'sources': [],
                    'generated_sources': [],
                }
            }
        }
        NTcopy)rM  rY  
parameterssourcesgenerated_sourcesunity_sourcesc                    t        | t              r&| j                  j                  j                        S t
        j                  j                  t
        j                  j                  j                  |             S )z Make source files absolute )	r   r   absolute_path
source_dirr  rX   rQ  normpathr   )filers   s    r>   compute_pathzENinjaBackend.create_target_source_introspection.<locals>.compute_path/  sP    $%))$//4>>JJ77##BGGLL$FGGr@   r  c              3  .   K   | ]  } |        y wrp   ry   r   r   r  s     r>   r   zBNinjaBackend.create_target_source_introspection.<locals>.<genexpr>5  s     #ELO#E   r  c              3  .   K   | ]  } |        y wrp   ry   r  s     r>   r   zBNinjaBackend.create_target_source_introspection.<locals>.<genexpr>6  s     -Y!l1o-Yr  r  c              3  .   K   | ]  } |        y wrp   ry   r  s     r>   r   zBNinjaBackend.create_target_source_introspection.<locals>.<genexpr>8  s     -U!l1o-Ur  )r  mesonlib.FileOrStringr   ru   )r  get_languager'  tuplerZ   r   r   r   &compute_parameters_with_absolute_pathsr  rU  extend)rs   r  compr  r  r  r  tidr  tgtid_hash	src_blockr  s   `           @r>   "create_target_source_introspectionz/NinjaBackend.create_target_source_introspection  s   $ mmo  "%%c*z*+GGGT*	*l3'11t1<
DDZQUQ_Q_`J ! ,,.(%'!#I %CL	H 	)###EW#EE%&---YGX-YYo&---U}-UU r@   c                <   |j                         }| j                  |   }t        |      }|j                  |d       }|^t	        |t
              r|j                  d      }t	        |t              r|j                         }n|j                         }||d}|||<   y y )NTr  )linkerr  )
r  r'  r  rZ   r   r   r   r   get_linker_exelistrU  )	rs   r  r  r  r  r  lnk_hash	lnk_blocklinkerss	            r>   "create_target_linker_introspectionz/NinjaBackend.create_target_linker_introspection:  s    mmo%%c*$GGHd+	*l3'11t1<
&(+ 335 ,,. "(I &CM r@   c                   	 t        |t        j                        r$t        j                  | j                  |             t        |t        j                        r| j                  |       t        |t        j                        r| j                  |       g }i }|j                         }|| j                  v ry | j                  j                  |       i | j                  |<   | j                  |       | j!                  || j#                  |             t        |t        j$                        r| j'                  |       y |j)                         r| j+                  |       y d|j,                  v r| j/                  |       y d|j,                  v r| j1                  |       y t        |t        j2                        }d|j,                  v r| j5                  |      \  }}}nHd|j,                  v r| j7                  |      \  }}}n$| j9                  |      }| j;                  |      }g }| j=                  |       | j?                  |       | jA                  |      }	g }
|jB                  }g }g }g }|| jE                  |      z  }|rtG        |j,                  jI                               }|jK                  tL        jN                        }|rtdjQ                  |      jS                         x}}|tU        |      dkD  rdndz  }| d	| d
|jV                  d}tY        jZ                  tY        j\                  d      |       g }|jI                         D ]9  }t_        j`                  |      }| jb                  je                  |      r|rm| jg                  ||      r[|ji                  |       t        jj                  jQ                  | jb                  jm                         |      }|ji                  |       |ji                  |       | jb                  jo                  |      r|
ji                  |       | jb                  jq                  |      sts        jt                  |      r|r|ji                  |       )|ji                  |       < g }|D ]  }| jb                  jw                  |      r| jy                  ||      \  }}n| j{                  ||d|      \  }}|ji                  |       |||<   |
ji                  |       |j}                  d      d   t,        j~                  d   v s|ji                  |        | j                  |      }|r$|j                         r| j                  ||      }ng }| j                  |      \  }}|D cg c]  }|j                         s| }}|
j                  |       |D cg c]:  }t_        dgt        jj                  j}                  | jA                  |             < } }g }!|j                         rPt        j                  |D cg c]1  }|j,                  d   j                  | j                  |      d      3 c}      }!g }"|D ]U  }t_        j`                  |      }| jb                  j                  |      r|ji                  |       E|"ji                  |       W |"D ]+  }| j{                  ||dg |      \  }}|
ji                  |       - |j                         D ]   }| jb                  j                  |      r|s"| jb                  jw                  |      r'| jy                  ||      \  }}|
ji                  |       d|ru| jg                  ||      rct        jj                  jQ                  | jb                  jm                         |j                  | j                              }|ji                  |       | j{                  ||dg ||z   | z   |!      \  }}|
ji                  |       |ji                  |       |||<   # |r^| j                  ||      D ]I  }| j{                  ||d||z   |z   | |!|      \  }}|
ji                  |       |ji                  |       |||<   K |ry | j                  |      \  }#}$t        |t        j                        r|j                  r| j                  ||
      }%n|
}%| j                  ||	|%|#||$      }&| j                  |||||        | j                  |&       t        |t        j                        ry| jb                  j                  |j                     j                         rG|j                  r:t        | j                  |#j                  |	      d|	g      }&| j                  |&       y y y y # t        $ r Y 	sw xY wc c}w c c}w c c}w )Ncsswiftr  cythonz, r   z arez isz' not supported in Unity builds yet, so z sources in the z! target will be compiled normallyFIXMET)
order_deps.r   r  )r  r7  F)	is_system)stdlib_args
AIX_LINKER)^r   r   r~  rX   makedirsget_target_private_dir_absFileExistsErrorr  generate_custom_target	RunTargetgenerate_run_targetr  processed_targetsr   r'  process_target_dependenciesgenerate_shlib_aliasesr  Jargenerate_jar_target	uses_rustgenerate_rust_targetr   generate_cs_targetgenerate_swift_targetCompileTargetgenerate_vala_compilegenerate_cython_transpiler  r  scan_fortran_module_outputsgenerate_generator_list_rulesget_target_filenameis_unityr  r&  keysintersectionr   r  r   upperr:   r   r   ra  redr   r  r   	is_sourcer  r   rQ  rp  	is_object
is_libraryr   is_module_libraryr  generate_llvm_ir_compilegenerate_single_compiler   rP  target_uses_pchhas_pchgenerate_pchflatten_object_listuses_fortranr  r   listifyget_include_argsget_target_private_dirr  rL  r  r  generate_unity_files determine_linker_and_stdlib_argsr  prelinkgenerate_prelinkgenerate_linkgenerate_dependency_scan_targetr/  r  machinesr  is_aixaix_so_archiver   r   get_archive_name)'rs   r  compiled_sourcesrr   r   is_compile_targettarget_sourcesr  transpiled_sourcesoutnameobj_listr1  r  	unity_src
unity_depslangs
langs_cant	langs_aremsggenerated_source_filesr  raw_srcabs_srcd_generated_depsr  orL   use_pchpch_objectsodr  obj_targetsfortran_order_depsfortran_inc_argsvala_generated_source_filesr  r  final_obj_listr3  s'                                          r>   r  zNinjaBackend.generate_targetN  s!	   	&%"3"34D;;FCD fe001''/feoo.$$V,}}4)))""4((*%((0##FD,?,?,GH feii($$V,%%f-6#####F+f&&&&&v. 'vu/B/BC V%%% &*%?%?%G#N-")))%)%C%CF%K#N-"!44V<N $ A A& I!#((0**62 **62??	
t11&99((--/0E++H,E,EFJ$(IIj$9$?$?$AA	Es:':VE	"#J5' R((.6WY'*C0 "$(--/ 	,G..w7G))'2 @ @ Q%%g. ggll4+;+;+I+I+KWUG$$W-*11':!!++G4(!!,,W59R9RSZ9["&--g6
 ""7+'	,. 
 * 
	+C**3/44VSA133FC?J 4 L1##A& M!OOAwws|B9#:#:3#?? ''*
	+ &&v.v~~'++F+LKK((02"$9Q(8q99_jkZ[d4U"''--8P8PQR8S*TUkk(* '//JU1WEF 281A1A)1L1]1]++A.% 2^ 2A 1W  X ')#% 	<C..s3G ))#.""7+ ,227;	< / 	C //VRUDAqOOA	 "((* 	)C##--c26G##..s388EDAqOOA&$"B"B63"O ggll4+;+;+I+I+K+.+>+>t?P?P+QSG$$W-77UB8CFV8VYk8k8HJDAq OOA&$++A.'(M!$	)" 00C %33FCzT_G_brGr4FHXZce1" ''*#$a % "CCFKfe112v~~!2268DN%N!!&'>6;do!p,,V5E}Vl  oA  	Bt fe112t7G7G7P7PQWQcQc7d7k7k7m$$()9)96;R;RSZ;[]ilsktut$ % 8n2i  		T : l1Ws)   >f' f7&f7?f<'6g'	f43f4c                   t        j                  | j                  d      ryd|j                  v ryd|j                  vryd|j                  d   v ry|j                  d   }|j                         dk7  ry|j                  t        d|j                  d	            }|d
vryt        j                         syt        j                  |j                  d      ryy)Nz<1.10.0Fr7  Tcppz-fmodules-tsr<  stdmachiner  )latestz	c++latestz
vc++latestz<19.28.28617)r   r  rv  r   
extra_argsr  ro  r$   r  current_vs_supports_modulesversion)rs   r  rh  
cppversions       r>   should_use_dyndeps_for_targetz*NinjaBackend.should_use_dyndeps_for_target+  s    ##D$6$6	B((((((V..u55u%::<6!&&y@R@RY^'_`
BB335##CKK@r@   c                D   | j                  |      sy | j                  |      }|j                  dz   }t        j                  j                  | j                  |      |      j                  dd      }t        j                  j                  | j                  |      |      j                  dd      }	t        j                  j                  | j                  |      |j                   d      j                  dd      }
d}| j                  |      }t        |
dd      5 }t        j                  ||       d d d        t        | j                  |||
      }|j                  d	|       |D ]+  }|j                   j#                  |j%                                - |j                   j'                  |       t)        | j                  |      |      }t        |	d
      5 }t+        j                  ||       d d d        | j-                  |       y # 1 sw Y   xY w# 1 sw Y   'xY w)Nz.datr7   r   z
-deps.jsondepscanr=  r9  r:  
picklefiler  )rq  get_dep_scan_file_forr   rX   rQ  r   rC  rH   r  select_sources_to_scanrE  r  r  r   r   r   r   r   relative_namer   rn   pickler/  )rs   r  rN  rr   rZ  object_depsdepscan_filepickle_basepickle_file
pickle_absjson_abs	rule_namescan_sourcesr\  r3  gscaninfops                     r>   rI  z,NinjaBackend.generate_dependency_scan_targetA  s   11&911&9kkF*ggll4#>#>v#FT\\]acfgWW\\$"A"A&"I;W__`dfij
77<< ? ? GFKK=XbIcdllmqsvw	223CD
 (C'2 	'aIIlA&	' !1!1<HUlK0 ( 	2ANNq01	2k*.t/J/J6/RTab*d# 	%qKK!$	%t	' 	'	% 	%s   H
H
HHc                *   t        t        j                  d         t        t        j                  d         z  }g }|D ]R  }t        j                  j                  |      d   dd  }|dk7  r|j                         }||v sB|j                  |       T |S )Nrh  r7  r   C)r&  r   rP  rX   rQ  r  r  r   )rs   rN  all_suffixesselected_sourcesr  r  s         r>   rv  z#NinjaBackend.select_sources_to_scan^  s     92259:SAXAXYbAc=dd& 	0F''""6*1-ab1Ccziikl" ''/	0  r@   c                    |j                         D ]0  }|j                         | j                  vs | j                  |       2 y rp   )get_dependenciesr  r"  r  )rs   r  r  s      r>   r#  z(NinjaBackend.process_target_dependenciesl  s<    ((* 	(Axxz!7!77$$Q'	(r@   c                    |j                   D ]/  }t        |t        j                        s| j	                  ||       1 y rp   )r  r   r   r&   generate_genlist_for_target)rs   r  rL   s      r>   custom_target_generator_inputsz+NinjaBackend.custom_target_generator_inputsq  s5     	<A!U00100F;	<r@   c           	        g }|j                         D ]j  }t        |t              r|d   }|j                         D ]@  }|j	                  t
        j                  j                  | j                  |      |             B l |S )Nr   )	r  r   r   r  r   rX   rQ  r   r  )rs   r  r   r   outputs        r>   unwrap_dep_listzNinjaBackend.unwrap_dep_listv  sx    ((* 	JA!T"aD--/ JBGGLL)<)<Q)?HIJ	J r@   c           	        | j                  |       | j                  |      \  }}}| j                  |      }|| j                  |      z  }|j                  r|j                  d       |j                  d}nd}t        | j                  |||      }|j                  |       |j                  D ]U  }|j                         D ]@  }	|j                  t        j                  j                  | j                  |      |	             B W | j!                  |j"                  d   |dd  |j%                         |j&                  r|d   nd |j(                  r|d   nd |j*                  |j,                        \  }}
|
rd|
 d}nd	}|j                  |j/                  |j0                        }t        j                  j                  | j                  |      |      }t        j                  j                  | j2                  j5                         | j                  |            }t        j6                  |d
       |j9                  d|       |j,                  r|j9                  dd       t;        |j<                  |j>                        jA                         }|j9                  d|       |j9                  d|jB                  jE                  |      |z          | jG                  |       | jH                  jK                  |jM                                y )NPHONYCUSTOM_COMMANDCUSTOM_COMMAND_DEPr   r   )extra_bdepsr  feedenvverbose (wrapped by meson )r   Texist_okr   r^   consoleCOMMANDra   )'r  eval_custom_target_commandr  get_target_depend_filesbuild_always_staler   r   r   r   r   extra_dependsr  rX   rQ  r   r  as_meson_exe_cmdliner    get_transitive_build_target_depsr  r  r  r  get_dep_outnamer   r   rp  r  r   r
   subdirr   as_posixra   r   r/  r"  r   r  )rs   r  r  
ofilenamesrN   r   r   r3  r  r  reasoncmd_typer   	rel_dfileabs_pdir	full_names                   r>   r  z#NinjaBackend.generate_custom_target  s   ++F3"&"A"A&"Iz3##F+,,V44$$KK >>!'H+H !1!1:xNT%% 	KA--/ KRWW\\$*=*=a*@&IJK	K
 //q0A3qr7<B<c<c<eIO
1]a@FT!WQU4:JJ8> 0 HV ,VHA6HH>>%,,T-=-=>GT%8%8%@'JIww||D$4$4$B$B$DdFYFYZ`FabHKK40MM)Y/>>MM&),4==?	i%mV%7%7%>%>y%IH%TUt""6==?3r@   c                d    |j                   dk7  r|j                    d}nd}| |j                   S )Nr   z@@)
subprojectr   )rs   r  subproject_prefixs      r>   build_run_target_namez"NinjaBackend.build_run_target_name  s>    "#)#4#4"5R 8 "#$V[[M22r@   c                   | j                  |      }|j                  st        | j                  |dg       }n| j	                  |      }| j                  |      \  }}}| j                  |j                  d   |dd  |d      \  }}|rd| dnd}	| j                  |d	g       }|j                  d
|       |j                  dd|j                   |	        |j                  dd       | j                  |      }
|
| j                  |      z  }
|j                  |
       | j                  |       | j                  j                  |j!                                y )Nr   r   r   T)r  r  r  r  r   r  r  ra   zRunning external command r^   r  )r  r   r   r   get_run_target_envr  r  r4  r   r   r  r  r   r/  r"  r   r  )rs   r  target_namer3  
target_envr  rN   meson_exe_cmdr  r  r   s              r>   r!  z NinjaBackend.generate_run_target  sM   008~~ %T%5%5{GRPD008J77?IAq#$($=$=fnnQ>OQTUVUWQXBLFJ %> %L!M6 ;A,VHA6bH++K9I2NDMM)]3MM-+DV[[MRZQ[)\]MM&),##F+,,V44Tt""6==?3r@   c           
        | j                   j                         j                         }d}|D ]`  }t        |d      s|j                  j                         D ]4  }|j                         dk(  s|j                  j                         r2d} ` b |j                  d| j                  j                         ddgz   |z   | j                  j                         t        j                  j                  | j                  j                         | j                   j                               | j                  j!                         | j                  j#                         gz   |r
dgz          y g z          y )	NFr   clangTr  
--internalcoveragez--use_llvm_cov)r   r}  rL  r  r   r  info	is_darwinr   r   get_build_commandget_source_dirrX   rQ  r   get_subproject_dirrp  get_log_dir)rs   r3  outputstargetsuse_llvm_covr  rY  s          r>   generate_coverage_commandz&NinjaBackend.generate_coverage_command  sQ   **((*113 	F6;/",,335 ??$/8O8O8Q#'L	 	i!1!1!C!C!E#Z0"1" ''668ww||D$4$4$C$C$E$(JJ$A$A$CE''557''335	7"7 .:()"C 	D @B"C 	Dr@   c                    | j                  ddd      }| j                  |g        |j                  dd       | j                  |       | j	                  ||       y )Nr  r  r  ra   zGenerates coverage reports)r4  r  r   r/  generate_coverage_legacy_rulesrs   r  r  r   s       r>   r  z$NinjaBackend.generate_coverage_rules  sR    $$Z1A7K&&q"-	

=">?q++I}Er@   c                   | j                  ddd      }| j                  |dg       |j                  dd       | j                  |       |r| j                  ddd      }| j                  |dg       |j                  dd	       | j                  |       | j                  d
dd      }| j                  |dg       |j                  dd       | j                  |       t	        j
                  |d      rJ| j                  ddd      }| j                  |dg       |j                  dd       | j                  |       y y y )Nzcoverage-htmlr  r  z--htmlra   zGenerates HTML coverage reportzcoverage-xmlz--xmlzGenerates XML coverage reportzcoverage-textz--textzGenerates text coverage reportz>=4.2zcoverage-sonarqubez--sonarqubez'Generates Sonarqube XML coverage report)r4  r  r   r/  r   r  r  s       r>   r  z+NinjaBackend.generate_coverage_legacy_rules  s*   $$_6FP&&q8*5	

="BCq((9I7SA**1wi8JJ}&EFNN1((:JGTA**1xj9JJ}&FGNN1''w?,,-ACSU\]..q=/B

=*STq!	 @ r@   c                4   | j                          | j                  ddd      }|j                  d       |j                  dd       |j                  d| j                  j                         ddgz          |j                  d	d
       | j                  |       y )Ninstallr  r  allr]   zInstalling files.r  --no-rebuildr^   r  )create_install_data_filesr4  r   r   r   r  r/  rs   r3  s     r>   r  zNinjaBackend.generate_install  s    &&(''	3CWMUf12i!1!1!C!C!ETbHc!cdfi(tr@   c                   | j                          | j                  j                  d      ddgz   }| j                  j                  j	                  t        d            s|dgz  }| j                  j                  j	                  t        d            r|dgz  }| j                  ddd	d
g      }|j                  d|       |j                  dd       |j                  dd       | j                  |       | j                  j                  d      g dz   }| j                  ddd	d
g      }|j                  d|       |j                  dd       |j                  dd       | j                  |       y )NTtestr  stdsplitz--no-stdsplit	errorlogsz--print-errorlogsr  r  r  r  r]   zRunning all tests.r^   r  )r  z--benchmarkz	--logbasebenchmarklogz--num-processes=1r  	benchmarkzRunning benchmark suite.)	serialize_testsr   r  rJ  ro  r$   r4  r   r/  rs   rN   r3  s      r>   r  zNinjaBackend.generate_tests  sO   006&.9QQ((33Ij4IJO$$C$$//	+0FG'((C''0@5'BRSi%f23fi(t 006 :A A ''5EwGWXi%f89fi(tr@   c                   g | _         i | _        | j                  t        d             | j	                          | j                  t        d             | j                          | j                  t        d             | j                          | j                          | j                  t        d             | j                  t        ddgg dd	             | j                  t        d
dgg dddd             | j                  t        d| j                  j                         ddgz   ddgd             | j                  j                         dd| j                  j                         dgz   }| j                  t        d|g dd	             y )NzRules for module scanning.zRules for compiling.zRules for linking.zOther rulesr  z$COMMANDz$DESC
restat = 1r   r  gccr   )r   r   r   	COPY_FILEr  r  r   $outzCopying $in to $out
regenerater  REGENERATE_BUILDzRegenerating build files.zgenerator = 1)r  ruledictadd_rule_commentr   generate_scanner_rulesgenerate_compile_rulesgenerate_static_link_rulesgenerate_dynamic_link_rulesadd_ruler   r   r  r  )rs   r   s     r>   ry  zNinjaBackend.generate_rules  sx   
l+GHI##%l+ABC##%l+?@A'')((*l=9: 	i 0:,G&24 	5i 4zlB%*J&24 	5 	iT-=-=-O-O-QUaciTj-j!&1FH 	I ..0,,.  	i 2 !2 ;&57 	8r@   c                :    | j                   j                  |       y rp   )r  r   rs   r   s     r>   r  zNinjaBackend.add_rule_comment=  s    

'"r@   c                :    | j                   j                  |       y rp   )rz  r   r  s     r>   r|  zNinjaBackend.add_build_comment@  s    ""7+r@   c                    |j                   | j                  v rt        d|j                    d      | j                  j	                  |       || j                  |j                   <   y )NzTried to add rule z twice.)r   r  r   r  r   )rs   r   s     r>   r  zNinjaBackend.add_ruleC  sO    99% #5dii[!HII

$#'dii r@   c                H    |j                           | j                  j                  |       |j                  dk7  rg|j                  | j                  v r| j                  |j                     |_        y t        j                  d|j                   d|j                          y y )Nr   zbuild statement for z references nonexistent rule )	r  rz  r   r   r  r   r   r  r   )rs   r   s     r>   r/  zNinjaBackend.add_buildI  s    ""5)>>W$~~.!]]5>>:
3E4F4F3GGdejesesdtuv %r@   c                    | j                   D ]#  }t        |t              s|j                          % | j                  D ]  }|j                  |        y rp   )rz  r   r   r   r  r   )rs   r   brs       r>   r  zNinjaBackend.write_rulesT  sO    $$ 	*A!./'')	*  	AGGG	r@   c                    t        | j                  d      D ]  }|j                  |        t        j                  d       y )NzWriting build.ninjare  zbuild.ninja generated)r    rz  r   r   r  )rs   r   r  s      r>   r  zNinjaBackend.write_builds\  s:    T007LM 	AGGG	23r@   c                    | j                  t        d             t        | j                  ddd      }| j	                  |       y )Nz&Phony build target, always out of dater  r   r   )r|  r   r   r   r/  r  s     r>   r{  zNinjaBackend.generate_phonya  s8    |,TUV !1!17GRHtr@   c           	        |j                         }t        j                  j                  | j	                  |      |      }|j                         }|j                         }g }|j                  d   }d}d}	d}
d}|j                         }|dk7  rd}
| j                  |      }g }|j                         D ]:  }t        j                  |      }|j                  d      s*|j                  |       < | j                  ||      }||z   D ]'  }| j!                  ||||      }|j                  |       ) |D cg c]1  }t        j                  j                  | j#                  |      |      3 }}t        j                  j                  | j#                  |      dd	      }t        j                  j                  | j$                  j'                         |      }t        j(                  t        j                  j+                  |      d
       t-        |dd      5 }t/        |j0                        r|j3                  d       |j0                  D cg c]?  }t        j                  j                  | j	                  |      |j                               A }}|j3                  dj                  |             |j3                  d       d d d        d}||	z   |
z   |z   g}|j                  |       |
dk7  r|j                  |       |j                  | j5                  |             |d| j#                  |      dgz  }t7        | j8                  ||g       }|j;                  |       |r<|j=                  | j?                  tA        | j#                  |            |      d          |jC                  d|       | jE                  |       | jG                  |||||       y c c}w c c}w # 1 sw Y    xY w)Njavar   r=   r   r\  r   .javazMETA-INFzMANIFEST.MFTr  r=  r9  r:  zClass-Path: r   rd   java_LINKER-Cr  r   ARGS)$get_filenamerX   rQ  r   r  r  get_java_resourcesr   get_main_classr  r2  r   r  endswithr   "determine_single_java_compile_argsgenerate_single_java_compilerC  r   rp  r  dirnamerE  anyr  r   r0  r   r   r   r   )_NinjaBackend__generate_sources_structurer
   r   r/  r
  )rs   r  r  outname_relsrc_list	resources
class_listrY  r   r=   r   r\  
main_classr  gen_src_listr  r[  compile_argsr  plain_class_pathr   class_dep_listmanifest_pathmanifest_fullpathmanifestr   cp_pathsjar_rulecommandsr3  s                                 r>   r&  z NinjaBackend.generate_jar_targetf  sl   ##%ggll4#6#6v#>F%%'--/	
##F+**,
A !==fE(--/ 	-G..w7G(##G,	-
 >>vxPl* 	0C#@@fhXde./	0 YccST"'',,t'B'B6'JANccT%@%@%H*VcdGGLL)9)9)G)G)I=Y
BGGOO$56F#S7; 	!x6&&'~.\b\o\opWXBGGLL)<)<Q)?AQRppsxx12NN4 	! !EAIM?&7OOJ'0089 	T466v>DD !1!1;"M^$d??TE`E`agEh@iktuvwxyfh't//,PXZfg9 d q	! 	!s%   56O5O!AO3O!O!!O+c                   g }g }|j                   D ]m  }t        j                  j                  | j                  |j
                  |      }|j                  d      rd|z   }n|j                  d      s|j                  d      rt        j                  j                  t        j                  j                  |            d   dz   }t        j                  j                  | j                  |      |      }t        | j                  |d|      }	|	j                  dd||g       |	j                  d	d
|        | j                  |	       |j                  |       d|z   }nt        d| d      |j                  |       p ||fS )Nz
.resourcesz
-resource:z.txtz.resxr   r  r  resgenr]   zCompiling resource zUnknown resource file r  )r   rX   rQ  r   r  r  r  r  basenamerC  r   r   r   r/  r   r'   )
rs   r  r   r   r  rel_sourcefiler   	ofilebase	ofilenamer3  s
             r>   generate_cs_resource_tasksz'NinjaBackend.generate_cs_resource_tasks  sL   !! 	AWW\\$*;*;V]]ANNzz,' >1F#qzz'':GG,,RWW-=-=a-@A!D|S	GGLL)D)DV)LiX	()9)99FVXfgi(NI)NOf(;N;K&LMt$I& 9,&)?s!'DEEKKN	  Tzr@   c                >   |j                  t        d            }|j                         }t        j                  j                  | j                  |      |      }|j                         }|j                  d   }|D cg c]:  }t        j                  j                  |j                  | j                              < }}g }	|j                  |j                  d         }
|
|j                  |      z  }
|
|j                  |j                  t        d                  z  }
|
|j!                  |j                  t        d                  z  }
t#        |t$        j&                        r|
j)                  d       n7t#        |t$        j*                        r|
j)                  d       nt-        d      | j/                  |      \  }}|
|z  }
|	|z  }	|
|j1                  |      z  }
|j2                  D ]d  }t        j                  j                  | j                  |      |j                               }|
|j5                  |      z  }
|	j)                  |       f d|
v r||d	z   g}n|g}| j7                  |      }g }|j9                         D ]}  }|j;                         j=                  d
      r.|j)                  t        j                  j                  |             |	j)                  t        j                  j                  |              |j?                         D ]!  }|
jA                  |j5                                # |
| j$                  jC                  ||jD                  |jF                        z  }
|
| j$                  jI                  ||jF                        z  }
tK        | jL                  || jO                  |      ||z         }|jQ                  |	       |jS                  d|
       | jU                  |       | jW                  |       | jY                  |||
||       y c c}w )N	buildtyper  optimizationr   z-target:exez-target:libraryzUnknown C# target type.z-gz.mdbz.csr  )-ro  r$   r  rX   rQ  r   r  r  r   r  r  r  compiler_argsrm  get_buildtype_argsget_optimization_argsget_debug_argsr   r   r  r   r  r   r  get_output_argsr  get_link_argsr  r2  r  r  get_external_depsextend_directget_project_argsr  r  get_global_argsr   r   r  r   r   r/  r/  r
  )rs   r  r  r  r  r  rY  rL   rel_srcsr   r  resource_argsresource_depsr   lnamer  r  generated_rel_srcsr  r   r3  s                        r>   r)  zNinjaBackend.generate_cs_target  s   %%i&<=	##%ggll4#6#6v#>F%%'##D)T\]qBGG$$Q%6%6t7H7H%IJ]]))&*;*;D*ABH//	::H2263D3DY~E^3_``H++F,=,=i>P,QRRfe../OOM* 3 34OO-. !:;;)-)H)H)P&M!H,,[99$$ 	AGGLL!4!4Q!79IJE..u55HKK	 8"K&$89G"mG ==fE(--/ 	3G}}''."))"''*:*:7*CDKK((12	3
 ++- 	8C""3#4#4#67	8DJJ//&:K:KVM_M_``DJJ..x9K9KLL !1!17D<V<VW_<`bjmb  ATfh't**62//(HVhiU ^s   =?Pc                   g }||j                  |j                  t        d                  z  }|| j                  j	                  ||j
                        z  }|| j                  j                  ||j                  |j
                        z  }||j                         z  }||j                  | j                  |            z  }||j                         z  }|j                         }t        j                  j                  | j                   |      t        j"                  z   }|t        j                  j%                  |      t        j"                  z   z  }|j&                  D ]`  }|j)                         D ]K  }|t        j                  j                  | j                   |j*                  |      t        j"                  z   z  }M b |d|gz  }|S )Nr  z-sourcepath)r  ro  r$   r   r   r  r  r  get_java_argsr  rC  get_classpath_args
get_subdirrX   rQ  r   r  pathsepr  include_dirsget_incdirscurdir)rs   r  rY  r   r-  
sourcepathr   idirs           r>   r  z/NinjaBackend.determine_single_java_compile_args  s   ++F,=,=i>T,UVV

**8V5G5GHH

++Hf6G6GI[I[\\$$&&(()D)DV)LMM))++""$WW\\$"3"3V<rzzI
bgg&&v.;;
$$ 	[A [bggll4+<+<ahhMPRPZPZZZ
[	[ 	
++r@   c                   |j                   D cg c]?  }t        j                  j                  | j	                  |      |j                               A }}| j                  |      }|j                         D ]%  }|j                  d      s|j                  |       ' |j                  | j                        }|j                  d d dz   }	t        j                  j                  | j                  |      |	      }
t        | j                  |
| j!                  |      |      }|j#                  |       |j%                  d|       | j'                  |       |	S c c}w )Nr  classr  )r  rX   rQ  r   r  r  r  r2  r  r   r  r  r  rC  r   r   r  r   r   r/  )rs   r  r  rY  r   r   r   r  r  r  rel_objelements               r>   r  z)NinjaBackend.generate_single_java_compile  s#   PVPcPcd1T003Q^^5EFdd ==fE(--/ 	%G(G$	% %%d&7&7899Sb>G3'',,t::6BDTU#D$4$4gt?Y?YZb?celm&w es   AEc                N    d}ddg}d}| j                  t        ||g |             y )Nr  jar$ARGSzCreating JAR $out)r  r   )rs   r   r   ra   s       r>   generate_java_linkzNinjaBackend.generate_java_link  s-    '")igr;?@r@   c                   t               }t        j                  |j                  |j                        D ]  }|j                         s|j                  D ]  }t        |d      r|j                  }|j                  d      d   t        j                  d   v sC|j                  }t        j                  j                  | j!                  |      |      }|j#                  |          t%        |      S )a  
        Peek into the sources of BuildTargets we're linking with, and if any of
        them was built with Vala, assume that it also generated a .vapi file of
        the same name as the BuildTarget and return the path to it relative to
        the build directory.
        r  r  r   r  )r   r  r  r  r  is_linkable_targetr  r  r  r   r   rP  	vala_vapirX   rQ  r   r  r   r   )rs   r  r^  r   r   vapinamefullnames          r>   determine_dep_vapisz NinjaBackend.determine_dep_vapis  s     ??6#6#68Q8QR 
	C))+[[ 1g&A773<#y'>'>v'FF"}}H!ww||D,?,?,DhOHJJx(
	 F|r@   c                   t               }t               }t               }t               }|j                         D ]m  }t        |t              st	        d|d|      |j                  | j                        }|j                  d      r|}n|j                  d      r|}n|}|||<   o |j                         D ]  }	|	j                         D ]  }| j                  ||	|      }|j                  d      r|}n|j                  d      r|}n|}||v rg||   |	ur`dj                  |t        |	      j                  |	j                  ||   j                  t        ||         j                        }
t	        |
      |	||<     ||||ffS )a}  
        Splits the target's sources into .vala, .gs, .vapi, and other sources.
        Handles both preexisting and generated sources.

        Returns a tuple (vala, vapi, others) each of which is a dictionary with
        the keys being the path to the file (relative to the build directory)
        and the value being the object that generated or represents the file.
        r  z$ must be of type mesonlib.File, not )z.valaz.gsz.vapizNDuplicate output {0!r} from {1!r} {2!r}; conflicts with {0!r} from {4!r} {3!r})r   r  r   r   r'   r  r  r  r  r  r  r   typerv   r   )rs   r  r  vapiothers	othersgenrL   r\  srctyper  rY  s              r>   split_vala_sourceszNinjaBackend.split_vala_sources!  s    -8M,7M.9m1<	 	A a&&)?uDhijhm'noo!!$"3"34Azz*+G$ GAJ	 --/ 	$F'') $11!VQ?::./"GZZ("G (G<GAJf$<#VAtF|'<'<fkk$+AJOOT'!*5E5N5NP  +3//#
%$	$( TFI...r@   c                   | j                  |      \  }}}g }|st        d|j                  d      |j                  d   }| j	                  |      }g }g }	t        |      }
t        j                  j                  | j                  |j                               }|j                         D ]  \  }}|
j                  |       t        |t        j                  t        j                   f      s|j"                  rEt        j                  j%                  t        j                  j'                  |            d   dz   }t        j                  j                  | j(                  j+                         |j                               }t        j                  j                  | j(                  j-                         |      }t/        t        j                  j1                  ||f            t/        |      k(  rt/        |      j2                  j5                  |      }t        j                  j                  t7        |      |      }nt        j                  j                  | j                  |j                               }|j9                  |      rDt        j                  j%                  t        j                  j;                  ||            d   dz   }nBt        j                  j%                  t        j                  j'                  |            d   dz   }t        j                  j                  ||      }|j                  |       |	j                  |        | j=                  ||      }||j?                  |jA                  tC        d                  z  }|d|gz  }|d|gz  }|jE                         r|d	|j                  gz  }t        j                  j                  | jG                  |      |jH                        }|d
|gz  }|jJ                  r|dgz  }|	j                  |       t        j                  j                  | jG                  |      |jL                        }|dt        j                  j                  d|jL                        gz  }|	j                  |       tO        |jP                        dkD  r8|jP                  d   du r'| j(                  jS                         |jP                  d<   tO        |jP                        dkD  rW|jP                  d   du rFt        j                  j                  | j(                  jU                         dd      |jP                  d<   t        |jV                  t6              rt        j                  j                  | jG                  |      |jV                        }|dt        j                  j                  d|jV                        gz  }|	j                  |       tO        |jP                        dkD  rV|jP                  d   du rEt        j                  j                  | j(                  jU                         d      |jP                  d<   |d   jY                         D ]9  }t        |tZ        j\                        s| j_                  |      \  }|d|z   gz  }; | ja                  |      }||z  }|jc                  | je                  |             ||jg                  d      z  }ti        | jj                  |	| jm                  |      |
|z         }|jo                  d|       |jq                  |       | js                  |       | ju                  ||||
g        |d   |d   |fS )z?Vala is compiled into C. Set up all necessary build steps here.zVala library z# has no Vala or Genie source files.r  r   z.c
b_coloroutz--directoryz	--basedirz	--libraryz--headerz--use-headerz--vapiz..r   Tr   rA  z--girr|   zgir-1.0z--gresources=r  );rE  r'   r   r   rC  r   rX   rQ  r   r  r)  itemsr   r   r   r  r&   is_builtr  r  r   r  rp  r	   
commonpathparentrq  ru   r   relpathgenerate_basic_compiler_argsget_colorout_argsro  r$   r:  r  r  r1  r;  r:   install_dirget_includedirget_datadirvala_girrL  r   GResourceTargetget_custom_target_sourcesr>  r  r  get_extra_argsr   r   r  r   r   r/  r
  )rs   r  vala_srcvapi_src	other_srcextra_dep_filesvalac	c_out_dir
vala_c_srcvalac_outputs	all_files
srcbasedir	vala_filer  vala_c_fileabs_srcbasedirabs_vala_filevala_c_subdirpath_to_targetr   hnamer<  girnamegres_xmldependency_vapisr4  s                             r>   r,  z"NinjaBackend.generate_vala_compileV  s    +/*A*A&*I'8Y"]6;;/Ad#eff  (//7	"$
 "N	WW\\$"3"3V5F5F5HI
#+>>#3  	.YY' &5#5#5u7J7J"KLPVP_P_ gg..rww/?/?	/JKANQUU!#d.>.>.M.M.OQWQbQbQd!e "T-=-=-K-K-My YBGG../NOPT\]kTll$,]$;$B$B$N$N~$^M"$'',,s=/A;"OK!#d.?.?ARARAT!U''7"$''"2"2277??9n3]"^_`"adh"hK"$''"2"22773C3CI3N"OPQ"RUY"YK'',,y+>Kk*  -A 	.D 00?''(9(9)L:Q(RSS 		**j))$$&[&++..DGGLL!4!4V!<f>P>PQEZ''D
 ((  'ww||D$7$7$?AQAQRH Xrww||D&2B2BCDDD  *6%%&*v/A/A!/D/L(,(8(8(G(G(I""1%6%%&*v/A/A!/D/L(*T5E5E5Q5Q5SU[]c(d""1%&//3/'',,t':':6'BFOOT"'',,tV__"EFF$$W-v))*Q.63E3Ea3HD3P,.GGLL9I9I9U9U9WYb,cF&&q)l))+ 	5F&'"9"9: ::6B	8344	5  33F;++t;;FCD%%f--#D$4$4m$($>$>u$E$-0@$@B 	&(w//tYPRS|Yq\:55r@   c                	   t               }t               }g }|j                  d   }g }||j                         z  }||j                  |j	                  t        d                  z  }||j                  |j	                  t        d                  z  }||j                  |j	                  t        d                  z  }||j                  |j                               z  }|| j                  j                  ||j                        z  }|| j                  j                  ||j                  |j                        z  }||j                  d      z  }|j	                  t        d|j                  d            }g }|j!                         D ]  }	|	j#                  d      rt$        j&                  j)                  | j+                  |      |	 d|       }
t-        | j.                  |
g| j1                  |      |	j3                  | j4                  j7                         | j4                  j9                               g      }|j;                  d	|       | j=                  |       |j?                  |
       |j?                  |       |	||	jA                  | jB                        <    g }|jE                         D ]  }|jG                         D ]  }tI        |tJ              r0t$        j&                  j)                  | j+                  |      |      }n.t$        j&                  j)                  |jM                         |      }|j#                  d      rt$        j&                  j)                  | j+                  |      | d|       }
t-        | j.                  |
g| j1                  |      |g      }|j;                  d	|       | j=                  |       |j?                  |       |j?                  |
       'tN        jP                  jS                  |jM                         |      ||<   | j4                  jU                  |      ru| j4                  jW                  |      r| j4                  jY                  |      rt[        j\                  |      r|j?                  |         |D ]  }|j_                  |        |||fS )
zkGenerate rules for transpiling Cython files to C or C++

        XXX: Currently only C is handled.
        r  r  r   r  rM  rj  z.pyxr  r  )0r   r   get_always_argsr  ro  r$   r  r  get_option_compile_argsget_optionsr   r   r  r  r  rU  r  r  rX   rQ  r   rC  r   r   r  r  r   r  rp  r   r/  r   r  r  r  r  r   r&   r)  r   r   r  r6  r7  r8  r   r9  r   )rs   r  static_sourcesr  cython_sourcesr  r   r  pyx_sourcesr  r  r4  r  genssrcr  s                   r>   r-  z&NinjaBackend.generate_cython_transpile  s    7Bm9D&(!!(+&&(())&*;*;Ik<R*STT%%f&7&7	'8J&KLL,,V->->y?X-YZZ..v/A/A/CDD

**663E3EFF

++FF4E4EvGYGYZZ%%h//	*f>P>PW_ `a%%' 	MC||F#d&A&A&&IcURSTWSX>Z+$$vh..v6&&t'7'7'F'F'H$JZJZJhJhJjkln   .w'%%f-""7+ILs2243D3DEF	M //1 	1C) 1c=177<<(C(CF(KTRD77<<(8$?D==(WW\\$*E*Ef*MRVQWWXY\X]_F/((6(226: G $$VT2NN7+&&w/"))&1.6mm.K.KCNNL\^b.c%d+  ++55d; $ 0 0 : :4 @ $ 0 0 ; ;D A ' 9 9$ ?#**4011	14 " 	-F,	- 0.@@r@   c                (   t        |t              r;|j                  | j                  j                  | j                  j
                        }n|}t        | j                  t        |      gd|g      }|j                  |       | j                  |       y)zCCreate a target to copy a source file from one location to another.r  N)r   r   r  r   r  r  r   r   ru   r   r/  )rs   r  r  instrr3  s        r>   _generate_copy_targetz"NinjaBackend._generate_copy_target  st    c4 %%d&6&6&A&A4CSCSC]C]^EE !1!1CK=+PUwW% tr@   c           
     0   d }g }|j                   j                         D ]  \  }}|D ]  }t        |t              r`||z  t	        |j
                        j                  z  }|j                  t        |             | j                  ||       |gt        |      }s|j                         D ]c  }	||z  |	z  }|j                  t        |             | j                  t        t	        |j                        |	z        |       |Yt        |      }e   ||fS rp   )r  rH  r   r   r
   r  r   r   ru   ru  r  r  )
rs   rootstructured_sources
first_filer   rQ  filesr  r   r\  s
             r>   __generate_sources_structurez)NinjaBackend.__generate_sources_structure  s   &*
!#	-55;;= 	2KD% 2dD)+TZZ(8(=(==C$$SX...tS9!)%(X
!--/ 2"TkAo!((S2223tDKK7H17L3MsS%-),SJ22	2 *$$r@   c                   t        j                  t        |      d       }|sdn|j                  d      d   }g }	t	        |      }
|
D ]Q  }|dk(  r|	j                  t        |
             #|j                  d      s5|	j                  |t        d      d         S t        t        | j                        |||||	| |d u|	      }|| j                  |<   y )Nc                $    | j                  d      S )Nz	--edition)r   )r   s    r>   r?   z6NinjaBackend._add_rust_project_entry.<locals>.<lambda>-  s    PQP\P\]hPi r@   r2   =r   z--cfg)r  r  r  )r   firstreversedr   iterr   nextr   r:   r  r)  )rs   r   main_rust_filer   from_subprojectr  r   raw_editionr  r  arg_itrrD   r
  s                r>   _add_rust_project_entryz$NinjaBackend._add_rust_project_entry*  s     (0~~htnFi'j/:@Q@QRU@VWY@Z#': 	/Cg~

4=)(

3s7|}-.		/   !$3 3/t;"7

 "'r@   c                    |j                   j                  |j                  |j                        j                  dd      S )N-r  )rust_dependency_maprZ   r   rH   )rs   r  
dependencys      r>   _get_rust_dependency_namez&NinjaBackend._get_rust_dependency_nameF  s4     ))--joozOWWX[]`aar@   c                  +, |j                   d   }|j                         }|j                         ++t        j                  ||      z  +| j	                  |       g }g }g }d }|j
                  r|j
                  j                         rM| j                  t        | j                  |            dz  |j
                        \  }}|j                  |       n|j
                  j                         }	t        |	t              r|	j                  | j                        }nt        |	t               rAt"        j$                  j'                  | j                  |      |	j)                         d         }n?t"        j$                  j'                  |	j+                         |	j)                         d         }|j
                  j-                         D ]  }
t        |
t              r+|j/                  |
j                  | j                               >|j                  |
j)                         D cg c]7  }t"        j$                  j'                  | j                  |
j0                  |      9 c}        |j3                         D ]N  }|j5                  |      st7        d|j9                          d      |4|j                  | j                        }P |j;                         D ]  }	|	j)                         D ]  }|j5                  |      st7        d|j9                          d      t        |	t               r0t"        j$                  j'                  | j                  |      |      }n.t"        j$                  j'                  |	j+                         |      }||}|j/                  |         |t=        d      t"        j$                  j'                  |j0                  |j?                               }|j@                  }+j                  d|g       |dv r+j                  |jC                                +| jE                  ||d	      z  ++d
|jF                  jI                  dd      jI                  dd      jI                  dd      gz  +t"        j$                  j'                  |j0                  |jF                  dz         }+dd| dd| gz  ++d| j                  |      gz  ++dd|jK                         z   gz  ++|jM                  d      z  +t        |tN        jP                        sJ	 |jS                  tU        d            }|jS                  tU        d            }+|jW                  ||      z  +t[        j\                  |j^                  d      rd,nd,d3d4+,fd}t[        j`                         }|jb                  je                         }|jg                         }d	}|D ]L  }|ji                  |j0                         |j/                  | jk                  |             |jm                         r|to        jp                  |jr                  |jt                        vr|| jw                  ||      }+ddjy                  |t"        j$                  j'                  |j0                  |jz                              gz  +|j/                  t}        || j~                  |jF                     j                               d}t        |tN        jP                        r|j                  |jb                         | j                  |      }||jt                  v }t        |tN        jP                        s*t        |tN        j                        rd|j                         rTt        |tN        jP                        },rt"        j$                  j                  |      n|jF                  } ||||       |r4|j                  j                  |g      }+|D cg c]  }d | 	 c}z  +9+j/                  d |        O |D ]  } | j                         D ]  }||j                  v r|j                  d!      r+j/                  |       5|j                  d"      rt        |tN        jP                        rt"        j$                  j                  |      \  }!}|ji                  |!       ,s8t"        j$                  j                  |      \  }}"|j                  d#      r|d$d  }|j                  d%      } |||       +j/                  d |          |r+j/                  d&       |D ]  }|xs d}+j/                  d!|         +j                  d' |j                  d      D               t        d( |D              }#t        d) |D              }$|d*v s|$r+dd+gz  +t        |tN        j                        s|#r#t        |jF                        rWt"        j$                  j'                  t"        j$                  j                  |jF                        | j                  |            }%n| j                  |      }%|j                  | j                  | j                  j                         |%| j                  |      |j                  |j                        \  }&|_Y        |&D ]>  }'+dd,|'z   d-z   t"        j$                  j'                  |j                         d#      z   gz  +@ d }(t        |d.d      d/k(  rUt"        j$                  j                  t"        j$                  j'                  |j0                  |j?                                     }(| j                  |jF                  t"        j$                  j                  t"        j$                  j'                  | j                  j                  |            +t        |j                        |(|       | j                  |      })t        | j                  ||)|      }*|r|*j                  |       |r|*j                  |       |*j                  d0+       |*j                  d1|       |*j                  d2|       | j                  |*       t        |tN        j                        r| j                  |       | j                  ||+|gg        y c c}w # tX        $ r Y tw xY wc c}w )5Nr  
structuredr   zRust target z! contains a non-rust source file.zKA Rust target has no Rust sources. This is weird. Also a bug. Please reportz--crate-type>   bindylibFz--crate-namer  r  r   r  z.dz--emitz	dep-info=zlink=z	--out-dirr  z	metadata=r  b_vscrtz	>= 1.67.0z	+verbatimr   c                    |rdnd}g }|s|r|j                  d       r|j                         |r|ddj                  |      z   z  }j                  d| d|         y )Nstaticr  z-bundle:,-lr~  )r   r   )libnamer  bundletype_	modifiersr   verbatims        r>   _link_libraryz8NinjaBackend.generate_rust_target.<locals>._link_library  si     &HGEIf  +  *sxx	222KK"UG1WI./r@   z--externz{}={}T)r  -Clink-arg=-L)z.dllz.soz.dylib.a.liblibr|   )r  r  z-Clink-arg=-lcc              3  &   K   | ]	  }d |   yw)r  Nry   )r   r   s     r>   r   z4NinjaBackend.generate_rust_target.<locals>.<genexpr>  s     S!k!%Ss   c              3  P   K   | ]  }t        |t        j                           y wrp   )r   r   r  r   r   s     r>   r   z4NinjaBackend.generate_rust_target.<locals>.<genexpr>	  s     Zsje.A.ABZs   $&c              3  ^   K   | ]%  }|j                         xr |j                  d k(   ' yw)r  N)r'  rust_crate_typer  s     r>   r   z4NinjaBackend.generate_rust_target.<locals>.<genexpr>
  s8      #;'* $'==? $F'*':':g'E$F #;s   +->   r  
proc-macrozprefer-dynamicz	link-arg=r  r  r  r  r`   	cratetypeF)r  ru   r  r   r  r   )jr   rm  r  get_base_compile_argsr/  rx  
needs_copyr  r
   rC  r  ry  r   r   r  r  r&   rX   rQ  r   r  r)  as_listr   r  r  can_compiler'   get_basenamer  RuntimeErrorr  r  get_linker_always_argsrM  r   rH   r  rU  r   r  ro  r$   get_crt_link_argsKeyErrorr   r  ro  r   external_depsr  r  r   get_dependency_filenameuses_rust_abir  r  r  r  r  r   r[  r	  r)  r  get_target_filename_for_linkingr  get_crt_staticr  r  get_link_whole_forr  native_static_libsr   r  r   r  get_used_stdlib_argsr  r  r#   r  r  build_rpath_argsr   rp  determine_rpath_dirsbuild_rpathinstall_rpathrpath_dirs_to_remover  getattrabspathr  r  r   r  r  r   r   r   r   r   r/  generate_shsymr
  )-rs   r  rustc
base_proxyr   project_depsr   r  _odsr  r\  rL   r   r  r  r  r   r  crtr  linkdirsr  target_depshave_c_abi_libsr  d_namer  
link_wholer  r  link_whole_argsr   r   dir_r  has_shared_depshas_rust_shared_depstarget_slashname_workaround_dir
rpath_args	rpath_argr  compiler_namer4  r   r  s-                                              @@r>   r(  z!NinjaBackend.generate_rust_targetL  s     ( '')
""$	//
EBB**62  )+!#	$$((335'+'H'H//7J9;GJHIOIbIb(d$n  &
 --88:a&%&%6%6t7H7H%IN=1%'WW\\$2M2Mf2UWXWdWdWfghWi%jN%'WW\\!,,.!--/RSBT%UN22::< EA!!T*!(():):4;L;L)MN!((34==?*D./ +-'',,t7H7H!((TU*V *D E	E ##% 	FA$$Q'&f6I6I6K5LLm'noo%!"!2!243D3D!E		F
 --/ 
	(A]]_ 	(((+*\&:M:M:O9PPq+rssa/GGLL)D)DV)LaPEGGLL;E!)%*N  '	(
	( !lmmggll6==&2E2E2GH**	^Y/0 ((KK446711&%GG!4!4S#!>!F!FsC!P!X!XY\^a!bcc'',,v}}fkkD.@AYwi0(eK=<QRRd99&ABB{V]]_455%%f--
 &%"5"56"--i.DE	''	)(<=//Y?? ##EMM;?"HH		0 &&(,,113--/ *	1ALL"KK44Q78 IOOF,?,?AZAZ[[ 77BW^^FBGGLLSTS]S]<^%_``##GFD4D4DQVV4L4R4R$ST"& !U001$$Q__5 66q9Cf777J&%"5"56:feN^N^;_didxdxdz#Au':':;3;"''**3/gvjA"',,"A"A3%"HODq;qc*DDk#/0U*	1X  	3A__& 3000\\$'KKNZZ GHZX^`e`s`sMt "a 0ID#LL&##%77#3#3C#8S>>%0"%ab'CZZ7F!#v.KK+aS 12!3	3( KK() 	"ASAKK"QC!	" 	Sv/J/J6/RSSZkZZ" #;.9#;  ; //3G T+,,Dfe112o
 FKK( 35'',,rwwv{{?[?C?R?RSY?Z3\/ 372E2Ef2M/&&t'7'7'+'7'7'E'E'G'F'+'@'@'H'-'9'9'-';';= 4J3 ( i	{Y6<rww||EL]L]L_af?gghhi !%6,b1\A$&GGOOBGGLLPVPcPcPe4f$g!$$V[[%'WW__RWW\\$BRBRB\B\^l5m%n%)%)&*;*;%<%:%1	3 2259#D$4$4k=R`a  +OOD!&g.i0wfe112'//tnEUWYZ]*Db  ~ Es   #<s
%A	s s&	s#"s#c                     t        dd      |    S )N
_FOR_BUILDr   )r   )r  s    r>   get_rule_suffixzNinjaBackend.get_rule_suffixF  s    ,+K88r@   c                2    | d| | j                  |       S )Nr  )r  )clsr  r  modes       r>   get_compiler_rule_namez#NinjaBackend.get_compiler_rule_nameJ  s#    qs22;?@AAr@   c                l    | j                  |j                         |j                  |j                        S rp   )r  r  r  r  r  rY  s     r>   r  z"NinjaBackend.compiler_to_rule_nameN  s-    ))(*?*?*A8CWCWYaYfYfggr@   c                X    | j                  |j                         |j                  d      S )NPCH)r  r  r  r  s     r>   r  z&NinjaBackend.compiler_to_pch_rule_nameR  s'    ))(*?*?*A8CWCWY^__r@   c                    t         j                  j                  | j                  |      | j	                  |      dz         S )Nz.swiftmodule)rX   rQ  r   rC  target_swift_modulenamers   r  s     r>   swift_module_file_namez#NinjaBackend.swift_module_file_nameV  s9    ww||D77? 88@>QS 	Sr@   c                    |j                   S rp   )r   r  s     r>   r  z$NinjaBackend.target_swift_modulenameZ  s    {{r@   c                    g }|j                   D ]4  }| j                  |      s|j                  | j                  |             6 |S rp   )r  is_swift_targetr   r  rs   r  r^  r   s       r>   determine_swift_dep_modulesz(NinjaBackend.determine_swift_dep_modules]  sH    $$ 	>A##A&d99!<=	> r@   c                l    g }|j                   D ]"  }|j                  | j                  |             $ |S rp   )r  r   r0  r  s       r>   get_swift_link_depsz NinjaBackend.get_swift_link_depsd  s8    $$ 	7AMM$22156	7r@   c                    | j                  |      }g }g }|D ]6  }|j                  d      r|j                  |       &|j                  |       8 ||fS )Nz.swift)r  r  r   )rs   r  all_srcsr  rB  r   s         r>   split_swift_generated_sourcesz*NinjaBackend.split_swift_generated_sourcesj  sZ    44V< 	!Azz(#Aa 		!
 V|r@   c           	        | j                  |      }|j                  d   }g }g }g }g }|j                         D ]t  }|j                  |      r|j	                  | j
                        }	t        j                  j                  t        j                  j                  | j                  j                         |	            }
|j                  |	       |j                  |
       | j                  j                  |      r|j	                  | j
                        }t        j                  j                  t        j                  j                  | j                  j                         |            }|j                  |       ||j                  |      z  }Zt        d|j!                          d       t        j"                  | j%                  |      d       |j'                         }||j)                  |j+                  t-        d                  z  }||j/                  |j+                  t-        d                  z  }||j1                  |      z  }|| j2                  j5                  ||j6                  |j8                        z  }|| j2                  j;                  ||j8                        z  }t=        |j?                               D ]  }|jA                         }|jC                         D ]  }|dvr!t        j                  j                  ||      }n|}t        j                  j                  t        j                  j                  | j                  j                         | j
                  |            }|jE                  |d	      }||z  }  |jG                  t        j                  j                  | j                  j                         | jI                  |                  }|| j2                  jK                  ||j6                  |j8                        z  }|| j2                  jM                  ||j8                        z  }| jO                  |      }| jQ                  |      }| jS                  |      }| jU                  |      }g }|D ]  }||jE                  |d	      z  } | jW                  |      }|D cg c]:  }t        j                  j                  | j                  j                         |      < }}|jX                  D ]t  }| j[                  |      }|d
k(  rd}|dt        j                  j                  t        j                  j                  | j                  j                         |            gz  }v | j]                  |      \  }}|D cg c]:  }t        j                  j                  | j                  j                         |      < }}g } g }!||z   D ]  }t        j                  j_                  |      }"t        j                  ja                  |"      d   dz   }#| j                  |#       |!j                  t        j                  j                  | jO                  |      |#              | jc                  |      }$te        | jf                  |!|$|      }%|%ji                  ||z          |%ji                  |       |%jk                  d||z   |z   |z          |%jk                  d|       | jm                  |%       te        | jf                  ||$|      }%|%ji                  ||z          |%jk                  d||z   |z   |jo                         z          |%jk                  d|       | jm                  |%       tq        |t2        jr                        rV| ju                  || jI                  |      |!| j2                  jv                  |j8                           }%| jm                  |%       ntq        |t2        jx                        rte        | jf                  | jI                  |      |$g       }%|%ji                  |!       |%ji                  |       |%jk                  d||j{                         z   | z   |z          |%jk                  d|       | jm                  |%       nt}        d      | j                  ||||z   |z   ||       y c c}w c c}w )Nr  zSwift target z" contains a non-swift source file.Tr  r  r   r   r  Fr   r  r  r   z.or  RUNDIRz:Swift supports only executable and static library targets.)@r  r   r  r  r  r  rX   rQ  r  r   r   rp  r   r  get_header_import_argsr'   r  r  r  get_compile_only_argsr  ro  r$   r  get_module_argsr   r  r  r  r   r  get_include_dirs
get_curdirr,  rB  r  r0  get_project_link_argsget_global_link_argsrC  r  r  determine_swift_dep_dirsr  r  r  r  r  r  r  r   r   r   r   r/  get_mod_gen_argsr   r  rH  static_linkerr  get_std_exe_link_argsr   r
  )&rs   r  module_nameswiftcabssrcrelsrcabs_headersheader_importsr   relsabssrelhabshr  basedirr  expdir
srctreedirsargs	link_argsrundirout_module_namein_module_filesabs_module_dirsmodule_includesr   	link_depsabs_link_depsreldirrel_generatedr  abs_generatedobjectsrel_objectsbaseonamer   r3  s&                                         r>   r*  z"NinjaBackend.generate_swift_targetu  si   226:!!'*##% 	rA!!!$(():):;ww''T5E5E5S5S5UW[(\]d#d#!!++A.(():):;ww''T5E5E5S5S5UW[(\]""4(&"?"?"EE&v7J7J7L6MMo'pqq	r 	D33F;dK33544V5F5FyQ_G`5abb--f.?.?	'@R.STT..{;;

33FF<M<MvOaOabb

2266;M;MNN&1134 		&AllnG]]_ &I%WW\\'15F$FWW--bggll4;K;K;Y;Y;[]a]n]npv.wx
//
EB%&		& **277<<8H8H8V8V8XZ^ZrZrsyZz+{|	TZZ55ff>O>OQWQcQcdd	TZZ44VV=O=OPP	,,V455f=::6B77?  	AAv66q%@@O	A,,V4	T]^qd&6&6&D&D&FJ^^$$ 	jA((+F|$ 0 0d>N>N>\>\>^`f1g hiiI		j
 "??GTabqd&6&6&D&D&FJbb -' 	YA77##A&DGG$$T*1-4ENN5!rww||D,G,G,OQVWX		Y --f5 !!1!1;&Q_}45[!fl^;mKo]^h't !1!1?HfU_}45fl]:_LvOfOfOhhih'tfe112%%fd.F.Fv.N&14::3K3KFL^L^3_aDNN4  0 01$T%5%5t7O7OPV7WYacefDLL%LL#MM&)f.J.J.L"Lw"VYf"fgMM(F+NN4  !]^^//~@]`o@oqw  zG  	H] _ cs   ;?c?c	c                Z    d|j                         i}|d   r|j                         |d<   |S )zHelper method to get rsp options.

        rsp_file_syntax() is only guaranteed to be implemented if
        can_linker_accept_rsp() returns True.
        r   r   )can_linker_accept_rsprsp_file_syntax)rs   toolrx  s      r>   _rsp_optionszNinjaBackend._rsp_options  s8     d88:;9-1-A-A-CG)*r@   c           	         | j                   j                  j                  t        d         j                  }d| j                   j                  j
                  j                  v r| j                          t        D ]}  }| j                  j                  |   }| dj                  | j                  |            }g }dg}t        |t              r>t        j                          s*t"        t$        D cg c]  }|j                  d       c}z   }||j'                         z  }|dgz  }|t(        j+                  |j-                  d      t.        j0                        z  }|j2                  dk(  rN|j5                  |       g }| j                   j7                  |d      }|dg}|j5                  d	g|z   d
dgz          d}	|dkD  rd}
nd }
| j9                  |      }| j;                  t=        ||||	fi |d|
i        y c c}w )Nrd  r  zSTATIC_LINKER{}r   r  
$LINK_ARGSapplearranlibrR   z-czLinking static target $outr   pool = link_poolr   )r   rJ  rx  r$   r   r   rK  r8  r   r   r  r   r  r   r   r   rV   execute_wrapperrmfile_prefixrU  r1   r   r  r{   r   rN  r  lookup_binary_entryr  r  r   )rs   r  r  r  r   cmdlistr   r   r!  ra   r^   rx  s               r>   r  z'NinjaBackend.generate_static_link_rules  s   $$--55i@S6TU[[	T%%..88===##%( *	^K JJ44[AM$$++D,@,@,MND=?G7D
 -6x?R?R?T *},U!QXXf-=,UU}0022G~%G++M,I,I&,QSZS_S_``G
 9, t$ ))==k8T>&ZFv$?@6K1})''6GMM)D'4\\W[\]U*	^ -Vs   /G;c           
     0   | j                   j                  j                  t        d         j                  }t
        D ]p  }| j                   j                  j                  |   }|j                         D ]  \  }}|dv rdj                  || j                  |            }|j                         }dgt        j                  |j                  d      t        j                        z   ddgz   }d}	|d	kD  rd
}
nd }
| j!                  |      }| j#                  t%        ||||	fi |d|
i        | j                   j&                  |   j)                         sdj                  | j                  |            }d}	j+                         }g }i }| j#                  t%        ||||	fi |dd i       s | j                   j-                         dd| j                   j/                         dddgz   }d}|dgz   }d}d}| j#                  t%        ||g ||             y )Nrd  >   r  r  r  r  r  z{}_LINKER{}r7  r  r   r  zLinking target $outr   r"  r   zAIX_LINKER{}zArchiving AIX shared libraryr  symbolextractorz$IMPLIBSHSYMz$CROSSzGenerating symbol file $outr  r  )r   rJ  rx  r$   r   r   r   rH  r   r  r  r1   r   get_linker_output_argsr{   r   r  r  r   rJ  rK  get_command_to_archive_shlibr  rp  )rs   r  r  complistlangnamerY  r   r   r   ra   r^   rx  r&  symrulesymcmdsyndescsynstats                    r>   r  z(NinjaBackend.generate_dynamic_link_rules	  s&   $$--55i@S6TU[[	( 	bK''00::;GH&.nn&6 b"(GG$++Hd6J6J;6WX"557y?#7#78W8WX^8_ahamam#nnrw  zF  rG  G3q=-DD++H5igt[`G`[_`ab ((5<<>%,,T-A-A+-NO<"??Aigt[`G`[_`a-	b0 113++- 
"/iWGLMr@   c                    | j                  |      }|j                         ddgz   }d}| j                  t        ||g |             y )Nr7  r   zCompiling Java object $inr  rU  r  r   rs   rY  r   r   ra   s        r>   generate_java_compile_rulez'NinjaBackend.generate_java_compile_rule7	  sF    ))(3&&(GU+;;1igr;?@r@   c                    | j                  |      }|j                         }ddg}d}| j                  t        ||||t	        j
                         |j                                      y )Nr7  r   zCompiling C Sharp target $out)r   r   )r  rU  r  r   r   rV   r  )rs   rY  r   r   r   ra   s         r>   generate_cs_compile_rulez%NinjaBackend.generate_cs_compile_rule=	  sd    ))(3&&(5igt[(0(;(;(=4<4L4L4NP 	Qr@   c           	         | j                  |      }|j                         ddgz   }d}| j                  t        ||g |d             y )Nr7  r   zCompiling Vala source $inr  r  r3  r4  s        r>   generate_vala_compile_rulesz(NinjaBackend.generate_vala_compile_rulesF	  sH    ))(3&&(GU+;;1igr;lSTr@   c           
     :   | j                  |      }d}|j                         }|j                  dd      }|rdnd }|ddgz   }|t        j	                  |j                  d      t        j                        z  }| j                  t        |||z   g ||d             y )	NzCompiling Cython source $inr  r   z$out.depr7  r   r  )r   r   )
r  rU  get_dependency_gen_argsr1   r   r  r{   r   r  r   )rs   rY  r   ra   r   depargsr   r   s           r>   generate_cython_compile_rulesz*NinjaBackend.generate_cython_compile_rulesL	  s    ))(33&&(226:F '*T'5))$$X%=%=f%Ew||TTignb +(/&24 	5r@   c           
         | j                  |      }|j                         ddgz   }d}d}d}| j                  t        ||g |||             y )Nr7  r   zCompiling Rust source $inz
$targetdepr  r   r   r3  )rs   rY  r   r   ra   r   depstyles          r>   generate_rust_compile_rulesz(NinjaBackend.generate_rust_compile_rules[	  sY    ))(3&&(GU+;;1igr;X(/1 	2r@   c                    | j                  |      }| j                  j                         g dz   }||j                         z   }|ddgz   }d}| j	                  t        ||g |             y )N)r  
dirchangerz$RUNDIRr7  r   zCompiling Swift source $in)r  r   r  rU  r  r   )rs   rY  r   full_exeinvocr   ra   s          r>   generate_swift_compile_rulesz)NinjaBackend.generate_swift_compile_rulesd	  sp    ))(3##557 ;
 

 8//117E**2igr;?@r@   c                B    t        j                  | j                  d      S )zUse the new Ninja feature for scanning dependencies during build,
        rather than up front. Remove this and all old scanning code once Ninja
        minimum version is bumped to 1.10.ri  )r   r  rv  r   s    r>   use_dyndeps_for_fortranz$NinjaBackend.use_dyndeps_for_fortranp	  s     ''(:(:JGGr@   c           	         | j                         ry d| }t        j                         rddg}ndg}| j                  t	        d             | j                  t        ||g dd             y )	NFORTRAN_DEP_HACKrN   z/CtruezWorkaround for these issues:
https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485zDep hackr  r  )rH  r   rV   r  r   r  r   )rs   crstrr   rN   s       r>   generate_fortran_dep_hackz&NinjaBackend.generate_fortran_dep_hackv	  sn    '')!%) $-C(Cl ,6 7 	8 	ic2zNOr@   c                   | j                   |j                     ry | j                  d|j                        }|j                         }dgt        j                  |j                  d      t        j                        z   |j                         z   dgz   }d}| j                  |      }| j                  t        ||||fi |       d| j                   |j                  <   y )Nllvm_irr7  r  r   zCompiling LLVM IR object $inT)r(  r  r  rU  r1   r   r  r{   r   r  r  r  r   )rs   rY  r   r   r   ra   rx  s          r>   generate_llvm_ir_compile_rulez*NinjaBackend.generate_llvm_ir_compile_rule	  s    $$X%9%9:**9h6J6JK&&(y?//0H0H0PRYR^R^__bj  cA  cA  cC  C  GL  FM  M4##H-igt[LGLM:>!!("6"67r@   c           	     P   |dk(  r| j                  |       y |dk(  rA| j                  j                  j                  |j                        r| j                  |       y |dk(  r| j                  |       y |dk(  r| j                  |       y |dk(  rA| j                  j                  j                  |j                        r| j                  |       y |dk(  r| j                  |       y | j                  |j                        }| j                  |      }|dk(  r| j                  |       d|d	<   | j                  |      }t        j                  |j!                  d
d      t"        j$                        }|j'                         }dg|z   t        j                  |j)                  d
      t"        j$                        z   |j+                         z   dgz   }d|j-                          d}	|j/                         dk(  rd}
d }nd}
d}| j1                  t3        ||||	fi ||
|d       y )Nr  r  r  r  r  r  r7  r  r   r  r   r7  r   z
Compiling z object $outr<  r  r?  )r5  r   rJ  matches_build_machiner  r7  r9  rA  rF  r=  r  r  rM  r  r1   r   r;  r{   r   rU  r  r  get_display_languagerO  r  r   )rs   r-  rY  rL  rx  r   r<  r   r   ra   r   r   s               r>   generate_compile_rule_forz&NinjaBackend.generate_compile_rule_for	  s1   v++H5t((>>x?S?ST--h7v,,X6v,,X6w((>>x?S?ST11(;x..x8$$X%9%9:##H-y **51  ,GG))(3!&&x'G'GPZ'[]d]i]ij&&(y7"_%9%9(:R:RSY:Z\c\h\h%iilt  mK  mK  mM  M  QV  PW  W"8#@#@#B"C<P'')V3DGD Gigt[ <G <%)7< 	=r@   c           
     .   |dvry | j                  |      }|j                  dd      }|j                         dk(  rg }n3t        j	                  |j                  d      t        j                        }d|j                  v r)d|d   _	        |j                         dgz   |z   |z   d	gz   }n/|j                         dgz   |z   |z   |j                         z   d	gz   }d
}|j                         dk(  rd}d }	nd}d}	| j                  t        ||g |||	             y )N>   r   rh  r  r   r<  mwccz-precompiler   r7  r   zPrecompiling header $inr  r?  )r  r;  rO  r1   r   r  r{   r   rN  rL   rU  r  r  r   )
rs   r-  rY  r   r<  r  r   ra   r   r   s
             r>   generate_pch_rule_forz"NinjaBackend.generate_pch_rule_for	  s#   <'--h7226:F'')V3F$))(*B*B6*JGLLYFX[[ 'F1IK**,y87BVKugUG**,y87BVKhNlNlNnnrwqxxG/'')V3DGD Gigr;T(/1 	2r@   c                    d}|| j                   v ry | j                  j                         ddgz   }g d}d}t        ||||      }| j	                  |       y )Nrs  r  )z$picklefiler  r   zModule scanner.)r  r   r  r   r  )rs   r   r   r   ra   r   s         r>   r  z#NinjaBackend.generate_scanner_rules	  s]    t}}$""4469%&-'7D+>dr@   c                n   t         D ]  }| j                  j                  j                  |   }|j	                         D ]t  \  }}|j                         dk(  r| j                  |       | j                  ||       | j                  ||       |j                         D ]  }| j                  ||        v  y )Nr  )
r   r   rJ  r   rH  r  rP  rT  rW  	get_modes)rs   r  clistr-  rY  r  s         r>   r  z#NinjaBackend.generate_compile_rules	  s    ( 	CK$$--77DE&+kkm C"(??$/66x@..xB**8X>$..0 CD228TBCC	Cr@   c                    |j                         D ]?  }t        |t        j                  t        j                  f      r.| j                  ||       A y rp   )r  r   r   r  r  r  )rs   r  r  s      r>   r/  z*NinjaBackend.generate_generator_list_rules	  sJ     335 	>G'E$6$68O8O#PQ,,Wf=	>r@   c                ,   |r+t         j                  j                  | j                  |      }n| j	                  |      }| j                  |      }|D cg c].  }|j                  d| j                        j                  d|      0 }}|D cg c]  }|j                  d|       }}|D cg c].  }|j                  d| j                        j                  dd      0 }}|D cg c]  }|j                  dd       }}|S c c}w c c}w c c}w c c}w )	Nz@SOURCE_DIR@z@BUILD_DIR@z@CURRENT_SOURCE_DIR@z@SOURCE_ROOT@z@BUILD_ROOT@r  r7   r   )rX   rQ  r   r  get_target_source_dirrC  rH   )rs   r  r   override_subdirsource_target_dirreloutr   s          r>   replace_pathszNinjaBackend.replace_paths	  s    "T->-> P $ : :6 B,,V4 		.$*;*;<DD]TZ[  NRS		02CDSS 		/4+<+<=EEnVYZ  .23		$$33S3s   3DD,3D%Dc           	        |j                   D ]/  }t        |t        j                        s| j	                  ||       1 |j                         }|j                  }|j                         }|j                         }|j                         }| j                  |      }	t        |      D ]  \  }
}t        |j                        dk(  r3t        j                  j!                  | j#                  |      ||
         }n| }|j%                  | j&                  | j#                  |            }|j)                  |      }|j+                  |      }|D cg c]1  }t        j                  j!                  | j#                  |      |      3 }}|j,                  d}|}nad}|j/                  |      }t        j                  j!                  | j#                  |      |      }|D cg c]  }|j1                  d|       }}|D cg c]$  }|j1                  d|      j1                  d|      & }}| j3                  || j#                  |      |      }t        |j                        dkD  r|t        |j                        d  }| j5                  |||      }| j7                  || j9                  ||      |j:                  r|d   nd |j<                  	      \  }}t        j                  j!                  | j>                  jA                         | jC                  |            }t        jD                  |d
       tG        | jH                  |||      }|jK                  |j                   D cg c]  }| jM                  |       c}       |j,                  |jO                  d       t        |	      dkD  r|jK                  |	       t        |j                        dk(  r|}nd|}|rd| d}|jO                  dd| |        t        |t        jP                        r |jK                  | jM                  |             |jO                  d|       | jS                  |        y c c}w c c}w c c}w c c}w )Nr   r  r  z	@DEPFILE@z@INPUT@z@OUTPUT@)r_  r   )r  r  Tr  r   zfrom r  r  r]   zGenerating r  )*dependsr   r   r&   r  get_generatorr  get_exe
get_inputsr  r  	enumerater:   r  rX   rQ  r   rC  r  r  get_arglistget_outputs_forr   r  rH   replace_outputsrb  r  replace_extra_argsr  r  r   rp  r  r  r   r   r   r0  r   r~  r/  )rs   r  r  r   	generatorr  exe
infilelistoutfilelistextra_dependenciesr   curfilesole_output
infilename	base_argsr   ofr   r   depfilenamer   r&  r  r  r3  whats                             r>   r  z(NinjaBackend.generate_genlist_for_target
  s    	<A!U00100F;	< ))+	!'')
))+!99'B#J/ 2	!JAw9$$%* ggll4+F+Fv+NP[\]P^_!(	 001B1BDD_D_`fDghJ!--j9I..w7HX`aRTT%@%@%H"MaHa  (+ /'77
C'',,t'B'B6'JKXAJKA		+w7KK!# IIi4<<ZU #D #''d.I.I&.QS^_D9$$%))#i.?.?*@*AB%%fdF%KD"778<8O8OPTV]8^OXO`O`fj<CKK 8 IOGV ww||D$4$4$B$B$DdFYFYZ`FabHKK40$T%5%5x:VDLLy?P?PQ!$2215QR  ,i1%&*/09$$%*% {o..vha8MM&KvfX">?#u001T55c:;MM)W-NN4 e2	! b L# Rs   6QQ ;)Q%Q*
c                   | j                         ryd}| j                  j                  j                  j                  j                         D ]  \  }}|dk(  s|} n |i | j                  |j                         <   yt        j                  t        t        j                        }t        j                  t        t        j                        }i }i }|j                         D ]U  }	|j                  |	      s|	j                  | j                  j!                         | j                  j#                               }
t%        |
dd      5 }|D ]  }|j'                  |      }|A|j)                  d      j+                         }||v rt-        d| d||    d	|	 d
      |	||<   W|j'                  |      }|k|j)                  d      j+                         j/                  d      }|d   dz   |j)                  d      j+                         z   }||v rt-        d| d||    d	|	 d
      |	||<    	 ddd       X i ||| j                  |j                         <   y# 1 sw Y   xY w)zV
        Find all module and submodule made available in a Fortran code file.
        Nr7  asciiignorer;  errorsr   zNamespace collision: module z defined in two files z and r  r  r   r  r   zNamespace collision: submodule )rH  r   rJ  r   rK  rH  r%  r  rB   rX  FORTRAN_MODULE_PAT
IGNORECASEFORTRAN_SUBMOD_PATr  r  r  r  rp  rE  rD  r;   r  r'   r   )rs   r  rY  r  r   modresubmodremodule_filessubmodule_filesrL   r[  r\  r  modmatchmodnamesubmodmatchparents
submodnames                     r>   r.  z(NinjaBackend.scan_fortran_module_outputs@
  s    '')''00::??EEG 	GD!y 	 79Df1134

-r}}=::0"--@##% 	<A ''*t'7'7'F'F'H'+'7'7'E'E'GIH hB <a <D${{40H+"*.."3"9"9";"l2"2">wi H--9'-B,C51!N#O O 12W-&.nnT&:&2&1&7&7&:&@&@&B&H&H&MG)0c)9K<M<Ma<P<V<V<X)XJ)_<&6&Ej\ R11@1L0MUSTRUUV%X'Y !Y ;<OJ7)<< <	<@ 4Wl3Vo3V&--/0/< <s   A-I5A9II&	c                    | j                         rg S t        | j                  |            }| j                  |j	                            }t        | j
                        }t        |||||      }|S )zJ
        Find all module and submodule needed by a Fortran target
        )rH  r
   rC  r%  r  r  _scan_fortran_file_deps)rs   rY  r  r  r  tdepssrcdir	mod_filess           r>   get_fortran_depszNinjaBackend.get_fortran_depsv
  si     '')It226:;!!&"5"5"78doo&+C%R	r@   c                    t        |d      r?|j                  | j                  j                  |j                     v r|j                         S g S )NrM  )r  rM  r   stdlibsr  get_no_stdlib_link_args)rs   r  r  s      r>   r  z$NinjaBackend.get_no_stdlib_link_args
  sA    6:&6??djj>P>PQWQcQc>d+d1133	r@   c                    |j                         r7| j                  |      }|s| j                  |      }|j                  |d      S |j                  |d      S )NT)pchF)r=  get_target_debug_filename_absget_target_filename_absget_compile_debugfile_args)rs   rY  r  objfile	tfilenames        r>   r  z'NinjaBackend.get_compile_debugfile_args
  s^    b >>::6BI 88@	66yd6KK66wE6JJr@   c                B    |j                  | j                  |            S rp   )get_link_debugfile_nameget_target_debug_filenamers   r  r  s      r>   r  z$NinjaBackend.get_link_debugfile_name
      --d.L.LV.TUUr@   c                B    |j                  | j                  |            S rp   )get_link_debugfile_argsr  r  s      r>   r  z$NinjaBackend.get_link_debugfile_args
  r  r@   c                   |j                         }t        |j                  j                         |      }|j	                         }|t        j
                  ||      z  }t        |t              rN|j                  r5t        j                  j                  |j                  |j                        }nN|j                  }nAt        j                  j                  |      r t        j                  j                  |      }n|}| j!                  |      }t        j                  j                  | j#                  |      |      }|d| j$                  j&                  |j(                     j+                         z   z  }|| j-                  |||      z  }t        |t              r|j                  r|j                  }	n:t        |t              r|j/                  | j0                        }	nt3        d|      | j5                  d|j(                        }
t7        | j8                  ||
|	      }|j;                  d|       | j=                  |       ||	fS )Nr  Invalid source type: rO  r  )rm  r"   r   rL  r  r  r   r   rI  rX   rQ  r   r  r  isabsr  canonicalize_filenamerC  r   rJ  r  get_object_suffixr  r  r  r'   r  r   r   r   r/  )rs   r  r  r  rY  r  src_filenameobj_basenamer3  r  r  r4  s               r>   r:  z%NinjaBackend.generate_llvm_ir_compile
  s   '')
*6+;+;+B+B+DcJ))+I33JIIc4 ||!ww||CJJ		B"yyWW]]377++C0LL11,?'',,t::6BLQ3))2263E3EFXXZZZD33HfgNNc4 S\\iiGT"))$*;*;<G"%:3'#BCC33Ix?S?ST#D$4$4g}gV*w!!r@   )maxsizec                   |dvr>t         j                  j                  t         j                  j                  ||            }n|}t         j                  j                  t         j                  j                  | j                  |            }|j                  ||      }t         j                  j                  t         j                  j                  | j                  j                         |            r|j                  ||      }||fS g }||fS )Nr  )	rX   rQ  r  r   r  rB  isdirr   rp  )	rs   rY  r  r  r  r  r  r	  bargss	            r>   generate_inc_dirzNinjaBackend.generate_inc_dir
  s     IWW%%bggll7A&>?FFWW%%bggll43D3Df&MN
))*i@ 77==d&6&6&D&D&FOP--fi@E u~ Eu~r@   c                V    | j                  ||      }|| j                  |||      z  }|S rp   )"_generate_single_compile_base_args$_generate_single_compile_target_args)rs   r  rY  is_generatedr  s        r>   _generate_single_compilez%NinjaBackend._generate_single_compile
  s3    ::68LD==fhP\]]r@   c                    |j                         }|j                         }||j                  |j                        z  }|t	        j
                  ||      z  }|S rp   )rm  r  gnu_symbol_visibility_argsgnu_symbol_visibilityr   r  )rs   r  rY  r  r  s        r>   r  z/NinjaBackend._generate_single_compile_base_args  s^    '')
 ))+H778T8TUU 	I33J4<> 	>r@   c                l   |dk(  }| j                  |||      }|j                  r|| j                  ||      z  }t        |j	                               D ]  }|j                         }t        |j                               D ]-  }| j                  ||||j                        \  }	}
||	z  }||
z  }/ |j                         D ]!  }||j                  ||j                        z  }#  || j                  |j                  |j                                     z  }|j                  dk(  r)||j                  |j                   | j"                        z  }|j                  r|| j%                  ||      z  }|j                  r|| j'                  ||      z  }||j                  | j)                  |      d      z  }|S )Nr  r  F)rM  implicit_include_directories"get_custom_target_dir_include_argsr  r  r  r,  r  r  get_extra_build_dirsrB  escape_extra_argsrU  r  rM  get_feature_args
d_featuresr  get_source_dir_include_argsget_build_dir_include_argsrC  )rs   r  rY  r  no_warn_argsr  r   r  r  compile_objincludeargss              r>   r  z1NinjaBackend._generate_single_compile_target_args  s   
 $v- 44VX|T ..??QQH &1134 	FAllnG ammo. (-1-B-B8QPWYZYdYd-e*kK'K'	(
 ++- FH55aEEF	F 	D**6+@+@AVAVAX+YZZ #11&2C2CTEVEVWWH ..88JJH..77IIH 	H--d.I.I&.QSXYYr@   c                   i }| j                  |      }|j                  j                         D ]  }|j                  |   }| j                  ||      }|r#d|j                  vr|| j                  ||      z  }|| j                  ||d      z  }|r#d|j                  v r|| j                  ||      z  }|j                  j                  |      }|j                         ||<    |S )NmwF)r  )
r<  r   r2  r  rN  get_pch_include_argsr  rY  r  r   )rs   r  src_type_to_argsr_  src_type_strrY  r  s          r>   r  z6NinjaBackend.generate_common_compile_args_per_src_typeQ  s    &&v.",,113 	BL''5H>>vxPH 4x{{2D55hGGAA&(afAggH 48;;.D55hGG((66x@H-5-?-?-A\*#	B$  r@   c                   ||ng }||ng }t        |t              r|j                  d      rt        d|      t	        |j
                  j                         |      }| j                  ||      }	| j                  |      xr |dk7  }
|
r#d|j                  vr|	| j                  ||      z  }	|	| j                  |||      z  }	|
r#d|j                  v r|	| j                  ||      z  }	|	j                  j                  |	      }	|du r| j                  |||	|gg |       n| j                  |||	g |g|       | j                  j!                         }t        |t"              rk|j%                  | j&                        }t(        j*                  j-                  |      rO|j.                  rC|j1                  |      sJ |t3        |      dz   d }n|rt        d|      t5        d	|      | j7                  ||      }t(        j*                  j9                  | j;                  |      |      }|j=                  |      }|	| j?                  |||      z  }	| j                  |      r|jA                  |jB                        }ng }|sg }nh|j                  d
k(  rg }nVg }t(        j*                  j9                  | j;                  |      |jE                  |d               }|jG                  |       |}| jI                  |      }g }|jK                         dk(  r|s$tM        |      |z  }|| jO                  |||      z  }| jQ                         s| jR                  |jU                            jW                         D ]  \  }}t(        j*                  j9                  | j;                  |      |jY                  |            }||k(  sJ| j[                  |j\                        }t_        | j`                  |d|z   |      }| jc                  |        |	|je                  | j;                  |            z  }	||	jg                  |       t_        | j`                  |||      }| ji                  |||       |D ]  }|jk                  |        |D ]  }t        |t"              r|j%                  | j&                        }n@| jm                  |      s/t(        j*                  j9                  | j;                  |      |      }|jo                  |        |jk                  |       | jq                  ||      D ]  }|jo                  |        |r|js                  d|       |js                  d|	       | ju                  ||||       | jc                  |       t        |t              sJ t        |t              sJ ||jw                  dd      fS )zE
        Compiles C/C++, ObjC/ObjC++, Fortran, and D sources
        Nz.hz(BUG: sources should not contain headers r  r  Fr   z/BUG: broken generated source file handling for r  intelr   r7  rJ  r   r  r7   r   )<r   ru   r  r.  r"   r   rL  r  r<  rN  r  r  rY  r  r
  r   rp  r   r  r  rX   rQ  r  rI  r   r:   r'   object_filename_from_sourcer   rC  depfile_for_objectr  get_pchrM  get_pch_namer   r  r  r
   r  rH  r%  r  rH  module_name_to_filenamer  r  r   r   r/  get_module_outdir_argsr  add_header_depsr   has_dir_partr   get_fortran_orderdepsr   )add_dependency_scanner_entries_to_elementrH   )rs   r  r  r  r  r  rm  r  rY  r  r_  r  r  r  r3  dep_filepchlistpch_deparrr   r  
extra_depsr\  r  srcfilemodfilerL  depelemr4  r  s                                 r>   r;  z$NinjaBackend.generate_single_compilej  su    &1%<k"#-#9Zr
c3CLL$6 #KC7!STT*6+;+;+B+B+DcJ::68L &&v.H<53Ht8;;.11(FCCHD==fhP\]] tx{{*11(FCCH$$228< 5 33FHhQTPUWY[hi33FHhPRUXTY[hi$$224	c4 ))$*;*;<Gww}}W% <<"--i888%c)nq&8&9:G #RSVRY!Z[["%:3'#BCC77D'',,t::6BLQ..w7 	D33HfgNN 'nnX%6%67GGG[[G#GCT88@(BWBWX_`aXbBcdAJJqMG228<
  "i/
  y/G3d33HgvNN
//1 )-(9(9&:M:M:O(P(V(V(X 
0$GW ggll4+F+Fv+N+3+K+KG+TVG #~ $ 4 4V5G5G H"3D4D4D4;4F4N4;#= w/
0 778S8STZ8[\\H!OOJ'#D$4$4g}gVVWk: 	AOOA	 	$A!T"%%d&7&78&&q)GGLL!<!<V!DaH  #	$ 	 ++FH= 	$A  #	$Y1*66vxRUVw'3''''3'''s344r@   c                   | j                  |      sy t        |t        j                        ry t        j
                  j                  |j                        d   dd  }|dk7  r|j                         }|t        j                  d   v s|t        j                  d   v sy | j                  |      }|j                  d|       |j                  |       y )Nr   r  r7  rh  r_   )rq  r   r   r+  rX   rQ  r  r  r  r   rP  ru  r   r   )rs   r  rY  r4  r  	extensiondep_scan_files          r>   r  z6NinjaBackend.add_dependency_scanner_entries_to_element  s    11&9fe112GG$$SYY/2126	!)IY44Y??9PYPgPghmPnCn226:=1]+r@   c                `    t         j                  j                  | j                  |      d      S )Nz
depscan.dd)rX   rQ  r   rC  r  s     r>   ru  z"NinjaBackend.get_dep_scan_file_for  s"    ww||D77?NNr@   c                   |D ]  }t        |t              r|j                  | j                        }n@| j	                  |      s/t
        j                  j                  | j                  |      |      }|j                  |        y rp   )
r   r   r  r  r  rX   rQ  r   rC  r   )rs   r  ninja_elementr  r  s        r>   r  zNinjaBackend.add_header_deps  sl     	%A!T"%%d&7&78&&q)GGLL!<!<V!DaH!!!$	%r@   c                V    t        |t              r|j                  dk7  S t        |      S r   )r   r   r  r#   )rs   r  s     r>   r  zNinjaBackend.has_dir_part  s&    eT"<<2%%E""r@   c                   |j                   dk7  rg S t        j                  |j                  |j                        D cg c]?  }t
        j                  j                  | j                  |      |j                               A c}S c c}w )Nr7  )
rM  r  r  r  r  rX   rQ  r   r  r  )rs   r  rY  lts       r>   r  z"NinjaBackend.get_fortran_orderdeps
  so    	)I  oof&9&96;T;TU
 GGLL,,R0"//2CD
 	
 
s   ABc                t   |d   }|j                  |      }t        j                  j                  | j	                  |      |      }g }|| j                  ||      z  }t        |      dk(  r| j                  ||j                         |d         }t        j                  j                  t        j                  j                  | j                  |j                         |            }	||j                  |	d      z  }n<t        j                  j                  | j                  |j                         |d         }t        j                  j                  |      }
|j                  |
||      \  }}||z  }|| j                  ||      z  }|| j!                  |||      z  }|dz   |j#                         z   }||||g|fS )Nr   r   Fr  )r  rX   rQ  r   rC  rM  r:   create_msvc_pch_implementationr  r  r  get_source_subdirrB  r  gen_pch_argsr  r  get_depfile_suffix)rs   r  rY  r  headerpchnamedstr  r  pch_header_dir	just_nameobjnamepch_argsr   s                 r>   generate_msvc_pch_commandz&NinjaBackend.generate_msvc_pch_command  s   Q''/ggll466v>HD55fhGGs8q=88AVAVAXZ]^_Z`aFWW__RWW\\$:K:KVMeMeMgio-pqN11.%HHHWW\\$"3"3V5M5M5OQTUVQWXFGG$$V,	&33IvsK(HD11&(CCD33HfgNNCi(5577cG9f44r@   c                x   | j                  ||      }|j                  d      d   dk(  r|j                  dk(  r|ddgz  }t        j                  j                  | j                  |      t        j                  j                  |      dz   |j                         z         }|dz   |j                         z   }|||g fS )Nr  r   hrh  r  z
c++-header)
r  r   rM  rX   rQ  r   rC  r  get_pch_suffixr  rs   r  rY  r  r  r  r   s          r>   generate_gcc_pch_commandz%NinjaBackend.generate_gcc_pch_command*  s    00B99S>"$):):e)C |,,Hggll466v>77++C0369P9P9RRTCi(5577c2%%r@   c                ^   | j                  ||      }t        j                  j                  | j	                  |      t        j                  j                  |      dz   |j                         z         }t        j                  j                  |      d   dz   |j                         z   }|||g fS )Nr  r   )	r  rX   rQ  r   rC  r  r  r  r  r  s          r>   generate_mwcc_pch_commandz&NinjaBackend.generate_mwcc_pch_command5  s    00Bggll466v>77++C0369P9P9RRTggs#A&,x/J/J/LLc2%%r@   c                r   ||ng }g }dD ](  }|j                  |      }|st        |d         rt        |d         sd|j                         d}t        |      |j                  |   }|j                         dk(  rV| j                  |||      \  }}	}
}}t        j                  j                  | j                  |j                         |d         }n|j                  dk(  rd|j                  v rZt        j                  j                  | j                  |j                         |d         }| j                  |||d         \  }}	}
}d }nYt        j                  j                  | j                  |j                         |d         }| j                  |||d         \  }}	}
}d }||z  }| j                  |      }t!        | j"                  ||
gz   ||      }||j%                  |       | j'                  |||       |j)                  d	|       |j)                  d
|	       | j+                  |       + |S )N)r   rh  r   r   zPrecompiled header of zN must not be in the same directory as source, please put it in a subdirectory.r<  r  rV  r  r   )r  r#   r  r'   r   rO  r  rX   rQ  r   r  r  rN  r  r  r  r   r   r   r  r   r/  )rs   r  r  r`  r  r  rY  rY  r  r   r  objsr  extradepr   r3  s                   r>   r>  zNinjaBackend.generate_pch<  s9   %0%<k"  	!D..&CA'|CG/D.v/B/B/D.G HN N&s++!'!1!1$!7H++-7262P2PQWYacf2g/3T377<<(9(96;S;S;UWZ[\W]^'8;;&ggll4#4#4f6N6N6PRUVWRXY-1-K-KFT\^abc^d-e*3Tggll4#4#4f6N6N6PRUVWRXY-1-J-J6S[]`ab]c-d*3T4K55h?H$T%5%5tse|XsSD#X&  {;MM&(+MM)S)NN4 ?	!@ r@   c                    | j                  |      }t        j                  j                  ||j	                         dz         S )Nz.symbols)rC  rX   rQ  r   r  )rs   r  	targetdirs      r>   get_target_shsym_filenamez&NinjaBackend.get_target_shsym_filenamea  s5    //7	ww||Iv':':'<z'IJJr@   c                   | j                  |      }| j                  |      }t        | j                  |d|      }|j	                  d| j                  |             | j                  j                         r@|j	                  dd| j                  j                  |j                     j                  z          | j                  |       y )Nr)  IMPLIBCROSSz--cross-host=)r0  r  r   r   r   r  r   is_cross_buildrJ  r  systemr/  )rs   r  target_filesymnamer3  s        r>   r  zNinjaBackend.generate_shsymf  s    ..v6008 !1!17G[Qh D DV LM**,MM'?T5E5E5N5NvOaOa5b5i5i#ijtr@   c                t    t         j                  j                  | j                  |      |j                        S rp   )rX   rQ  r   r  import_filenamer  s     r>   get_import_filenamez NinjaBackend.get_import_filenamep  s(    ww||D//79O9OPPr@   c           	        g }t        |t        j                        r||j                         z  }|j                  r||j                  | j                        z  }|j                  r#||j                  | j                  |            z  }|j                  r||j                         z  }|j                  rCt        |d      r7||j                  |j                  j                  | j                               z  }|S t        |t        j"                        r^t        |t        j$                        r#||j'                  |j)                               z  }n||j+                         z  }||j-                         z  }t        |t        j$                        r|j.                  rU||j1                  | j                  |j2                  |j4                  |j6                  |j8                  |j:                        z  }|j                  rCt        |d      r7||j                  |j                  j                  | j                               z  }|j                  r#||j                  | j                  |            z  }|S t        |t        j<                        r0||j?                  | j                  |jA                                z  }|S tC        d      )Ngen_vs_module_defs_argszUnknown build target type.)"r   r   r  r  export_dynamicgen_export_dynamic_link_argsr   r  gen_import_library_argsr  pieget_pie_link_argsvs_module_defsr  r  r  r  r  SharedModuleget_std_shared_module_link_argsrm  get_std_shared_lib_link_argsget_pic_argsforce_sonameget_soname_argsprefixr   r  	soversiondarwin_versionsr  get_std_link_argsshould_installr  )rs   r  r  r  s       r>   get_target_type_link_argsz&NinjaBackend.get_target_type_link_argss  s]   fe../4466H$$F??@P@PQQ%%F::4;S;STZ;[\\zzF4466$$9R)SF::6;P;P;`;`aearar;stt. -  3 34&%"4"45FBB6CUCUCWXXF??AA++--Hfe&8&89V=P=PF22$$fmmV[[&--$$f&<&<> > $$9R)SF::6;P;P;`;`aearar;stt%%F::4;S;STZ;[\\
 	  3 34001A1AvG\G\G^C^__H  ;<<r@   c                    g }t        |t        j                        ra| j                  j                  |j
                     }|j                         s|j                         r||j                  |j                        z  }|S rp   )
r   r   r  r   rJ  r  rV   	is_cygwinget_win_subsystem_argswin_subsystem)rs   r  r  r  r=   s        r>   +get_target_type_link_args_post_dependenciesz8NinjaBackend.get_target_type_link_args_post_dependencies  sf    fe../   ))&*<*<=A||~F99&:N:NOOr@   c                   d}|j                   dk(  r"t        j                  |j                  d      rd}|r^g }|j                  D ]K  }|j                  d      }|| j                  |d      z  }|j                  | j                  |      d          M |S | j                  ||j                        }|r|j                  |      S g S )NFr<  z<19.00.23918Tr   r   )rN  r   r  ro  r  extract_all_objectsdetermine_ext_objsr  r?  build_target_link_argumentsr  )rs   r  r  
use_customobjects_from_static_libsr   r   target_argss           r>   get_link_whole_argsz NinjaBackend.get_link_whole_args  s    
99 ''G!
AC$00 R++E2(D,C,CAr,JJ((//0H0H0Ma0PQR
 ,+::66C\C\]K=H6,,[9PbPr@   c                    ddl m} |D ]C  }|D ]<  }|j                  |||      }|s|j                  | j                  |      }|s8|c c S  E y )Nr   )	CCompiler)compilers.cr)  _get_trials_from_pattern_get_file_from_listr   )	rs   r  r  search_dirspatternsr)  r  r  trials	            r>   guess_library_absolute_pathz(NinjaBackend.guess_library_absolute_path  s`    + 		A !::1aI!55d6F6FN		r@   c                   t               }t               }g }| j                  j                         }t        |j	                  |            }	|	D ]M  }
|
|v r|
j                  d      s|
j                  d      rqt        |
      dkD  r|
dd  }n	 t        |	      }t        j                  j                  |      s t        j                  j                  ||      }|j                  |       |
j                  d      r2t        |
      dkD  r|
dd  }n	 t        |	      }|j                  |       t        j                  j                  |
      s| j                  j!                  |
      st        j                  j#                  |
      s=|j%                  |
       P g }	 |j'                  | j                  t(        j*                  d      }|j'                  | j                  t(        j,                  d      }t/        |      t/        |j1                  | j                              z   }|D ]  }| j3                  ||||      }| j3                  ||||      }|r-|j%                  |j5                         j7                                |s]|j%                  |j5                         j7                                 	 ||z   S # t        $ r t        j                  d       Y  Aw xY w# t        $ r t        j                  d       Y  gw xY w# t8        j:                  t<        f$ r}d	t?        |      vr Y d }~||z   S d }~ww xY w)
Nr  r  r   z?Generated linker command has -L argument without following pathr  zIGenerated linker command has '-l' argument without following library nameT)strictget_library_naming) r   r   rp  r  native_args_to_unixr   r:   r  StopIterationr   r  rX   rQ  r  r   r   r8  isfiler   r3  r   STATICSHAREDr  get_library_dirsr0  resolver  r   r   AttributeErrorru   )rs   r  r  r  internalr-  libsabsolute_libsr  ititemrQ  r  guessed_dependenciesstatic_patternsshared_patternsr  
staticlibs
sharedlibsr   s                       r>    guess_external_link_dependenciesz-NinjaBackend.guess_external_link_dependencies  s    !l|$$224	&,,X67 	+Dx(<t$t9q=8D#Bx ww}}T*77<<	48D%&t9q=qr(C"2h t$)9)9)D)DT)Jrww~~^bOc$$T*7	+:  "	$778H8H'..ae7fO$778H8H'..ae7fO,uV5L5LTM]M]5^/__K 
Q "==fg>I?\
!==fg>I?\
(//
0B0B0D0M0M0OP(//
0B0B0D0M0M0OP
Q $m33Q ) %fg ) %pq0 ''8 	#3q61 2 $m33		sC   J=K#!C&L	 /L	 =K K #LL	L>"L99L>c                   t        |t        j                        sJ t        j                  j                  | j                  |      |j                  dz         }t        | j                  |gd|      }|j                         }|j                  d d  }||j                  ||      z  }| j                  ||      }|j                  d|       |j                  dd| d       | j                  |       |gS )Nz
-prelink.or  r  ra   zPrelinking r  )r   r   r  rX   rQ  r   rC  r   r   r   get_prelinkerexelistget_prelink_argsrb  r   r/  )rs   r  rS  prelink_namer3  	prelinkerrN   s          r>   rG  zNinjaBackend.generate_prelink
  s    &%"5"5666ww||D$?$?$GWcIcd !1!1L>CSU]^((*	"y)),AA  -i%m{<.%BCt~r@   c           	        ||ng }||ng }g }t        |t        j                        rd}n|j                         }t        |t        j                        r| j                  |       | j                  |j                        }	|dz   |	z   }
|j                         }t        |t        j                        r#||j                  |j                               z  }nY|t        j                  |j                         |t        |t        j                        | j                  j                               z  }|| j                  ||      z  }||j!                         z  }||j#                  |j%                  t'        d                  z  }|j%                  t'        d            r/|| j)                  ||      z  }| j+                  ||      }|||gz  }|| j-                  ||      z  }t        |t        j                        s|| j/                  ||      z  }t        |t        j                        s|| j                  j1                  ||j2                  |j                        z  }|| j                  j5                  ||j                        z  }|| j                  j6                  j9                  |j                  |j                               z  }t;        |j<                        rWt>        j@                  jC                  t>        j@                  jE                  |j<                        | jG                  |            }n| jG                  |      }|jI                  | j                  | j                  j                         || jK                  |      |jL                  |jN                        \  }|_(        ||z  }|dk(  rg }n|jS                         }| jU                  ||      }||z  }t        |t        j                        s||jW                  |      z  }|jY                         D ]"  }|j[                  |j]                  |             $ |jS                         D ]R  }t        |t        j                        s|jY                         D ]"  }|j[                  |j]                  |             $ T || j_                  ||      z  }t        |t`              r"||jc                  |j                               z  }g }|je                  | jg                  ||||             | ji                  |      }||z  }||z  }||z  }|je                  |D cg c]  }| jk                  |       c}       |je                  |jl                  D cg c]  }| jk                  |       c}       to        | jp                  ||
||      }|js                  ||z          |ju                  d|       | jw                  |||       |S c c}w c c}w )Nr7  _LINKERr  r   )r   	LINK_ARGS)<r   r   r  r  r  r  r  r  r  get_base_link_argsrm  r   r  r   rp  r  r  get_buildtype_linker_argsro  r$   r  r  r  r'  r  r  r  rJ  get_external_link_argsr#   r   rX   rQ  r   r  r  r  r  r  r  r  r  r#  get_target_link_argsr  extend_preserving_lflagsget_dependency_link_argsr  r   get_option_link_argsr  rF  $get_custom_target_provided_librariesr  link_dependsr   r   r   r   r  )rs   r  rR  rS  r  rm  r  r   linker_baserL  linker_ruler  	debugfiler  r  dependenciesr<  r   r  dep_targetscustom_target_librariesr  r3  s                          r>   rH  zNinjaBackend.generate_link  s   #-#9Zr
%0%<k"fe112"K --/Kfe112'$$V%7%78!I-5 '') fe11211&2D2D2FGGH	44V5G5G5I5;5?HZHZ5[595E5E5S5S5UW WH
 	D00@@F1133F44V5F5FyQ\G]5^__Yw/044VVDDH44VVDI$), 	D2266BB &%"5"5600@@H&%"5"56

88ARARTZTfTfggH 

77@R@RSSH ((11HHI[I[]c]p]p]rssH $ /1ggll,##F+/-+ /3.A.A&.I+##D$4$4$($4$4$B$B$D$C$($=$=f$E$*$6$6$*$8$8: 	2V0 	J (" L!224L33FLIH&%"5"56 33F;;H//1 X 11&2Q2QRU2VWX ,,. `a!4!45 224 ` 99&:Y:YZ]:^_`` 	DDDVVTT fh' 33F4F4F4HIIH4@@QY[cde #'"K"KF"SJ++K\RD88;RS%+%8%8: ! !88; : 	; !1!17Kano[#::;k8,//I S:s    W,8W1c                j   t        |t        j                        r| j                  |      S t        |t        j
                        r^|j                  r|j                         S |j                  | j                  j                         | j                  j                               S | j                  |      S rp   )r   r   r  r  r   r   rI  rw  r  r   r  rp  r0  )rs   r  s     r>   r  z$NinjaBackend.get_dependency_filename  s    a,,-11!448==)zz((t'7'7'F'F'H'+'7'7'E'E'GI I''**r@   c                   |j                         D ]  \  }}}t        j                  j                  ||      }t        j                  j                  | j                  j                         ||      }	 t        j                  |       	 t        j                  ||       | j                  j                  |        y # t        $ r Y @w xY w# t        $ r t        j                  d       Y t        $ r t        j                  d       Y w xY w)Nz?Library versioning disabled because symlinks are not supported.zOLibrary versioning disabled because we do not have symlink creation privileges.)get_aliasesrX   rQ  r   r   rp  remover  symlinkr*  r   NotImplementedErrorr   r   OSError)rs   r  outdiraliastotag	aliasfileabs_aliasfiles           r>   r$  z#NinjaBackend.generate_shlib_aliases  s    $002 	;NE2sVU3IGGLL)9)9)G)G)I6SXYM		-(;

2}- ((//	:	;
   ' ^

\] n

lmns*   2B<C<	CCD+D
Dc                   | j                  ddd      }t        | j                  j                         |      }t        j
                  j                  | j                  j                         d      }|j                  d| j                  j                         dd|gz          |j                  dd	       | j                  |       t        |d
      5 }t        j                  ||       d d d        y# 1 sw Y   yxY w)Nzclean-ctlistr  r  zcleantrees.datr  r  
cleantreesra   z"Cleaning custom target directoriesr  )r4  r%   r   rp  rX   rQ  r   rR  r   r  r/  rE  rx  r  )rs   treesr   r  d_fileofiles         r>   generate_custom_target_cleanz)NinjaBackend.generate_custom_target_clean  s    $$^5EwOt''557?d..>>@BRS	

9d..@@BlT`bhEiij	

="FGq&$ 	"5KK5!	"	"s   C//C8c                   | j                  ddd      }|j                  dt        j                         g dz          |j                  dd       | j	                  |       | j                  ddd      }|j                  dt        j                         g d	z          |j                  dd
       | j	                  |       y )N
clean-gcnor  r  r  )r  delwithsuffixr  gcnora   zDeleting gcno files
clean-gcda)r  rt  r  gcdazDeleting gcda files)r4  r   r   rt  r/  )rs   	gcno_elem	gcda_elems      r>   generate_gcov_cleanz NinjaBackend.generate_gcov_clean  s    ,,\;KWU	9h&@&@&BEq&qr=*?@y!,,\;KWU	9h&@&@&BEq&qr=*?@y!r@   c                ~   g }| j                   j                  j                  j                         D ]  \  }}|j	                         s|j                  dt        |      z   dz   t        |j                  t              r|j                  n"t        |j                        j                         z           t        |      S )Nz-Dr~  )r   rJ  rx  rH  
is_projectr   ru   r   r   r  r   )rs   cmdskvs       r>   get_user_option_argsz!NinjaBackend.get_user_option_args  s    &&//77==? 	sFQ||~D3q6MC/jRU>V177\_`a`g`g\h\n\n\pqr	s d|r@   c                    | j                  ddd      }|j                  dd       |j                  d| j                  j                         dgz          |j                  dd       | j	                  |       y )	Ndistr  r  r]   zCreating source packagesr  r^   r  )r4  r   r   r  r/  r  s     r>   r  zNinjaBackend.generate_dist  sd    ''0@'Jf89i!1!1!C!C!E!PQfi(tr@   c                   t        j                         sy d| j                  v ry | j                   j                         dd| j                   j                  | j                   j
                  | j                  j                         gz   | j                   j                         z   | j                         z   }| j                  ddd      }|j                  d|       |j                  dd       | j                  |       y )	Nz
scan-buildr  	scanbuildr  r  r  r^   r  )r   detect_scanbuildr   r  r  r  r   r  r  r4  r   r/  r  s      r>   generate_scanbuildzNinjaBackend.generate_scanbuild  s    ++-4+++002;(8(8(C(CTEUEUE_E_aeakaka~a~  bA  BB..01373L3L3NO ''6FPi%fi(tr@   c                   d|z   }g }|r|d| z  }|j                  d|        t        j                  j                  t        j                  j	                  | j
                  j                  d|z               sUt        j                  j                  t        j                  j	                  | j
                  j                  d|z               sy || j                  v ry | j
                  j                         dd|z   | j
                  j                  | j
                  j                  gz   |z   }| j                  |dd	      }|j                  d
|       |j                  dd       | j                  |       y )Nzclang-r  z--z.clang-z_clang-r  r  r  r  r  r^   r  )r   rX   rQ  r  r   r   r  r   r  r  r4  r   r/  )rs   r   	extra_argr  rm  rN   r3  s          r>   generate_clangtoolzNinjaBackend.generate_clangtool  s7   o
Qyk?*K9+./ww~~bggll4+;+;+F+F	TXHXYZGGNN277<<0@0@0K0KYY]M]#^_$***0027T>4+;+;+F+FHXHXHbHbcd ''5EwOi%fi(tr@   c                t    t        j                         sy | j                  d       | j                  dd       y )Nr   check)r   detect_clangformatr  r   s    r>   generate_clangformatz!NinjaBackend.generate_clangformat  s/    --/)'2r@   c                v    dd l }|j                  d      sy | j                  d       | j                  dd       y )Nr   z
clang-tidytidyfix)shutilwhichr  )rs   r  s     r>   generate_clangtidyzNinjaBackend.generate_clangtidy  s2    ||L)'.r@   c                H   dd l }|j                  |      sy || j                  v ry | j                  j	                         dd|| j                  j
                  gz   }| j                  |dd      }|j                  d|       |j                  dd       | j                  |       y )	Nr   r  tagsr  r  r  r^   r  )	r  r  r   r   r  r  r4  r   r/  )rs   r  r  r  rN   r3  s         r>   generate_tagszNinjaBackend.generate_tags  s    ||D!$***00264)9)9)D)DEF''5EwOi%fi(tr@   c                   | j                          | j                          | j                          | j                  dd       | j                  dd       | j                  dd       | j                  j                         ddgz   }| j                  ddd      }|j                  d	|       |j                  d
d       | j                  |       y )NetagsTAGSctagscscoper  	uninstallr  r  r  r^   r  )	r  r  r  r  r   r  r4  r   r/  r  s      r>   r  zNinjaBackend.generate_utils(  s    !!!#!7F+7G,8X.002lK5PP''5EwOi%fi(tr@   c           	     <   d| j                         fd| j                         fd| j                  d      ffD ]K  \  }}g }|dk(  r|j                  ddg       |j                         D ]  }t	        |t
        j                        r|j                  rx| j                  j                  |j                     j                         rG| j                  |      \  }}|j                  |j                         d         |j                         d<   |j                  t         j"                  j%                  | j'                  |      |j                         d                 t)        | j*                  |d|      }| j-                  |       N | j/                  ddd	      }|j1                  d
| j2                  ddgz          |j1                  dd       g }| j
                  j5                         j                         D ]p  }t	        |t
        j6                        s|j                         D ]@  }	|j                  t         j"                  j%                  | j'                  |      |	             B r |r |j9                  | j;                  |             t=        d      | j                  j>                  j@                  v rh| j                  j>                  j@                  t=        d         jB                  r2| jE                          |j9                  d       |j9                  d       | j-                  |       | jG                         }t)        | j*                  dd|      }|j1                  dd       | j-                  |       | jH                  r3t)        | j*                  dd| jH                        }| j-                  |       t)        | j*                  ddd	      }|j1                  dd       | j-                  |       t)        | j*                  |dd      }| j-                  |       y )Nr  zmeson-test-prereqzmeson-benchmark-prereqTr   r   cleanr  r  r  rj  ra   Cleaningrg  rv  rs  r"  r  r^   r  zmeson-implicit-outsreconfigurer   )%get_build_by_default_targetsget_testlike_targetsr  rL  r   r   r  rL  r   rJ  r  rK  rE  rM  r  r   rX   rQ  r   r  r   r   r/  r4  r   ru  r}  r  r   rq  r$   rJ  rx  r   rz  get_regen_filelistr*  )
rs   targr   
targetlistr  r  r  r3  ctlistr^  s
             r>   r  zNinjaBackend.generate_ending5  so   99;<$d&?&?&AB)4+D+DT+JKM 	!JD$ J u}!!#68P"QR[[] \ a!4!45!:J:J''00?FFH.2.S.STU.V+-3-D-DQ]]_UVEW-X*!!"'',,t/B/B1/Eq}}WXGY"Z[\ %T%5%5tWjQDNN4 )	!, ''1A7Ki!3!3tWo!EFmZ0 '')002 	KA!U//0 KAMM"'',,t/B/B1/Eq"IJK	K
 LL::6BC\"d&6&6&?&?&G&GG$$,,Y|-DEKK$$&LL&LL&t&&( !1!1=BTVZ[fi(t ##$T%5%57LgW[WoWopDNN4  !1!1=BTV]^fi(t !1!14"Etr@   c                    | j                   j                  |      }|st        |   ||      S t	        |j                               S rp   )r'  rZ   r#  get_introspection_datar   rL  )rs   	target_idr  datar,  s       r>   r  z#NinjaBackend.get_introspection_datax  s?    &&**9571)VDDDKKM""r@   )r   zT.Optional[build.Build]r+  zT.Optional[Interpreter])r0  ru   r   ru   r1  ru   r   r   )FN)r  r   r  dictr   zT.Optional[dict])r   r   )r  build.BuildTargetr   zT.MutableMapping[str, File]rp   )r  build.Targetr  zcompilers.Compilerr  )T.Optional[T.List[mesonlib.FileOrString]])r  r  r  zT.Union[Compiler, StaticLinker])r  z'build.BuildTarget'r   r   )r  r  rZ  zT.List[mesonlib.File]ry  zT.List['mesonlib.FileOrString']r   r   )r  zbuild.CustomTarget)r  zbuild.RunTarget)r  r   r  r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   )r  z	build.Jar)r  r  )r  r  r   zyT.Tuple[T.MutableMapping[str, File], T.MutableMapping[str, File], T.Tuple[T.MutableMapping[str, File], T.MutableMapping]])r  r  r   zNT.Tuple[T.MutableMapping[str, File], T.MutableMapping[str, File], T.List[str]])r  z'mesonlib.FileOrString'r  r
   r   r   )rw  r
   rx  zbuild.StructuredSourcesr   z%T.Tuple[T.List[str], T.Optional[str]])r   ru   r  ru   r   r   r  r   r  r   r   r  r   r   )r  r  r  r+   r   ru   )r  r  r   r   )r  r   r   ru   )COMPILER)r  ru   r  r   r  ru   r   ru   )rY  r   r   ru   )r  z4T.Union['Compiler', 'StaticLinker', 'DynamicLinker']r   z)T.Dict[str, T.Union[bool, RSPFileSyntax]])rY  z'CsCompiler'r   r   )rY  
'Compiler'r   r   )r   r   )rL  ru   r   r   )r  zbuild.GeneratedListr  r  r   r   )rY  r0   r  r
   r   r   )r   r   )
rY  r  r  ru   r  ru   r  r   r   zCT.Tuple['ImmutableListProtocol[str]', 'ImmutableListProtocol[str]']r  )r  r  rY  r  r  r   r   'CompilerArgs')r  r  rY  r  r   r  )r  r  rY  r  r  r   r   z'ImmutableListProtocol[str]')r  r  r   zdict[str, list[str]])FNNNN)
r  r  r  z+T.Optional[T.List['mesonlib.FileOrString']]rm  zT.Optional[T.List[str]]r  r  r   r   )r  r  r   ru   )r  r   r   r   )r   r
   )NN)r  r  r  z#T.Union['Compiler', 'StaticLinker'])rn  r   r   ru   )r   ru   r  r   r   r   )r  ru   r  ru   r   r   )r  ru   r  r  r   zkT.List[T.Dict[str, T.Union[bool, str, T.List[T.Union[str, T.Dict[str, T.Union[str, T.List[str], bool]]]]]]])rv   rw   rx   rt   r4  r_  r  r  r  r  r  r  r  r
  r  r  rq  rI  rv  r#  r  r  r  r  r!  r  r  r  r  r  ry  r  r|  r  r/  r  r  r{  r&  r  r)  r  r  r8  r>  rE  r,  r-  ru  r  r  r  r(  r   r  classmethodr  r  r  r  r  r  r  r  r*  r  r  r  r5  r7  r9  r=  rA  rF  rH  rM  rP  rT  rW  r  r  r/  rb  r  r.  r  r  r  r  r  r:  r   r  r  r  r  r  r;  r  ru  r  r  r  r  r  r  r>  r  r  r  r  r  r'  r0  rF  rG  rH  r  r$  rq  rz  r  r  r  r  r  r  r  r  r  r  __classcell__)r,  s   @r>   r  r    s	   	&X"ApF`4DP,*
 gk1V:c1Vf&([%z,5TY]: (
<
	(4T34.D(F".. 8D#,(	w4

7hr*0jd" A*3/L3/jk6Zk6ZGAZGAR%('15'N]'&5':>'8bx[t 9 9 B B h h ` `S	^H@	.^`%NNAQU52
AHP?(=T24
	C><!|4Wl
7KrVV"@ tO , 7</3@N tBG9;?9Lh9 9| 4 AEZ^FJ[_	y5,Wy5 -Dy5 0Y	y5 ei	y5v,O%#
50	&&#JK
Q%N
Q( t @4DN`	+;"
	"&3/AF# #r@   r  c                T   t        j                  t        t         j                        }t        j                  t        t         j                        }t        j                  t
        t         j                        }g }t        |       } | j                  dd      5 }	|	D ]r  }
|j                  |
      }|e| j                  |j                  d      z  }|j                  j                         dd |j                  v r|j                  t        |||||             |j                  |
      }||j                  d      j                         }|dk(  r||vr|||   j                   z  }|j#                         s|j$                  | j$                  k7  rn|j'                  |       r	|j)                  |      }|j+                  t-        ||z               9|j                  |
      }|N|j                  d      j                         j/                  d      }t1        |      dv s
J d	|        d
j3                  |      }||vrLt5        dj7                  |j                  d      j                         |j/                  d
d      d               |||   j                   z  }|j#                         s|j$                  | j$                  k7  rn2|j'                  |       rE|j)                  |      }|j+                  t-        ||z               u 	 ddd       |S # 1 sw Y   |S xY w)a  
    scan a Fortran file for dependencies. Needs to be distinct from target
    to allow for recursion induced by `include` statements.er

    It makes a number of assumptions, including

    * `use`, `module`, `submodule` name is not on a continuation line

    Regex
    -----

    * `incre` works for `#include "foo.f90"` and `include "foo.f90"`
    * `usere` works for legacy and Fortran 2003 `use` statements
    * `submodre` is for Fortran >= 2008 `submodule`
    rz  r{  r|  Nr   	intrinsicr  >   r   r   zHsubmodule ancestry must be specified as ancestor:parent but Meson found r  z=submodule {} relies on ancestor module {} that was not found.r   )maxsplitr   )rB   rX  FORTRAN_INCLUDE_PATr  FORTRAN_USE_PATr  r
   rE  rD  rK  r;   r  r  r  r  r  r  is_filer   samefiler  r   ru   r   r:   r   r   r   )r  r  r  r  rY  increuserer  r  r\  r  incmatchincfileusematchusenamer  mod_namer  r  ancestor_childsubmodsrcfiles                        r>   r  r    s0   " JJ*BMM:EJJ6Ezz,bmm<HI
s)C	78	4 ;> :	>D{{4(H#**x~~a'88 >>'')!"-1G1GG$$%<WfgW\^f%gh{{4(H#"..+113k)%'  5>#7#77(||sxx/ %%c*#;;GD  Wx%7!89&nnT2*)//288:@@EGw<61 G<<C9FG1 &)XXg%6N%U2,-l-s-st  uF  uF  GH  uI  uO  uO  uQ  Sa  Sg  Sg  hk  vw  Sg  Sx  yz  S{  .|  }  }$*U>-B-H-H$HM(002(--9 $&//4 '??OH$$S8);%<=u:	>;>x y;>x s   EL*D(LL')rD   ru   r   ru   )rL   ru   r   ru   )r   rW   r  )rh   ru   ri   r   r   ru   )r  r
   r  r
   r  r
   r   r   )g
__future__r   collectionsr   dataclassesr   enumr   r   	functoolsr   pathlibr	   r
   textwrapr   r  r  rX   rx  rB   rI   rS  typingTr   r   r   r   r   r   r   r   arglistr   r   r  r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   TYPE_CHECKINGtyping_extensionsr(   _typingr)   r*   r+   r+  r,   linkers.linkersr-   r.   compilers.csr/   compilers.fortranr0   ListUnionru   r   r  r  r~  r  r  rE   rM   rV   r   r#  r$  r\   r   r   rX  re   rf   rl   rn   r{   r1   r   r   r   r	  r  Backendr  r  ry   r@   r>   <module>r     s   # # !   "    	  	      $    "   1   H G   3??)/2)=)3ffQWW%6%;<=O23M > ; B E 8JdmO9MJO,M=& "# W	"

:.  bjj+ )"+ +
 d  
2 
2   u un@$ @$D 
 
 
      FZ2#8## Z2#zdSr@   