o
    uJAf6Õ ã                   @  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mZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl m#Z# ddl$m%Z%m&Z& ddlm'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddlm0Z0m1Z1m2Z2 d	dlm3Z3 ddlm4Z4m5Z5 ej6rõd dl7m8Z8 ddl9m:Z: ddlm;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZE ejFejGdeHf  ZIe8d  ZJd!ZKd"ZLd#ZMd$ZNdUd(d)„ZOdVd+d,„ZPe Q¡ reOZRd-d.gZSg d/¢ZTne/ZRg ZSg d0¢ZTdWd2d3„ZUeUƒ ZVh d4£ZWe Xd5¡ZYe Xd6¡ZZdXdYd;d<„Z[G d=d>„ d>ƒZ\eG d?d@„ d@eƒƒZ]G dAd„ dƒZ^eG dBdC„ dCƒƒZ_G dDdE„ dEƒZ`G dFdG„ dGƒZaeG dHdI„ dIƒƒZbeG dJdK„ dKƒƒZcG dLdM„ dMejdƒZedZdSdT„ZfdS )[é    )Úannotations)ÚOrderedDict)Ú	dataclass)ÚEnumÚunique)Ú	lru_cache)ÚPurePathÚPath)ÚdedentNé   )Úbackendsé   )Úmodules)ÚenvironmentÚmesonlib)Úbuild)Úmlog)Ú	compilers)ÚCompilerArgs)ÚCompiler)ÚArLikeLinkerÚRSPFileSyntax)	ÚFileÚLibTypeÚMachineChoiceÚMesonBugExceptionÚMesonExceptionÚ
OrderedSetÚ
PerMachineÚProgressBarÚ	quote_arg)Úget_compiler_for_sourceÚhas_path_sepÚ	OptionKey)Ú
CleanTrees)ÚGeneratedListÚInvalidArguments)ÚLiteral)ÚImmutableListProtocol)ÚExtractedObjectsÚLibTypes)ÚInterpreter)ÚDynamicLinkerÚStaticLinker)Ú
CsCompiler)ÚFortranCompilerÚNinjaCommandArg)Ú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+)ÚargÚstrÚreturnc                 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© r<   úD/usr/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 )Nr5   r   r   r7   r:   r<   r<   r=   r>   J   ó    r6   )ÚreÚsub)r2   r<   r<   r=   Ú	cmd_quoteC   s   rB   Úsc                 C  s   |   dd¡} t | ¡S )Nr5   ú\\)ÚreplaceÚshlexÚquote©rC   r<   r<   r=   Úgcc_rsp_quoteP   s   
rI   Úcmdú/c)Údelz/fz/sz/qú{}ú&&)Úrmz-frM   rN   Úintc                  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_windowsrP   ÚosÚenvironÚget)Úlimitr<   r<   r=   Úget_rsp_thresholdf   s
   rV   >   ÚdyndepÚ	targetdepÚpoolÚdescriptionZDEPFILE_UNQUOTEDÚDESCz[$ :\n]z[$ \n]FÚtextÚis_build_lineÚboolc                 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   rA   )r\   r]   Zquote_reÚerrmsgr<   r<   r=   Úninja_quote„   s   
þrd   c                   @  s   e Zd Zddd„ZdS )	ÚTargetDependencyScannerInfoÚprivate_dirr3   Úsource2objectúT.Dict[str, str]c                 C  ó   || _ || _d S ©N)rf   rg   )Úselfrf   rg   r<   r<   r=   Ú__init__–   ó   
z$TargetDependencyScannerInfo.__init__N)rf   r3   rg   rh   )Ú__name__Ú
__module__Ú__qualname__rl   r<   r<   r<   r=   re   •   s    re   c                   @  s   e Zd ZdZdZdZdZdS )ÚQuotingr   r   r   é   N)rn   ro   rp   ÚbothÚnotShellÚnotNinjaÚnoner<   r<   r<   r=   rq   š   s
    rq   c                   @  s4   e Zd Zejfddd„Zdd	d
„Zeddd„ƒZdS )r0   rC   r3   Úquotingrq   r4   ÚNonec                 C  ri   rj   )rC   rw   )rk   rC   rw   r<   r<   r=   rl   ¢   rm   zNinjaCommandArg.__init__c                 C  s   | j S rj   rH   ©rk   r<   r<   r=   Ú__str__¦   ó   zNinjaCommandArg.__str__ÚlúT.List[str]ÚqúT.List[NinjaCommandArg]c                   s   ‡ fdd„| D ƒS )Nc                   s   g | ]}t |ˆ ƒ‘qS r<   )r0   ©Ú.0Úi©r~   r<   r=   Ú
<listcomp>«   r?   z(NinjaCommandArg.list.<locals>.<listcomp>r<   )r|   r~   r<   rƒ   r=   Úlist©   s   zNinjaCommandArg.listN)rC   r3   rw   rq   r4   rx   )r4   r3   )r|   r}   r~   rq   r4   r   )	rn   ro   rp   rq   rs   rl   rz   Ústaticmethodr…   r<   r<   r<   r=   r0   ¡   s
    
c                   @  s    e Zd ZU ded< d
dd„Zd	S )ÚNinjaCommentr3   ÚcommentÚoutfileúT.TextIOr4   rx   c                 C  s>   | j  d¡D ]}| d¡ | |¡ | d¡ q| d¡ d S )Nr_   z# )rˆ   ÚsplitÚwrite)rk   r‰   r|   r<   r<   r=   rŒ   ±   s
   

zNinjaComment.writeN©r‰   rŠ   r4   rx   )rn   ro   rp   Ú__annotations__rŒ   r<   r<   r<   r=   r‡   ­   s   
 r‡   c                   @  sF   e Zd Zddddejfddd„Zeefdd„ƒZddd„Z	dd„ Z
dS )Ú	NinjaRuleFNÚruler3   ÚcommandÚCommandArgOrStrÚargsrZ   Úrspabler^   ÚdepsúT.Optional[str]ÚdepfileÚextraÚrspfile_quote_styler   c
           
        sˆ   ddd„‰ || _ ‡ fdd„|D ƒ| _‡ fd	d„|D ƒ| _|| _|| _|| _|| _|| _d
| _d
| _	|	| _
| jdkrB|  jd7  _d S d S )NÚcúT.Union[NinjaCommandArg, str]r4   r0   c                 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 )NrN   ú$z\$\{?(\w*)\}?r   )Ú
isinstancer0   rq   rt   Ú
startswithr@   rb   r9   Ú	raw_namesrv   ru   )rš   Úvarr<   r<   r=   ÚstrToCommandArg¾   s   

z+NinjaRule.__init__.<locals>.strToCommandArgc                   ó   g | ]}ˆ |ƒ‘qS r<   r<   ©r   rš   ©r¡   r<   r=   r„   Õ   ó    z&NinjaRule.__init__.<locals>.<listcomp>c                   r¢   r<   r<   ©r   Úar¤   r<   r=   r„   Ö   r¥   r   ú$DEPFILEÚ	_UNQUOTED)rš   r›   r4   r0   )Únamer‘   r“   rZ   r•   r—   r˜   r”   ÚrefcountÚrsprefcountr™   )
rk   r   r‘   r“   rZ   r”   r•   r—   r˜   r™   r<   r¤   r=   rl   ¹   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 rj   )
r   r0   rw   rq   rv   rC   ru   rt   rd   r3   )ÚxÚqfr<   r<   r=   Ú_quoterã   s   


zNinjaRule._quoterr‰   rŠ   r4   rx   c              
     sr  ˆj }ˆjtju rt‰ dd„ |D ƒ}nt‰ ‡fdd„}|ƒ D ]˜}| dˆj› |› d¡ |dkr\| d d	 	‡fd
d„ˆj
D ƒ¡¡¡ | d¡ | d d	 	‡ ‡fdd„|D ƒ¡¡¡ n| d d	 	‡fdd„ˆj
ˆj  D ƒ¡¡¡ ˆjr| dˆj› d¡ ˆjrŒ| dˆj› d¡ | dˆj› d¡ ˆjr±ˆj d¡D ]}| d	¡ | |¡ | d¡ qŸ| d¡ qd S )Nc                 S  s&   g | ]}|j d krtd|jƒn|‘qS )ú$inz$in_newline)rC   r0   rw   )r   r2   r<   r<   r=   r„   ó   s   & z#NinjaRule.write.<locals>.<listcomp>c                   3  s"    ˆ j rdV  ˆ jrdV  d S d S )NÚ Ú_RSP)r«   r¬   r<   ry   r<   r=   Ú	rule_iter÷   s   €
ÿz"NinjaRule.write.<locals>.rule_iterzrule r_   r²   z command = {} @$out.rsp
ú c                   ó   g | ]}ˆ   |¡‘qS r<   ©r¯   ©r   r­   ry   r<   r=   r„      r?   z rspfile = $out.rsp
z rspfile_content = {}
c                   s   g | ]}ˆ  |ˆ ¡‘qS r<   r¶   r·   ©Zrspfile_quote_funcrk   r<   r=   r„     ó    z command = {}
c                   rµ   r<   r¶   r·   ry   r<   r=   r„     r?   z deps = z depfile = z description = )r“   r™   r   ÚMSVCrB   rI   rŒ   rª   ÚformatÚjoinr‘   r•   r—   rZ   r˜   r‹   )rk   r‰   Zrspfile_argsr³   Zrspr|   r<   r¸   r=   rŒ   ï   s2   
&
(,

î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µ   r<   r¶   r·   ry   r<   r=   r„     r?   z-NinjaRule.length_estimate.<locals>.<listcomp>z(\${\w+}|\$\w+)?[^$]*r   éÿÿÿÿÚ{r   )r•   r—   r¼   r‘   r“   r8   r@   ÚfinditerÚstartÚendr9   rT   )rk   ZinfilesÚoutfilesÚelemsZ
ninja_varsÚerª   Úvaluer‘   Zestimater;   Úchunkr<   ry   r=   Úlength_estimate  s*   


 
€zNinjaRule.length_estimate)r   r3   r‘   r’   r“   r’   rZ   r3   r”   r^   r•   r–   r—   r–   r˜   r–   r™   r   r   )rn   ro   rp   r   ÚGCCrl   r†   Ú
quote_funcr¯   rŒ   rÉ   r<   r<   r<   r=   r   ¸   s    ý*
"r   c                   @  sT   e Zd Zdddd„Zdd
d„Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dS ) ÚNinjaBuildElementNÚall_outputsú
T.Set[str]c                 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   r3   ÚoutfilenamesÚrulenameÚinfilenamesr   r•   Ú	orderdepsrÅ   rÍ   Úoutput_errors)rk   rÍ   rÑ   rÒ   rÓ   Úimplicit_outsr<   r<   r=   rl   0  s   





zNinjaBuildElement.__init__ÚdepúT.Union[str, T.List[str]]r4   rx   c                 C  ó*   t |tƒr| j |¡ d S | j |¡ d S rj   )r   r…   r•   ÚupdateÚadd©rk   r×   r<   r<   r=   Úadd_depB  ó   
zNinjaBuildElement.add_depc                 C  rÙ   rj   )r   r…   rÔ   rÚ   rÛ   rÜ   r<   r<   r=   Úadd_orderdepH  rÞ   zNinjaBuildElement.add_orderdeprª   r3   rÅ   ú'T.Union[str, T.List[str, CompilerArgs]]c                 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_nativer3   rÅ   Úappend)rk   rª   rÅ   r<   r<   r=   Úadd_itemN  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©rd   r€   r<   r<   r=   r„   b  r?   z9NinjaBuildElement._should_use_rspfile.<locals>.<listcomp>c                 S  ræ   rç   rè   r€   r<   r<   r=   r„   c  r?   )	rÒ   r   r”   r¼   rÓ   rÑ   rÉ   rÅ   Úrsp_threshold)rk   rÓ   rÑ   r<   r<   r=   Ú_should_use_rspfileZ  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«   ry   r<   r<   r=   Úcount_rule_referencesi  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è   r€   r<   r<   r=   r„   s  r?   z+NinjaBuildElement.write.<locals>.<listcomp>c                 S  ræ   rç   rè   r€   r<   r<   r=   r„   t  r?   c                 S  ræ   rç   rè   r€   r<   r<   r=   r„   u  r?   z | r²   zCommand line for building z is long, using a response filezbuild z: r   c                 S  ræ   rç   rè   r·   r<   r<   r=   r„   €  r?   c                 S  s   g | ]}t |ƒ‘qS r<   )r3   r·   r<   r<   r=   r„   ‚  r¥   z || c                 S  ræ   rç   rè   r·   r<   r<   r=   r„   ƒ  r?   r_   r5   ú/c                 s  s,    | ]}|  d ¡r| d dd¡n|V  qdS )z//rD   r   N)rž   rE   ©r   r|   r<   r<   r=   Ú	<genexpr>Ž  s
   € ÿ
ÿz*NinjaBuildElement.write.<locals>.<genexpr>z = rN   )rÕ   r   r¼   rÓ   rÑ   rÐ   rê   rÒ   r   Údebugr8   r•   ÚsortedrÔ   rE   r   rQ   r‹   rŒ   r   r™   r   rº   rB   rI   rË   rÅ   rŸ   rã   rd   )rk   r‰   ZinsZoutsrÖ   Zuse_rspfilerÒ   ÚlinerÔ   r®   rÆ   rª   rÅ   Zshould_quoteZnewelemsr‚   r<   r<   r=   rŒ   p  sV   

" 
þ

zNinjaBuildElement.writec                 C  s4   | j D ]}|| jv rd|› d| _| j |¡ qd S )Nz%Multiple producers for Ninja target "z". Please rename your targets.)rÑ   rÍ   rÕ   rÛ   )rk   Únr<   r<   r=   Úcheck_outputs«  s
   

ýzNinjaBuildElement.check_outputsrj   )rÍ   rÎ   )r×   rØ   r4   rx   )rª   r3   rÅ   rà   r4   rx   )rn   ro   rp   rl   rÝ   rß   rä   rê   rë   rŒ   ró   r<   r<   r<   r=   rÌ   /  s    

;rÌ   c                   @  s(   e Zd ZU ded< ded< d
dd„Zd	S )ÚRustDepr3   rª   rP   Úcrater4   úT.Dict[str, object]c                 C  s   | j | jdœS )N©rõ   rª   r÷   ry   r<   r<   r=   Úto_json¹  s   þzRustDep.to_jsonN©r4   rö   )rn   ro   rp   rŽ   rø   r<   r<   r<   r=   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 )Ú	RustCraterP   Úorderr3   Údisplay_nameÚroot_moduleÚRUST_EDITIONSÚeditionúT.List[RustDep]r•   r}   Úcfgr^   Úis_proc_macroÚis_workspace_memberNr–   Úproc_macro_dylib_pathr4   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 r<   ©rø   )r   Údr<   r<   r=   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  )rk   Úretr<   r<   r=   rø   Ò  s   ú	
zRustCrate.to_jsonrù   )rn   ro   rp   rŽ   r  rø   r<   r<   r<   r=   rú   ¿  s   
 rú   c                      s
  e Zd Zdc‡ fdd„Zdddd„Zdd„ Zdedfdd„Zdgdd„Zdd„ Zdd „ Z	dhd$d%„Z
dhd&d'„Zd(d)„ Z	didjd/d0„Zdkd3d4„Zd5d6„ Zdld8d9„Zdmd>d?„Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ ZdndIdJ„ZdKdL„ ZdodNdO„ZdPdQ„ ZdpdUdV„ZdpdWdX„ZdYdZ„ Zd[d\„ Zd]d^„ Zdqdadb„Zdqdcdd„Z drdgdh„Z!dsdidj„Z"dtdmdn„Z#dtdodp„Z$dgdqdr„Z%dudtdu„Z&dvdw„ Z'dvdxdy„Z(dzd{„ Z)d|d}„ Z*d~d„ Z+d€d„ Z,dwd„d…„Z-dxd‡dˆ„Z.dxd‰dŠ„Z/dydd„Z0dzd•d–„Z1d{dŸd „Z2d|d£d¤„Z3d}d¥d¦„Z4e5d~d©dª„ƒZ6e7dd€d®d¯„ƒZ8e7dd²d³„ƒZ9e7dd´dµ„ƒZ:d¶d·„ Z;d¸d¹„ Z<dºd»„ Z=d¼d½„ Z>d¾d¿„ Z?dÀdÁ„ Z@d‚dÅdÆ„ZAdÇdÈ„ ZBdÉdÊ„ ZCdËdÌ„ ZDdƒdÎdÏ„ZEdÐdÑ„ ZFd„dÓdÔ„ZGdÕdÖ„ ZHd×dØ„ ZId…dÙdÚ„ZJd†dÜdÝ„ZKdÞdß„ ZLdàdá„ ZMdâdã„ ZNdädå„ ZOdædç„ ZPdèdé„ ZQdidêdë„ZRd‡dîdï„ZSdðdñ„ ZTdˆdôdõ„ZUdöd÷„ ZVdødù„ ZWd‰dúdû„ZXdüdý„ ZYdþdÿ„ ZZe[dd dŠdd„ƒZ\	d‹dŒd	d
„Z]ddd„Z^e[dd 	d‹dŽdd„ƒZ_ddd„Z`				dd‘dd„Zadvdd„Zbd’dd„Zcdd„ Zdd“d!d"„Zed#d$„ Zfd%d&„ Zgd'd(„ Zhd)d*„ Zidid+d,„Zjd-d.„ Zkd/d0„ Zld1d2„ Zmd3d4„ Znd5d6„ Zod7d8„ Zpe[dd d”d9d:„ƒZqd;d<„ Zrd=d>„ Zsd•d–d@dA„ZtdBdC„ ZudDdE„ Zvd—dGdH„ZwdgdIdJ„ZxdKdL„ ZydgdMdN„ZzdgdOdP„Z{did˜dRdS„Z|dgdTdU„Z}dgdVdW„Z~d™dYdZ„Zdgd[d\„Z€dgd]d^„Zdš‡ fdadb„Z‚‡  ZƒS (›  ÚNinjaBackendr   úT.Optional[build.Build]ÚinterpreterúT.Optional[Interpreter]c                   sJ   t ƒ  ||¡ d| _d| _i | _tƒ | _i | _tddƒ| _	i | _
g | _d S )NÚninjaúbuild.ninjaF)Úsuperrl   rª   Úninja_filenameÚfortran_depsÚsetrÍ   Úintrospection_datar   Úcreated_llvm_ir_ruleÚrust_cratesÚimplicit_meson_outs)rk   r   r  ©Ú	__class__r<   r=   rl   å  s   
zNinjaBackend.__init__Údummy_outfiler3   rÒ   Úphony_infilenamer4   rÌ   c                 C  sL   |  d¡rtd|›ƒ‚d|› }t| j|d|ƒ}|  |¡ t| j|||ƒS )aL  
        We need to use aliases for targets that might be used as directory
        names to workaround a Ninja bug that breaks `ninja -t clean`.
        This is used for 'reserved' targets such as 'test', 'install',
        'benchmark', etc, and also for RunTargets.
        https://github.com/mesonbuild/meson/issues/1644
        zmeson-internal__z*Invalid usage of create_phony_target with rå   )rž   ÚAssertionErrorrÌ   rÍ   Ú	add_build)rk   r  rÒ   r  Zto_nameÚelemr<   r<   r=   Ú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.>   ÚfortranÚmasmÚpgir§   úutf-8©ÚencodingÚmsvcz
incdetect.r   ÚwzI                #include<stdio.h>
                int dummy;
            Nz/showIncludesrK   )Ú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Œ   r9   )r¾   rñ   r,  Zbinfile©ZmatchreÚtempfilenamer<   r=   Údetect_prefix3  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   rQ   r-  Úget_argument_syntaxÚlang_suffixesrR   Úpathr¼   Úget_scratch_dirrŒ   r
   Ú
subprocessÚPopenÚget_exelistÚPIPEÚcommunicater@   Úcompiler   )rk   r/  ÚcompilerZfilebaseÚfilenameÚfÚpcr(  r)  r0  Úresultr<   r.  r=   Údetect_vs_dep_prefix  s:   
ÿÿÿ

ÿý
z!NinjaBackend.detect_vs_dep_prefixFNÚcapturer^   Ú
vslite_ctxÚdictúT.Optional[dict]c                 C  sÌ  |rt dƒ‚tjdd}| jj tdƒ¡rIt| j ¡ ƒ}z	| t 	¡ ¡}W n	 t
y.   Y nw t t ¡ ¡}t ¡  t d¡ t |› d|› ¡ |d u rQt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ƒ¡ |räi }
| j #¡  $¡ D ]}t%|tj&ƒrã|  '|¡|
| (¡ < qÒt)| j #¡  $¡ ddD ]}|  *|¡ qït +d¡ |  !t"dƒ¡ |  ,¡  t +d¡ |  !t"dƒ¡ |  -¡  t +d¡ |  .¡  t +d¡ tdƒ}|| jjjv re| jjj| jret /¡ \}}}}}}|sM|r`|r`|  !t"dƒ¡ |  0||¡ t +d ¡ nt 1d!¡ |  !t"d"ƒ¡ |  2¡  t +d#¡ |  3¡  |  4|¡ |  5|¡ d$}| |¡ W d   ƒ n	1 s•w   Y  t 6||¡ t 7|¡ t 8| jd%¡r×tj 9tj | jj:d&¡¡r×t;j<| jd'd(g | jj:d) t;j<| jd'd*g | jj:d) |  =¡  |  >¡  |rä|
S d S )+NzCWe do not expect the ninja backend to be given a valid 'vslite_ctx'T)ÚlogÚvsenvzYVisual Studio environment is needed to run Ninja. It is recommended to use Meson wrapper:z compile -C z&Could not detect Ninja v1.8.2 or newerú~r&  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Targets generatedz
Test ruleszTests generatedzInstall ruleszInstall generatedzDist generatedÚ
b_coveragezCoverage ruleszCoverage rules generatedz;Need gcovr or lcov/genhtml to generate any coverage reportsZSuffixzUtils generatedzdefault all

ú>=1.10.0z
.ninja_logú-tZrestat©r'  Z	cleandead)?r   r   Ú detect_ninja_command_and_versionr1  Ú
get_optionr#   r	   Úget_build_dirÚrelative_tor'  Ú
ValueErrorr   Ú	join_argsÚget_meson_commandr   rJ  r   Úninja_commandÚninja_versionrR   r8  r¼   r  r-  rŒ   r   Úget_projectÚoptionsrÇ   rE  Úgenerate_rulesÚbuild_elementsÚgenerate_phonyÚadd_build_commentr‡   Úget_targetsr3  r   ÚBuildTargetÚ)generate_common_compile_args_per_src_typeÚget_idr   Úgenerate_targetÚlog_timestampÚgenerate_testsÚgenerate_installÚgenerate_distÚfind_coverage_toolsÚgenerate_coverage_rulesÚwarningÚgenerate_utilsÚgenerate_endingÚwrite_rulesÚwrite_buildsrE   Úcmd_ci_includeÚversion_compareÚexistsÚ	build_dirr:  ÚcallÚgenerate_compdbÚgenerate_rust_project_json)rk   rF  rG  r  ÚbuilddirÚmeson_commandÚoutfilenamer/  r‰   Ú	num_poolsZ captured_compile_args_per_targetÚtargetÚtÚkeyÚ	gcovr_exeÚgcovr_versionÚlcov_exeÚlcov_versionÚgenhtml_exeÚ_Údefaultr<   r<   r=   ÚgenerateD  s¤   ÿ




ÿ€ø€



ÿ



Ò1
,ÿzNinjaBackend.generaterx   c                 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  r<   r  r£   r<   r<   r=   r„   °  r¥   z;NinjaBackend.generate_rust_project_json.<locals>.<listcomp>)Zsysroot_srcZcratesé   )Úindent)r  r-  rR   r8  r¼   r   rV  ÚjsonÚdumpr1  r   r2  Úget_sysrootr3  )rk   rB  r<   r<   r=   ry  ¦  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²   r<   ©r   r   Úextr<   r<   r=   r„   »  ó
    ÿÿz0NinjaBackend.generate_compdb.<locals>.<listcomp>c                 S  r  r  r<   r‘  r<   r<   r=   r„   ½  r“  z>=1.9ú-xrR  ZcompdbrS  zcompile_commands.jsonÚwbz&Could not create compilation database.F)Úfatal)r   r   r1  r   r3  Úcompiler_to_rule_nameÚcompiler_to_pch_rule_namer   rt  r\  r[  rV  r:  Úcheck_outputr-  rR   r8  r¼   rŒ   Ú	Exceptionr   rn  )	rk   ÚrulesÚfor_machiner@  Zcompdb_optionsZninja_compdbrz  ZjsondbrB  r<   r<   r=   rx  µ  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)Úhasattrr  Úget_generated_sourcesr   r   ÚCustomTargetÚCustomTargetIndexÚget_outputsr   Ú	is_headerrã   Úget_target_generated_dirr   Ú
Executabler   Úfrom_built_fileÚget_target_dirÚvala_headerÚ	itertoolsÚchainÚlink_targetsÚlink_whole_targetsÚStaticLibraryÚSharedLibraryÚget_generated_headers)rk   r~  Úheader_depsÚgenlistÚsrcr©  r×   r<   r<   r=   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   r   r£  r¥  r   Úfrom_built_relative)rk   r~  ÚsrcsÚgensrcrC   Úrel_srcr<   r<   r=   Ú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)rk   r~  r·  rC   rB  r<   r<   r=   Ú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_irÚis_assemblyrR   r8  ÚsplitextÚlowerr   ÚLANGS_CANT_UNITYr   Úfile_suffixes)rk   r~  ÚsourceÚsuffixÚlangr<   r<   r=   Úget_target_source_can_unityù  s   

ÿ

ÿz(NinjaBackend.get_target_source_can_unityúbuild.TargetÚcompúcompilers.CompilerÚunity_sourcesú)T.Optional[T.List[mesonlib.FileOrString]]c                   sê   |  ¡ }| ¡ }ˆj| }	|t|ƒf}
|	 |
d¡}|du r>t|tƒr(|jdd}| |ˆj	¡}|| 
¡ |g g g dœ}||	|
< d‡fd	d
„‰ |d  ‡ fdd„|D ƒ¡ |d  ‡ fdd„|D ƒ¡ |rs|d  ‡ fdd„|D ƒ¡ dS 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)r4  r@  Ú
parametersÚsourcesÚgenerated_sourcesrÎ  Úfileúmesonlib.FileOrStringr4   r3   c                   s2   t | tƒr|  ˆ jˆ j¡S tj tj ˆ j| ¡¡S )z Make source files absolute )	r   r   Úabsolute_pathÚ
source_dirrv  rR   r8  Únormpathr¼   )rÕ  ry   r<   r=   Úcompute_path/  s   
zENinjaBackend.create_target_source_introspection.<locals>.compute_pathrÓ  c                 3  ó    | ]}ˆ |ƒV  qd S rj   r<   r·   ©rÚ  r<   r=   rî   5  ó   € zBNinjaBackend.create_target_source_introspection.<locals>.<genexpr>rÔ  c                 3  rÛ  rj   r<   r·   rÜ  r<   r=   rî   6  rÝ  rÎ  c                 3  rÛ  rj   r<   r·   rÜ  r<   r=   rî   8  rÝ  )rÕ  rÖ  r4   r3   )rf  Úget_languager  ÚtuplerT   r   r   râ   Ú&compute_parameters_with_absolute_pathsrv  r<  Úextend)rk   r~  rÌ  rÒ  rÓ  rÔ  rÎ  ÚtidrÉ  ÚtgtZid_hashZ	src_blockr<   )rÚ  rk   r=   Ú"create_target_source_introspection  s.   

ú ÿz/NinjaBackend.create_target_source_introspectionÚlinkerúT.Union[Compiler, StaticLinker]c           	      C  sz   |  ¡ }| j| }t|ƒ}| |d ¡}|d u r;t|tƒr"|jdd}t|tƒr,| ¡ }n| 	¡ }||dœ}|||< d S d S )NTrÐ  )rå  rÒ  )
rf  r  rß  rT   r   r   râ   r   Úget_linker_exelistr<  )	rk   r~  rå  rÒ  râ  rã  Zlnk_hashZ	lnk_blockÚlinkersr<   r<   r=   Ú"create_target_linker_introspection:  s   



þóz/NinjaBackend.create_target_linker_introspectionc           &   
     sj  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 t ˆtjƒ}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 ]b}t/ 0|¡}ˆ j1 2|¡rO|rHˆ  3ˆ|¡rH| 4|¡ tj5 (ˆ j1 6¡ |¡}| 4|¡ q| 4|¡ qˆ j1 7|¡r]|
 4|¡ qˆ j1 8|¡sjt9 :|¡rlq|rv| 4|¡ q| 4|¡ qg }|D ]>}ˆ j1 ;|¡r“ˆ  <ˆ|¡\}}nˆ j=ˆ|d|d\}}| 4|¡ |||< |
 4|¡ | >d¡d tj?d v r¾| 4|¡ qˆ  @ˆ¡}|rÕˆ A¡ rÕˆ jBˆ|d}ng }ˆ  Cˆ¡\}}dd„ |D ƒ}|
 D|¡ ‡ fdd„|D ƒ}g } ˆ E¡ rtF G‡ ‡fdd„|D ƒ¡} g }!|D ]}t/ 0|¡}ˆ j1 H|¡r | 4|¡ q|! 4|¡ q|!D ]}ˆ  =ˆ|dg |¡\}}|
 4|¡ q)| I¡ D ]`}ˆ j1 H|¡rM|r ˆ j1 ;|¡rcˆ  <ˆ|¡\}}|
 4|¡ qA|r‚ˆ  3ˆ|¡r‚tj5 (ˆ j1 6¡ | Jˆ jK¡¡}| 4|¡ qAˆ  =ˆ|dg || | | ¡\}}|
 4|¡ | 4|¡ |||< qA|rÎˆ  Lˆ|¡D ]"}ˆ  =ˆ|d|| | || |¡\}}|
 4|¡ | 4|¡ |||< q«|rÓd S ˆ  Mˆ¡\}"}#t ˆtjNƒrìˆjOrìˆ  Pˆ|
¡}$n|
}$ˆ jQˆ|	|$|"||#d}%ˆ  Rˆ||||¡ ˆ  S|%¡ t ˆtjTƒr/ˆ j1jUˆjV  W¡ r1ˆjXr3tYˆ jZ|" [|	¡d|	gƒ}%ˆ  S|%¡ d S d S d S d S )NÚcsÚswiftrž  Ú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  )r±  c                 S  s   g | ]}|  ¡ r|‘qS r<   )Úuses_fortran©r   r  r<   r<   r=   r„   Ü  r¹   z0NinjaBackend.generate_target.<locals>.<listcomp>c              	     s*   g | ]}t d gtj ˆ  |¡¡¢R Ž ‘qS rç   )r   rR   r8  r‹   Úget_target_filenamerð  ry   r<   r=   r„   ß  s   * c                   s&   g | ]}ˆj d  jˆ  |¡dd‘qS )r  F)Ú	is_system)r   Úget_include_argsÚget_target_private_dirrð  ©rk   r~  r<   r=   r„   â  s
    
ÿ

ÿF)Ústdlib_argsZ
AIX_LINKER)\r   r   rd  rR   ÚmakedirsÚget_target_private_dir_absÚFileExistsErrorr¡  Úgenerate_custom_targetÚ	RunTargetÚgenerate_run_targetrf  Úprocessed_targetsrÛ   r  Úprocess_target_dependenciesÚgenerate_shlib_aliasesr¨  ÚJarÚgenerate_jar_targetÚ	uses_rustÚgenerate_rust_targetr   Úgenerate_cs_targetÚgenerate_swift_targetÚCompileTargetÚgenerate_vala_compileÚgenerate_cython_transpiler¿  rº  Úscan_fortran_module_outputsÚgenerate_generator_list_rulesrñ  Úis_unityr°  r  ÚkeysÚintersectionr   rÅ  r¼   Úupperr8   rª   r   rJ  Úredr   r¶  r   Ú	is_sourcerÊ  rã   r8  rV  Ú	is_objectÚ
is_libraryr   Úis_module_libraryrÁ  Úgenerate_llvm_ir_compileÚgenerate_single_compiler‹   r7  Útarget_uses_pchÚhas_pchÚgenerate_pchÚflatten_object_listrá  rï  r   Úlistifyr¤  r3  r½  r¾  Úgenerate_unity_filesÚ determine_linker_and_stdlib_argsr®  ÚprelinkÚgenerate_prelinkÚgenerate_linkÚgenerate_dependency_scan_targetr  r¯  Úmachinesrœ  Úis_aixÚaix_so_archiverÌ   rÍ   Úget_archive_name)&rk   r~  Úcompiled_sourcesrg   rª   Zis_compile_targetÚtarget_sourcesrÔ  Ztranspiled_sourcesÚoutnameÚobj_listr  r±  Ú	unity_srcZ
unity_depsÚlangsZ
langs_cantZ	langs_areÚmsgÚgenerated_source_filesr¹  Úraw_srcÚabs_srcZd_generated_depsr³  ÚorC   Úuse_pchÚpch_objectsZodZobj_targetsZfortran_order_depsZfortran_inc_argsZvala_generated_source_filesrå  rö  Zfinal_obj_listr  r<   rõ  r=   rg  N  s6  €ÿ











ÿ
ÿ




ÿ



ÿ


€


ÿ	

ÿ
þ

€ÿ


"ýzNinjaBackend.generate_targetú'build.BuildTarget'c                 C  sž   t  | jd¡r	dS d|jv rdS d|jvrdS d|jd v r dS |jd }| ¡ dkr-dS | td|jdd	¡}|d
vr>dS t  	¡ sDdS t  |j
d¡rMdS dS )Nz<1.10.0Fr  TÚcppz-fmodules-tsr%  Ústd©ÚmachinerÉ  )Úlatestz	c++latestz
vc++latestz<19.28.28617)r   rt  r\  r   Ú
extra_argsrf  rU  r#   rœ  Úcurrent_vs_supports_modulesÚversion)rk   r~  r3  Z
cppversionr<   r<   r=   Ú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.datr5   rì   z
-deps.jsonÚdepscanr&  r"  r#  Z
picklefiler•  )r;  Úget_dep_scan_file_forrª   rR   r8  r¼   rô  rE   rø  Úselect_sources_to_scanr-  rŒ  r  rÌ   rÍ   rä   rÔ   rÛ   Úrelative_namerÚ   re   Úpickler  )rk   r~  r%  rg   r,  r=  Zdepscan_fileZpickle_baseZpickle_fileZ
pickle_absZjson_absZ	rule_nameZscan_sourcesrB  r  ÚgZscaninfoÚpr<   r<   r=   r   A  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 )Nr3  r  r   ÚC)r  r   r7  rR   r8  rÃ  rÄ  rã   )rk   r%  Úall_suffixesZselected_sourcesrÇ  r’  r<   r<   r=   rA  ^  s   
€z#NinjaBackend.select_sources_to_scanc                 C  s*   |  ¡ D ]}| ¡ | jvr|  |¡ qd S rj   )Úget_dependenciesrf  rý  rg  )rk   r~  r  r<   r<   r=   rþ  l  s
   
€þz(NinjaBackend.process_target_dependenciesc                 C  s(   |j D ]}t|tjƒr|  ||¡ qd S rj   )rÓ  r   r   r%   Úgenerate_genlist_for_target)rk   r~  rC   r<   r<   r=   Úcustom_target_generator_inputsq  s
   
€þz+NinjaBackend.custom_target_generator_inputsc              	   C  sP   g }|  ¡ D ]}t|tƒr|d }| ¡ D ]}| tj |  |¡|¡¡ qq|S )Nr   )	rH  r   r…   r£  rã   rR   r8  r¼   r¨  )rk   r~  r•   r‚   Úoutputr<   r<   r=   Úunwrap_dep_listv  s   
ÿzNinjaBackend.unwrap_dep_listúbuild.CustomTargetc              	   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|j! "|¡| ¡ |  #|¡ | j$ %| &¡ ¡ d S )NÚPHONYÚCUSTOM_COMMANDÚCUSTOM_COMMAND_DEPr   r   )Úextra_bdepsrF  ÚfeedÚenvÚverboseú (wrapped by meson ú)r±   T©Úexist_okrá   rY   ÚconsoleÚCOMMANDrZ   )'rJ  Úeval_custom_target_commandrL  Úget_target_depend_filesÚbuild_always_stalerã   r—   rÌ   rÍ   rÝ   Úextra_dependsr£  rR   r8  r¼   r¨  Úas_meson_exe_cmdliner‘   Ú get_transitive_build_target_depsrF  rR  rS  rY  Úget_dep_outnamerÓ   r   rV  r÷  rä   r	   Úsubdirrª   Úas_posixrZ   r»   r  rý  rÛ   rf  )rk   r~  r·  Z
ofilenamesrJ   r•   rÒ   r  r  rK  ÚreasonÚcmd_typer—   Z	rel_dfileÚabs_pdirÚ	full_namer<   r<   r=   rú    sL   





ÿ
û

z#NinjaBackend.generate_custom_targetc                 C  s*   |j dkr|j › d}nd}|› |j› S )Nr±   z@@)Ú
subprojectrª   )rk   r~  Zsubproject_prefixr<   r<   r=   Úbuild_run_target_name«  s   
z"NinjaBackend.build_run_target_nameúbuild.RunTargetc                 C  sò   |   |¡}|jst| j|dg ƒ}nH|  |¡}|  |¡\}}}| j|jd |dd … |dd\}}|r8d|› dnd}	|  |d	g ¡}| d
|¡ | dd|j	› |	› ¡ | dd¡ |  
|¡}
|
|  |¡7 }
| |
¡ |  |¡ | j | ¡ ¡ d S )Nrå   r   r   T)rS  rT  rU  rV  r±   rO  rZ  rZ   zRunning external command rY   rY  )ri  r‘   rÌ   rÍ   Úget_run_target_envr[  r_  r  rä   rª   rL  r\  rÝ   r  rý  rÛ   rf  )rk   r~  Útarget_namer  Z
target_envr†  rJ   Zmeson_exe_cmdrd  re  r•   r<   r<   r=   rü  ²  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   ÚclangTrZ  ú
--internalÚcoveragez--use_llvm_cov)r   rc  r3  rŸ  r   rf  ÚinfoÚ	is_darwinrä   r   Úget_build_commandÚget_source_dirrR   r8  r¼   Úget_subproject_dirrV  Úget_log_dir)rk   r  ÚoutputsÚtargetsZuse_llvm_covr~  r@  r<   r<   r=   Úgenerate_coverage_commandÉ  s2   
€ÿþÿüý
øz&NinjaBackend.generate_coverage_commandr  r–   r‚  c                 C  s@   |   ddd¡}|  |g ¡ | dd¡ |  |¡ |  ||¡ d S )Nro  rO  rN  rZ   zGenerates coverage reports)r  rx  rä   r  Úgenerate_coverage_legacy_rules©rk   r  r‚  rÆ   r<   r<   r=   rm  Ý  s
   
z$NinjaBackend.generate_coverage_rulesc                 C  sä   |   ddd¡}|  |dg¡ | dd¡ |  |¡ |rn|   ddd¡}|  |dg¡ | dd	¡ |  |¡ |   d
dd¡}|  |dg¡ | dd¡ |  |¡ t |d¡rp|   ddd¡}|  |dg¡ | dd¡ |  |¡ d S d S d S )Nzcoverage-htmlrO  rN  z--htmlrZ   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  rx  rä   r  r   rt  rz  r<   r<   r=   ry  ä  s(   


ñz+NinjaBackend.generate_coverage_legacy_rulesc                 C  s`   |   ¡  |  ddd¡}| d¡ | dd¡ | d| j ¡ ddg ¡ | d	d
¡ |  |¡ d S )NÚinstallrO  rN  Úallr[   zInstalling files.rZ  ú--no-rebuildrY   rY  )Úcreate_install_data_filesr  rÝ   rä   r   rr  r  ©rk   r  r<   r<   r=   rj  û  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 }|  ddd	d
g¡}| d|¡ | dd¡ | dd¡ |  |¡ | j d¡g d¢ }|  ddd	d
g¡}| d|¡ | dd¡ | dd¡ |  |¡ d S )NTÚtestr}  Ústdsplitz--no-stdsplitÚ	errorlogsz--print-errorlogsrO  r|  rN  rZ  r[   zRunning all tests.rY   rY  )r€  z--benchmarkz	--logbaseZbenchmarklogz--num-processes=1r}  Ú	benchmarkzRunning benchmark suite.)	Úserialize_testsr   rr  r1  rU  r#   r  rä   r  ©rk   rJ   r  r<   r<   r=   ri    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
 ¡ dg }|  t	d|g ddd	¡ d S )NzRules for module scanning.zRules for compiling.zRules for linking.zOther rulesrO  z$COMMANDz$DESCú
restat = 1©r˜   rP  Úgccr¨   )r•   r—   r˜   Ú	COPY_FILErn  rÑ  r°   ú$outzCopying $in to $outÚ
regeneraterî  ÚREGENERATE_BUILDzRegenerating build files.zgenerator = 1)r›  ÚruledictÚadd_rule_commentr‡   Úgenerate_scanner_rulesÚgenerate_compile_rulesÚgenerate_static_link_rulesÚgenerate_dynamic_link_rulesÚadd_ruler   r   rr  rs  )rk   rš   r<   r<   r=   r_    s@   ÿþÿûÿýzNinjaBackend.generate_rulesrˆ   r‡   c                 C  ó   | j  |¡ d S rj   )r›  rã   ©rk   rˆ   r<   r<   r=   rŽ  =  ó   zNinjaBackend.add_rule_commentc                 C  r”  rj   )r`  rã   r•  r<   r<   r=   rb  @  r–  zNinjaBackend.add_build_commentr   r   c                 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   r›  rã   )rk   r   r<   r<   r=   r“  C  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ó   r`  rã   rÒ   r  r   r   rn  rÑ   )rk   r   r<   r<   r=   r  I  s   
ûzNinjaBackend.add_buildr‰   rŠ   c                 C  s8   | j D ]}t|tƒr| ¡  q| jD ]}| |¡ qd S rj   )r`  r   rÌ   rë   r›  rŒ   )rk   r‰   ÚbÚrr<   r<   r=   rq  T  s   

€
ÿzNinjaBackend.write_rulesc                 C  s,   t | jddD ]}| |¡ qt d¡ d S )NzWriting build.ninjarN  zbuild.ninja generated)r   r`  rŒ   r   rh  )rk   r‰   r—  r<   r<   r=   rr  \  s   zNinjaBackend.write_buildsc                 C  s,   |   tdƒ¡ t| jdddƒ}|  |¡ d S )Nz&Phony build target, always out of daterN  rå   r±   )rb  r‡   rÌ   rÍ   r  r  r<   r<   r=   ra  a  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š   r;   r±   rB  rÆ   ú.javac                   ó    g | ]}t j ˆ  ˆ¡|¡‘qS r<   ©rR   r8  r¼   rô  r€   rõ  r<   r=   r„     ó     z4NinjaBackend.generate_jar_target.<locals>.<listcomp>zMETA-INFzMANIFEST.MFTrW  r&  r"  r#  zClass-Path: c                   ó$   g | ]}t j ˆ  |¡| ¡ ¡‘qS r<   ©rR   r8  r¼   r¨  Úget_filenamerí   ry   r<   r=   r„   ˆ  ó   $ r´   r_   Újava_LINKERú-Crî  r   ÚARGS)$r¡  rR   r8  r¼   r¨  r¼  Úget_java_resourcesr   Úget_main_classrº  r  r   r¶  Úendswithrã   Ú"determine_single_java_compile_argsÚgenerate_single_java_compilerô  r   rV  r÷  Údirnamer-  Úanyr¬  rŒ   rñ  rÌ   rÍ   rÝ   rß   Ú)_NinjaBackend__generate_sources_structurer	   rä   r  rä  )rk   r~  rÀ  Úoutname_relÚsrc_listÚ	resourcesZ
class_listr@  rš   r;   rÆ   rB  Ú
main_classrÔ  Zgen_src_listr¹  r-  Úcompile_argsr³  Úplain_class_pathZclass_dep_listZmanifest_pathZmanifest_fullpathZmanifestÚcp_pathsZjar_ruleÚcommandsr  r<   rõ  r=   r  f  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   rO  rZ  Zresgenr[   zCompiling resource zUnknown resource file rî  )r°  rR   r8  r¼   r¾  rb  r¨  rÃ  Úbasenamerô  rÌ   rÍ   rä   r  rã   r&   )
rk   r~  r“   r•   r˜  Zrel_sourcefiler§   Z	ofilebaseÚ	ofilenamer  r<   r<   r=   Úgenerate_cs_resource_tasksŸ  s$   





z'NinjaBackend.generate_cs_resource_tasksc                   sL  |  tdƒ¡}| ¡ }tj ˆ  |¡|¡}| ¡ }|jd }‡ fdd„|D ƒ}g }| 	|j
d ¡}	|	| |¡7 }	|	| |  tdƒ¡¡7 }	|	| |  tdƒ¡¡7 }	t|tjƒr\|	 d¡ nt|tjƒrh|	 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 r<   )rR   r8  rÙ  r½  r¾  ©r   rC   ry   r<   r=   r„   º  rž  z3NinjaBackend.generate_cs_target.<locals>.<listcomp>Úoptimizationrï   z-target:exez-target:libraryzUnknown C# target type.z-gz.mdbz.csr¥  )+rU  r#   r¡  rR   r8  r¼   r¨  r¼  r   Úcompiler_argsr8  Úget_buildtype_argsÚget_optimization_argsÚget_debug_argsr   r   r¦  rã   r¯  r   r¸  Úget_output_argsr¬  Úget_link_argsrº  r  rÄ  r¨  rÙ  Úget_external_depsÚextend_directÚget_project_argsrh  rœ  Úget_global_argsrÌ   rÍ   r—  rÝ   rä   r  r
  rä  )rk   r~  r¹  rÀ  r®  r¯  r@  Zrel_srcsr•   rµ  Zresource_argsZresource_depsr|   Úlnamerv  rÔ  Zgenerated_rel_srcsr¹  r×   r  r<   ry   r=   r  ´  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 )Nr¹  z-sourcepath)r½  rU  r#   r   rÅ  rœ  rÄ  rh  Úget_java_argsrÀ  rô  Úget_classpath_argsÚ
get_subdirrR   r8  r¼   r¾  ÚpathseprÙ  Úinclude_dirsÚget_incdirsÚcurdir)rk   r~  r@  r“   rÍ  Z
sourcepathr‚   Úidirr<   r<   r=   r©  æ  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                   rŸ  r<   r   rí   ry   r<   r=   r„   ø  r¢  z=NinjaBackend.generate_single_java_compile.<locals>.<listcomp>r›  éüÿÿÿÚclassr¥  )r¬  rº  r  r¨  rã   r½  r¾  rÀ  rR   r8  r¼   rô  rÌ   rÍ   r—  rÝ   rä   r  )rk   r³  r~  r@  r“   r•   rÔ  r¹  r³  Úrel_objÚelementr<   ry   r=   rª  ÷  s   


€

z)NinjaBackend.generate_single_java_compilec                 C  s(   d}ddg}d}|   t||g |ƒ¡ d S )Nr£  Újarú$ARGSzCreating JAR $out)r“  r   )rk   r   r‘   rZ   r<   r<   r=   Ú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¿   rž  )r   rª  r«  r¬  r­  Úis_linkable_targetrÓ  rŸ  rÀ  r‹   r   r7  Ú	vala_vapirR   r8  r¼   r¨  rÛ   r…   )rk   r~  rD  r×   r‚   ÚvapinameÚfullnamer<   r<   r=   Údetermine_dep_vapis  s   


ü€z NinjaBackend.determine_dep_vapisr  ú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¾  r¨  r   r£  r¥  r»   Útypern   rª   )rk   r  rž  ÚvapiÚothersZ	othersgenrC   rB  Zsrctyper¸  r+  r<   r<   r=   Ú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|  ||¡}|| |  t!dƒ¡¡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 }|	 |¡ t'|j(ƒdkrJ|j(d du rJ| j )¡ |j(d< t'|j(ƒdkrh|j(d du rhtj | j *¡ dd¡|j(d< t|j+tƒr¨tj |  #|¡|j+¡}|dtj d|j+¡g7 }|	 |¡ t'|j(ƒdkr¨|j(d du r¨tj | j *¡ d¡|j(d< |d  ,¡ D ]}t|t-j.ƒrÄ|  /|¡\}|d| g7 }q®|  0|¡}||7 }| 1|  2|¡¡ || 3d¡7 }t4| j5|	|  6|¡|
| ƒ}| 7d|¡ | 8|¡ |  9|¡ |  :||||
g ¡ |d |d |fS )z?Vala is compiled into C. Set up all necessary build steps here.zVala library z# has no Vala or Genie source files.rž  r   z.cÚ
b_coloroutz--directoryz	--basedirz	--libraryz--headerz--use-headerz--vapiz..r   Tr   rÝ  z--girrr   zgir-1.0z--gresources=r¥  );rß  r&   rª   r   rô  r…   rR   r8  r¼   r¾  rÉ  Úitemsrã   r   r   r¡  r%   Úis_builtrÃ  r¶  r   rs  rV  r   Ú
commonpathÚparentrW  r3   rž   ÚrelpathÚgenerate_basic_compiler_argsÚget_colorout_argsrU  r#   rÖ  r¨  r©  r  r×  r8   Úinstall_dirÚget_includedirÚget_datadirÚvala_girr3  r   ÚGResourceTargetÚget_custom_target_sourcesrÚ  rá  r\  Úget_extra_argsrÌ   rÍ   r—  rä   rÝ   r  rä  )rk   r~  Zvala_srcZvapi_srcZ	other_srcZextra_dep_filesÚ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“   ÚhnamerØ  ZgirnameZgres_xmlZdependency_vapisrÒ  r<   r<   r=   r  V  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ì  r¹  rï   r»  r4  r5  z.pyxrî  r¥  )0r   r   Úget_always_argsr½  rU  r#   r¿  r¾  Úget_option_compile_argsÚget_optionsr   rÅ  rœ  rÄ  rh  rï  r¼  r¨  rR   r8  r¼   rô  rÌ   rÍ   r—  r×  r   rs  rV  rä   r  rã   r½  r¾  r   r£  r   r%   rÉ  r   r   r§  r  r  r  r   r  rß   )rk   r~  Zstatic_sourcesrÔ  Zcython_sourcesrì  r“   r’  Zpyx_sourcesr³  rK  rÒ  r±  ÚgenZssrcrÇ  r<   r<   r=   r  Ã  sv   

ý


ý


ÿ
þý
€è
z&NinjaBackend.generate_cython_transpiler³  ú'mesonlib.FileOrString'rK  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Ø  rv  rÌ   rÍ   r3   rß   r  )rk   r³  rK  Úinstrr  r<   r<   r=   Ú_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 rj   )rÓ  râ  r   r   r	   rÀ  rª   rã   r3   rø  r£  rb  )
rk   rù  rú  Ú
first_filerÔ   r8  ÚfilesrÕ  r¾   rB  r<   r<   r=   Z__generate_sources_structure  s*   
€€ûøz)NinjaBackend.__generate_sources_structurerª   Ú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­   r<   r<   r=   r>   -  s   
 z6NinjaBackend._add_rust_project_entry.<locals>.<lambda>r1   ú=r¿   z--cfg)r  r  r  )r   ÚfirstÚreversedr‹   Úiterrã   Únextrž   r8   rú   r  )rk   rª   rÿ  r“   r   r  r•   Zraw_editionrÿ   r  Zarg_itrr2   rõ   r<   r<   r=   Ú_add_rust_project_entry*  s,   
€÷z$NinjaBackend._add_rust_project_entryÚ
dependencyr*   c                 C  s   |j  |j|j¡ dd¡S )Nú-r†  )Úrust_dependency_maprT   rª   rE   )rk   r~  r  r<   r<   r=   Ú_get_rust_dependency_nameF  s   z&NinjaBackend._get_rust_dependency_namec           (   
     s´  |j d }| ¡ }| ¡ ‰ ˆ t  ||¡7 ‰ ˆ |¡ g }g }g }d }|jr˜|j ¡ r@ˆ tˆ 	|¡ƒd |j¡\}}| 
|¡ nX|j ¡ }	t|	tƒrQ|	 ˆj¡}n!t|	tƒretj ˆ 	|¡|	 ¡ d ¡}ntj |	 ¡ |	 ¡ d ¡}|j ¡ D ] ‰tˆtƒrˆ| ˆ ˆj¡¡ qw| 
‡‡fdd„ˆ ¡ D ƒ¡ qw| ¡ 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| ¡ ¡}|j }ˆ  
d	|g¡ |d
v r"ˆ  
| !¡ ¡ ˆ ˆ "||d¡7 ‰ ˆ d|j# $dd¡ $dd¡ $dd¡g7 ‰ tj |j|j#d ¡}ˆ dd|› dd|› g7 ‰ ˆ dˆ 	|¡g7 ‰ ˆ dd| %¡  g7 ‰ ˆ | &d¡7 ‰ t|t'j(ƒs›z| )t*dƒ¡}| )t*dƒ¡}ˆ | +||¡7 ‰ W n
 t,yš   Y nw t- .|j/d¡r¦d‰nd‰d;d<‡ ‡fd"d#„}t- 0¡ }|j1 2¡ }| 3¡ }|D ]Ÿ}| 4|j¡ | ˆ 5|¡¡ | 6¡ r|t7 8|j9|j:¡vrâqÀˆ ;||¡}ˆ d$d% <|tj |j|j=¡¡g7 ‰ | t>|ˆj?|j# j@ƒ¡ qÀt|t'j(ƒr| 
|j1¡ ˆ A|¡}||j:v }t|t'j(ƒrAt|t'j(ƒ}ˆr5tj B|¡n|j#}||||d& qÀ|rV|jC D|g¡}ˆ d'd„ |D ƒ7 ‰ qÀˆ  d(|› ¡ qÀ|D ]e}| E¡ D ]]}||jFv rrqh| Gd)¡rˆ  |¡ qh| Hd*¡r¼t|t'j(ƒr¼tj I|¡\}}| 4|¡ ˆs°tj J|¡\}}| Gd+¡r°|d,d … }| Hd-¡}|||ƒ qhˆ  d(|› ¡ qhqb|D ]}|pÐd}ˆ  d)|› ¡ qÊˆ  
d.d/„ | Kd¡D ƒ¡ tLd0d/„ |D ƒƒ} tLd1d/„ |D ƒƒ}!|d2v s|!rˆ dd3g7 ‰ t|t'jMƒs| r\tN|j#ƒr(tj tj O|j#¡ˆ P|¡¡}"nˆ P|¡}"| QˆjRˆjR S¡ |"ˆ T|¡|jU|jV¡\}#|_W|#D ]}$ˆ dd4|$ d5 tj | X¡ d+¡ g7 ‰ qEd }%tY|d6dƒd7krutj Ztj |j| ¡ ¡¡}%ˆ [|j#tj Ztj ˆjRj\|¡¡ˆ t]|j^ƒ|%|¡ ˆ _|¡}&t`ˆja||&|ƒ}'|r£|' b|¡ |r«|' c|¡ |' dd8ˆ ¡ |' dd9|¡ |' dd:|¡ ˆ e|'¡ t|t'jMƒrÎˆ f|¡ ˆ g||ˆ |gg ¡ d S )=Nr‰  Z
structuredr   c                   s    g | ]}t j ˆjˆ j|¡‘qS r<   )rR   r8  r¼   r¾  rb  rº  )rB  rk   r<   r=   r„   v  ó    ÿz5NinjaBackend.generate_rust_target.<locals>.<listcomp>zRust target z! contains a non-rust source file.zKA Rust target has no Rust sources. This is weird. Also a bug. Please reportz--crate-type>   ÚdylibÚbinFz--crate-namer  r†  r´   rî  z.dz--emitz	dep-info=zlink=z	--out-dirr¤  z	metadata=r¹  Úb_vscrtz	>= 1.67.0z	+verbatimr±   Úlibnamer3   Ústaticr^   Úbundlec                   s`   |rdnd}g }|s|r|  d¡ ˆr|  ˆ¡ |r#|dd |¡ 7 }ˆ   d|› d| › ¡ d S )Nr  r  z-bundleú:ú,ú-lr  )rã   r¼   )r  r  r  Útype_Ú	modifiers)r“   Úverbatimr<   r=   Ú_link_library¯  s   

z8NinjaBackend.generate_rust_target.<locals>._link_libraryz--externz{}={})r  c                 S  s   g | ]}d |› ‘qS )ú-Clink-arg=r<   r¦   r<   r<   r=   r„   ã  r?   r  ú-L)z.dllz.soz.dylibú.aú.libÚlibrr   )r  r  c                 s  s    | ]}d |› V  qdS )r  Nr<   r¦   r<   r<   r=   rî      s   € z4NinjaBackend.generate_rust_target.<locals>.<genexpr>c                 s  s    | ]	}t |tjƒV  qd S rj   )r   r   r¯  ©r   r×   r<   r<   r=   rî     s   € c                 s  s"    | ]}|  ¡ o|jd kV  qdS )r  N)r  Úrust_crate_typer  r<   r<   r=   rî     s   € þ
ÿ>   r  ú
proc-macrozprefer-dynamicz	link-arg=r  r  r   r¥  rX   Ú	cratetype©F)r  r3   r  r^   r  r^   )hr   rô  r¼  Úget_base_compile_argsr
  rú  Ú
needs_copyr­  r	   rô  rá  rý  r   r   r½  r¾  r%   rR   r8  r¼   r£  rÉ  Úas_listrã   r¼  Úcan_compiler&   Úget_basenamer   ÚRuntimeErrorrb  r¡  r  Úget_linker_always_argsrç  rª   rE   rf  rï  r   r®  rU  r#   Úget_crt_link_argsÚKeyErrorr   rt  r:  r   Úexternal_depsrÑ  rH  rÛ   Úget_dependency_filenameÚuses_rust_abirª  r«  r¬  r­  r
  r»   rA  rô   r  rû   Úget_target_filename_for_linkingr¶  rå  Úget_link_whole_forrÁ  Únative_static_libsrž   r¨  r‹   rÃ  Úget_used_stdlib_argsr¬  r¯  r"   r«  r¨  Úbuild_rpath_argsr   rV  Údetermine_rpath_dirsÚbuild_rpathÚinstall_rpathÚrpath_dirs_to_removerŽ  ÚgetattrÚabspathr  rv  r^   rh  r—  rÌ   rÍ   rß   rÝ   rä   r  Úgenerate_shsymrä  )(rk   r~  ÚrustcÚ
base_proxyr•   Zproject_depsrÔ   rÿ  Z_odsrD  r‚   rÀ  rl  r!  r—   r¹  Zcrtr  Zlinkdirsr,  Ztarget_depsr  Zd_namer  Ú
link_wholer  r  Zlink_whole_argsrÆ   r§   Údir_r’  Zhas_shared_depsZhas_rust_shared_depsÚtarget_slashname_workaround_dirÚ
rpath_argsZ	rpath_argr  Úcompiler_namerÒ  r<   )r“   rB  rk   r  r=   r  L  sJ  


ÿÿÿ




ÿ
€

÷


&ÿ

"



ð
þÿ
ûÿ	*û




z!NinjaBackend.generate_rust_targetrœ  r   c                 C  s   t ddƒ|  S )NÚ
_FOR_BUILDr±   )r   )rœ  r<   r<   r=   Úget_rule_suffix?  s   zNinjaBackend.get_rule_suffixÚCOMPILERrÉ  Úmodec                 C  s   |› d|› |   |¡› S )Nr†  )rC  )ÚclsrÉ  rœ  rE  r<   r<   r=   Úget_compiler_rule_nameC  s   z#NinjaBackend.get_compiler_rule_namer@  r   c                 C  s   |   | ¡ |j|j¡S rj   )rG  rÞ  rœ  rE  ©rF  r@  r<   r<   r=   r—  G  s   z"NinjaBackend.compiler_to_rule_namec                 C  s   |   | ¡ |jd¡S )NZPCH)rG  rÞ  rœ  rH  r<   r<   r=   r˜  K  s   z&NinjaBackend.compiler_to_pch_rule_namec                 C  s   t j |  |¡|  |¡d ¡S )Nz.swiftmodule)rR   r8  r¼   rô  Útarget_swift_modulenamerõ  r<   r<   r=   Úswift_module_file_nameO  s   ÿz#NinjaBackend.swift_module_file_namec                 C  s   |j S rj   )rª   rõ  r<   r<   r=   rI  S  r{   z$NinjaBackend.target_swift_modulenamec                 C  s.   g }|j D ]}|  |¡r| |  |¡¡ q|S rj   )r¬  Úis_swift_targetrã   rJ  ©rk   r~  rD  r|   r<   r<   r=   Údetermine_swift_dep_modulesV  s   

€z(NinjaBackend.determine_swift_dep_modulesc                 C  s$   g }|j D ]
}| |  |¡¡ q|S rj   )r¬  rã   rñ  rL  r<   r<   r=   Úget_swift_link_deps]  s   
z NinjaBackend.get_swift_link_depsc                 C  sD   |   |¡}g }g }|D ]}| d¡r| |¡ q| |¡ q||fS )Nz.swift)rº  r¨  rã   )rk   r~  Zall_srcsr·  rÞ  r‚   r<   r<   r=   Úsplit_swift_generated_sourcesc  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.TrW  r»  rï   ©r±   rî  Fc                   ó    g | ]}t j ˆ j ¡ |¡‘qS r<   ©rR   r8  r¼   r   rV  r·   ry   r<   r=   r„   ž  rž  z6NinjaBackend.generate_swift_target.<locals>.<listcomp>r±   rî  r  c                   rQ  r<   rR  r·   ry   r<   r=   r„   ¥  rž  r   z.or¥  ZRUNDIRz:Swift supports only executable and static library targets.)@rI  r   r¼  r&  r½  r¾  rR   r8  rÙ  r¼   r   rV  rã   r¤  Zget_header_import_argsr&   r'  r÷  rø  Úget_compile_only_argsr¾  rU  r#   r¿  Zget_module_argsr   rÄ  rh  rœ  rÅ  r  Úget_include_dirsÚ
get_curdirrÌ  ró  rÀ  rñ  Úget_project_link_argsÚget_global_link_argsrô  rJ  rM  Údetermine_swift_dep_dirsrN  r¬  r¨  rO  r¶  rÃ  r—  rÌ   rÍ   rÝ   rä   r  Zget_mod_gen_argsr   r®  r  Ústatic_linkerr¦  Úget_std_exe_link_argsr   rä  )&rk   r~  Úmodule_nameÚswiftcZabssrcZrelsrcZabs_headersZheader_importsr‚   ZrelsZabssZrelhZabshr²  Úbasedirr  ÚexpdirÚ
srctreedirÚsargsÚ	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  r<   ry   r=   r  n  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™   )Úcan_linker_accept_rspÚrsp_file_syntax)rk   rd  r^  r<   r<   r=   Ú_rsp_optionsÎ  s   zNinjaBackend._rsp_optionsc                 C  sL  | j jjtdƒ j}d| j jjjv r|  ¡  tD ]‹}| 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 }|jd	kr| |¡ g }| j  |d
¡}|d u rud
g}| dg| ddg ¡ d}|dkrŠd}	nd }	|  |¡}
|  t||||fi |
¤d|	i¤Ž¡ qd S )NrM  rš  zSTATIC_LINKER{}r°   c                 S  s   g | ]}|  d ¡‘qS )rŠ  )r»   r£   r<   r<   r=   r„   ì  r?   z;NinjaBackend.generate_static_link_rules.<locals>.<listcomp>ú
$LINK_ARGSrŠ  ÚapplearÚranlibrN   z-czLinking static target $outr   úpool = link_poolr˜   )r   r1  r^  r#   rÇ   r   r2  rÕ  r   r   rY  r»   rC  r   r   r   rQ   Úexecute_wrapperÚrmfile_prefixr<  r0   r…   rÀ  rq   rv   r5  rá  Úlookup_binary_entryri  r“  r   )rk   r}  rœ  rY  r   Úcmdlistr“   rl  rZ   rY   r^  r<   r<   r=   r‘  Ù  s:   



&Öz'NinjaBackend.generate_static_link_rulesc              	   C  sr  | j jjtdƒ j}tD ]ƒ}| 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| j j|  ¡ rd |  	|¡¡}d}	| ¡ }g }i }|  t||||	fi |¤dd i¤Ž¡ q| j  ¡ dd| j  ¡ dddg }d}|dg }d}d}|  t||g ||d¡ d S )NrM  >   rì  rê  r‰  rž  rš  z{}_LINKER{}rÔ  rŠ  r°   rj  zLinking target $outr   rm  r˜   zAIX_LINKER{}zArchiving AIX shared libraryrn  Zsymbolextractorz$IMPLIBÚSHSYMz$CROSSzGenerating symbol file $outr†  r‡  )r   r1  r^  r#   rÇ   r   r   râ  r»   rC  rç  r0   r…   Úget_linker_output_argsrq   rv   ri  r“  r   r!  r"  Úget_command_to_archive_shlibrr  rV  )rk   r}  rœ  ZcomplistÚlangnamer@  r   r‘   r“   rZ   rY   r^  rq  ZsymruleZsymcmdZsyndescZsynstatr<   r<   r=   r’  		  sJ   "
&$€ûÿ
z(NinjaBackend.generate_dynamic_link_rulesc                 C  s6   |   |¡}| ¡ ddg }d}|  t||g |ƒ¡ d S )NrÔ  r°   zCompiling Java object $in©r—  r<  r“  r   ©rk   r@  r   r‘   rZ   r<   r<   r=   Úgenerate_java_compile_rule0	  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™   )r—  r<  r“  r   r   rQ   rh  )rk   r@  r   r‘   r“   rZ   r<   r<   r=   Úgenerate_cs_compile_rule6	  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 $inr†  r‡  rv  rw  r<   r<   r=   Ú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°   r†  )r—   r˜   )
r—  r<  Úget_dependency_gen_argsr0   r…   rÀ  rq   rv   r“  r   )rk   r@  r   rZ   r‘   Údepargsr—   r“   r<   r<   r=   Úgenerate_cython_compile_rulesE	  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—   rv  )rk   r@  r   r‘   rZ   r—   Zdepstyler<   r<   r=   Úgenerate_rust_compile_rulesT	  s   
ÿz(NinjaBackend.generate_rust_compile_rulesc                 C  sP   |   |¡}| j ¡ g d¢ }|| ¡  }|ddg }d}|  t||g |ƒ¡ d S )N)rn  Z
dirchangerz$RUNDIRrÔ  r°   zCompiling Swift source $in)r—  r   rr  r<  r“  r   )rk   r@  r   Zfull_exeZinvocr‘   rZ   r<   r<   r=   Ú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.rQ  )r   rt  r\  ry   r<   r<   r=   Úuse_dyndeps_for_fortrani	  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_HACKrJ   z/CÚtruezWorkaround for these issues:
https://groups.google.com/forum/#!topic/ninja-build/j-2RfBIOd_8
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485zDep hackr†  r‡  )rƒ  r   rQ   rŽ  r‡   r“  r   )rk   r„  r   rJ   r<   r<   r=   Úgenerate_fortran_dep_hacko	  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  rœ  rG  r<  r0   r…   rÀ  rq   rv   rS  ri  r“  r   )rk   r@  r   r‘   r“   rZ   r^  r<   r<   r=   Ú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 )Nrš  rê  rž  r‰  rë  rì  r  r†  r˜   rŠ  r¨   rÔ  r°   z
Compiling z object $outr%  rˆ  r€  )rx  r   r!  Úmatches_build_machinerœ  rz  r{  r  r‚  r  rC  ri  r‡  r—  r0   r…   r}  rq   rv   r<  rÀ  rS  Úget_display_languager6  r“  r   )rk   ru  r@  r„  r^  r   r~  r‘   r“   rZ   r•   r—   r<   r<   r=   Úgenerate_compile_rule_for‰	  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|jv r=d|d _	| 
¡ dg | | d	g }n| 
¡ dg | | | ¡  d	g }d
}| ¡ dkr\d}d }	nd}d}	|  t||g |||	d¡ d S )N>   r3  rš   rŠ  r¨   r%  Úmwccz-precompiler   rÔ  r°   zPrecompiling header $inrˆ  r€  )r˜  r}  r6  r0   r…   rÀ  rq   rv   r5  rC   r<  rS  r“  r   )
rk   ru  r@  r   r~  rK  r‘   rZ   r•   r—   r<   r<   r=   Úgenerate_pch_rule_for³	  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?  rn  )z$picklefilerŠ  r°   zModule scanner.)r  r   rr  r   r“  )rk   rÒ   r‘   r“   rZ   r   r<   r<   r=   r  Í	  s   
ÿz#NinjaBackend.generate_scanner_rulesc                 C  sv   t D ]6}| jjj| }| ¡ D ](\}}| ¡ dkr|  |¡ |  ||¡ |  ||¡ | 	¡ D ]}|  ||¡ q.qqd S )Nrm  )
r   r   r1  r   râ  rf  r‰  rŒ  rŽ  Ú	get_modes)rk   rœ  Úclistru  r@  rE  r<   r<   r=   r  Ù	  s   
ÿûþz#NinjaBackend.generate_compile_rulesc                 C  s2   |  ¡ D ]}t|tjtjfƒrq|  ||¡ qd S rj   )r   r   r   r¡  r¢  rI  )rk   r~  r²  r<   r<   r=   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@©rE   r¾  r·   )Úreloutrk   r<   r=   r„   ó	  ó    ÿz.NinjaBackend.replace_paths.<locals>.<listcomp>c                   ó   g | ]}|  d ˆ ¡‘qS )z@CURRENT_SOURCE_DIR@©rE   r·   )Úsource_target_dirr<   r=   r„   õ	  r¹   c                   s"   g | ]}|  d ˆ j¡  dd¡‘qS )z@SOURCE_ROOT@z@BUILD_ROOT@rî  r‘  r·   ry   r<   r=   r„   ö	  r“  c                 S  s   g | ]}|  d d¡‘qS )r5   rì   r•  r·   r<   r<   r=   r„   ø	  r¹   )rR   r8  r¼   r¾  Úget_target_source_dirrô  )rk   r~  r“   Úoverride_subdirr<   )r’  rk   r–  r=   Úreplace_pathsí	  s   

ÿ
ÿzNinjaBackend.replace_pathsr²  úbuild.GeneratedListc                   s¤  |j D ]}t|tjƒrˆ |ˆ¡ q| ¡ }|j}| ¡ }| ¡ }| 	¡ }ˆ 
|¡}	t|ƒD ] \}
}t|jƒdkrGtj ˆ ˆ¡||
 ¡‰n|› ‰| ˆjˆ ˆ¡¡‰| ˆ¡}| |¡}‡‡fdd„|D ƒ}|jd u rrd}|}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 |j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ˆ›}|r*d|› d}| %dd|› |› ¡ t|tj&ƒrD| $ˆ '|¡¡ | %d|¡ ˆ (|¡ q.d S )Nr   c                   rœ  r<   r  )r   Úofrõ  r<   r=   r„   
  rž  z<NinjaBackend.generate_genlist_for_target.<locals>.<listcomp>rO  rP  c                   r”  )z	@DEPFILE@r•  r·   )r—   r<   r=   r„   
  r¹   c                   s    g | ]}|  d ˆ ¡  dˆ¡‘qS )z@INPUT@z@OUTPUT@r•  r·   )Ú
infilenameÚsole_outputr<   r=   r„   
  r  )r˜  r   )rF  rS  TrW  c                   rµ   r<   )rñ  r·   ry   r<   r=   r„   %
  r?   rá   zfrom rU  rV  r[   zGenerating rZ  ))Údependsr   r   r%   rI  Úget_generatorrb  Úget_exeÚ
get_inputsr£  r\  Ú	enumerater8   rv  rR   r8  r¼   rô  r½  r¾  Úget_arglistÚget_outputs_forr—   ra  Úreplace_outputsr™  r_  Úreplace_extra_argsrF  rS  r   rV  r¨  r÷  rÌ   rÍ   rÝ   rä   rd  rñ  r  )rk   r²  r~  r­   Ú	generatorrb  ÚexeÚ
infilelistÚoutfilelistZextra_dependenciesr‚   ZcurfileZ	base_argsrÄ   rÒ   r“   Zdepfilenamerq  rd  rf  r  Úwhatr<   )r—   rœ  rk   r  r~  r=   rI  û	  sp   
€




ÿ

ý

Î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   r1  r   r2  râ  r  r'  r@   r?  ÚFORTRAN_MODULE_PATÚ
IGNORECASEÚFORTRAN_SUBMOD_PATr¼  r&  r×  rs  rV  r-  r,  r9   rÄ  r&   r‹   )rk   r~  r@  rÉ  rš   ZmodreÚsubmodreZmodule_filesZsubmodule_filesrC   rA  rB  rñ   ZmodmatchÚmodnameÚsubmodmatchÚparentsZ
submodnamer<   r<   r=   r	  9
  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)rk   r@  r³  r~  r«  ÚtdepsÚsrcdirÚ	mod_filesr<   r<   r=   Úget_fortran_depso
  s   
zNinjaBackend.get_fortran_depsc                 C  s*   t |dƒr|j| jj|j v r| ¡ S g S )Nr4  )rŸ  r4  r   Ústdlibsrœ  Úget_no_stdlib_link_args)rk   r~  rå  r<   r<   r=   r½  }
  s   z$NinjaBackend.get_no_stdlib_link_argsc                 C  s<   |  ¡ r|  |¡}|s|  |¡}|j|ddS |j|ddS )NT)ÚpchF)r  Úget_target_debug_filename_absÚget_target_filename_absÚget_compile_debugfile_args)rk   r@  r~  ÚobjfileZ	tfilenamer<   r<   r=   rÁ  ‚
  s   1

z'NinjaBackend.get_compile_debugfile_argsc                 C  ó   |  |  |¡¡S rj   )Úget_link_debugfile_nameÚget_target_debug_filename©rk   rå  r~  r<   r<   r=   rÄ  »
  r–  z$NinjaBackend.get_link_debugfile_namec                 C  rÃ  rj   )Úget_link_debugfile_argsrÅ  rÆ  r<   r<   r=   rÇ  ¾
  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ˆ  r¥  )rô  r!   r   r3  r¼  r#  r   r   rã  rR   r8  r¼   rb  rÀ  Úisabsr¶  Úcanonicalize_filenamerô  r   r!  rœ  Úget_object_suffixrÁ  r½  r¾  r&   rG  rÌ   rÍ   rä   r  )rk   r~  r³  r<  r@  rµ  Zsrc_filenameÚobj_basenamerÑ  r¹  rA  rÒ  r<   r<   r=   r  Á
  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 )NrP  )	rR   r8  rÙ  r¼   r¾  ró  Úisdirr   rV  )	rk   r@  r  r]  rò  r^  r_  r`  Zbargsr<   r<   r=   Úgenerate_inc_dirá
  s   ÿzNinjaBackend.generate_inc_dirÚis_generatedú'CompilerArgs'c                 C  s"   |   ||¡}||  |||¡7 }|S rj   )Ú"_generate_single_compile_base_argsÚ$_generate_single_compile_target_args)rk   r~  r@  rÑ  rµ  r<   r<   r=   Ú_generate_single_compile÷
  s   z%NinjaBackend._generate_single_compilec                 C  s4   |  ¡ }| ¡ }|| |j¡7 }|t ||¡7 }|S rj   )rô  r¼  Úgnu_symbol_visibility_argsÚgnu_symbol_visibilityr   r#  )rk   r~  r@  r<  rµ  r<   r<   r=   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 )Nrž  r  F)rç  Úimplicit_include_directoriesÚ"get_custom_target_dir_include_argsr  rT  rU  rÌ  rÐ  rò  Úget_extra_build_dirsró  Úescape_extra_argsrï  rÞ  r4  Úget_feature_argsÚ
d_featuresr¾  Úget_source_dir_include_argsÚget_build_dir_include_argsrô  )rk   r~  r@  rÑ  Úno_warn_argsrµ  r‚   r]  r  Zcompile_objÚincludeargsr<   r<   r=   rÔ    s,   

ÿ
z1NinjaBackend._generate_single_compile_target_argsúdict[str, list[str]]c                 C  s    i }|   |¡}|j ¡ D ]A}|j| }|  ||¡}|r(d|jvr(||  ||¡7 }|| j||dd7 }|rAd|jv rA||  ||¡7 }|j |¡}| 	¡ ||< q|S )NÚmwF)rÑ  )
r  r   r  rÓ  r5  Úget_pch_include_argsrÔ  r@  r¼  râ   )rk   r~  Zsrc_type_to_argsr0  Zsrc_type_strr@  rµ  r<   r<   r=   re  J  s   

z6NinjaBackend.generate_common_compile_args_per_src_typerí  ú+T.Optional[T.List['mesonlib.FileOrString']]r8  ú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 ¡ |ƒ}|  ||¡}	|  |¡o7|dk}
|
rGd|j	vrG|	|  
||¡7 }	|	|  |||¡7 }	|
r_d|j	v r_|	|  
||¡7 }	|	j |	¡}	|du ru|  |||	|gg |¡ n|  |||	g |g|¡ | j ¡ }t |tƒr«| | j¡}tj |¡rª|jrª| |¡s J ‚|t|ƒd d… }n|r´td|›ƒ‚td	|›ƒ‚|  ||¡}tj |  |¡|¡}| |¡}|	|  |||¡7 }	|  |¡rå|  |j!¡}ng }|sìg }n |j	d
krôg }ng }tj |  |¡| "|d ¡¡}| #|¡ |}|  $|¡}g }| %¡ dkrq|s,t&|ƒ| }||  '|||¡7 }|  (¡ sg| j)| *¡   +¡ D ],\}}tj |  |¡| ,|¡¡}||kre|  -|j.¡}t/| j0|d| |ƒ}|  1|¡ q:|	| 2|  |¡¡7 }	|dur{|	 3|¡ t/| j0|||ƒ}|  4|||¡ |D ]}| 5|¡ qŒ|D ]%}t |tƒr¦| | j¡}n|  6|¡s¶tj |  |¡|¡}| 7|¡ q—| 5|¡ |  8||¡D ]}| 7|¡ qÈ|rÚ| 9d|¡ | 9d|	¡ |  :||||¡ |  1|¡ 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¾  rä  Fr   z/BUG: broken generated source file handling for rÈ  Úintelr   r  r…  rá   r¥  r5   rì   )<r   r3   r¨  r  r!   r   r3  rÓ  r  r5  rå  rÔ  r@  r¼  rä  r   rV  r   r½  r¾  rR   r8  rÉ  rã  rž   r8   r&   Úobject_filename_from_sourcer¼   rô  Údepfile_for_objectrÁ  Úget_pchr4  Úget_pch_namerã   r—  rÞ  r	   r»  rƒ  r  r'  râ  Úmodule_name_to_filenamerC  rœ  rÌ   rÍ   r  Úget_module_outdir_argsrá  Úadd_header_depsrÝ   Úhas_dir_partrß   Úget_fortran_orderdepsrä   Ú)add_dependency_scanner_entries_to_elementrE   )rk   r~  r³  rÑ  r±  rí  r8  rÎ  r@  rµ  r0  rv  r¹  rÌ  rÑ  Zdep_fileÚpchlistZpch_depÚarrr‚   rA  Z
extra_depsr.  r´  ÚsrcfileZmodfiler„  ZdepelemrÒ  r  r<   r<   r=   r  c  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   rF  r  r3  rW   )r;  r   r   r  rR   r8  rÃ  rÀ  rÄ  r   r7  r@  rä   rß   )rk   r~  r@  rÒ  r³  Ú	extensionZdep_scan_filer<   r<   r=   rò  Þ  s   

z6NinjaBackend.add_dependency_scanner_entries_to_elementc                 C  s   t j |  |¡d¡S )Nz
depscan.ddr  rõ  r<   r<   r=   r@  ì  s   z"NinjaBackend.get_dep_scan_file_forc                 C  sN   |D ]"}t |tƒr| | j¡}n|  |¡stj |  |¡|¡}| 	|¡ qd S rj   )
r   r   r½  r¾  rð  rR   r8  r¼   rô  rÝ   )rk   r~  Zninja_elementr±  r  r<   r<   r=   rï  ï  s   

ûzNinjaBackend.add_header_depsrÀ  rÖ  c                 C  s   t |tƒr
|jdkS t|ƒS rÏ   )r   r   rb  r"   )rk   rÀ  r<   r<   r=   rð  ÷  s   

zNinjaBackend.has_dir_partc                   s,   |j dkrg S ‡ fdd„t |j|j¡D ƒS )Nr  c                   rŸ  r<   r   )r   Últry   r<   r=   r„     s    ÿÿz6NinjaBackend.get_fortran_orderdeps.<locals>.<listcomp>)r4  rª  r«  r¬  r­  )rk   r~  r@  r<   ry   r=   rñ    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î  )rì  rR   r8  r¼   rô  rç  r8   Úcreate_msvc_pch_implementationrÞ  r«  r¾  Úget_source_subdirró  r¶  Úgen_pch_argsrÕ  rÁ  Úget_depfile_suffix)rk   r~  r@  r¾  ÚheaderÚpchnameÚdstrµ  rÇ  Zpch_header_dirZ	just_nameÚobjnameZpch_argsr×   r<   r<   r=   Ú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¿   Úhr3  r”  z
c++-header)
rÕ  r‹   r4  rR   r8  r¼   rô  r¶  Úget_pch_suffixrû  ©rk   r~  r@  r¾  rµ  rþ  r×   r<   r<   r=   Úgenerate_gcc_pch_command#  s   ÿz%NinjaBackend.generate_gcc_pch_commandc                 C  s\   |   ||¡}tj |  |¡tj |¡d | ¡  ¡}tj |¡d d | ¡  }|||g fS )Nrî  r   )	rÕ  rR   r8  r¼   rô  r¶  r  rÃ  rû  r  r<   r<   r=   Úgenerate_mwcc_pch_command.  s   ÿz&NinjaBackend.generate_mwcc_pch_commandc                 C  sž  |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 ¡}nD|jdkrYqd|jv r{tj 	| j
| ¡ |d ¡}|  |||d ¡\}}	}
}d }ntj 	| j
| ¡ |d ¡}|  |||d ¡\}}	}
}d }||7 }|  |¡}t| j||
g ||ƒ}|d ur´| |¡ |  |||¡ | d	|¡ | d
|	¡ |  |¡ q|S )N)rš   r3  r   r¿   zPrecompiled header of zN must not be in the same directory as source, please put it in a subdirectory.r%  rè  r  r¥  rá   )rë  r"   r'  r&   r   r6  r   rR   r8  r¼   r¾  rù  r5  r  r  r˜  rÌ   rÍ   rÝ   rï  rä   r  )rk   r~  r±  r1  rÉ  r¾  r+  r@  rµ  r×   rþ  Úobjsr³  ZextradeprÒ   r  r<   r<   r=   r  5  s@   





zNinjaBackend.generate_pchc                 C  s    |   |¡}tj || ¡ d ¡S )Nz.symbols)rô  rR   r8  r¼   r¡  )rk   r~  Ú	targetdirr<   r<   r=   Úget_target_shsym_filenameZ  s   
z&NinjaBackend.get_target_shsym_filenamec                 C  sj   |   |¡}|  |¡}t| j|d|ƒ}| d|  |¡¡ | j ¡ r.| dd| jj|j	 j
 ¡ |  |¡ d S )Nrr  ZIMPLIBZCROSSz--cross-host=)rñ  r  rÌ   rÍ   rä   r/  r   Úis_cross_buildr!  rœ  Úsystemr  )rk   r~  Ztarget_fileZsymnamer  r<   r<   r=   r:  _  s   


zNinjaBackend.generate_shsymc                 C  s   t j |  |¡|j¡S rj   )rR   r8  r¼   r¨  Úimport_filenamerõ  r<   r<   r=   Úget_import_filenamei  s   z NinjaBackend.get_import_filenamec              	   C  sz  g }t |tjƒrE|| ¡ 7 }|jr|| | j¡7 }|jr&|| |  	|¡¡7 }|j
r/|| ¡ 7 }|jrCt|dƒrC|| |j | j¡¡7 }|S t |tjƒr¥t |tjƒr[|| | ¡ ¡7 }n|| ¡ 7 }|| ¡ 7 }t |tjƒrp|jr‚|| | 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¦  rZ  Úexport_dynamicÚgen_export_dynamic_link_argsr   r  Úgen_import_library_argsr  ÚpieÚget_pie_link_argsÚvs_module_defsrŸ  r  r½  r¾  r¯  ÚSharedModuleÚget_std_shared_module_link_argsrô  Úget_std_shared_lib_link_argsÚget_pic_argsÚforce_sonameÚget_soname_argsÚprefixrª   rÈ  Ú	soversionÚdarwin_versionsr®  Úget_std_link_argsÚshould_installr(  )rk   r~  rå  rµ  r<   r<   r=   Úget_target_type_link_argsl  s>   êþüÿz&NinjaBackend.get_target_type_link_argsc                 C  sB   g }t |tjƒr| jj|j }| ¡ s| ¡ r|| |j	¡7 }|S rj   )
r   r   r¦  r   r!  rœ  rQ   Ú	is_cygwinÚget_win_subsystem_argsÚwin_subsystem)rk   r~  rå  rµ  r;   r<   r<   r=   Ú+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   )r5  r   rt  r:  r­  Úextract_all_objectsÚdetermine_ext_objsrá  r  Úbuild_target_link_argumentsr0  )rk   rå  r~  Z
use_customZobjects_from_static_libsr×   r|   Ztarget_argsr<   r<   r=   Ú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)Úcompilers.cr(  Ú_get_trials_from_patternÚ_get_file_from_listr   )	rk   rå  r  Úsearch_dirsÚpatternsr(  r  rE  Útrialr<   r<   r=   Ú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   rV  r  Únative_args_to_unixrž   r8   r  ÚStopIterationr   rn  rR   r8  rÉ  r¼   rÛ   r  Úisfilerã   r1  r   ÚSTATICÚSHAREDrß  Úget_library_dirsr/  Úresolverc  r   r   ÚAttributeErrorr3   )rk   rå  r~  rµ  Úinternalr,  ÚlibsZabsolute_libsrv  ÚitÚitemr8  r  Zguessed_dependenciesZstatic_patternsZshared_patternsr  Z
staticlibsZ
sharedlibsrÆ   r<   r<   r=   Ú guess_external_link_dependenciesÁ  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.orO  rZ  rZ   zPrelinking rî  )r   r   r®  rR   r8  r¼   rô  rª   rÌ   rÍ   Úget_prelinkerÚexelistÚget_prelink_argsr™  rä   r  )rk   r~  r(  Úprelink_namer  Ú	prelinkerrJ   r<   r<   r=   r    s   
zNinjaBackend.generate_prelinkú#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 ]}| -| .|¡¡ q0| )¡ D ]}t |tjƒrY| ,¡ D ]}| -| .|¡¡ qMq@|ˆ  /||¡7 }t |t0ƒrr|| 1| 
¡ ¡7 }g }| 2ˆ  3||||¡¡ ˆ  4|¡}||7 }||7 }||7 }| 2‡ fdd„|D ƒ¡ | 2‡ fdd„|j5D ƒ¡ t6ˆ j7||
||d}| 8|| ¡ | 9d	|¡ ˆ  :|||¡ |S )
Nr5  Z_LINKERr¹  rï   c                   rµ   r<   ©r-  rð  ry   r<   r=   r„   ™  r?   z.NinjaBackend.generate_link.<locals>.<listcomp>c                   rµ   r<   rE  rð  ry   r<   r=   r„   š  s    ÿ)rÖ   Z	LINK_ARGS);r   r   r®  rÞ  r¯  r:  rC  rœ  r¼  Úget_base_link_argsrô  r   r  r   rV  r½  r)  Úget_buildtype_linker_argsrU  r#   rÇ  rÄ  r  r'  rV  rh  rW  r1  Úget_external_link_argsr"   rª   rR   r8  r¼   r«  r¨  r3  r4  r5  r6  r7  rH  r&  Úget_target_link_argsrÂ  Úextend_preserving_lflagsÚget_dependency_link_argsr#  r   Úget_option_link_argsrá  r>  Ú$get_custom_target_provided_librariesÚlink_dependsrÌ   rÍ   rÝ   rä   ré  )rk   r~  r'  r(  rå  r8  rö  rÖ   Zlinker_baser„  Zlinker_rulerµ  Z	debugfiler?  r@  Údependenciesr:  r×   r  Zdep_targetsZcustom_target_librariesr  r<   ry   r=   r    s    

ý

þ
ûÿ
€
ÿzNinjaBackend.generate_linkc                 C  sR   t |tjƒr|  |¡S t |tjƒr$|jr| ¡ S | | j	 
¡ | j	 ¡ ¡S |  |¡S rj   )r   r   r¯  r  r   r   rã  rB  r×  r   rs  rV  rñ  )rk   r  r<   r<   r=   r-  ¢  s   
ÿ
z$NinjaBackend.get_dependency_filenamec              	   C  s²   |  ¡ D ]R\}}}tj ||¡}tj | j ¡ ||¡}zt |¡ W n	 ty+   Y nw zt ||¡ W n t	yB   t
 d¡ Y q tyO   t
 d¡ Y qw | j |¡ qd S )Nz?Library versioning disabled because symlinks are not supported.zOLibrary versioning disabled because we do not have symlink creation privileges.)Úget_aliasesrR   r8  r¼   r   rV  Úremoverš  ÚsymlinkÚNotImplementedErrorr   rï   ÚOSErrorr  rã   )rk   r~  ÚoutdirÚaliasÚtoÚtagZ	aliasfileZabs_aliasfiler<   r<   r=   rÿ  ­  s"   ÿÿòz#NinjaBackend.generate_shlib_aliasesÚtreesc                 C  s    |   ddd¡}t| j ¡ |ƒ}tj | j ¡ d¡}| d| j 	¡ dd|g ¡ | dd	¡ |  
|¡ t|d
ƒ}t ||¡ W d   ƒ dS 1 sIw   Y  dS )Nzclean-ctlistrO  rN  zcleantrees.datrZ  rn  Z
cleantreesrZ   z"Cleaning custom target directoriesr•  )r  r$   r   rV  rR   r8  r¼   r9  rä   rr  r  r-  rC  r  )rk   rY  rÆ   r  Zd_fileÚofiler<   r<   r=   Úgenerate_custom_target_clean¾  s   

ÿþz)NinjaBackend.generate_custom_target_cleanc                 C  s|   |   ddd¡}| dt ¡ g d¢ ¡ | dd¡ |  |¡ |   ddd¡}| dt ¡ g d	¢ ¡ | dd
¡ |  |¡ d S )Nú
clean-gcnorO  rN  rZ  )rn  Údelwithsuffixrî  ZgcnorZ   zDeleting gcno filesú
clean-gcda)rn  r]  rî  ZgcdazDeleting gcda files)r  rä   r   rZ  r  )rk   Z	gcno_elemZ	gcda_elemr<   r<   r=   Úgenerate_gcov_cleanÊ  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   r1  r^  râ  Ú
is_projectrã   r3   r   rÇ   rÄ  rð   )rk   ZcmdsÚkÚvr<   r<   r=   Úget_user_option_argsÕ  s   6€z!NinjaBackend.get_user_option_argsc                 C  sL   |   ddd¡}| dd¡ | d| j ¡ dg ¡ | dd¡ |  |¡ d S )	NÚdistrO  rN  r[   zCreating source packagesrZ  rY   rY  )r  rä   r   rr  r  r  r<   r<   r=   rk  ß  s
   zNinjaBackend.generate_distc                 C  s†   t  ¡ sd S d| jv rd S | j  ¡ dd| j j| j j| j ¡ g | j  ¡  |  ¡  }|  	ddd¡}| 
d|¡ | 
dd¡ |  |¡ d S )	Nz
scan-buildrn  Z	scanbuildrO  rN  rZ  rY   rY  )r   Údetect_scanbuildrÍ   rr  rØ  rv  r   rt  rc  r  rä   r  r…  r<   r<   r=   Úgenerate_scanbuildæ  s   
ÿþþzNinjaBackend.generate_scanbuildÚ	extra_argc                 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 | }|  
|dd	¡}| d
|¡ | dd¡ |  |¡ d S )Nzclang-r  z--z.clang-z_clang-rn  rm  rO  rN  rZ  rY   rY  )rã   rR   r8  ru  r¼   r   rØ  rÍ   rr  rv  r  rä   r  )rk   rª   rg  rl  r8  rJ   r  r<   r<   r=   Úgenerate_clangtooló  s(   ÿ
ÿþzNinjaBackend.generate_clangtoolc                 C  s&   t  ¡ sd S |  d¡ |  dd¡ d S )Nr»   Úcheck)r   Údetect_clangformatrh  ry   r<   r<   r=   Úgenerate_clangformat  s   
z!NinjaBackend.generate_clangformatc                 C  s0   dd l }| d¡sd S |  d¡ |  dd¡ d S )Nr   z
clang-tidyZtidyZfix)ÚshutilÚwhichrh  )rk   rl  r<   r<   r=   Úgenerate_clangtidy  s
   

zNinjaBackend.generate_clangtidyrl  c                 C  sr   dd l }| |¡sd S || jv rd S | j ¡ dd|| jjg }|  |dd¡}| d|¡ | dd¡ |  |¡ d S )	Nr   rn  ÚtagsrO  rN  rZ  rY   rY  )	rl  rm  rÍ   r   rr  rØ  r  rä   r  )rk   rd  rl  rl  rJ   r  r<   r<   r=   Úgenerate_tags  s   

ÿzNinjaBackend.generate_tagsc                 C  s‚   |   ¡  |  ¡  |  ¡  |  dd¡ |  dd¡ |  dd¡ | j ¡ ddg }|  ddd¡}| d	|¡ | d
d¡ |  |¡ d S )NZetagsZTAGSZctagsZcscopern  Ú	uninstallrO  rN  rZ  rY   rY  )	rf  rk  rn  rp  r   rr  r  rä   r  r…  r<   r<   r=   ro  !  s   zNinjaBackend.generate_utilsc           
   	   C  sP  d|   ¡ fd|  ¡ fd|  d¡ffD ]\\}}g }|dkr#| ddg¡ | ¡ D ]9}t|tjƒrO|jrO| jj	|j
  ¡ rO|  |¡\}}| | ¡ d ¡| ¡ d< | tj |  |¡| ¡ d ¡¡ q't| j|d|ƒ}|  |¡ q|  ddd	¡}| d
| jddg ¡ | dd¡ g }| j ¡  ¡ D ]}t|tjƒr¬| ¡ D ]}	| tj |  |¡|	¡¡ qœq|r·| |  |¡¡ tdƒ| jjj v rØ| jjj tdƒ j!rØ|  "¡  | d¡ | d¡ |  |¡ |  #¡ }t| jdd|ƒ}| dd¡ |  |¡ | j$rt| jdd| j$ƒ}|  |¡ t| jddd	ƒ}| dd¡ |  |¡ t| j|ddƒ}|  |¡ d S )Nr|  zmeson-test-prereqzmeson-benchmark-prereqTr   rå   ÚcleanrO  rN  rZ  rR  rZ   ZCleaningrP  r^  r\  r  rŒ  rY   rY  zmeson-implicit-outsÚreconfigurer±   )%Úget_build_by_default_targetsÚget_testlike_targetsrá  r3  r   r   r¯  r#  r   r!  rœ  r"  r  r$  r£  rã   rR   r8  r¼   r¨  rÌ   rÍ   r  r  rä   r[  rc  r¡  rÝ   r[  r#   r1  r^  rÇ   r_  Úget_regen_filelistr  )
rk   Ztargr•   Z
targetlistr  rå  rö  r  Zctlistr/  r<   r<   r=   rp  .  sZ   

ý$€ÿ





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                   s*   | j  |¡}|stƒ  ||¡S t| ¡ ƒS rj   )r  rT   r  Úget_introspection_datar…   r3  )rk   rw  r~  Údatar  r<   r=   ry  q  s   z#NinjaBackend.get_introspection_data)r   r
  r  r  )r  r3   rÒ   r3   r  r3   r4   rÌ   )FN)rF  r^   rG  rH  r4   rI  )r4   rx   )r~  r´  r4   rµ  rj   )r~  rË  rÌ  rÍ  rÎ  rÏ  )r~  rË  rå  ræ  )r~  r2  r4   r^   )r~  r´  r,  r<  r=  r>  r4   rx   )r~  rM  )r~  rj  )r  r–   r‚  r–   )rˆ   r‡   r4   rx   )r   r   r4   rx   )r   rÌ   r4   rx   r   )r~  r™  )r~  r´  )r  r´  r4   rÛ  )r~  r´  r4   rà  )r³  rö  rK  r	   r4   rx   )rù  r	   rú  rû  r4   rü  )rª   r3   rÿ  r3   r“   r   r   r^   r  r–   r•   r   r4   rx   )r~  r´  r  r*   r4   r3   )r~  r´  r4   rx   )rœ  r   r4   r3   )rD  )rÉ  r3   rœ  r   rE  r3   r4   r3   )r@  r   r4   r3   )rd  re  r4   rf  )r@  ry  r4   rx   )r@  r|  r4   rx   )r4   r^   )r„  r3   r4   rx   )r²  rš  r~  r´  r4   rx   )r@  r/   r³  r	   r4   r}   )r4   r–   )
r@  r|  r  r3   r]  r3   rò  r^   r4   rÎ  r"  )r~  r´  r@  r|  rÑ  r^   r4   rÒ  )r~  r´  r@  r|  r4   rÒ  )r~  r´  r@  r|  rÑ  r^   r4   rØ  )r~  r´  r4   rã  )FNNNN)
r~  r´  rí  ræ  r8  rç  rÎ  rÏ  r4   rx   )r~  r´  r4   r3   )rÀ  rÖ  r4   r^   )r4   r	   )NN)r~  r´  rå  rD  )rY  r}   r4   r3   )rª   r3   rg  r–   r4   rx   )rd  r3   rl  r3   r4   rx   )rw  r3   r~  rË  r4   rx  )„rn   ro   rp   rl   r  rE  rˆ  ry  rx  r°  rº  r¿  rÊ  rä  ré  rg  r;  r   rA  rþ  rJ  rL  rú  ri  rü  rx  rm  ry  rj  ri  r_  rŽ  rb  r“  r  rq  rr  ra  r  r¸  r  r©  rª  rÕ  rÚ  rß  r  r  rø  r­  r  r
  r  r†   rC  ÚclassmethodrG  r—  r˜  rJ  rI  rM  rN  rO  r  ri  r‘  r’  rx  rz  r{  r  r  r‚  rƒ  r‡  r‰  rŒ  rŽ  r  r  r
  r™  rI  r	  r»  r½  rÁ  rÄ  rÇ  r  r   rÐ  rÕ  rÓ  rÔ  re  r  rò  r@  rï  rð  rñ  r   r  r  r  r  r:  r  r  r#  r'  r/  r>  r  r  r-  rÿ  r[  r_  rc  rk  rf  rh  rk  rn  rp  ro  rp  ry  Ú__classcell__r<   r<   r  r=   r	  ã  s   Cbÿ3 ^*	"925mI
 t`0'		*	>69
 ÿ
ÿ>ü{%
'
B 
Cr	  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å  r9   rÈ  rÄ  rÆ  rá  r·  rÀ  Úis_filerª   Úsamefilerí  rã   r3   r‹   r8   r¼   r   r»   )r³  r¹  r«  r¸  r@  ZincreZuserer³  rº  rB  rñ   ZincmatchZincfileZusematchZusenamerõ  Úmod_namerµ  r¶  Zancestor_childZsubmodsrcfiler<   r<   r=   r·  y  sl   




ÿÿ
(

€Æ
ÿ<Ä<r·  )r2   r3   r4   r3   )rC   r3   r4   r3   )r4   rP   r"  )r\   r3   r]   r^   r4   r3   )r³  r	   r¹  r	   r«  r	   r4   r}   )gÚ
__future__r   Úcollectionsr   Údataclassesr   Úenumr   r   Ú	functoolsr   Úpathlibr   r	   Útextwrapr
   rª  rŒ  rR   rC  r@   rF   r:  ÚtypingÚTr±   r   r   r   r   r   r   r   Úarglistr   r   rè  r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   ÚTYPE_CHECKINGZtyping_extensionsr'   Z_typingr(   r)   r*   r  r+   Úlinkers.linkersr,   r-   Zcompilers.csr.   Úcompilers.fortranr/   ÚListÚUnionr3   r’   rþ   r~  r°  r²  r  rB   rI   rQ   rË   rn  ro  rV   ré   rŸ   r?  r`   ra   rd   re   rq   r0   r‡   r   rÌ   rô   rú   ÚBackendr	  r·  r<   r<   r<   r=   Ú<module>   sÂ   ,







w #                         /