o
    Wªodã· ã                   @  sþ  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 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/ ddlm0Z0m1Z1m2Z2 d	dlm3Z3 ddlm4Z4m5Z5 ej6ríd dl7m8Z8 ddl9m:Z: ddlm;Z; ddl<m=Z= ddl%m>Z>m?Z? ddl@mAZA ddlBmCZC e8d  ZDd!ZEd"ZFd#ZGd$ZHd%d&„ ZId'd(„ ZJe K¡ reIZLd)d*gZMg d+¢ZNne/ZLg ZMg d,¢ZNd-d.„ ZOeOƒ ZPh d/£ZQe Rd0¡ZSe Rd1¡ZTdQdRd6d7„ZUG d8d9„ d9ƒZVeG d:d;„ d;eƒƒZWG d<d=„ d=ƒZXG d>d?„ d?ƒZYG d@dA„ dAƒZZG dBdC„ dCƒZ[eG dDdE„ dEƒƒZ\eG dFdG„ dGƒƒZ]G dHdI„ dIej^ƒZ_dSdOdP„Z`dS )Té    )Úannotations)ÚOrderedDict)Ú	dataclass)ÚEnumÚunique)Ú	lru_cache)ÚPurePathÚPath)ÚdedentNé   )Úbackendsé   )Úmodules)Úgnome)ÚenvironmentÚmesonlib)Úbuild)Úmlog)Ú	compilers)ÚCompilerArgs)ÚCompiler)ÚArLinkerÚRSPFileSyntax)ÚFileÚLibTypeÚMachineChoiceÚMesonExceptionÚ
OrderedSetÚ
PerMachineÚProgressBarÚ	quote_arg)Úget_compiler_for_sourceÚhas_path_sepÚ	OptionKey)Ú
CleanTrees)ÚGeneratedListÚInvalidArguments)ÚLiteral)ÚImmutableListProtocol)ÚExtractedObjects)ÚInterpreter)ÚDynamicLinkerÚStaticLinker)Ú
CsCompiler)ÚFortranCompiler)Ú2015Z2018Z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                 C  s4   t  ddd„ | ¡} t  ddd„ | ¡} d| › d} | S )Nz(\\*)"c                 S  s   dt |  d¡ƒd d  d S )Nú\r   r   ú"©ÚlenÚgroup©Úm© r7   ú~home/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/backend/ninjabackend.pyÚ<lambda>H   s    zcmd_quote.<locals>.<lambda>z(\\*)$c                 S  s   dt |  d¡ƒd  S )Nr0   r   r   r2   r5   r7   r7   r8   r9   J   ó    r1   )ÚreÚsub©Úsr7   r7   r8   Ú	cmd_quoteC   s   r?   c                 C  s   |   dd¡} t | ¡S )Nr0   ú\\)ÚreplaceÚshlexÚquoter=   r7   r7   r8   Úgcc_rsp_quoteP   s   
rD   Úcmdú/c)Údelz/fz/sz/qú{}ú&&)Zrmz-frH   rI   c                  C  s,   t  ¡ rd} nd} | d } ttj d| ¡ƒS )zÉReturn 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   ZMESON_RSP_THRESHOLD)r   Ú
is_windowsÚintÚosÚenvironÚget)Úlimitr7   r7   r8   Úget_rsp_thresholdf   s
   rP   >   Ú	targetdepÚdyndepÚdescriptionÚpoolZDEPFILE_UNQUOTEDÚDESCz[$ :\n]z[$ \n]FÚtextÚstrÚreturnc                 C  sD   |rt }nt}| | ¡s| S d| v rd| › d}t|ƒ‚| 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   r<   )rV   Zis_build_lineZquote_reÚerrmsgr7   r7   r8   Úninja_quote„   s   
þr^   c                   @  s   e Zd Zddd„ZdS )	ÚTargetDependencyScannerInfoÚprivate_dirrW   Úsource2objectúT.Dict[str, str]c                 C  ó   || _ || _d S ©N)r`   ra   )Úselfr`   ra   r7   r7   r8   Ú__init__–   ó   
z$TargetDependencyScannerInfo.__init__N)r`   rW   ra   rb   )Ú__name__Ú
__module__Ú__qualname__rf   r7   r7   r7   r8   r_   •   s    r_   c                   @  s   e Zd ZdZdZdZdZdS )ÚQuotingr   r   r   é   N)rh   ri   rj   ÚbothÚnotShellÚnotNinjaÚnoner7   r7   r7   r8   rk   š   s
    rk   c                   @  s.   e Zd Zejfdd„Zdd„ Zedd„ ƒZdS )ÚNinjaCommandArgc                 C  rc   rd   )r>   Úquoting)re   r>   rr   r7   r7   r8   rf   ¢   rg   zNinjaCommandArg.__init__c                 C  s   | j S rd   r=   ©re   r7   r7   r8   Ú__str__¦   ó   zNinjaCommandArg.__str__c                   s   ‡ fdd„| D ƒS )Nc                   s   g | ]}t |ˆ ƒ‘qS r7   )rq   ©Ú.0Úi©Úqr7   r8   Ú
<listcomp>«   r:   z(NinjaCommandArg.list.<locals>.<listcomp>r7   )Úlrz   r7   ry   r8   Úlist©   s   zNinjaCommandArg.listN)	rh   ri   rj   rk   rm   rf   rt   Ústaticmethodr}   r7   r7   r7   r8   rq   ¡   s
    rq   c                   @  s   e Zd Zdd„ Zdd„ ZdS )ÚNinjaCommentc                 C  s
   || _ d S rd   )Úcomment©re   r€   r7   r7   r8   rf   ®   ó   
zNinjaComment.__init__c                 C  s>   | j  d¡D ]}| d¡ | |¡ | d¡ q| d¡ d S )NrY   z# )r€   ÚsplitÚwrite)re   Úoutfiler|   r7   r7   r8   r„   ±   s
   

zNinjaComment.writeN)rh   ri   rj   rf   r„   r7   r7   r7   r8   r   ­   s    r   c                   @  sD   e Zd Zddddejfddd„Zeefdd„ƒZd	d
„ Z	dd„ Z
dS )Ú	NinjaRuleFNÚrspfile_quote_styler   c
           
        s†   dd„ ‰ || _ ‡ fdd„|D ƒ| _‡ fdd„|D ƒ| _|| _|| _|| _|| _|| _d| _d| _	|	| _
| jdkrA|  jd7  _d S d S )	Nc                 S  sf   t | tƒr| S | dkrt| tjƒS |  d¡r/t d| ¡ d¡}|tvr)t| tj	ƒS t| tj
ƒS t| ƒS )NrI   ú$z\$\{?(\w*)\}?r   )Ú
isinstancerq   rk   rn   Ú
startswithr;   r\   r4   Ú	raw_namesrp   ro   )ÚcÚvarr7   r7   r8   ÚstrToCommandArg½   s   

z+NinjaRule.__init__.<locals>.strToCommandArgc                   ó   g | ]}ˆ |ƒ‘qS r7   r7   ©rw   rŒ   ©rŽ   r7   r8   r{   Ô   ó    z&NinjaRule.__init__.<locals>.<listcomp>c                   r   r7   r7   )rw   Úar‘   r7   r8   r{   Õ   r’   r   ú$DEPFILEÚ	_UNQUOTED)ÚnameÚcommandÚargsrS   ÚdepsÚdepfileÚextraÚrspableÚrefcountÚrsprefcountr‡   )
re   Úruler—   r˜   rS   rœ   r™   rš   r›   r‡   r7   r‘   r8   rf   ¹   s   
ÿzNinjaRule.__init__c                 C  sX   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 rd   )
r‰   rq   rr   rk   rp   r>   ro   rn   r^   rW   )ÚxÚqfr7   r7   r8   Ú_quoterâ   s   


zNinjaRule._quoterc              
     s`  ˆj tju r	t‰ nt‰ ‡fdd„}|ƒ D ]™}| dˆj› |› d¡ |dkrS| d d ‡fdd	„ˆj	D ƒ¡¡¡ | d
¡ | d d ‡ ‡fdd	„ˆj
D ƒ¡¡¡ n| d d ‡fdd	„ˆj	ˆj
 D ƒ¡¡¡ ˆjrv| dˆj› d¡ ˆjrƒ| dˆj› d¡ | dˆj› d¡ ˆjr¨ˆj d¡D ]}| d¡ | |¡ | d¡ q–| d¡ qd S )Nc                   3  s"    ˆ j rdV  ˆ jrdV  d S d S )NÚ Ú_RSP)r   rž   r7   rs   r7   r8   Ú	rule_iterô   s   €
ÿz"NinjaRule.write.<locals>.rule_iterzrule rY   r¤   z command = {} @$out.rsp
ú c                   ó   g | ]}ˆ   |¡‘qS r7   ©r¢   ©rw   r    rs   r7   r8   r{   ý   r:   z#NinjaRule.write.<locals>.<listcomp>z rspfile = $out.rsp
z rspfile_content = {}
c                   s   g | ]}ˆ  |ˆ ¡‘qS r7   r¨   r©   ©Zrspfile_quote_funcre   r7   r8   r{   ÿ   ó    z command = {}
c                   r§   r7   r¨   r©   rs   r7   r8   r{     r:   z deps = z depfile = z description = )r‡   r   ÚMSVCr?   rD   r„   r–   ÚformatÚjoinr—   r˜   r™   rš   rS   r›   rƒ   )re   r…   r¥   Zrspr|   r7   rª   r8   r„   î   s.   
&
*,

îzNinjaRule.writec                   sø   i }|D ]
}|\}}|||< qˆ j |d< ˆ j|d< ||d< ||d< d ‡ fdd„ˆ jˆ j D ƒ¡}t|ƒ}	t d|¡D ]>}
|
 d	¡d
kry|	|
 	d	¡|
 d	¡ d	 8 }	|
 
d	¡}|d	 dkrd|dd
… }n|d	d … }| |g ¡}|	td |¡ƒ7 }	q;|	S )Nr™   rš   ÚinÚoutr¦   c                   r§   r7   r¨   r©   rs   r7   r8   r{     r:   z-NinjaRule.length_estimate.<locals>.<listcomp>z(\${\w+}|\$\w+)?[^$]*r   éÿÿÿÿÚ{r   )r™   rš   r®   r—   r˜   r3   r;   ÚfinditerÚstartÚendr4   rN   )re   ÚinfilesÚoutfilesÚelemsZ
ninja_varsÚer–   Úvaluer—   Zestimater6   Úchunkr7   rs   r8   Úlength_estimate  s*   


 
€zNinjaRule.length_estimate)r‡   r   )rh   ri   rj   r   ZGCCrf   r~   Ú
quote_funcr¢   r„   r¼   r7   r7   r7   r8   r†   ¸   s    þ) r†   c                   @  sN   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚNinjaBuildElementNc                 C  sx   |pg | _ t|tƒr|g| _n|| _t|tƒsJ ‚|| _t|tƒr&|g| _n|| _tƒ | _tƒ | _g | _	|| _
d| _d S ©Nr£   )Úimplicit_outfilenamesr‰   rW   ÚoutfilenamesÚrulenameÚinfilenamesr   r™   Ú	orderdepsr¸   Úall_outputsÚoutput_errors)re   rÅ   rÁ   rÂ   rÃ   Úimplicit_outsr7   r7   r8   rf   -  s   





zNinjaBuildElement.__init__c                 C  ó*   t |tƒr| j |¡ d S | j |¡ d S rd   )r‰   r}   r™   ÚupdateÚadd©re   Údepr7   r7   r8   Úadd_dep?  ó   
zNinjaBuildElement.add_depc                 C  rÈ   rd   )r‰   r}   rÄ   rÉ   rÊ   rË   r7   r7   r8   Úadd_orderdepE  rÎ   zNinjaBuildElement.add_orderdepc                 C  sV   t |tƒr	| ¡ }t |tƒr|g}| j ||f¡ |dkr)| j |d |f¡ d S d S )NÚDEPFILEr•   )r‰   r   Ú	to_nativerW   r¸   Úappend)re   r–   r¸   r7   r7   r8   Úadd_itemK  s   

ÿzNinjaBuildElement.add_itemc                 C  s\   | j dkrdS | jjsdS d dd„ | jD ƒ¡}d dd„ | jD ƒ¡}| j ||| j¡tkS )NÚphonyFr¦   c                 S  ó   g | ]}t |d ƒ‘qS ©T©r^   rv   r7   r7   r8   r{   _  r:   z9NinjaBuildElement._should_use_rspfile.<locals>.<listcomp>c                 S  rÕ   rÖ   r×   rv   r7   r7   r8   r{   `  r:   )	rÂ   rŸ   rœ   r®   rÃ   rÁ   r¼   r¸   Úrsp_threshold)re   rÃ   rÁ   r7   r7   r8   Ú_should_use_rspfileW  s   
þþz%NinjaBuildElement._should_use_rspfilec                 C  s>   | j dkr|  ¡ r| j jd7  _d S | j jd7  _d S d S )NrÔ   r   )rÂ   rÙ   rŸ   rž   r   rs   r7   r7   r8   Úcount_rule_referencesf  s
   
üz'NinjaBuildElement.count_rule_referencesc                 C  s  | j rt| j ƒ‚d dd„ | jD ƒ¡}d dd„ | jD ƒ¡}d dd„ | jD ƒ¡}|r/d| }|  ¡ }|rE| jd }t 	d| j› d	¡ n| j}d
|› |› d|› d|› }t
| jƒdkrm|dd dd„ t| jƒD ƒ¡ 7 }t
| jƒdkrŒdd„ | jD ƒ}|dd dd„ t|ƒD ƒ¡ 7 }|d7 }| dd¡}t ¡ r§d dd„ | d¡D ƒ¡}| |¡ |r»| jjtju r¸t}	nt}	nt}	| jD ]>}
|
\}}|tv}d|› d}g }|D ]}|rÜ|dkrä| t|ƒ¡ qÔ| t|	|ƒƒ¡ qÔ|d |¡7 }|d7 }| |¡ qÀ| d¡ d S )Nr¦   c                 S  rÕ   rÖ   r×   rv   r7   r7   r8   r{   p  r:   z+NinjaBuildElement.write.<locals>.<listcomp>c                 S  rÕ   rÖ   r×   rv   r7   r7   r8   r{   q  r:   c                 S  rÕ   rÖ   r×   rv   r7   r7   r8   r{   r  r:   z | r¤   zCommand line for building z is long, using a response filezbuild z: r   c                 S  rÕ   rÖ   r×   r©   r7   r7   r8   r{   }  r:   c                 S  s   g | ]}t |ƒ‘qS r7   )rW   r©   r7   r7   r8   r{     r’   z || c                 S  rÕ   rÖ   r×   r©   r7   r7   r8   r{   €  r:   rY   r0   ú/c                 s  s,    | ]}|  d ¡r| d dd¡n|V  qdS )z//r@   r   N)rŠ   rA   ©rw   r|   r7   r7   r8   Ú	<genexpr>‹  s
   € ÿ
ÿz*NinjaBuildElement.write.<locals>.<genexpr>z = rI   )rÆ   r   r®   rÃ   rÁ   rÀ   rÙ   rÂ   r   Údebugr3   r™   ÚsortedrÄ   rA   r   rJ   rƒ   r„   rŸ   r‡   r   r¬   r?   rD   r½   r¸   r‹   rÒ   r^   )re   r…   ZinsZoutsrÇ   Zuse_rspfilerÂ   ÚlinerÄ   r¡   r¹   r–   r¸   Zshould_quoteZnewelemsrx   r7   r7   r8   r„   m  sV   

" 
þ

zNinjaBuildElement.writec                 C  s2   | j D ]}|| jv rd|› d| _d| j|< qd S )Nz%Multiple producers for Ninja target "z". Please rename your targets.T)rÁ   rÅ   rÆ   )re   Únr7   r7   r8   Úcheck_outputs¨  s
   

ýzNinjaBuildElement.check_outputsrd   )rh   ri   rj   rf   rÍ   rÏ   rÓ   rÙ   rÚ   r„   râ   r7   r7   r7   r8   r¾   ,  s    
;r¾   c                   @  s(   e Zd ZU ded< ded< d
dd„Zd	S )ÚRustDeprW   r–   rK   ÚcraterX   úT.Dict[str, object]c                 C  s   | j | jdœS )N©rä   r–   ræ   rs   r7   r7   r8   Úto_json¶  s   þzRustDep.to_jsonN©rX   rå   )rh   ri   rj   Ú__annotations__rç   r7   r7   r7   r8   rã   ®  s   
 rã   c                   @  sd   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d„ZdS )Ú	RustCraterK   ÚorderrW   Údisplay_nameÚroot_moduleÚRUST_EDITIONSÚeditionúT.List[RustDep]r™   úT.List[str]ÚcfgÚboolÚis_proc_macroÚis_workspace_memberNúT.Optional[str]Úproc_macro_dylib_pathrX   rå   c                 C  sN   | j | j| j| j| jdd„ | jD ƒdœ}| jr%| jd us J dƒ‚| j|d< |S )Nc                 S  ó   g | ]}|  ¡ ‘qS r7   ©rç   )rw   Údr7   r7   r8   r{   Ö  r’   z%RustCrate.to_json.<locals>.<listcomp>)rì   rí   rï   rò   rô   r™   zThis shouldn't happenr÷   )rì   rí   rï   rò   rô   r™   r÷   )re   Úretr7   r7   r8   rç   Ï  s   ú	
zRustCrate.to_jsonrè   )rh   ri   rj   ré   r÷   rç   r7   r7   r7   r8   rê   ¼  s   
 rê   c                      sR  e Zd ZdB‡ fdd„ZdCdd	„Zd
d„ Zdd„ ZdDdd„Zdd„ Zdd„ Z	dEdd„Z
dEdd„Zdd„ ZdFd"d#„Zd$d%„ ZdGd(d)„ZdHd.d/„Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ ZdId=d>„Zd?d@„ ZdJdDdE„ZdJdFdG„ZdHdI„ ZdJdK„ ZdLdM„ ZdNdO„ ZdPdQ„ ZdRdS„ Z dTdU„ Z!dVdW„ Z"dXdY„ Z#dZd[„ Z$dKd]d^„Z%d_d`„ Z&dLdadb„Z'dcdd„ Z(dedf„ Z)dgdh„ Z*didj„ Z+dMdmdn„Z,dNdpdq„Z-dNdrds„Z.dOdxdy„Z/dPd~d„Z0dQd‰dŠ„Z1dRd‹dŒ„Z2e3dSdd„ƒZ4e5dTdUd”d•„ƒZ6e5dVd˜d™„ƒZ7e5dVdšd›„ƒZ8dœd„ Z9dždŸ„ Z:d d¡„ Z;d¢d£„ Z<d¤d¥„ Z=d¦d§„ Z>dWd«d¬„Z?d­d®„ Z@d¯d°„ ZAd±d²„ ZBdXd´dµ„ZCd¶d·„ ZDdYd¹dº„ZEd»d¼„ ZFd½d¾„ ZGdZd¿dÀ„ZHd[dÂdÃ„ZIdÄdÅ„ ZJdÆdÇ„ ZKdÈdÉ„ ZLdÊdË„ ZMdÌdÍ„ ZNdÎdÏ„ ZOdCdÐdÑ„ZPd\dÔdÕ„ZQdÖd×„ ZRd]dÚdÛ„ZSdÜdÝ„ ZTdÞdß„ ZUdàdá„ ZVdâdã„ ZWdädå„ ZXeYddæd^dëdì„ƒZZ	íd_d`dðdñ„Z[dadòdó„Z\eYddæ	íd_dbdõdö„ƒZ]			dcdddûdü„Z^dýdþ„ Z_dÿd „ Z`dd„ Zadd„ Zbdd„ Zcdd„ Zdd	d
„ ZedCdd„Zfdd„ Zgdd„ Zhdd„ Zidd„ Zjdd„ Zkdd„ ZleYddædedd„ƒZmdd„ Zndd„ Zodfdgd!d"„Zpd#d$„ Zqd%d&„ Zrdhd(d)„Zsd*d+„ Ztd,d-„ Zud.d/„ Zvd0d1„ ZwdCd2d3„Zxd4d5„ Zyd6d7„ Zzd8d9„ Z{d:d;„ Z|d<d=„ Z}di‡ fd@dA„Z~‡  ZS (j  ÚNinjaBackendr   úT.Optional[build.Build]ÚinterpreterúT.Optional[Interpreter]c                   sB   t ƒ  ||¡ d| _d| _i | _i | _i | _tddƒ| _i | _	d S )NÚninjaúbuild.ninjaF)
Úsuperrf   r–   Úninja_filenameÚfortran_depsrÅ   Úintrospection_datar   Úcreated_llvm_ir_ruleÚrust_crates)re   r   rþ   ©Ú	__class__r7   r8   rf   â  s   
zNinjaBackend.__init__Nc                 C  sJ   |  d¡rtd|›ƒ‚d|› }t||d|ƒ}|  |¡ t|||||ƒ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¾   Ú	add_build)re   rÅ   Zdummy_outfilerÂ   Zphony_infilenamerÇ   Zto_nameÚelemr7   r7   r8   Úcreate_phony_targetì  s   


z NinjaBackend.create_phony_targetc                   sB  | j jjj ¡ D ]"}|jdv rq|jdkr"t ¡ r"t	ˆddd  S | 
¡ dkr* nqt	ˆdddS dtj|j d  }tj | j  ¡ |¡}t	|d	dd}| td
ƒ¡ W d  ƒ n1 s_w   Y  tj| ¡ dd|g | j  ¡ tjtjd}| ¡ \}}t d¡‰ ‡ ‡fdd„}	|	|ƒp’|	|ƒ}
|
r—|
S td|› d|› ƒ‚)z_VS writes its dependency in a locale dependent format.
        Detect the search prefix to use.>   ZmasmÚfortranZpgir“   úutf-8©ÚencodingÚmsvcz
incdetect.r   ÚwzI                #include<stdio.h>
                int dummy;
            Nz/showIncludesrF   )ÚcwdÚstdoutÚstderrs(   ^(.*\s)([a-zA-Z]:[\\/]|[\\\/]).*stdio.h$c              	     sx   t  d| ¡D ]3}ˆ  |¡}|r9tˆdƒ}| d| d¡ d ¡ W d   ƒ n1 s+w   Y  tˆddd  S qd S )	Ns   \r?\nÚabs   msvc_deps_prefix = r   ó   
r“   r  r  )r;   rƒ   ÚmatchÚopenr„   r4   )r°   rà   r  Zbinfile©ZmatchreÚtempfilenamer7   r8   Údetect_prefix/  s   
ÿýz8NinjaBackend.detect_vs_dep_prefix.<locals>.detect_prefixz=Could not determine vs dep dependency prefix string. output: r¦   )r   Úcoredatar   ÚhostÚvaluesÚlanguageÚidr   rJ   r  Úget_argument_syntaxÚlang_suffixesrL   Úpathr®   Úget_scratch_dirr„   r
   Ú
subprocessÚPopenÚget_exelistÚPIPEÚcommunicater;   Úcompiler   )re   r  ÚcompilerZfilebaseÚfilenameÚfZpcr  r  r  Úresultr7   r  r8   Údetect_vs_dep_prefixý  s:   
ÿÿÿ

ÿý
z!NinjaBackend.detect_vs_dep_prefixc                 C  s   t jdd}| j j tdƒ¡rCt| j  ¡ ƒ}z	| t ¡ ¡}W n	 t	y(   Y nw t
 t
 ¡ ¡}t ¡  t d¡ t |› d|› ¡ |d u rKtdƒ‚|\| _| _tj | j  ¡ | j¡}|d }t|dd	d
:}| d| j ¡ › d¡ | d¡ | d¡ | d¡ | j jjtdƒ j}|dkrš| d|› d¡ W d   ƒ n1 s¤w   Y  |  |¡¡}|  ¡  g | _|  ¡  |   t!dƒ¡ t"| j #¡  $¡ ddD ]}|  %|¡ qÌ|   t!dƒ¡ |  &¡  |   t!dƒ¡ |  '¡  |  (¡  tdƒ}	|	| j jjv r(| j jj|	 jr(t  )¡ \}
}}}}|
s|r#|r#|   t!dƒ¡ |  *|
|¡ nt +d¡ |   t!dƒ¡ |  ,¡  |  -¡  |  .|¡ |  /|¡ d}| |¡ W d   ƒ n	1 sSw   Y  t 0||¡ t 1|¡ t
 2| jd¡r†tj 3d¡r†t4 5| jd d!g ¡ t4 5| jd d"g ¡ |  6¡  |  7¡  d S )#NT)ÚlogZ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  r  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
Test ruleszInstall rulesÚ
b_coveragezCoverage rulesz;Need gcovr or lcov/genhtml to generate any coverage reportsZSuffixzdefault all

ú>=1.10.0z.ninja_depsú-tZrestatZ	cleandead)8r   Z detect_ninja_command_and_versionr  Ú
get_optionr#   r	   Úget_build_dirÚrelative_tor  Ú
ValueErrorr   Z	join_argsÚget_meson_commandr   r2  r   Úninja_commandÚninja_versionrL   r%  r®   r  r  r„   r   Zget_projectÚoptionsrº   r1  Úgenerate_rulesÚbuild_elementsÚgenerate_phonyÚadd_build_commentr   r   Úget_targetsr   Úgenerate_targetÚgenerate_testsÚgenerate_installÚgenerate_distZfind_coverage_toolsÚgenerate_coverage_rulesÚwarningÚgenerate_utilsÚgenerate_endingÚwrite_rulesÚwrite_buildsrA   Zcmd_ci_includeÚversion_compareÚexistsr'  ÚcallÚgenerate_compdbÚgenerate_rust_project_json)re   r   ÚbuilddirZmeson_commandZoutfilenamer  r…   Ú	num_poolsÚtÚkeyÚ	gcovr_exeÚgcovr_versionZlcov_exeZgenhtml_exeÚ_Údefaultr7   r7   r8   Úgenerate@  s‚   ÿ




ÿ€øÿ


à#
zNinjaBackend.generaterX   ÚNonec                 C  sŽ   | j sdS ttj | j ¡ d¡ddd)}tjtj | jj	j
jd  ¡ d¡dd	„ | j  ¡ D ƒd
œ|dd W d  ƒ dS 1 s@w   Y  dS )z;Generate a rust-analyzer compatible rust-project.json file.Nzrust-project.jsonr  r  r  Úrustzlib/rustlib/src/rust/library/c                 S  rø   r7   rù   r   r7   r7   r8   r{   —  r’   z;NinjaBackend.generate_rust_project_json.<locals>.<listcomp>)Zsysroot_srcZcratesé   )Úindent)r  r  rL   r%  r®   r   r;  ÚjsonÚdumpr  r   r  Úget_sysrootr   )re   r/  r7   r7   r8   rU    s   ÿÿýú"þz'NinjaBackend.generate_rust_project_jsonc           	      C  s  g }t D ](}| jjj|  ¡ D ]}|dd„ |  |¡fD ƒ7 }|dd„ |  |¡fD ƒ7 }qqt | j	d¡r7dgng }| j
ddg | | }| j ¡ }z+tj||d}ttj |d	¡d
ƒ}| |¡ W d   ƒ W d S 1 smw   Y  W d S  ty…   tjddd Y d S w )Nc                 S  ó"   g | ]}d D ]}|› |› ‘qqS ©)r£   r¤   r7   ©rw   rŸ   Úextr7   r7   r8   r{   ¢  ó
    ÿÿz0NinjaBackend.generate_compdb.<locals>.<listcomp>c                 S  rf  rg  r7   rh  r7   r7   r8   r{   ¤  rj  z>=1.9ú-xr9  Zcompdb)r  zcompile_commands.jsonÚwbz&Could not create compilation database.F)Úfatal)r   r   r  r   r   Úcompiler_to_rule_nameÚcompiler_to_pch_rule_namer   rQ  r@  r?  r;  r'  Úcheck_outputr  rL   r%  r®   r„   Ú	Exceptionr   rL  )	re   ÚrulesÚfor_machiner-  Zcompdb_optionsZninja_compdbrV  Zjsondbr/  r7   r7   r8   rT  œ  s"   ý
&ÿÿzNinjaBackend.generate_compdbc              	   C  sØ   t |dƒr|jS g }| ¡ D ]#}t|tjtjfƒrq| ¡ D ]}| j 	|¡r0| 
|  |||¡¡ qqd|jv rLt|tjƒsLt |  |¡|j¡}| 
|¡ t |j|j¡D ]}t|tjtjfƒrf||  |¡7 }qT||_|S )NÚcached_generated_headersÚvala)Úhasattrrt  Ú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)re   ÚtargetÚheader_depsÚgenlistÚsrcr€  rÌ   r7   r7   r8   r‡  ²  s(   
€þ
€z"NinjaBackend.get_generated_headersrˆ  úbuild.BuildTargetúT.MutableMapping[str, File]c                 C  sB   t ƒ }| ¡ D ]}| ¡ D ]}|  |||¡}t |¡||< qq|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   rw  rz  r|  r   Úfrom_built_relative)re   rˆ  ÚsrcsÚgensrcr>   Úrel_srcr7   r7   r8   Úget_target_generated_sourcesÇ  s   þz)NinjaBackend.get_target_generated_sourcesc                 C  sF   t ƒ }| ¡ D ]}t|tƒstd|›dƒ‚| | j¡}|||< q|S )NúAll sources in target z must be of type mesonlib.File)r   Úget_sourcesr‰   r   r&   Úrel_to_builddirÚbuild_to_src)re   rˆ  r  r>   r/  r7   r7   r8   Úget_target_sourcesÔ  s   

zNinjaBackend.get_target_sourcesc                 C  sz   t |tƒr|j}| j |¡s| j |¡rdS tj |¡d dd …  	¡ }t
jD ]}||jvr/q'||j| jv r: dS q'dS )NFr   T)r‰   r   Úfnamer   Ú
is_llvm_irZis_assemblyrL   r%  ÚsplitextÚlowerr   ÚLANGS_CANT_UNITYr   Úfile_suffixes)re   rˆ  ÚsourceÚsuffixÚlangr7   r7   r8   Úget_target_source_can_unityà  s   

ÿ

ÿz(NinjaBackend.get_target_source_can_unityúbuild.TargetÚcompúcompilers.Compilerc                   sÂ   |  ¡ }| ¡ }ˆ j| }|t|ƒf}	| |	d¡}
|
du r=t|tƒr(|jdd}| |ˆ j	¡}|| 
¡ |g g dœ}
|
||	< ‡ fdd„|D ƒ}‡ fdd„|D ƒ}|
d  |7  < |
d	  |7  < dS )
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)r!  r-  Ú
parametersÚsourcesÚgenerated_sourcesc                   ó>   g | ]}t |tƒr| ˆ jˆ j¡ntj tj ˆ j|¡¡‘qS r7   ©	r‰   r   Úabsolute_pathÚ
source_dirÚ	build_dirrL   r%  Únormpathr®   r©   rs   r7   r8   r{     ó    6ÿzCNinjaBackend.create_target_source_introspection.<locals>.<listcomp>c                   r©  r7   rª  r©   rs   r7   r8   r{     r¯  r§  r¨  )Úget_idÚget_languager  ÚtuplerN   r‰   r   rÑ   Z&compute_parameters_with_absolute_pathsr­  r)  )re   rˆ  r£  r¦  r§  r¨  Útidr   ZtgtZid_hashZ	src_blockr7   rs   r8   Ú"create_target_source_introspectionî  s0   

û
ÿ
ÿz/NinjaBackend.create_target_source_introspectionc           %   	     sü  zt ˆtjƒrt ˆ  ˆ¡¡ W n	 ty   Y nw t ˆtjƒr%ˆ  ˆ¡ t ˆtj	ƒr0ˆ  
ˆ¡ g }i }ˆ ¡ }|ˆ jv r?d S ˆ j |¡ i ˆ j|< ˆ  ˆ¡ ˆ  ˆˆ  ˆ¡¡ t ˆtjƒreˆ  ˆ¡ d S ˆ ¡ rpˆ  ˆ¡ d S dˆjv r|ˆ  ˆ¡ d S dˆjv rˆˆ  ˆ¡ d S dˆjv r–ˆ  ˆ¡\}}}ndˆjv r¤ˆ  ˆ¡\}}}nˆ  ˆ¡}ˆ  ˆ¡}g }ˆ  ˆ¡ ˆ  ˆ¡ ˆ  ˆ¡}g }	ˆj }
g }g }g }|ˆ  !ˆ¡7 }|
rt"ˆj #¡ ƒ}| $t%j&¡}|rd '|¡ (¡  }}|t)|ƒdkrödnd7 }|› d	|› d
ˆj*›d}t+ ,t+ -d¡|¡ g }| #¡ D ]X}t. /|¡}ˆ j0 1|¡rI|
rBˆ  2ˆ|¡rB| 3|¡ tj4 'ˆ j0 5¡ |¡}| 3|¡ q| 3|¡ qˆ j0 6|¡rW|	 3|¡ qˆ j0 7|¡sdt8 9|¡rfq| 3|¡ qg }|D ]>}ˆ j0 :|¡rƒˆ  ;ˆ|¡\}}nˆ j<ˆ|d|d\}}| 3|¡ |||< |	 3|¡ | =d¡d tj>d v r®| 3|¡ qqˆ j0j?j@ AtBdƒ¡}|rÊˆ C¡ rÊˆ jDˆ|d}ng }ˆ  Eˆ¡\}}dd„ |D ƒ}|	 F|¡ ‡ fdd„|D ƒ}g }ˆ G¡ rütH I‡ ‡fdd„|D ƒ¡}g } |D ]}t. /|¡}ˆ j0 J|¡r| 3|¡ q |  3|¡ q | D ]}ˆ  <ˆ|dg |¡\}}|	 3|¡ q| K¡ D ]]}ˆ j0 J|¡s’ˆ j0 :|¡rUˆ  ;ˆ|¡\}}|	 3|¡ q6|
rtˆ  2ˆ|¡rttj4 'ˆ j0 5¡ | Lˆ jM¡¡}| 3|¡ q6ˆ  <ˆ|dg || | |¡\}}|	 3|¡ | 3|¡ |||< q6|
r¿ˆ  Nˆ|¡D ]!}ˆ  <ˆ|d|| | ||¡\}}|	 3|¡ | 3|¡ |||< qt ˆtjOƒrÈd S ˆ  Pˆ¡\}!}"t ˆtjQƒráˆjRráˆ  Sˆ|	¡}#n|	}#ˆ jTˆ||#|!||"d}$ˆ  Uˆ||||¡ ˆ  V|$¡ d S )NÚcsÚswiftru  Úcythonz, r   z arez isz' not supported in Unity builds yet, so z sources in the z! target will be compiled normallyZFIXMET)Ú
order_depsÚ.r±   rú   Úb_pch)r‰  c                 S  s   g | ]}|  ¡ r|‘qS r7   )Úuses_fortran©rw   rX  r7   r7   r8   r{   ¤  r«   z0NinjaBackend.generate_target.<locals>.<listcomp>c              	     s*   g | ]}t d gtj ˆ  |¡¡¢R Ž ‘qS rÖ   )r   rL   r%  rƒ   Úget_target_filenamer¼  rs   r7   r8   r{   §  s   * c                   s&   g | ]}ˆj d  jˆ  |¡dd‘qS )r  F)Ú	is_system)r   Úget_include_argsÚget_target_private_dirr¼  ©re   rˆ  r7   r8   r{   ª  s
    
ÿ

ÿF)Ústdlib_args)Wr‰   r   ÚBuildTargetrL   ÚmakedirsÚget_target_private_dir_absÚFileExistsErrorrx  Úgenerate_custom_targetZ	RunTargetÚgenerate_run_targetr°  Úprocessed_targetsrÊ   r  Úprocess_target_dependenciesÚgenerate_shlib_aliasesr  ZJarÚgenerate_jar_targetÚ	uses_rustÚgenerate_rust_targetr   Úgenerate_cs_targetÚgenerate_swift_targetÚgenerate_vala_compileÚgenerate_cython_transpiler—  r’  Úscan_fortran_module_outputsÚgenerate_generator_list_rulesr½  Úis_unityr‡  ÚsetÚkeysÚintersectionr   rœ  r®   Úupperr3   r–   r   r2  Zredr   rŽ  r   Ú	is_sourcer¡  rÒ   r%  r;  Ú	is_objectÚ
is_libraryr   Úis_module_libraryr™  Úgenerate_llvm_ir_compileÚgenerate_single_compilerƒ   r$  r  rA  rN   r#   Úhas_pchÚgenerate_pchÚflatten_object_listÚextendr»  r   Zlistifyr{  r   r•  r–  Zgenerate_unity_filesÚCompileTargetZ determine_linker_and_stdlib_argsr…  ZprelinkÚgenerate_prelinkÚgenerate_linkÚgenerate_dependency_scan_targetr  )%re   rˆ  Úcompiled_sourcesra   r–   Ztarget_sourcesr¨  Ztranspiled_sourcesÚoutnameÚobj_listrÕ  r‰  Z	unity_srcZ
unity_depsZlangsZ
langs_cantZ	langs_areÚmsgÚgenerated_source_filesr‘  Úraw_srcÚabs_srcZd_generated_depsr‹  Úor>   Zuse_pchÚpch_objectsZodZobj_targetsZfortran_order_depsZfortran_inc_argsZvala_generated_source_filesÚlinkerrÂ  Zfinal_obj_listr  r7   rÁ  r8   rG    s$  €ÿ











ÿ
ÿ




ÿ



ÿ


€

ÿ	

ÿ
þ

€ÿ

zNinjaBackend.generate_targetú'build.BuildTarget'ró   c                 C  s¨   t  | jd¡r	dS d|jv rdS d|jvrdS d|j dg ¡v r"dS |jd }| ¡ dkr/dS | jjj	t
d|jdd	 j}|d
vrCdS t  ¡ sIdS t  |jd¡rRdS dS )Nz<1.10.0Fr  TÚcppz-fmodules-tsr  Zstd©Úmachiner   )Zlatestz	c++latestz
vc++latestz<19.28.28617)r   rQ  r@  r   Ú
extra_argsrN   r°  r   r  rA  r#   rs  rº   Zcurrent_vs_supports_modulesÚversion)re   rˆ  ró  Z
cppversionr7   r7   r8   Úshould_use_dyndeps_for_targetí  s&   


z*NinjaBackend.should_use_dyndeps_for_targetrì  úT.List[mesonlib.File]Úobject_depsúT.List['mesonlib.FileOrString']c                 C  s\  |   |¡sd S |  |¡}|jd }tj |  |¡|¡ dd¡}tj |  |¡|¡ dd¡}	tj |  |¡|j› d¡ dd¡}
d}|  	|¡}t
|
ddd}t ||¡ W d   ƒ n1 s^w   Y  t| j|||
ƒ}| d	|¡ |D ]
}|j | ¡ ¡ qs|j |¡ t|  |¡|ƒ}t
|	d
ƒ}t ||¡ W d   ƒ n1 s¢w   Y  |  |¡ d S )Nz.datr0   rÛ   z
-deps.jsonÚdepscanr  r  r  Z
picklefilerl  )rø  Úget_dep_scan_file_forr–   rL   r%  r®   rÀ  rA   rÅ  Úselect_sources_to_scanr  rc  rd  r¾   rÅ   rÓ   rÄ   rÊ   Úrelative_namerÉ   r_   Úpickler  )re   rˆ  rè  ra   rì  rú  Zdepscan_fileZpickle_baseZpickle_fileZ
pickle_absZjson_absZ	rule_nameZscan_sourcesr/  r  ÚgZscaninfoÚpr7   r7   r8   rç    s,   


$
ÿÿz,NinjaBackend.generate_dependency_scan_targetc                 C  sh   t tjd ƒt tjd ƒB }g }|D ]}tj |¡d dd … }|dkr(| ¡ }||v r1| |¡ q|S )Nró  r  r   ÚC)rÖ  r   r$  rL   r%  rš  r›  rÒ   )re   rè  Úall_suffixesZselected_sourcesrž  ri  r7   r7   r8   rþ     s   
€z#NinjaBackend.select_sources_to_scanc                 C  s*   |  ¡ D ]}| ¡ | jvr|  |¡ qd S rd   )Úget_dependenciesr°  rÉ  rG  )re   rˆ  rX  r7   r7   r8   rÊ  .  s
   
€þz(NinjaBackend.process_target_dependenciesc                 C  s(   |j D ]}t|tjƒr|  ||¡ qd S rd   )r§  r‰   r   r%   Úgenerate_genlist_for_target)re   rˆ  r>   r7   r7   r8   Úcustom_target_generator_inputs3  s
   
€þz+NinjaBackend.custom_target_generator_inputsc              	   C  sP   g }|  ¡ D ]}t|tƒr|d }| ¡ D ]}| tj |  |¡|¡¡ qq|S ©Nr   )	r  r‰   r}   rz  rÒ   rL   r%  r®   r  )re   rˆ  r™   rx   Úoutputr7   r7   r8   Úunwrap_dep_list8  s   
ÿzNinjaBackend.unwrap_dep_listc              	   C  sÌ  |   |¡ |  |¡\}}}|  |¡}||  |¡7 }|jr!| d¡ |jd u r)d}nd}t| j|||ƒ}| 	|¡ |j
D ]}| ¡ D ]}	| 	tj |  |¡|	¡¡ qAq;| j|jd |dd … | ¡ |jrg|d nd |jro|d nd |j|jd\}}
|
r‚d|
› d}nd	}|jd ur³| |j¡}tj |  |¡|¡}tj | j ¡ |  |¡¡}tj|d
d | d|¡ |jr¼| dd¡ t|j|jƒ  ¡ }| d|¡ | dd|› d|› ¡ |  !|¡ | j" #| $¡ ¡ d S )NÚPHONYÚCUSTOM_COMMANDÚCUSTOM_COMMAND_DEPr   r   )Zextra_bdepsÚcaptureÚfeedÚenvÚverboseú (wrapped by meson ú)r£   T©Úexist_okrÐ   rT   ÚconsoleÚCOMMANDrS   úGenerating z with a custom command)%r  Úeval_custom_target_commandr
  Úget_custom_target_depend_filesZbuild_always_stalerÒ   rš   r¾   rÅ   rÍ   Zextra_dependsrz  rL   r%  r®   r  Úas_meson_exe_cmdliner—   Z get_transitive_build_target_depsr  r  r  r  Úget_dep_outnamerÃ   r   r;  rÄ  rÓ   r	   Úsubdirr–   Úas_posixr  rÉ  rÊ   r°  )re   rˆ  r  Z
ofilenamesrE   r™   rÂ   r  rú   r	  ÚreasonÚcmd_typerš   Z	rel_dfileÚabs_pdirÚ	full_namer7   r7   r8   rÇ  C  sL   





ÿ
û

z#NinjaBackend.generate_custom_targetc                 C  s*   |j dkr|j › d}nd}|› |j› S )Nr£   z@@)Ú
subprojectr–   )re   rˆ  Zsubproject_prefixr7   r7   r8   Úbuild_run_target_namem  s   
z"NinjaBackend.build_run_target_nameúbuild.RunTargetc                 C  sö   |   |¡}|jst| j|dg ƒ}nJ|  |¡}|  |¡\}}}| j|jd |dd … |dd\}}|r8d|› dnd}	|  | j|d	g ¡}| d
|¡ | dd|j	› |	› ¡ | dd¡ |  
|¡}
|
|  |¡7 }
| |
¡ |  |¡ | j | ¡ ¡ d S )NrÔ   r   r   T)r  r  r  r  r£   r  r  rS   zRunning external command rT   r  )r$  r—   r¾   rÅ   Zget_run_target_envr  r  r  rÓ   r–   r
  r  rÍ   r  rÉ  rÊ   r°  )re   rˆ  Útarget_namer  Z
target_envr\  rE   Zmeson_exe_cmdr  r   r™   r7   r7   r8   rÈ  t  s&   


þ


z NinjaBackend.generate_run_targetc              
   C  sº   | j  ¡  ¡ }d}|D ]}t|dƒsq|j ¡ D ]}| ¡ dkr)|j ¡ s)d} nqq| d| j	 
¡ ddg | | j	 ¡ tj | j	 ¡ | j  ¡ ¡| j	 ¡ | j	 ¡ g |rWdgng  ¡ d S )	NFr   ÚclangTr  ú
--internalÚcoveragez--use_llvm_cov)r   rF  r   rv  r   r°  ÚinfoZ	is_darwinrÓ   r   Úget_build_commandÚget_source_dirrL   r%  r®   Zget_subproject_dirr;  Zget_log_dir)re   r  ÚoutputsÚtargetsZuse_llvm_covrˆ  r-  r7   r7   r8   Úgenerate_coverage_command‹  s2   
€ÿþÿüý
øz&NinjaBackend.generate_coverage_commandrZ  rö   r[  c                 C  sD   |   | jddd¡}|  |g ¡ | dd¡ |  |¡ |  ||¡ d S )Nr)  r  r  rS   zGenerates coverage reports)r  rÅ   r/  rÓ   r  Úgenerate_coverage_legacy_rules©re   rZ  r[  r¹   r7   r7   r8   rK  Ÿ  s
   
z$NinjaBackend.generate_coverage_rulesc                 C  sô   |   | jddd¡}|  |dg¡ | dd¡ |  |¡ |rv|   | jddd¡}|  |dg¡ | dd	¡ |  |¡ |   | jd
dd¡}|  |dg¡ | dd¡ |  |¡ t |d¡rx|   | jddd¡}|  |dg¡ | dd¡ |  |¡ d S d S d S )Nzcoverage-htmlr  r  z--htmlrS   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)r  rÅ   r/  rÓ   r  r   rQ  r1  r7   r7   r8   r0  ¦  s(   


ñz+NinjaBackend.generate_coverage_legacy_rulesc                 C  sd   |   ¡  |  | jddd¡}| d¡ | dd¡ | d| j ¡ ddg ¡ | d	d
¡ |  |¡ d S )NÚinstallr  r  ÚallrU   zInstalling files.r  ú--no-rebuildrT   r  )Zcreate_install_data_filesr  rÅ   rÍ   rÓ   r   r+  r  ©re   r  r7   r7   r8   rI  ½  s   
zNinjaBackend.generate_installc                 C  sô   |   ¡  | j d¡ddg }| jj tdƒ¡s|dg7 }| jj tdƒ¡r*|dg7 }|  | jddd	d
g¡}| d|¡ | dd¡ | dd¡ |  	|¡ | j d¡g d¢ }|  | jddd	d
g¡}| d|¡ | dd¡ | dd¡ |  	|¡ d S )NTÚtestr4  Zstdsplitz--no-stdsplitZ	errorlogsz--print-errorlogsr  r3  r  r  rU   zRunning all tests.rT   r  )r6  z--benchmarkz	--logbaseZbenchmarklogz--num-processes=1r4  Ú	benchmarkzRunning benchmark suite.)
Zserialize_testsr   r+  r  r:  r#   r  rÅ   rÓ   r  ©re   rE   r  r7   r7   r8   rH  Æ  s"   


zNinjaBackend.generate_testsc                 C  s   g | _ i | _|  tdƒ¡ |  ¡  |  tdƒ¡ |  ¡  |  tdƒ¡ |  ¡  |  ¡  |  tdƒ¡ |  t	ddgg ddd	¡ |  t	d
dgg ddddd¡ |  t	d| j
 ¡ ddg ddgdƒ¡ | j
 ¡ dd| j
 ¡ | j
 ¡ g }|  t	d|g ddd	¡ d S )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¥  ú$inú$outzCopying $in to $outZ
regenerateÚREGENERATE_BUILDzRegenerating build files.zgenerator = 1)rr  ÚruledictÚadd_rule_commentr   Úgenerate_scanner_rulesÚgenerate_compile_rulesÚgenerate_static_link_rulesÚgenerate_dynamic_link_rulesÚadd_ruler†   r   r+  r,  r;  )re   rŒ   r7   r7   r8   rB  Ý  s@   ÿþÿýÿýzNinjaBackend.generate_rulesc                 C  ó   | j  |¡ d S rd   )rr  rÒ   r   r7   r7   r8   rA  ý  ó   zNinjaBackend.add_rule_commentc                 C  rG  rd   )rC  rÒ   r   r7   r7   r8   rE     rH  zNinjaBackend.add_build_commentc                 C  s:   |j | jv rtd|j › dƒ‚| j |¡ || j|j < d S )NzTried to add rule z twice.)r–   r@  r   rr  rÒ   )re   rŸ   r7   r7   r8   rF    s   zNinjaBackend.add_rulec                 C  s^   |  ¡  | j |¡ |jdkr-|j| jv r| j|j |_d S t d|j› d|j› ¡ d S d S )NrÔ   zbuild statement for z references nonexistent rule )	râ   rC  rÒ   rÂ   r@  rŸ   r   rL  rÁ   )re   r   r7   r7   r8   r  	  s   
ûzNinjaBackend.add_buildc                 C  s8   | j D ]}t|tƒr| ¡  q| jD ]}| |¡ qd S rd   )rC  r‰   r¾   rÚ   rr  r„   )re   r…   ÚbÚrr7   r7   r8   rO    s   

€
ÿzNinjaBackend.write_rulesc                 C  s"   t | jddD ]}| |¡ qd S )NzWriting build.ninjar5  )r   rC  r„   )re   r…   rI  r7   r7   r8   rP    s   ÿzNinjaBackend.write_buildsc                 C  s,   |   tdƒ¡ t| jdddƒ}|  |¡ d S )Nz&Phony build target, always out of dater  rÔ   r£   )rE  r   r¾   rÅ   r  r5  r7   r7   r8   rD     s   zNinjaBackend.generate_phonyú	build.Jarc                   sR  ˆ  ¡ }tj ˆ  ˆ¡|¡}ˆ ¡ }ˆ ¡ }g }ˆjd }d}d}	d}
d}ˆ ¡ }|dkr/d}
ˆ  	ˆ¡}g }| 
¡ D ]}t |¡}| d¡rK| |¡ q:ˆ  ˆ|¡}|| D ]}ˆ  |ˆ||¡}| |¡ qV‡ ‡fdd	„|D ƒ}tj ˆ  ˆ¡d
d¡}tj ˆ j ¡ |¡}tjtj |¡dd t|ddd)}tˆjƒr´| d¡ ‡ fdd	„ˆjD ƒ}| d |¡¡ | d¡ W d   ƒ n1 sÃw   Y  d}||	 |
 | g}| |¡ |
dkrá| |¡ | ˆ  ˆ¡¡ |dˆ  ˆ¡dg7 }tˆ j||g ƒ}| |¡ |r| ˆ  t ˆ  ˆ¡ƒ|¡d ¡ | !d|¡ ˆ  "|¡ ˆ  #ˆ||||¡ d S )NÚjavarŒ   r6   r£   r/  r¹   ú.javac                   ó    g | ]}t j ˆ  ˆ¡|¡‘qS r7   ©rL   r%  r®   rÀ  rv   rÁ  r7   r8   r{   @  ó     z4NinjaBackend.generate_jar_target.<locals>.<listcomp>zMETA-INFzMANIFEST.MFTr  r  r  r  zClass-Path: c                   ó$   g | ]}t j ˆ  |¡| ¡ ¡‘qS r7   ©rL   r%  r®   r  Úget_filenamerÜ   rs   r7   r8   r{   G  ó   $ r¦   rY   Újava_LINKERú-Cr¹  r   ÚARGS)$rS  rL   r%  r®   r  r”  Zget_java_resourcesr   Zget_main_classr’  r×  r   rŽ  ÚendswithrÒ   Ú"determine_single_java_compile_argsÚgenerate_single_java_compilerÀ  r   r;  rÄ  Údirnamer  Úanyrƒ  r„   r½  r¾   rÅ   rÍ   rÏ   Ú)_NinjaBackend__generate_sources_structurer	   rÓ   r  r´  )re   rˆ  r˜  Úoutname_relÚsrc_listÚ	resourcesZ
class_listr-  rŒ   r6   r¹   r/  Z
main_classr¨  Zgen_src_listr‘  rí  Úcompile_argsr‹  Úplain_class_pathZclass_dep_listZmanifest_pathZmanifest_fullpathÚmanifestZcp_pathsZjar_ruleÚcommandsr  r7   rÁ  r8   rÌ  %  sb   




€

û


 
z NinjaBackend.generate_jar_targetc           
      C  sô   g }g }|j D ]n}tj | j|j|¡}| d¡rd| }nS| d¡s'| d¡rhtj tj |¡¡d d }tj |  	|¡|¡}t
| j|d|ƒ}	|	 dd||g¡ |	 d	d
|› ¡ |  |	¡ | |¡ d| }ntd|› dƒ‚| |¡ q||fS )Nz
.resourcesz
-resource:z.txtz.resxr   r  r  ZresgenrU   zCompiling resource zUnknown resource file r¹  )r`  rL   r%  r®   r–  r  rX  rš  ÚbasenamerÀ  r¾   rÅ   rÓ   r  rÒ   r&   )
re   rˆ  r˜   r™   rJ  Zrel_sourcefiler“   Z	ofilebaseZ	ofilenamer  r7   r7   r8   Úgenerate_cs_resource_tasks^  s$   





z'NinjaBackend.generate_cs_resource_tasksc                   sP  |  tdƒ¡}| ¡ }tj ˆ  |¡|¡}| ¡ }|jd }‡ fdd„|D ƒ}g }| 	|j
 dg ¡¡}	|	| |¡7 }	|	| |  tdƒ¡¡7 }	|	| |  tdƒ¡¡7 }	t|tjƒr^|	 d¡ nt|tjƒrj|	 d¡ ntd	ƒ‚ˆ  |¡\}
}|	|
7 }	||7 }|	| |¡7 }	|jD ]}tj ˆ  |¡| ¡ ¡}|	| |¡7 }	| |¡ q‡d
|	v r­||d g}n|g}ˆ  |¡}g }| ¡ D ]}| ¡  d¡rÍ| tj |¡¡ | tj |¡¡ q»| ¡ D ]	}|	 | ¡ ¡ qÛ|	ˆ j  ||j!|j"¡7 }	|	ˆ j #||j"¡7 }	t$ˆ j%|ˆ  &|¡|| ƒ}| '|¡ | (d|	¡ ˆ  )|¡ ˆ  *|¡ ˆ  +|||	||¡ d S )NÚ	buildtyperµ  c                   s    g | ]}t j | ˆ j¡¡‘qS r7   )rL   r%  r®  r•  r–  ©rw   r>   rs   r7   r8   r{   y  rP  z3NinjaBackend.generate_cs_target.<locals>.<listcomp>ÚoptimizationrÞ   z-target:exez-target:libraryzUnknown C# target type.z-gz.mdbz.csrW  ),r:  r#   rS  rL   r%  r®   r  r”  r   Úcompiler_argsrö  rN   Úget_buildtype_argsÚget_optimization_argsÚget_debug_argsr‰   r   r}  rÒ   r†  r   rf  Úget_output_argsrƒ  Úget_link_argsr’  r×  r›  rX  r®  Úget_external_depsZextend_directÚget_project_argsr#  rs  Úget_global_argsr¾   rÅ   rn  rÍ   rÓ   r  rÔ  r´  )re   rˆ  rg  r˜  r^  r_  r-  Zrel_srcsr™   rd  Zresource_argsZresource_depsr|   Úlnamer-  r¨  Zgenerated_rel_srcsr‘  rÌ   r  r7   rs   r8   rÏ  s  sV   





zNinjaBackend.generate_cs_targetc                 C  sð   g }||  | tdƒ¡¡7 }|| j ||j¡7 }|| j ||j|j¡7 }|| ¡ 7 }|| 	|  
|¡¡7 }|| ¡ 7 }| ¡ }tj | j|¡tj }|tj |¡tj 7 }|jD ]}| ¡ D ]}|tj | j|j|¡tj 7 }q]qW|d|g7 }|S )Nrg  z-sourcepath)rk  r:  r#   r   rr  rs  rq  r#  Zget_java_argsrn  rÀ  Zget_classpath_argsÚ
get_subdirrL   r%  r®   r–  Úpathsepr®  Úinclude_dirsÚget_incdirsÚcurdir)re   rˆ  r-  r˜   rx  Z
sourcepathrx   Zidirr7   r7   r8   rY  ¥  s    
 ÿz/NinjaBackend.determine_single_java_compile_argsc                   s¬   ‡ fdd„|j D ƒ}ˆ  |¡}| ¡ D ]}| d¡r| |¡ q| ˆ j¡}|jd d… d }tj	 
ˆ  |¡|¡}	tˆ j|	ˆ  |¡|ƒ}
|
 |¡ |
 d|¡ ˆ  |
¡ |S )Nc                   rQ  r7   rR  rÜ   rs   r7   r8   r{   ·  rT  z=NinjaBackend.generate_single_java_compile.<locals>.<listcomp>rM  éüÿÿÿÚclassrW  )rƒ  r’  r×  rX  rÒ   r•  r–  r˜  rL   r%  r®   rÀ  r¾   rÅ   rn  rÍ   rÓ   r  )re   r‹  rˆ  r-  r˜   r™   r¨  r‘  rb  Úrel_objÚelementr7   rs   r8   rZ  ¶  s   


€

z)NinjaBackend.generate_single_java_compilec                 C  s(   d}ddg}d}|   t||g |ƒ¡ d S )NrU  Zjarú$ARGSzCreating JAR $out)rF  r†   )re   rŸ   r—   rS   r7   r7   r8   Úgenerate_java_linkÅ  s   zNinjaBackend.generate_java_linkc                 C  sŠ   t ƒ }t |j|j¡D ]5}| ¡ sq|jD ]*}t|dƒr|j}| 	d¡d t
jd v r?|j}tj |  |¡|¡}| |¡  nqq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±   ru  )r   r  r‚  rƒ  r„  Úis_linkable_targetr§  rv  r˜  rƒ   r   r$  Ú	vala_vapirL   r%  r®   r  rÊ   r}   )re   rˆ  r0  rÌ   rx   ÚvapinameÚfullnamer7   r7   r8   Údetermine_dep_vapisË  s   


ü€z NinjaBackend.determine_dep_vapisrX  úyT.Tuple[T.MutableMapping[str, File], T.MutableMapping[str, File], T.Tuple[T.MutableMapping[str, File], T.MutableMapping]]c                 C  s&  t ƒ }t ƒ }t ƒ }t ƒ }| ¡ D ]-}t|tƒs!td|›d|›ƒ‚| | j¡}| d¡r/|}n
| d¡r7|}n|}|||< q| ¡ D ]I}	|	 	¡ D ]B}|  
||	|¡}| d¡rY|}n
| d¡ra|}n|}||v r†|| |	ur†d |t|	ƒj|	j|| jt|| ƒj¡}
t|
ƒ‚|	||< qHqB||||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–  rX  rw  rz  r|  r­   Útyperh   r–   )re   rX  ru  ÚvapiÚothersZ	othersgenr>   r/  Zsrctyper  rë  r7   r7   r8   Úsplit_vala_sourcesà  s@   





ÿþ
îzNinjaBackend.split_vala_sourcesúNT.Tuple[T.MutableMapping[str, File], T.MutableMapping[str, File], T.List[str]]c                 C  s¢  |   |¡\}}}g }|std|j›dƒ‚|jd }|  |¡}g }g }	t|ƒ}
tj | j	| 
¡ ¡}| ¡ D ]—\}}|
 |¡ t|tjtjfƒsJ|jrŽtj tj |¡¡d d }tj | j ¡ | 
¡ ¡}tj | j ¡ |¡}ttj ||f¡ƒt|ƒkrt|ƒj |¡}tj t|ƒ|¡}n-tj | j	| 
¡ ¡}| |¡r­tj tj ||¡¡d d }ntj tj |¡¡d d }tj ||¡}| |¡ |	 |¡ q5|  ||¡}|| | jj j! "t#dƒ¡j$¡7 }|d|g7 }|d|g7 }| %¡ rÍ|d	|jg7 }tj |  &|¡|j'¡}|d
|g7 }|j(r|dg7 }|	 |¡ tj |  &|¡|j)¡}|dtj d|j)¡g7 }|	 |¡ | j*|j'|j)g7  _*| j+ddg7  _+t,|j-ƒdkrb|j-d du rb| j .¡ |j-d< t,|j-ƒdkr€|j-d du r€tj | j /¡ dd¡|j-d< t|j0tƒrÍtj |  &|¡|j0¡}|dtj d|j0¡g7 }|	 |¡ |j* |j0¡ |j+ d¡ t,|j-ƒdkrÍ|j-d du rÍtj | j /¡ d¡|j-d< |d  1¡ D ]}t|t2j3ƒré|  4|¡\}|d| g7 }qÓg }|j5 "dg ¡D ] }t|t6ƒr| 7| j	¡}| |¡ | |¡ qô| |¡ qô|  8|¡}||7 }||7 }t9| j:|	|  ;|¡|
| ƒ}| <d|¡ | =|¡ |  >|¡ |  ?||||
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.ru  r   z.cZ
b_coloroutz--directoryz	--basedirz	--libraryz--headerz--use-headerz--vapiz..Zdevelr   Tr   r†  z--girrl   zgir-1.0z--gresources=rW  )@rˆ  r&   r–   r   rÀ  r}   rL   r%  r®   r–  rt  ÚitemsrÒ   r‰   r   rx  r%   Úis_builtrš  re  r   r,  r;  r   Ú
commonpathÚparentr<  rW   rŠ   ÚrelpathÚgenerate_basic_compiler_argsZget_colorout_argsr  rA  rN   r#   rº   r  r  r€  rÕ  r€  r-  Zinstall_tagr3   Úinstall_dirZget_includedirZget_datadirZvala_girr   r   ZGResourceTargetZget_custom_target_sourcesrö  r   r•  rƒ  r¾   rÅ   rn  rÓ   rÍ   r  r´  )re   rˆ  Zvala_srcZvapi_srcZ	other_srcZextra_dep_filesZvalacZ	c_out_dirZ
vala_c_srcZvalac_outputsZ	all_filesZ
srcbasedirZ	vala_filer  Zvala_c_fileZabs_srcbasedirZabs_vala_fileZvala_c_subdirZpath_to_targetr˜   Zhnamer  ZgirnameZgres_xmlrö  r“   ZrelnameZdependency_vapisr|  r7   r7   r8   rÑ    sž   


€
 
 



  
 €

þ

z"NinjaBackend.generate_vala_compilec              
   C  s°  t ƒ }t ƒ }g }|jd }g }|| ¡ 7 }|| | tdƒ¡¡7 }|| | tdƒ¡¡7 }|| | tdƒ¡¡7 }|| | 	¡ ¡7 }|| j
 ||j¡7 }|| j
 ||j|j¡7 }|| d¡7 }| td|jdd¡}g }| ¡ D ]K}	|	 d¡r³tj |  |¡|	› d|› ¡}
t| j|
g|  |¡|	 | j ¡ | j ¡ ¡gƒ}| d	|¡ |  |¡ | |
¡ | |¡ qp|	||	  | j!¡< qpg }| "¡ D ]…}| #¡ D ]~}t$|t%ƒrÚtj |  |¡|¡}n	tj | &¡ |¡}| d¡rtj |  |¡|› d|› ¡}
t| j|
g|  |¡|gƒ}| d	|¡ |  |¡ | |¡ | |
¡ qÈt'j( )| &¡ |¡||< | j *|¡sF| j +|¡sF| j ,|¡sFt- .|¡sF| |¡ qÈqÂ|D ]}| /|¡ qJ|||fS )
zkGenerate rules for transpiling Cython files to C or C++

        XXX: Currently only C is handled.
        r·  rg  rÞ   ri  r!  rô  z.pyxr¹  rW  )0r   r   Zget_always_argsrk  r:  r#   rm  rl  Zget_option_compile_argsÚget_optionsr   rr  rs  rq  r#  Úget_extra_argsr”  rX  rL   r%  r®   rÀ  r¾   rÅ   rn  r«  r   r,  r;  rÓ   r  rÒ   r•  r–  rw  rz  r‰   r%   rt  r   r   r~  rÚ  rÛ  rÜ  r   rÝ  rÏ   )re   rˆ  Zstatic_sourcesr¨  Zcython_sourcesr·  r˜   ri  Zpyx_sourcesr‹  r	  r|  r‰  ÚgenZssrcrž  r7   r7   r8   rÒ  Ž  sv   

ý


ý


ÿ
þý
€è
z&NinjaBackend.generate_cython_transpiler‹  ú'mesonlib.FileOrString'r	  r	   c                 C  sT   t |tƒr| | jj| jj¡}n|}t| jt|ƒgd|gƒ}| 	|¡ |  
|¡ dS )zCCreate a target to copy a source file from one location to another.r<  N)r‰   r   r«  r   r¬  r­  r¾   rÅ   rW   rÏ   r  )re   r‹  r	  Úinstrr  r7   r7   r8   Ú_generate_copy_target×  s   

z"NinjaBackend._generate_copy_targetÚrootÚstructured_sourcesúbuild.StructuredSourcesú%T.Tuple[T.List[str], T.Optional[str]]c           
      C  sÊ   d }g }|j  ¡ D ]W\}}|D ]P}t|tƒr6|| t|jƒj }| t|ƒ¡ |  	||¡ |d u r5t|ƒ}q| 
¡ D ]$}	|| |	 }| t|ƒ¡ |  	tt|jƒ|	 ƒ|¡ |d u r^t|ƒ}q:qq	||fS rd   )r§  rŠ  r‰   r   r	   r˜  r–   rÒ   rW   r–  rz  r  )
re   r—  r˜  Ú
first_filerÄ   r%  ÚfilesÚfiler°   r/  r7   r7   r8   Z__generate_sources_structureá  s*   
€€ûøz)NinjaBackend.__generate_sources_structurer–   rW   Úmain_rust_filer˜   r   Úfrom_subprojectr÷   r™   rð   c                 C  s¬   t  t|ƒdd„ ¡}|sdn| d¡d }g }	t|ƒ}
|
D ]}|dkr+|	 t|
ƒ¡ q| d¡r;|	 |tdƒd … ¡ qt	t| j
ƒ|||||	| |d u|d	}|| j
|< d S )Nc                 S  s
   |   d¡S )Nz	--edition)rŠ   )r    r7   r7   r8   r9   ø  s   
 z6NinjaBackend._add_rust_project_entry.<locals>.<lambda>r/   ú=r±   z--cfg)rõ   rô   r÷   )r   ÚfirstÚreversedrƒ   ÚiterrÒ   ÚnextrŠ   r3   rê   r  )re   r–   rž  r˜   rŸ  r÷   r™   Zraw_editionrï   rò   Zarg_itrÚargrä   r7   r7   r8   Ú_add_rust_project_entryõ  s,   
€÷z$NinjaBackend._add_rust_project_entryc           '   
     s  |j d }| ¡ }| ¡ }|t  ||¡7 }ˆ |¡ dd„ t |j|j¡D ƒ}g }g }d }|j	r£|j	 
¡ rKˆ tˆ |¡ƒd |j	¡\}	}| |	¡ nX|j	 ¡ }
t|
tƒr\|
 ˆj¡}n!t|
tƒrptj ˆ |¡|
 ¡ d ¡}ntj |
 ¡ |
 ¡ d ¡}|j	 ¡ D ] ‰ tˆ tƒr“| ˆ  ˆj¡¡ q‚| ‡ ‡fdd„ˆ  ¡ D ƒ¡ q‚| ¡ D ]}| |¡s¸td| ¡ › dƒ‚|d u rÂ| ˆj¡}q§|  ¡ D ]<}
|
 ¡ D ]5}| |¡sÞtd| ¡ › dƒ‚t|
tƒrîtj ˆ |¡|¡}n	tj |
 ¡ |¡}|d u rý|}| |¡ qÍqÇ|d u rt!d	ƒ‚tj |j"| #¡ ¡}t|t$j%ƒr!d
}n"t&|dƒr+|j'}nt|t$j(ƒr5d}nt|t$j)ƒr?d}ntdƒ‚| d|g¡ |dv rV| | *¡ ¡ |ˆ +||d¡7 }|d|j, -dd¡ -dd¡ -dd¡g7 }tj |j"|j,d ¡}|dd|› ddg7 }|| .d¡7 }| /tj |j"| #¡ ¡¡}||7 }t0 1¡ }|j2 3¡ }|jD ]r}| 4|j"¡ | 5¡ ræ|j'dvræ|j, -dd¡}|dd 6|tj |j"|j7¡¡g7 }| t8|ˆj9|j, j:ƒ¡ q¬t|t$j)ƒr|j;j<dv r|dd ˆ =|¡› g7 }n
|d!d"|j,› g7 }| |j2¡ q¬|d!d#|j,› g7 }q¬t0 >|j?d$¡r*d%}nd&}t0 >|j?d'¡r7d(}nd&}|jD ]–}| 4|j"¡ | 5¡ rp|j, -dd¡}|dd 6|tj |j"|j7¡¡g7 }| t8|ˆj9|j, j:ƒ¡ q<|j;j<dv r¾|r|d!d)|› |› d*| ¡ d › g7 }n>t|t$j)ƒr¦t@ Ad+d,d-¡ |d!d"|j,› g7 }n%|j; Bˆ =|¡g¡D ]}|dd |› g7 }q°n|d!d)|› d*|j,› g7 }| |j2¡ q<|D ]i}| C¡ D ]a}| Dd.¡rtj E|¡\}}| 4|¡ tj F|¡\}}| Gd/¡r|d0d … }| d!d#|› g¡ qÛ| Gd1¡r| |¡ qÛ| Gd!¡r;|jHr)d)nd}| d!|› d*|d2d … › g¡ qÛqÕ|D ]}|d&krJd}|d1|g7 }qA| I¡ }tJd3d4„ |D ƒƒ}t|t$j(ƒsi|rÊtJd5d4„ |D ƒƒ} |d6vsz| r€|dd7g7 }tK|j,ƒr–tj tj L|j,¡ˆ M|¡¡}!nˆ M|¡}!| NˆjOˆjO P¡ |!ˆ Q|¡|jR|jS¡\}"|_T|"D ]}#|dd |# d8 tj | U¡ d/¡ g7 }q³d }$tV|dd&ƒd9krãtj Wtj |j"| #¡ ¡¡}$ˆ X|j,tj Wtj ˆjOjY|¡¡|tZ|j[ƒ|$|¡ ˆ \|¡}%t]ˆj^||%|ƒ}&|r|& _|¡ |r|& `|¡ |& ad:|¡ |& ad;|¡ |& ad<|¡ ˆ b|&¡ t|t$j(ƒr<ˆ c|¡ ˆ d||||gg ¡ d S )=Nr`  c                 S  s    g | ]}t j |j| ¡ ¡‘qS r7   )rL   r%  r®   r  rS  r¼  r7   r7   r8   r{     s    ÿÿz5NinjaBackend.generate_rust_target.<locals>.<listcomp>Z
structuredr   c                   s    g | ]}t j ˆjˆ j|¡‘qS r7   )rL   r%  r®   r–  r  rh  ©r/  re   r7   r8   r{   >  ó    ÿzRust target z! contains a non-rust source file.zKA Rust target has no Rust sources. This is weird. Also a bug. Please reportÚbinÚrust_crate_typeÚdylibZrlibzUnknown target type for rustc.z--crate-type>   r©  r«  Fz--crate-nameú-r\  r¦   r¹  z.dz--emitz	dep-info=Úlink)Z	staticlibÚcdylibz--externz{}={}>   zlld-linkr­  rV  z	link-arg=ú-lzstatic=zdylib=z	>= 1.63.0z:+whole-archive,-bundler£   z	>= 1.67.0z
,+verbatimÚstaticr   uI   Due to limitations in Rustc versions 1.61â€“1.66 and meson library namingzEwhole-archive linking with MSVC may or may not work. Upgrade rustc toz;>= 1.67. A best effort is being made, but likely won't work)z.dllz.soz.dylibÚlibrl   ú-Lr   c                 s  s    | ]	}t |tjƒV  qd S rd   )r‰   r   r†  ©rw   rÌ   r7   r7   r8   rÝ   Ø  s   € z4NinjaBackend.generate_rust_target.<locals>.<genexpr>c                 s  s.    | ]}t |tjƒo| ¡ o|jd vV  qdS )¾   r®  ú
proc-macroN)r‰   r   r†  rÍ  rª  r³  r7   r7   r8   rÝ   Ú  s   € þ
ÿr´  zprefer-dynamicú:rµ  rW  rQ   Ú	cratetype)er   r‘  rj  Úget_base_compile_argsrÔ  r  r‚  rƒ  r„  r˜  Z
needs_copyr]  r	   rÀ  rã  r›  r‰   r   r•  r–  r%   rL   r%  r®   rz  rt  Úas_listrÒ   r”  Úcan_compiler&   Úget_basenamerw  ÚRuntimeErrorr  rS  r   r}  rv  rª  r†  r…  Úget_linker_always_argsr  r–   rA   r’  rn  r   r   Úexternal_depsr¥  rÊ   rÍ  r­   r.  rã   r  rë   rñ  r"  Úget_target_filename_for_linkingrQ  r÷  r   rL  Úget_link_whole_forro  rX  rƒ   rš  rŠ   r°  r  r\  r"   r[  r  Úbuild_rpath_argsr   r;  Údetermine_rpath_dirsÚbuild_rpathÚinstall_rpathÚrpath_dirs_to_removere  ÚgetattrÚabspathr¦  r­  ró   r#  rn  r¾   rÅ   rÏ   rÍ   rÓ   r  Úgenerate_shsymr´  )'re   rˆ  ZrustcÚ
base_proxyr˜   r™   Zproject_depsrÄ   rž  Z_odsr  rx   r˜  r&  r·  rš   r	  Zlinkdirsr¾  rú   Zd_nameZwhole_archiveZverbatimZlink_whole_argr¹   r“   Zdir_r±  ri  Z_typeZtarget_depsZhas_shared_depsZhas_rust_shared_depsÚtarget_slashname_workaround_dirÚ
rpath_argsZ	rpath_argr÷   Úcompiler_namer|  r7   r§  r8   rÎ    sd  

þ
ÿÿÿ




ÿ
€

÷


&

"

"&þÿ
 €ô
þÿ
ûÿ	*û




z!NinjaBackend.generate_rust_targetrs  r   c                 C  s   t ddƒ|  S )NZ
_FOR_BUILDr£   )r   )rs  r7   r7   r8   Úget_rule_suffix  s   zNinjaBackend.get_rule_suffixÚCOMPILERr   Úmodec                 C  s   |› d|› |   |¡› S )Nr\  )rÍ  )Úclsr   rs  rÏ  r7   r7   r8   Úget_compiler_rule_name  s   z#NinjaBackend.get_compiler_rule_namer-  r   c                 C  s   |   | ¡ |j|j¡S rd   )rÑ  r±  rs  rÏ  ©rÐ  r-  r7   r7   r8   rn    s   z"NinjaBackend.compiler_to_rule_namec                 C  s   |   | ¡ |jd¡S )NZPCH)rÑ  r±  rs  rÒ  r7   r7   r8   ro     s   z&NinjaBackend.compiler_to_pch_rule_namec                 C  s   t j |  |¡|  |¡d ¡S )Nz.swiftmodule)rL   r%  r®   rÀ  Útarget_swift_modulenamerÁ  r7   r7   r8   Úswift_module_file_name$  s   ÿz#NinjaBackend.swift_module_file_namec                 C  s   |j S rd   )r–   rÁ  r7   r7   r8   rÓ  (  ru   z$NinjaBackend.target_swift_modulenamec                 C  s.   g }|j D ]}|  |¡r| |  |¡¡ q|S rd   )rƒ  Zis_swift_targetrÒ   rÔ  ©re   rˆ  r0  r|   r7   r7   r8   Údetermine_swift_dep_modules+  s   

€z(NinjaBackend.determine_swift_dep_modulesc                 C  s$   g }|j D ]
}| |  |¡¡ q|S rd   )rƒ  rÒ   r½  rÕ  r7   r7   r8   Úget_swift_link_deps2  s   
z NinjaBackend.get_swift_link_depsc                 C  sD   |   |¡}g }g }|D ]}| d¡r| |¡ q| |¡ q||fS )Nz.swift)r’  rX  rÒ   )re   rˆ  Zall_srcsr  r‡  rx   r7   r7   r8   Úsplit_swift_generated_sources8  s   

z*NinjaBackend.split_swift_generated_sourcesc           &   	     sÊ  ˆ   |¡}|jd }g }g }g }g }| ¡ D ]V}| |¡r<| ˆ j¡}	tj tj 	ˆ j
 ¡ |	¡¡}
| |	¡ | |
¡ qˆ j
 |¡rc| ˆ j¡}tj tj 	ˆ j
 ¡ |¡¡}| |¡ || |¡7 }qtd| ¡ › dƒ‚tjˆ  |¡dd | ¡ }|| | tdƒ¡¡7 }|| | tdƒ¡¡7 }|| |¡7 }|ˆ j ||j|j¡7 }|ˆ j ||j¡7 }t| ¡ ƒD ]5}|  ¡ }| !¡ D ]*}|dvrÎtj 	||¡}n|}tj tj 	ˆ j
 ¡ ˆ j|¡¡}| "|d	¡}||7 }qÀq¶| #tj 	ˆ j
 ¡ ˆ  $|¡¡¡}|ˆ j %||j|j¡7 }|ˆ j &||j¡7 }ˆ  '|¡}ˆ  (|¡}ˆ  )|¡}ˆ  *|¡}g }|D ]}|| "|d	¡7 }q*ˆ  +|¡}‡ fd
d„|D ƒ}|j,D ]!}ˆ  -|¡}|dkrUd}|dtj tj 	ˆ j
 ¡ |¡¡g7 }qGˆ  .|¡\}}‡ fdd„|D ƒ}g } g }!|| D ]%}tj /|¡}"tj 0|"¡d d }#|  |#¡ |! tj 	ˆ  '|¡|#¡¡ qˆ  1|¡}$t2ˆ j3|!|$|ƒ}%|% 4|| ¡ |% 4|¡ |% 5d|| | | ¡ |% 5d|¡ ˆ  6|%¡ t2ˆ j3||$|ƒ}%|% 4|| ¡ |% 5d|| | | 7¡  ¡ |% 5d|¡ ˆ  6|%¡ t8|tj9ƒrˆ  :|ˆ  $|¡|!ˆ jj;|j ¡}%ˆ  6|%¡ n:t8|tj<ƒrRt2ˆ j3ˆ  $|¡|$g ƒ}%|% 4|!¡ |% 4|¡ |% 5d|| =¡  |  | ¡ |% 5d|¡ ˆ  6|%¡ nt>dƒ‚ˆ  ?|||| | ||¡ d S )Nr¶  zSwift target z" contains a non-swift source file.Tr  ri  rÞ   ©r£   r¹  Fc                   ó    g | ]}t j ˆ j ¡ |¡‘qS r7   ©rL   r%  r®   r   r;  r©   rs   r7   r8   r{   s  rP  z6NinjaBackend.generate_swift_target.<locals>.<listcomp>r£   r¹  r²  c                   rÚ  r7   rÛ  r©   rs   r7   r8   r{   z  rP  r   z.orW  ZRUNDIRz:Swift supports only executable and static library targets.)@rÓ  r   r”  rº  r•  r–  rL   r%  r®  r®   r   r;  rÒ   r{  Zget_header_import_argsr&   r»  rÄ  rÅ  Úget_compile_only_argsrl  r:  r#   rm  Zget_module_argsr   rq  r#  rs  rr  r¢  Úget_include_dirsÚ
get_curdirrw  r¿  rn  r½  Úget_project_link_argsÚget_global_link_argsrÀ  rÔ  rÖ  Zdetermine_swift_dep_dirsr×  rƒ  r  rØ  re  rš  rn  r¾   rÅ   rÍ   rÓ   r  Zget_mod_gen_argsr‰   r…  ræ  Ústatic_linkerr}  Úget_std_exe_link_argsr   r´  )&re   rˆ  Úmodule_nameZswiftcZabssrcZrelsrcZabs_headersZheader_importsrx   ZrelsZabssZrelhZabshra  Úbasedirrú   ÚexpdirÚ
srctreedirÚsargsZ	link_argsZrundirZout_module_nameZin_module_filesZabs_module_dirsZmodule_includesr    Z	link_depsZabs_link_depsZreldirZrel_generatedr\  Zabs_generatedÚobjectsZrel_objectsÚbaseZonamerÂ   r  r7   rs   r8   rÐ  C  s®   




 
ù 







(




ÿ

z"NinjaBackend.generate_swift_targetÚtoolú4T.Union['Compiler', 'StaticLinker', 'DynamicLinker']ú)T.Dict[str, T.Union[bool, RSPFileSyntax]]c                 C  s$   d|  ¡ i}|d r| ¡ |d< |S )z›Helper method to get rsp options.

        rsp_file_syntax() is only guaranteed to be implemented if
        can_linker_accept_rsp() returns True.
        rœ   r‡   )Zcan_linker_accept_rspÚrsp_file_syntax)re   rê  rA  r7   r7   r8   Ú_rsp_options£  s   zNinjaBackend._rsp_optionsc           
      C  s   | j jjtdƒ j}d| j jjjv r|  ¡  tD ]e}| j	j
| }|d u r%qd |  |¡¡}g }dg}t|tƒrDt ¡ sDtdd„ tD ƒ }|| ¡ 7 }|dg7 }|t | d¡tj¡7 }d	}|d
krdd}nd }|  |¡}	|  t||||fi |	¤d|i¤Ž¡ qd S )Nr4  rL  zSTATIC_LINKER{}r=  c                 S  s   g | ]}|  d ¡‘qS )r>  )r­   r   r7   r7   r8   r{   Á  r:   z;NinjaBackend.generate_static_link_rules.<locals>.<listcomp>ú
$LINK_ARGSr>  zLinking static target $outr   úpool = link_poolr›   )r   r  rA  r#   rº   r   r  r~  r   r   rá  r­   rÍ  r‰   r   r   rJ   Úexecute_wrapperÚrmfile_prefixr)  rq   r}   rn  rk   rp   rî  rF  r†   )
re   rW  rs  rá  rŸ   Úcmdlistr˜   rS   rT   rA  r7   r7   r8   rD  ®  s,   

&æz'NinjaBackend.generate_static_link_rulesc              	   C  s  | j jjtdƒ j}tD ]W}| j jj| }| ¡ D ]I\}}|dv r"qd ||  	|¡¡}| 
¡ }dgt | d¡tj¡ ddg }d}	|d	krId
}
nd }
|  |¡}|  t||||	fi |¤d|
i¤Ž¡ qq| j  ¡ dd| j  ¡ dddg }d}|dg }d}d}|  t||g ||d¡ d S )Nr4  >   r·  ru  rµ  r`  rL  z{}_LINKER{}r}  r>  r=  rï  zLinking target $outr   rð  r›   r(  Zsymbolextractorz$IMPLIBÚSHSYMz$CROSSzGenerating symbol file $outr9  r:  )r   r  rA  r#   rº   r   r   rŠ  r­   rÍ  Zget_linker_exelistrq   r}   Zget_linker_output_argsrk   rp   rî  rF  r†   r+  r;  )re   rW  rs  ZcomplistÚlangnamer-  rŸ   r—   r˜   rS   rT   rA  ZsymruleZsymcmdZsyndescZsynstatr7   r7   r8   rE  Î  s<   "
&óûÿ
z(NinjaBackend.generate_dynamic_link_rulesc                 C  s6   |   |¡}| ¡ ddg }d}|  t||g |ƒ¡ d S )Nr}  r=  zCompiling Java object $in©rn  r)  rF  r†   ©re   r-  rŸ   r—   rS   r7   r7   r8   Úgenerate_java_compile_ruleî  s   
z'NinjaBackend.generate_java_compile_ruleú'CsCompiler'c              
   C  sD   |   |¡}| ¡ }ddg}d}|  t||||t ¡ | ¡ d¡ d S )Nr}  r=  zCompiling C Sharp target $out)rœ   r‡   )rn  r)  rF  r†   r   rJ   rí  )re   r-  rŸ   r—   r˜   rS   r7   r7   r8   Úgenerate_cs_compile_ruleô  s   
þz%NinjaBackend.generate_cs_compile_rulec              	   C  s:   |   |¡}| ¡ ddg }d}|  t||g |dd¡ d S )Nr}  r=  zCompiling Vala source $inr9  r:  rö  r÷  r7   r7   r8   Úgenerate_vala_compile_rulesý  s   
z(NinjaBackend.generate_vala_compile_rulesú
'Compiler'c              
   C  st   |   |¡}d}| ¡ }| dd¡}|rdnd }|ddg }|t | d¡tj¡7 }|  t	||| g ||dd¡ d S )	NzCompiling Cython source $inr>  r”   z$out.depr}  r=  r9  )rš   r›   )
rn  r)  Úget_dependency_gen_argsrq   r}   rn  rk   rp   rF  r†   )re   r-  rŸ   rS   r—   Údepargsrš   r˜   r7   r7   r8   Úgenerate_cython_compile_rules	  s   
ýz*NinjaBackend.generate_cython_compile_rulesc              
   C  sD   |   |¡}| ¡ ddg }d}d}d}|  t||g |||d¡ d S )Nr}  r=  zCompiling Rust source $inz
$targetdepr;  ©r™   rš   rö  )re   r-  rŸ   r—   rS   rš   Zdepstyler7   r7   r8   Úgenerate_rust_compile_rules	  s   
ÿz(NinjaBackend.generate_rust_compile_rulesc                 C  sP   |   |¡}| j ¡ g d¢ }|| ¡  }|ddg }d}|  t||g |ƒ¡ d S )N)r(  Z
dirchangerz$RUNDIRr}  r=  zCompiling Swift source $in)rn  r   r+  r)  rF  r†   )re   r-  rŸ   Zfull_exeZinvocr—   rS   r7   r7   r8   Úgenerate_swift_compile_rules	  s   
z)NinjaBackend.generate_swift_compile_rulesc                 C  s   t  | jd¡S )z»Use 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.r8  )r   rQ  r@  rs   r7   r7   r8   Úuse_dyndeps_for_fortran'	  s   z$NinjaBackend.use_dyndeps_for_fortranÚcrstrc              	   C  sX   |   ¡ rd S d|› }t ¡ rddg}ndg}|  tdƒ¡ |  t||g ddd¡ d S )	NÚFORTRAN_DEP_HACKrE   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 hackr9  r:  )r  r   rJ   rA  r   rF  r†   )re   r  rŸ   rE   r7   r7   r8   Úgenerate_fortran_dep_hack-	  s   

z&NinjaBackend.generate_fortran_dep_hackc                 C  sˆ   | j |j rd S |  d|j¡}| ¡ }dgt | d¡tj¡ | 	¡  dg }d}|  
|¡}|  t||||fi |¤Ž¡ d| j |j< d S )NÚllvm_irr}  r>  r=  zCompiling LLVM IR object $inT)r  rs  rÑ  r)  rq   r}   rn  rk   rp   rÜ  rî  rF  r†   )re   r-  rŸ   r—   r˜   rS   rA  r7   r7   r8   Úgenerate_llvm_ir_compile_rule:	  s   (
z*NinjaBackend.generate_llvm_ir_compile_rulec                 C  s€  |dkr|   |¡ d S |dkr| jj |j¡r|  |¡ d S |dkr)|  |¡ d S |dkr4|  |¡ d S |dkrG| jj |j¡rE|  |¡ d S |dkrR|  	|¡ d S |  
|j¡}|  |¡}|dkrj|  |¡ d|d	< |  |¡}t | d
d¡tj¡}| ¡ }dg| t | d
¡tj¡ | ¡  dg }d| ¡ › d}	| ¡ dkr§d}
d }nd}
d}|  t||||	fi |¤|
|dœ¤Ž¡ d S )NrL  rµ  ru  r`  r¶  r·  r  r9  r›   r>  r”   r}  r=  z
Compiling z object $outr  r;  r   )rø  r   ÚmachinesZmatches_build_machiners  rú  rû  r  r  rÿ  rÍ  rî  r  rn  rq   r}   rý  rk   rp   r)  rn  rÜ  Zget_display_languager#  rF  r†   )re   rõ  r-  r  rA  rŸ   rþ  r—   r˜   rS   r™   rš   r7   r7   r8   Úgenerate_compile_rule_forG	  sL   








,ÿz&NinjaBackend.generate_compile_rule_forc           
   
   C  s¬   |dvrd S |   |¡}| dd¡}| ¡ dkrg }n
t | d¡tj¡}| ¡ dg | | | 	¡  dg }d}| ¡ dkrCd}d }	nd}d}	|  
t||g |||	d	¡ d S )
N>   rŒ   ró  r>  r”   r  r}  r=  zPrecompiling header $inr;  r   )ro  rý  r#  rq   r}   rn  rk   rp   r)  rÜ  rF  r†   )
re   rõ  r-  rŸ   rþ  r	  r—   rS   r™   rš   r7   r7   r8   Úgenerate_pch_rule_forq	  s"   
$ÿz"NinjaBackend.generate_pch_rule_forc                 C  sL   d}|| j v r	d S | j ¡ ddg }g d¢}d}t||||ƒ}|  |¡ d S )Nrü  r(  )z$picklefiler>  r=  zModule scanner.)r@  r   r+  r†   rF  )re   rÂ   r—   r˜   rS   rŸ   r7   r7   r8   rB  †	  s   
ÿz#NinjaBackend.generate_scanner_rulesc                 C  sv   t D ]6}| jjj| }| ¡ D ](\}}| ¡ dkr|  |¡ |  ||¡ |  ||¡ | 	¡ D ]}|  ||¡ q.qqd S )Nr'  )
r   r   r  r   rŠ  r°  r	  r  r  Z	get_modes)re   rs  Zclistrõ  r-  rÏ  r7   r7   r8   rC  ’	  s   
ÿûþz#NinjaBackend.generate_compile_rulesc                 C  s2   |  ¡ D ]}t|tjtjfƒrq|  ||¡ qd S rd   )rw  r‰   r   rx  ry  r  )re   rˆ  rŠ  r7   r7   r8   rÔ  	  s
   ýz*NinjaBackend.generate_generator_list_rulesc                   st   |rt j ˆj|¡‰nˆ |¡‰ˆ |¡‰ ‡ ‡fdd„|D ƒ}‡fdd„|D ƒ}‡fdd„|D ƒ}dd„ |D ƒ}|S )Nc                   s"   g | ]}|  d ˆj¡  dˆ ¡‘qS )z@SOURCE_DIR@z@BUILD_DIR@©rA   r–  r©   )Úreloutre   r7   r8   r{   ¬	  ó    ÿz.NinjaBackend.replace_paths.<locals>.<listcomp>c                   ó   g | ]}|  d ˆ ¡‘qS )z@CURRENT_SOURCE_DIR@©rA   r©   )Úsource_target_dirr7   r8   r{   ®	  r«   c                   s"   g | ]}|  d ˆ j¡  dd¡‘qS )z@SOURCE_ROOT@z@BUILD_ROOT@r¹  r  r©   rs   r7   r8   r{   ¯	  r  c                 S  s   g | ]}|  d d¡‘qS )r0   rÛ   r  r©   r7   r7   r8   r{   ±	  r«   )rL   r%  r®   r–  Zget_target_source_dirrÀ  )re   rˆ  r˜   Úoverride_subdirr7   )r  re   r  r8   Úreplace_paths¦	  s   

ÿ
ÿzNinjaBackend.replace_pathsrŠ  úbuild.GeneratedListc                   st  |  ¡ }|j}| ¡ }| ¡ }| ¡ }ˆ |¡}t|ƒD ]\}	}
t|jƒdkr5t	j
 ˆ ˆ¡||	 ¡‰n|
› ‰|
 ˆj¡‰| ˆ¡}| |
¡}‡‡fdd„|D ƒ}|jd u r\d}|}nd}| ˆ¡}t	j
 ˆ ˆ¡|¡‰ ‡ fdd„|D ƒ}‡‡fdd„|D ƒ}ˆ |ˆ ˆ¡|¡}t|jƒdkrš|t|jƒd … }ˆjˆ||d}ˆj|ˆ ||¡|jr±|d	 nd d
\}}t	j
 ˆj ¡ ˆ ˆ¡¡}t	j|dd tˆj||ˆƒ}| ‡fdd„|jD ƒ¡ |jd urë|  dˆ ¡ t|ƒd	krö| |¡ t|jƒdkrˆ›}ndˆ›d}|rd|› d}|  dd|› |› d¡ t!|t"j#ƒr,| ˆ $|¡¡ |  d|¡ ˆ %|¡ qd S )Nr   c                   rN  r7   rO  )rw   ZofrÁ  r7   r8   r{   Ã	  rP  z<NinjaBackend.generate_genlist_for_target.<locals>.<listcomp>r  r  c                   r  )z	@DEPFILE@r  r©   )rš   r7   r8   r{   Ë	  r«   c                   s    g | ]}|  d ˆ ¡  dˆ¡‘qS )z@INPUT@z@OUTPUT@r  r©   )Ú
infilenameÚsole_outputr7   r8   r{   Ì	  r¨  )r  r   )r  Tr  c                   r§   r7   )r½  r©   rs   r7   r8   r{   Ú	  r:   rÐ   zfrom r¹  r  r  rU   r  r  )&Zget_generatorr  Zget_exeÚ
get_inputsrz  r  Ú	enumerater3   r-  rL   r%  r®   rÀ  r•  r–  Zget_arglistZget_outputs_forrš   r  Zreplace_outputsr  r  Zreplace_extra_argsr  r   r;  r  rÄ  r¾   rÅ   rÍ   ÚdependsrÓ   r‰   r   rÃ  r½  r  )re   rŠ  rˆ  Ú	generatorr  ÚexeZ
infilelistZoutfilelistZextra_dependenciesrx   ZcurfileZ	base_argsr·   rÂ   r˜   Zdepfilenameró  r  r!  r  Úwhatr7   )rš   r  re   r  rˆ  r8   r  ´	  sf   




ÿ

þ

Ïz(NinjaBackend.generate_genlist_for_targetc                 C  s¾  |   ¡ rdS d}| jjjj ¡ D ]\}}|dkr|} nq|du r*i | j| ¡ < dS t 	t
tj¡}t 	ttj¡}i }i }| ¡ D ]‘}	| |	¡sHq@|	 | j ¡ | j ¡ ¡}
t|
dddn}|D ]c}| |¡}|dur‰| d¡ ¡ }||v r„td|› d|| › d	|	› d
ƒ‚|	||< q^| |¡}|durÁ| d¡ ¡  d¡}|d d | d¡ ¡  }||v r½td|› d|| › d	|	› d
ƒ‚|	||< q^W d  ƒ n1 sÌw   Y  q@i |¥|¥| j| ¡ < dS )zV
        Find all module and submodule made available in a Fortran code file.
        Nr  ÚasciiÚignore©r  Úerrorsr   zNamespace collision: module z defined in two files z and r¹  r¶  r   r\  r   zNamespace collision: submodule )r  r   r  r   r  rŠ  r  r»  r;   r,  ÚFORTRAN_MODULE_PATÚ
IGNORECASEÚFORTRAN_SUBMOD_PATr”  rº  r«  r,  r;  r  r  r4   r›  r&   rƒ   )re   rˆ  r-  r   rŒ   ZmodreÚsubmodreÚmodule_filesZsubmodule_filesr>   r.  r/  rà   ZmodmatchÚmodnameÚsubmodmatchÚparentsZ
submodnamer7   r7   r8   rÓ  î	  sj   þ
ÿ
ÿÿÿ

ÿÿÿ€ìÿ€z(NinjaBackend.scan_fortran_module_outputsr.   rñ   c                 C  sF   |   ¡ rg S t|  |¡ƒ}| j| ¡  }t| jƒ}t|||||ƒ}|S )zJ
        Find all module and submodule needed by a Fortran target
        )r  r	   rÀ  r  r»  r¬  Ú_scan_fortran_file_deps)re   r-  r‹  rˆ  r[  ÚtdepsÚsrcdirÚ	mod_filesr7   r7   r8   Úget_fortran_deps$
  s   
zNinjaBackend.get_fortran_depsc                 C  s*   t |dƒr|j| jj|j v r| ¡ S g S )Nr!  )rv  r!  r   Zstdlibsrs  Úget_no_stdlib_link_args)re   rˆ  rñ  r7   r7   r8   r/  2
  s   z$NinjaBackend.get_no_stdlib_link_argsc                 C  s.   |  ¡ r|  |¡}|j|ddS |j|ddS )NT)ÚpchF)rà  Zget_target_filename_absÚget_compile_debugfile_args)re   r-  rˆ  ZobjfileZ	tfilenamer7   r7   r8   r1  7
  s   1
z'NinjaBackend.get_compile_debugfile_argsc                 C  ó
   |  |¡S rd   )Úget_link_debugfile_name©re   rñ  rˆ  ré  r7   r7   r8   r3  n
  r‚   z$NinjaBackend.get_link_debugfile_namec                 C  r2  rd   )Úget_link_debugfile_argsr4  r7   r7   r8   r5  q
  r‚   z$NinjaBackend.get_link_debugfile_argsc                 C  s>  |  ¡ }t|j ¡ |ƒ}| ¡ }|t ||¡7 }t|tƒr.|jr*t	j
 |j|j¡}n|j}nt	j
 |¡r;t	j
 |¡}n|}|  |¡}t	j
 |  |¡|¡}|d| jj|j  ¡  7 }||  |||¡7 }t|tƒrn|jrn|j}	nt|tƒrz| | j¡}	ntd|›ƒ‚|  d|j¡}
t| j||
|	ƒ}| d|¡ |  |¡ ||	fS )Nr¹  úInvalid source type: r  rW  )r‘  r!   r   r   rj  r¸  r‰   r   r‹  rL   r%  r®   r  r˜  Úisabsre  Zcanonicalize_filenamerÀ  r   r
  rs  Zget_object_suffixr1  r•  r–  r&   rÑ  r¾   rÅ   rÓ   r  )re   rˆ  r‹  rÉ  r-  rd  Zsrc_filenameÚobj_basenamer{  r‘  rÌ  r|  r7   r7   r8   rÞ  t
  s2   



z%NinjaBackend.generate_llvm_ir_compile)Úmaxsizerú   rä  r¾  úCT.Tuple['ImmutableListProtocol[str]', 'ImmutableListProtocol[str]']c           	      C  s„   |dvrt j t j ||¡¡}n|}t j t j | j|¡¡}| ||¡}t j t j | j ¡ |¡¡r<| ||¡}||fS g }||fS )NrÙ  )	rL   r%  r®  r®   r–  r¿  Úisdirr   r;  )	re   r-  rú   rä  r¾  rå  ræ  rç  Zbargsr7   r7   r8   Úgenerate_inc_dir”
  s   ÿzNinjaBackend.generate_inc_dirFÚis_generatedú'CompilerArgs'c                 C  s"   |   ||¡}||  |||¡7 }|S rd   )Ú"_generate_single_compile_base_argsÚ$_generate_single_compile_target_args)re   rˆ  r-  r=  rd  r7   r7   r8   Ú_generate_single_compileª
  s   z%NinjaBackend._generate_single_compilec                 C  s4   |  ¡ }| ¡ }|| |j¡7 }|t ||¡7 }|S rd   )r‘  rj  Zgnu_symbol_visibility_argsZgnu_symbol_visibilityr   r¸  )re   rˆ  r-  rÉ  rd  r7   r7   r8   r?  °
  s   ÿz/NinjaBackend._generate_single_compile_base_argsú'ImmutableListProtocol[str]'c                 C  s  |dk}|   |||¡}|jr||  ||¡7 }t| ¡ ƒD ]2}| ¡ }t| ¡ ƒD ]}|  ||||j¡\}	}
||	7 }||
7 }q(| 	¡ D ]}|| 
||j¡7 }qBq||  | | ¡ ¡¡7 }|jdkrj|| |j| j¡7 }|jru||  ||¡7 }|jr€||  ||¡7 }|| 
|  |¡d¡7 }|S )Nru  rú   F)r  Zimplicit_include_directoriesZ"get_custom_target_dir_include_argsr¢  rÝ  rÞ  rw  r<  r¾  Zget_extra_build_dirsr¿  Zescape_extra_argsr’  r±  r!  Zget_feature_argsZ
d_featuresr–  Zget_source_dir_include_argsZget_build_dir_include_argsrÀ  )re   rˆ  r-  r=  Zno_warn_argsrd  rx   rä  rú   Zcompile_objZincludeargsr7   r7   r8   r@  ¾
  s,   

ÿ
z1NinjaBackend._generate_single_compile_target_argsr¸  ú+T.Optional[T.List['mesonlib.FileOrString']]rö  úT.Optional[T.List[str]]c                 C  sî  |dur|ng }|dur|ng }t |tƒr!| d¡r!td|›ƒ‚t|j ¡ |ƒ}|  ||¡}| jj	j
 tdƒ¡rE|dkrE||  ||¡7 }||  |||¡7 }|j |¡}|du rc|  ||||gg ¡ n
|  |||g |g¡ | j ¡ }	t |tƒr˜| | j¡}
tj |
¡r—|jr—|
 |	¡sJ ‚|
t|	ƒd d… }
n|r¡td|›ƒ‚td	|›ƒ‚|  ||¡}tj |  |¡|¡}|  |¡}||  !|||¡7 }| jj	j
 tdƒ¡r×| "|j#¡}ng }|sÞg }n |j$d
kræg }ng }tj |  |¡| %|d ¡¡}| &|¡ |}|  '|¡}g }| (¡ dkrc|st)|	ƒ|
 }||  *|||¡7 }|  +¡ sY| j,| -¡   .¡ D ],\}}tj |  |¡| /|¡¡}||krW|  0|j1¡}t2| j3|d| |ƒ}|  4|¡ q,|| 5|  |¡¡7 }|durm| 6|¡ t2| j3|||
ƒ}|  7|||¡ |D ]}| 8|¡ q~|D ]%}t |tƒr˜| | j¡}n|  9|¡s¨tj |  |¡|¡}| :|¡ q‰| 8|¡ |  ;||¡D ]}| :|¡ qº|rÌ| <d|¡ | <d|¡ |  =||||¡ |  4|¡ t |tƒsçJ ‚t |
tƒsïJ ‚||
 >dd¡fS )zE
        Compiles C/C++, ObjC/ObjC++, Fortran, and D sources
        Nz.hz(BUG: sources should not contain headers rº  r0  Fr   z/BUG: broken generated source file handling for r6  Úintelr   r  r  rÐ   rW  r0   rÛ   )?r‰   rW   rX  r
  r!   r   r   r?  r   r  rA  rN   r#   Zget_pch_include_argsr@  r-  rj  r´  r;  r   r•  r–  rL   r%  r7  r‹  rŠ   r3   r&   Zobject_filename_from_sourcer®   rÀ  Zdepfile_for_objectr1  Úget_pchr!  r"  Úget_pch_namerÒ   rn  r±  r	   r.  r  r  r»  rŠ  Úmodule_name_to_filenamerÍ  rs  r¾   rÅ   r  Zget_module_outdir_argsrã  Úadd_header_depsrÍ   Úhas_dir_partrÏ   Úget_fortran_orderdepsrÓ   Ú)add_dependency_scanner_entries_to_elementrA   )re   rˆ  r‹  r=  r‰  r¸  rö  r-  rd  r­  r‘  r8  r{  Zdep_fileZpchlistZpch_depZarrrx   rÌ  Ú
extra_depsrî  r'  ÚsrcfileZmodfiler  Zdepelemr|  rú   r7   r7   r8   rß  ú
  s¦   

€




ÿ
ý
€



z$NinjaBackend.generate_single_compilec                 C  sŒ   |   |¡sd S t|tjƒrd S tj |j¡d dd … }|dkr$| ¡ }|t	j
d v s4|t	j
d v s4d S |  |¡}| d|¡ | |¡ d S )Nr   r  r  ró  rR   )rø  r‰   r   rä  rL   r%  rš  r˜  r›  r   r$  rý  rÓ   rÏ   )re   rˆ  r-  r|  r‹  Ú	extensionZdep_scan_filer7   r7   r8   rL  n  s   

z6NinjaBackend.add_dependency_scanner_entries_to_elementc                 C  s   t j |  |¡d¡S )Nz
depscan.ddrO  rÁ  r7   r7   r8   rý  |  s   z"NinjaBackend.get_dep_scan_file_forc                 C  sN   |D ]"}t |tƒr| | j¡}n|  |¡stj |  |¡|¡}| 	|¡ qd S rd   )
r‰   r   r•  r–  rJ  rL   r%  r®   rÀ  rÍ   )re   rˆ  Zninja_elementr‰  rú   r7   r7   r8   rI    s   

ûzNinjaBackend.add_header_depsc                 C  s   t |tƒr
|jdkS t|ƒS r¿   )r‰   r   r  r"   )re   r˜  r7   r7   r8   rJ  ‡  s   

zNinjaBackend.has_dir_partc                   s,   |j dkrg S ‡ fdd„t |j|j¡D ƒS )Nr  c                   rQ  r7   rR  )rw   Últrs   r7   r8   r{   –  s    ÿÿz6NinjaBackend.get_fortran_orderdeps.<locals>.<listcomp>)r!  r  r‚  rƒ  r„  )re   rˆ  r-  r7   rs   r8   rK  “  s
   

þz"NinjaBackend.get_fortran_orderdepsc                 C  s  |d }|  |¡}tj |  |¡|¡}g }||  ||¡7 }t|ƒdkrF|  || ¡ |d ¡}tj 	tj | j
| ¡ |¡¡}	|| |	d¡7 }ntj | j
| ¡ |d ¡}tj |¡}
| |
||¡\}}||7 }||  ||¡7 }||  |||¡7 }|d | ¡  }||||g|fS )Nr   r   Fr¹  )rG  rL   r%  r®   rÀ  r  r3   Zcreate_msvc_pch_implementationr±  r[  r–  Úget_source_subdirr¿  re  Zgen_pch_argsrA  r1  Úget_depfile_suffix)re   rˆ  r-  r0  ÚheaderZpchnameÚdstrd  rž  Zpch_header_dirZ	just_nameZobjnameZpch_argsrÌ   r7   r7   r8   Úgenerate_msvc_pch_command›  s"   
z&NinjaBackend.generate_msvc_pch_commandc                 C  sx   |   ||¡}| d¡d dkr|jdkr|ddg7 }tj |  |¡tj |¡d | ¡  ¡}|d | 	¡  }|||g fS )Nr¹  r±   Úhró  rk  z
c++-header)
rA  rƒ   r!  rL   r%  r®   rÀ  re  Zget_pch_suffixrR  )re   rˆ  r-  r0  rd  rT  rÌ   r7   r7   r8   Úgenerate_gcc_pch_command³  s   ÿz%NinjaBackend.generate_gcc_pch_commandc                 C  sT  |d ur|ng }g }dD ]›}|  |¡}|sqt|d ƒr"t|d ƒs.d| ¡ ›d}t|ƒ‚|j| }| ¡ dkrS|  |||¡\}}	}
}}tj 	| j
| ¡ |d ¡}n"|jdkrYqtj 	| j
| ¡ |d ¡}|  |||d ¡\}}	}
}d }||7 }|  |¡}t| j|
||ƒ}|d ur| |¡ |  |||¡ | d|¡ | d	|	¡ |  |¡ q|S )
N)rŒ   ró  r   r±   zPrecompiled header of zN must not be in the same directory as source, please put it in a subdirectory.r  rE  rW  rÐ   )rF  r"   r»  r&   r   r#  rU  rL   r%  r®   r–  rQ  r"  rW  ro  r¾   rÅ   rÍ   rI  rÓ   r  )re   rˆ  r‰  rð  r   r0  rë  r-  rd  rÌ   rT  Zobjsr‹  ZextradeprÂ   r  r7   r7   r8   rá  ¾  s8   




zNinjaBackend.generate_pchc                 C  s    |   |¡}tj || ¡ d ¡S )Nz.symbols)rÀ  rL   r%  r®   rS  )re   rˆ  Z	targetdirr7   r7   r8   Úget_target_shsym_filenameß  s   
z&NinjaBackend.get_target_shsym_filenamec                 C  sj   |   |¡}|  |¡}t| j|d|ƒ}| d|  |¡¡ | j ¡ r.| dd| jj|j	 j
 ¡ |  |¡ d S )Nrô  ZIMPLIBZCROSSz--cross-host=)r½  rX  r¾   rÅ   rÓ   r¿  r   Zis_cross_buildr
  rs  Úsystemr  )re   rˆ  Ztarget_fileZsymnamer  r7   r7   r8   rÈ  ä  s   


zNinjaBackend.generate_shsymc                 C  s   t j |  |¡|j¡S rd   )rL   r%  r®   r  Úimport_filenamerÁ  r7   r7   r8   Úget_import_filenameî  s   z NinjaBackend.get_import_filenamec              	   C  sX  g }t |tjƒr1|| ¡ 7 }|jr|| | j¡7 }|jr&|| |  	|¡¡7 }|j
r/|| ¡ 7 }|S t |tjƒr”t |tjƒrJ| jjj}|| |¡7 }n|| ¡ 7 }|| ¡ 7 }t |tjƒr_|jrq|| | j|j|j|j|j|j¡7 }|jr…t|dƒr…|| |j | j¡¡7 }|jr’|| |  	|¡¡7 }|S t |tjƒr¨||  | j| !¡  ¡7 }|S t"dƒ‚)NÚgen_vs_module_defs_argszUnknown build target type.)#r‰   r   r}  râ  Zexport_dynamicZgen_export_dynamic_link_argsr   rZ  Zgen_import_library_argsr[  ZpieZget_pie_link_argsr†  ÚSharedModuler  rA  Zget_std_shared_module_link_argsZget_std_shared_lib_link_argsZget_pic_argsZforce_sonameZget_soname_argsÚprefixr–   rŸ  Ú	soversionZdarwin_versionsZvs_module_defsrv  r\  r•  r–  r…  Zget_std_link_argsZshould_installr¼  )re   rˆ  rñ  rd  rA  r7   r7   r8   Úget_target_type_link_argsñ  s<   é
þüÿz&NinjaBackend.get_target_type_link_argsc                 C  s`   g }t |tjƒr.| jj|j }| ¡ s| ¡ r.|jd ur&|| 	|j¡7 }|S || 
|j¡7 }|S rd   )r‰   r   r}  r   r
  rs  rJ   Z	is_cygwinZgui_appZget_gui_app_argsZget_win_subsystem_argsZwin_subsystem)re   rˆ  rñ  rd  r6   r7   r7   r8   Ú+get_target_type_link_args_post_dependencies  s   
ÿz8NinjaBackend.get_target_type_link_args_post_dependenciesc                 C  s†   d}|j dkrt |jd¡rd}|r3g }|jD ]}| d¡}||  |d¡7 }| |  |¡d ¡ q|S |  	||j¡}|rA| 
|¡S g S )NFr  z<19.00.23918Tr£   r   )r"  r   rQ  r÷  r„  Zextract_all_objectsZdetermine_ext_objsrã  râ  Úbuild_target_link_argumentsrÀ  )re   rñ  rˆ  Z
use_customZobjects_from_static_libsrÌ   r|   Ztarget_argsr7   r7   r8   Úget_link_whole_args&  s   


z NinjaBackend.get_link_whole_argsc           	      C  sV   ddl m} |D ] }|D ]}| |||¡}|sq| | j|¡}|s"q|    S qd S )Nr   )Ú	CCompiler)Zcompilers.crd  Z_get_trials_from_patternZ_get_file_from_listr   )	re   rñ  ÚlibnameÚsearch_dirsÚpatternsrd  rú   r  Ztrialr7   r7   r8   Úguess_library_absolute_path:  s   øÿz(NinjaBackend.guess_library_absolute_pathc              
   C  s.  t ƒ }t ƒ }g }| j ¡ }t| |¡ƒ}	|	D ]Œ}
|
|v r"|
 d¡s"q|
 d¡r]t|
ƒdkr4|
dd … }nzt|	ƒ}W n tyI   t	 
d¡ Y  nZw tj |¡sWtj ||¡}| |¡ q|
 d¡r‹t|
ƒdkro|
dd … }nzt|	ƒ}W n ty„   t	 
d¡ Y  nw | |¡ qtj |
¡r¢| j |
¡r¢tj |
¡r¢| |
¡ qg }zP|j| jtjdd}|j| jtjdd}t|ƒt| | j¡ƒ }|D ](}|  ||||¡}|  ||||¡}|rå| | ¡  ¡ ¡ |rð| | ¡  ¡ ¡ qÈW || S  tjtfy } zd	t|ƒvr	‚ W Y d }~|| S d }~w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   r;  r£  Znative_args_to_unixrŠ   r3   r¤  ÚStopIterationr   rL  rL   r%  r7  r®   rÊ   rÜ  ÚisfilerÒ   rj  r   ÚSTATICZSHAREDr²  Zget_library_dirsrh  Úresolver  r   r   ÚAttributeErrorrW   )re   rñ  rˆ  rd  Úinternalrf  ZlibsZabsolute_libsr­  ÚitÚitemr%  r±  Zguessed_dependenciesZstatic_patternsZshared_patternsre  Z
staticlibsZ
sharedlibsr¹   r7   r7   r8   Ú guess_external_link_dependenciesH  sv   


þ

þ$
€ÿÿ€öü
ÿ€üz-NinjaBackend.guess_external_link_dependenciesc                 C  sž   t |tjƒsJ ‚tj |  |¡|jd ¡}t| j	|gd|ƒ}| 
¡ }|jd d … }|| ||¡7 }|  ||¡}| d|¡ | dd|› d¡ |  |¡ |gS )Nz
-prelink.or  r  rS   zPrelinking r¹  )r‰   r   r…  rL   r%  r®   rÀ  r–   r¾   rÅ   Zget_prelinkerZexelistZget_prelink_argsr  rÓ   r  )re   rˆ  rê  Zprelink_namer  Z	prelinkerrE   r7   r7   r8   rå  Š  s   
zNinjaBackend.generate_prelinkrñ  ú#T.Union['Compiler', 'StaticLinker']c                   sŠ  |d ur|ng }|d ur|ng }g }t |tjƒrd}n| ¡ }t |tjƒr*ˆ  |¡ ˆ  |j¡}	|d |	 }
| ¡ }t |tjƒrJ|| 	| 
¡ ¡7 }n|t 	| 
¡ |t |tjƒˆ j ¡ ¡7 }|ˆ  ||¡7 }|| ¡ 7 }|| | tdƒ¡¡7 }| tdƒ¡r—|ˆ  |||¡7 }ˆ  |||¡}|d ur—||g7 }|ˆ  ||¡7 }t |tjƒs­|ˆ  ||¡7 }t |tjƒsÖ|ˆ j ||j|j¡7 }|ˆ j ||j¡7 }|ˆ jj |j| ¡ ¡7 }t|jƒrëtj  !tj  "|j¡ˆ  #|¡¡}nˆ  #|¡}| $ˆ jˆ j ¡ |ˆ  %|¡|j&|j'¡\}|_(||7 }|dkrg }n| )¡ }ˆ  *||¡}||7 }t |tjƒs]|| +|¡7 }| ,¡ D ]}| -| .|¡¡ q2| )¡ D ]}t |tjƒr[| ,¡ D ]}| -| .|¡¡ qOqB|ˆ  /||¡7 }t |t0ƒru|| 1ˆ jjj2¡7 }g }| 3ˆ  4||||¡¡ ˆ  5|¡}||7 }||7 }||7 }| 3‡ fdd„|D ƒ¡ | 3‡ fdd„|j6D ƒ¡ t7ˆ j8||
||d}| 9|| ¡ | :d	|¡ |S )
Nrm  Z_LINKERrg  rÞ   c                   r§   r7   ©Úget_dependency_filenamer¼  rs   r7   r8   r{      r:   z.NinjaBackend.generate_link.<locals>.<listcomp>c                   r§   r7   ru  r¼  rs   r7   r8   r{   !  s    ÿ)rÇ   Z	LINK_ARGS);r‰   r   r…  r±  r†  rÈ  rÍ  rs  rj  Zget_base_link_argsr‘  r   r]  r   r;  r/  r½  Zget_buildtype_linker_argsr:  r#   r5  r3  r`  rc  rß  r#  rà  r  Zget_external_link_argsr"   r–   rL   r%  r®   r[  r  rÁ  rÂ  rÃ  rÄ  rÅ  r  rb  Zget_target_link_argsrp  Zextend_preserving_lflagsZget_dependency_link_argsra  r   Zget_option_link_argsrA  rã  rs  Z$get_custom_target_provided_librariesZlink_dependsr¾   rÅ   rÍ   rÓ   )re   rˆ  ré  rê  rñ  rö  rÂ  rÇ   Zlinker_baser  Zlinker_rulerd  Z	debugfilerÊ  rË  Údependenciesrp  rÌ   rú   Zdep_targetsZcustom_target_librariesr  r7   rs   r8   ræ  ™  sž   

ý

þ
ûÿ
€
ÿzNinjaBackend.generate_linkc                 C  sR   t |tjƒr|  |¡S t |tjƒr$|jr| ¡ S | | j	 
¡ | j	 ¡ ¡S |  |¡S rd   )r‰   r   r†  rX  r   r   r‹  rÿ  r«  r   r,  r;  r½  )re   rX  r7   r7   r8   rv  (  s   
ÿ
z$NinjaBackend.get_dependency_filenamec              	   C  s–   |  ¡ D ]D\}}}tj | j ¡ ||¡}zt |¡ W n	 ty$   Y nw zt ||¡ W q t	y;   t
 d¡ Y q tyH   t
 d¡ Y qw d S )Nz?Library versioning disabled because symlinks are not supported.zOLibrary versioning disabled because we do not have symlink creation privileges.)Zget_aliasesrL   r%  r®   r   r;  Úremoverq  ÚsymlinkÚNotImplementedErrorr   rÞ   ÚOSError)re   rˆ  ÚoutdirÚaliasÚtoÚtagZ	aliasfiler7   r7   r8   rË  3  s   ÿÿöz#NinjaBackend.generate_shlib_aliasesÚtreesc                 C  s¤   |   | jddd¡}t| j ¡ |ƒ}tj | j ¡ d¡}| 	d| j 
¡ dd|g ¡ | 	dd	¡ |  |¡ t|d
ƒ}t ||¡ W d   ƒ dS 1 sKw   Y  dS )Nzclean-ctlistr  r  zcleantrees.datr  r(  Z
cleantreesrS   z"Cleaning custom target directoriesrl  )r  rÅ   r$   r   r;  rL   r%  r®   r&  rÓ   r+  r  r  r   rd  )re   r€  r¹   rú   Zd_fileZofiler7   r7   r8   Úgenerate_custom_target_cleanA  s   

ÿþz)NinjaBackend.generate_custom_target_cleanc                 C  s„   |   | jddd¡}| dt ¡ g d¢ ¡ | dd¡ |  |¡ |   | jddd¡}| dt ¡ g d	¢ ¡ | dd
¡ |  |¡ d S )Nú
clean-gcnor  r  r  )r(  Údelwithsuffixr¹  ZgcnorS   zDeleting gcno filesú
clean-gcda)r(  rƒ  r¹  ZgcdazDeleting gcda files)r  rÅ   rÓ   r   r>  r  )re   Z	gcno_elemZ	gcda_elemr7   r7   r8   Úgenerate_gcov_cleanM  s   
z NinjaBackend.generate_gcov_cleanc                 C  sb   g }| j jj ¡ D ]#\}}| ¡ r,| dt|ƒ d t|jtƒr#|jnt|jƒ 	¡  ¡ q	t
|ƒS )Nz-Dr   )r   r  rA  rŠ  Z
is_projectrÒ   rW   r‰   rº   r›  rß   )re   ZcmdsÚkÚvr7   r7   r8   Úget_user_option_argsX  s   6€z!NinjaBackend.get_user_option_argsc                 C  sP   |   | jddd¡}| dd¡ | d| j ¡ dg ¡ | dd¡ |  |¡ d S )	NÚdistr  r  rU   zCreating source packagesr  rT   r  )r  rÅ   rÓ   r   r+  r  r5  r7   r7   r8   rJ  b  s
   zNinjaBackend.generate_distc                 C  s‚   t  ¡ sd S d| jv rd S | j  ¡ dd| j j| j jg | j  ¡  |  ¡  }|  | jddd¡}| d|¡ | dd¡ |  	|¡ d S )	Nz
scan-buildr(  Z	scanbuildr  r  r  rT   r  )
r   Zdetect_scanbuildrÅ   r+  r¬  r­  rˆ  r  rÓ   r  r8  r7   r7   r8   Úgenerate_scanbuildi  s   
ÿþþzNinjaBackend.generate_scanbuildc                 C  sÚ   d| }g }|r|d|› 7 }|  d|› ¡ tj tj | jjd| ¡¡s7tj tj | jjd| ¡¡s7d S || jv r>d S | j ¡ dd| | jj| jj	g | }|  
| j|dd	¡}| d
|¡ | dd¡ |  |¡ d S )Nzclang-r¬  z--z.clang-z_clang-r(  r'  r  r  r  rT   r  )rÒ   rL   r%  rR  r®   r   r¬  rÅ   r+  r­  r  rÓ   r  )re   r–   Z	extra_argr&  rö  rE   r  r7   r7   r8   Úgenerate_clangtoolv  s(   ÿ
ÿþzNinjaBackend.generate_clangtoolc                 C  s&   t  ¡ sd S |  d¡ |  dd¡ d S )Nr­   Úcheck)r   Zdetect_clangformatr‹  rs   r7   r7   r8   Úgenerate_clangformat‰  s   
z!NinjaBackend.generate_clangformatc                 C  s$   dd l }| d¡sd S |  d¡ d S )Nr   z
clang-tidyZtidy)ÚshutilÚwhichr‹  )re   rŽ  r7   r7   r8   Úgenerate_clangtidy  s   
zNinjaBackend.generate_clangtidyc                 C  sv   dd l }| |¡sd S || jv rd S | j ¡ dd|| jjg }|  | j|dd¡}| d|¡ | dd¡ |  |¡ d S )	Nr   r(  Útagsr  r  r  rT   r  )	rŽ  r  rÅ   r   r+  r¬  r  rÓ   r  )re   rê  r&  rŽ  rE   r  r7   r7   r8   Úgenerate_tags•  s   

ÿzNinjaBackend.generate_tagsc                 C  s†   |   ¡  |  ¡  |  ¡  |  dd¡ |  dd¡ |  dd¡ | j ¡ ddg }|  | jddd¡}| d	|¡ | d
d¡ |  	|¡ d S )NZetagsZTAGSZctagsZcscoper(  Z	uninstallr  r  r  rT   r  )
rŠ  r  r  r’  r   r+  r  rÅ   rÓ   r  r8  r7   r7   r8   rM  £  s   zNinjaBackend.generate_utilsc              	   C  sä  d|   ¡ fd|  ¡ fd|  d¡ffD ]6\}}g }|dkr#| ddg¡ | ¡ D ]}| tj |  |¡| 	¡ d ¡¡ q't
| j|d|ƒ}|  |¡ q|  | jddd	¡}| d
| jddg ¡ | dd¡ g }| j ¡  ¡ D ]}t|tjƒrˆ| 	¡ D ]}| tj |  |¡|¡¡ qxql|r“| |  |¡¡ tdƒ| jjjv r´| jjjtdƒ jr´|  ¡  | d¡ | d¡ |  |¡ |  ¡ }t
| jdd|ƒ}| dd¡ |  |¡ t
| jddd	ƒ}| dd¡ |  |¡ t
| j|ddƒ}|  |¡ d S )Nr3  zmeson-test-prereqzmeson-benchmark-prereqTr   rÔ   Úcleanr  r  r  r9  rS   ZCleaningr7  r„  r‚  r  r?  rT   r  Úreconfigurer£   )Zget_build_by_default_targetsZget_testlike_targetsrã  r   rÒ   rL   r%  r®   r  rz  r¾   rÅ   r  r  rÓ   r?  r   rF  r‰   rx  rÍ   r  r#   r   r  rA  rº   r…  Zget_regen_filelist)re   Ztargr™   Z
targetlistrX  r  Zctlistrï  r7   r7   r8   rN  °  sL   

ý$€ÿ




zNinjaBackend.generate_endingÚ	target_idúkT.List[T.Dict[str, T.Union[bool, str, T.List[T.Union[str, T.Dict[str, T.Union[str, T.List[str], bool]]]]]]]c                   sP   || j vst| j | ƒdkrtƒ  ||¡S g }| j |  ¡ D ]}||g7 }q|S r  )r  r3   r  Úget_introspection_datar   )re   r•  rˆ  r0  rx   r  r7   r8   r—  è  s   z#NinjaBackend.get_introspection_data)r   rý   rþ   rÿ   rd   )rX   r_  )rˆ  rŒ  rX   r  )rˆ  r¢  r£  r¤  )rˆ  rò  rX   ró   )rì  rù  rú  rû  rX   r_  )rˆ  r%  )rZ  rö   r[  rö   )rˆ  rK  )rˆ  rŒ  )rX  rŒ  rX   r„  )rˆ  rŒ  rX   r‰  )r‹  r”  r	  r	   rX   r_  )r—  r	   r˜  r™  rX   rš  )r–   rW   rž  rW   r˜   r   rŸ  ró   r÷   rö   r™   rð   rX   r_  )rˆ  rŒ  rX   r_  )rs  r   rX   rW   )rÎ  )r   rW   rs  r   rÏ  rW   rX   rW   )r-  r   rX   rW   )rê  rë  rX   rì  )r-  rù  rX   r_  )r-  rü  rX   r_  )rX   ró   )r  rW   rX   r_  )rŠ  r  rˆ  rŒ  rX   r_  )r-  r.   r‹  r	   rX   rñ   )
r-  rü  rú   rW   rä  rW   r¾  ró   rX   r:  ©F)rˆ  rŒ  r-  rü  r=  ró   rX   r>  )rˆ  rŒ  r-  rü  rX   r>  )rˆ  rŒ  r-  rü  r=  ró   rX   rB  )FNNN)rˆ  rŒ  r¸  rC  rö  rD  rX   r_  )rX   r	   )NN)rˆ  rŒ  rñ  rt  )r€  rñ   rX   rW   )r•  rW   rˆ  r¢  rX   r–  )€rh   ri   rj   rf   r  r1  r^  rU  rT  r‡  r’  r—  r¡  r´  rG  rø  rç  rþ  rÊ  r  r
  rÇ  r$  rÈ  r/  rK  r0  rI  rH  rB  rA  rE  rF  r  rO  rP  rD  rÌ  rf  rÏ  rY  rZ  r~  rƒ  rˆ  rÑ  rÒ  r–  r]  r¦  rÎ  r~   rÍ  ÚclassmethodrÑ  rn  ro  rÔ  rÓ  rÖ  r×  rØ  rÐ  rî  rD  rE  rø  rú  rû  rÿ  r  r  r  r  r	  r  r  rB  rC  rÔ  r  r  rÓ  r.  r/  r1  r3  r5  rÞ  r   r<  rA  r?  r@  rß  rL  rý  rI  rJ  rK  rU  rW  rá  rX  rÈ  r[  r`  ra  rc  rh  rs  rå  ræ  rv  rË  r  r…  rˆ  rJ  rŠ  r‹  r  r  r’  rM  rN  r—  Ú__classcell__r7   r7   r  r8   rü   à  s   
CM. R*	 925yI
  `  		*	:67 ÿÿ<ýt
!
&B 
8rü   r‹  r	   r,  r[  rñ   c              
   C  s  t  tt j¡}t  tt j¡}t  tt j¡}g }t| ƒ} | jdddÜ}	|	D ]Ð}
| |
¡}|durO| j	| 
d¡ }|j ¡ dd… |jv rO| t|||||ƒ¡ | |
¡}|dur‘| 
d¡ ¡ }|dkrdq%||vriq%||| j }| ¡ s||j| jkr{nq%| | ¡r‚q%| |¡}| t|| ƒ¡ q%| |
¡}|durõ| 
d¡ ¡  d¡}t|ƒdv s±J d	|› ƒ‚d
 |¡}||vrÎtd | 
d¡ ¡ |jd
ddd ¡ƒ‚||| j }| ¡ sá|j| jkrànq%| | ¡rçq%| |¡}| t|| ƒ¡ q%W d  ƒ |S 1 sw   Y  |S )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`
    r  r  r   Nr   Z	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   )r;   r,  ÚFORTRAN_INCLUDE_PATr#  ÚFORTRAN_USE_PATr$  r	   r  r  r  r4   rŸ  r›  r  rã  r*  r˜  Úis_filer–   ÚsamefilerH  rÒ   rW   rƒ   r3   r®   r   r­   )r‹  r,  r[  r+  r-  ZincreZuserer%  r-  r/  rà   ZincmatchZincfileZusematchZusenamerN  Úmod_namer(  r)  Zancestor_childZsubmodsrcfiler7   r7   r8   r*  ò  sl   




ÿÿ
(

€Æ
ÿ<Ä<r*  r˜  )rV   rW   rX   rW   )r‹  r	   r,  r	   r[  r	   rX   rñ   )aÚ
__future__r   Úcollectionsr   Údataclassesr   Úenumr   r   Ú	functoolsr   Úpathlibr   r	   Útextwrapr
   r  rc  rL   r   r;   rB   r'  ÚtypingÚTr£   r   r   r   r   r   r   r   r   Zarglistr   r   Zlinkersr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   ÚTYPE_CHECKINGÚtyping_extensionsr'   Z_typingr(   r)   rþ   r*   r+   r,   Zcompilers.csr-   Zcompilers.fortranr.   rî   rœ  r"  r$  r  r?   rD   rJ   r½   rñ  rò  rP   rØ   r‹   r,  rZ   r[   r^   r_   rk   rq   r   r†   r¾   rã   rê   ZBackendrü   r*  r7   r7   r7   r8   Ú<module>   s¾   (



t #                        *