o
    uJAf«… ã                   @  s´  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZdd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ej(rÒddl)m*Z* ddl+m,Z, ddlm-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4 ddlm5Z5m6Z6 d dl7m8Z8 ej9ej:e ej;ej<ej=f  Z>G dd„ de8ƒZ?dZ@eddG dd„ dƒƒZAG dd „ d ejBƒZCeddG d!d"„ d"ƒƒZDeddG d#d$„ d$ƒƒZEeddG d%d&„ d&ƒƒZFeddG d'd(„ d(ƒƒZGeddG d)d*„ d*ƒƒZHeddG d+d,„ d,ƒƒZIG d-d.„ d.eHƒZJeddG d/d0„ d0ƒƒZKd@dAd9d:„ZLd@dBd<d=„ZMG d>d?„ d?ƒZNdS )Cé    )Úannotations)ÚOrderedDict)Ú	dataclassÚInitVar)Ú	lru_cache)Úchain)ÚPathNé   )Úbuild)Údependencies)Úprograms)Úmesonlib)Úmlog)ÚLANGUAGES_USING_LDFLAGSÚdetect)ÚFileÚMachineChoiceÚMesonExceptionÚ
OrderedSetÚclassify_unity_sourcesÚ	OptionKeyÚ	join_argsÚExecutableSerialisation)ÚImmutableListProtocol)ÚCompilerArgs)ÚCompiler)ÚEnvironment)ÚInterpreterÚTest)ÚStaticLinker)ÚFileModeÚFileOrString)Ú	TypedDictc                   @  s6   e Zd ZU ded< ded< ded< ded< ded< dS )	ÚTargetIntrospectionDataÚstrÚlanguageúT.List[str]ÚcompilerÚ
parametersÚsourcesÚgenerated_sourcesN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r0   r0   ú@/usr/lib/python3.10/site-packages/mesonbuild/backend/backends.pyr#   8   s   
 r#   )ÚdÚfortranÚvalaF)Úeqc                   @  s&   e Zd ZU ded< ded< ded< dS )Ú	RegenInfor$   Ú
source_dirÚ	build_dirr&   ZdepfilesNr+   r0   r0   r0   r1   r6   F   s   
 r6   c                   @  s4   e Zd ZdZdZdZdZedd	d
„ƒZddd„Z	dS )ÚTestProtocolr   é   r	   é   Ústringr$   Úreturnú'TestProtocol'c                 C  sF   |dkr| j S |dkr| jS |dkr| jS |dkr| jS td|› ƒ‚)NÚexitcodeÚtapÚgtestÚrustzunknown test format )ÚEXITCODEÚTAPÚGTESTÚRUSTr   )Úclsr<   r0   r0   r1   Úfrom_strS   s   zTestProtocol.from_strc                 C  s6   t | ƒ}| |ju rdS | |ju rdS | |ju rdS dS )Nr?   rA   rB   r@   )ÚtyperC   rE   rF   )ÚselfrG   r0   r0   r1   Ú__str___   s   


zTestProtocol.__str__N)r<   r$   r=   r>   )r=   r$   )
r,   r-   r.   rC   rD   rE   rF   ÚclassmethodrH   rK   r0   r0   r0   r1   r9   L   s    r9   c                   @  s"   e Zd ZU dZded< ded< dS )Ú
CleanTreesz•
    Directories outputted by custom targets that have to be manually cleaned
    because on Linux `ninja clean` only deletes empty directories.
    r$   r8   r&   ZtreesN)r,   r-   r.   Ú__doc__r/   r0   r0   r0   r1   rM   j   s   
 rM   c                   @  sX   e Zd ZU ded< ded< ded< ded< ded< ded	< ded
< ded< ddd„ZdS )ÚInstallDatar$   r7   r8   ÚprefixÚlibdirr&   Ú	strip_binzT.Union[str, int]Úinstall_umaskÚmesonintrospectÚversionr=   ÚNonec                 C  s4   g | _ g | _g | _g | _g | _g | _g | _g | _d S ©N)ÚtargetsÚheadersÚmanÚemptydirÚdataÚsymlinksÚinstall_scriptsÚinstall_subdirs©rJ   r0   r0   r1   Ú__post_init__€   s   
zInstallData.__post_init__N©r=   rV   ©r,   r-   r.   r/   ra   r0   r0   r0   r1   rO   s   s   
 rO   c                   @  s„   e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< ded< ded< dZded< dZded< dZded< ddd„ZdS )ÚTargetInstallDatar$   ÚfnameÚoutdirzInitVar[T.Optional[str]]Úoutdir_nameÚboolÚstripzT.Mapping[str, str]Zinstall_name_mappingszT.Set[bytes]Úrpath_dirs_to_removeÚinstall_rpathzT.Optional['FileMode']Úinstall_modeÚ
subprojectFÚoptionalNúT.Optional[str]ÚtagÚ	can_stripr=   rV   c                 C  s6   |d u rt j d| j¡}t j |t j | j¡¡| _d S )Nú{prefix})ÚosÚpathÚjoinrf   Úbasenamere   Úout_name)rJ   rg   r0   r0   r1   ra   š   s   zTargetInstallData.__post_init__)rg   ro   r=   rV   )r,   r-   r.   r/   rn   rp   rq   ra   r0   r0   r0   r1   rd   Š   s   
 rd   c                   @  s2   e Zd ZU ded< ded< ded< dZded< dS )	ÚInstallEmptyDirr$   rt   ú
'FileMode'rl   rm   Nro   rp   )r,   r-   r.   r/   rp   r0   r0   r0   r1   rx   Ÿ   s
   
 rx   c                   @  sZ   e Zd ZU ded< ded< ded< ded< ded< dZd	ed
< dZd	ed< dZded< dS )ÚInstallDataBaser$   rt   Úinstall_pathÚinstall_path_namery   rl   rm   Nro   rp   Ú	data_typeúT.Optional[bool]Úfollow_symlinks)r,   r-   r.   r/   rp   r}   r   r0   r0   r0   r1   rz   ¦   s   
 rz   c                   @  sF   e Zd ZU ded< ded< ded< ded< dZded< d	Zd
ed< dS )ÚInstallSymlinkDatar$   ÚtargetÚnamer{   rm   Nro   rp   Frh   Úallow_missing)r,   r-   r.   r/   rp   rƒ   r0   r0   r0   r1   r€   ±   s   
 r€   c                      s$   e Zd Z		dd‡ fdd„Z‡  ZS )ÚSubdirInstallDataNrt   r$   r{   r|   rl   ry   ÚexcludeúT.Tuple[T.Set[str], T.Set[str]]rm   rp   ro   r}   r   r~   c
           
   
     s$   t ƒ  ||||||||	¡ || _d S rW   )ÚsuperÚ__init__r…   )
rJ   rt   r{   r|   rl   r…   rm   rp   r}   r   ©Ú	__class__r0   r1   rˆ   ¼   s   
zSubdirInstallData.__init__)NNN)rt   r$   r{   r$   r|   r$   rl   ry   r…   r†   rm   r$   rp   ro   r}   ro   r   r~   )r,   r-   r.   rˆ   Ú__classcell__r0   r0   r‰   r1   r„   »   s    ýr„   c                   @  sÀ   e Zd ZU ded< ded< ded< ded< ded< d	ed
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< d$d!d"„Zd#S )%ÚTestSerialisationr$   r‚   Úproject_namer&   Úsuitere   rh   Úis_cross_builtz$T.Optional[programs.ExternalProgram]Úexe_wrapperÚneeds_exe_wrapperÚis_parallelÚcmd_argsúmesonlib.EnvironmentVariablesÚenvÚshould_failzT.Optional[int]Útimeoutro   ÚworkdirÚextra_pathsr9   ÚprotocolÚintÚpriorityZcmd_is_builtZ
cmd_is_exeÚdependsrU   Úverboser=   rV   c                 C  s$   | j d urt| j tjƒsJ ‚d S d S rW   )r   Ú
isinstancer   ÚExternalProgramr`   r0   r0   r1   ra   Ü   s   
ÿzTestSerialisation.__post_init__Nrb   rc   r0   r0   r0   r1   rŒ   Ä   s.   
 rŒ   Úbackendr$   r
   úT.Optional[build.Build]ÚinterpreterúT.Optional['Interpreter']r=   úT.Optional['Backend']c                 C  sd  | dkrddl m} | ||¡S | dkr ddl m} | ||¡S | dkr0ddl m} | ||¡S | dkr@ddl m} | ||¡S | d	krPdd
l m} | 	||¡S | dkr`ddl m
} | ||¡S | dkrpddl m} | ||¡S | dkr€ddl m}	 |	 ||¡S | dkrddl m}
 |
 ||¡S | dkr ddl m} | ||¡S | dkr°ddl m} | ||¡S d S )NÚninjar:   )ÚninjabackendÚvs)Úvs2010backendÚvs2010Úvs2012)Úvs2012backendÚvs2013)Úvs2013backendÚvs2015)Úvs2015backendÚvs2017)Úvs2017backendÚvs2019)Úvs2019backendÚvs2022©Úvs2022backendÚxcode)ÚxcodebackendÚnone)Únonebackend)Ú r§   ZNinjaBackendr©   Zautodetect_vs_versionZVs2010Backendr¬   ZVs2012Backendr®   ZVs2013Backendr°   ZVs2015Backendr²   ZVs2017Backendr´   ZVs2019Backendr·   ÚVs2022Backendr¹   ZXCodeBackendr»   ZNoneBackend)r¡   r
   r£   r§   r©   r¬   r®   r°   r²   r´   r·   r¹   r»   r0   r0   r1   Úget_backend_from_nameá   sD   r¾   Ú	genvsnamec                 C  s(   | dkrddl m} |j||ddS d S )Nrµ   r:   r¶   T)Zgen_lite)r¼   r·   r½   )r¿   r
   r£   r·   r0   r0   r1   Úget_genvslite_backend  s   rÀ   c                   @  sV  e Zd ZU ded< dZd3dd	„Zd4d5dd„Zddœd6dd„Zd7dd„Zd8d!d"„Z	d8d#d$„Z
d
d%œd9d*d+„Zd
d%œd9d,d-„Zd:d.d/„Zedd0d7d1d2„ƒZd;d5d6„Zd<d7d8„Zd=d:d;„Zd=d<d=„Zedd0d>dAdB„ƒZd?dGdH„Zd@dKdL„ZedAdOdP„ƒZdBdCdTdU„ZdBdDdXdY„ZdEd[d\„ZedFd]d^„ƒZdGd_d`„Z							
	dHdIdndo„Z					
		
dJdKdvdw„ZdLdydz„Z dMd|d}„Z!edNd‚dƒ„ƒZ"dOd…d†„Z#edPdˆd‰„ƒZ$edd0dQdRdŒd„ƒZ%dSdd„Z&edTd’d“„ƒZ'dUd–d—„Z(dVdšd›„Z)dWdœd„Z*dXd d¡„Z+dYd£d¤„Z,dFd¥d¦„Z-edZd§d¨„ƒZ.d[dªd«„Z/d\d]d®d¯„Z0d^d²d³„Z1dGd´dµ„Z2eedd0d_d·d¸„ƒƒZ3e4edd0dOd¹dº„ƒƒZ5d`d½d¾„Z6dadÂdÃ„Z7dadÄdÅ„Z8dbdÉdÊ„Z9dcdËdÌ„Z:dddÍdÎ„Z;dedÑdÒ„Z<dfdÓdÔ„Z=dgdÕdÖ„Z>dhdÙdÚ„Z?didÝdÞ„Z@djdádâ„ZAdkdådæ„ZBdldèdé„ZCd\dmdìdí„ZDedd0dndðdñ„ƒZEedd0dodódô„ƒZFdpdõdö„ZGd\dqdùdú„ZHd7dûdü„ZIedd0drdýdþ„ƒZJd
d%œdsdÿd „ZKd
d%œdsdd„ZL	
d\dtdd„ZMdud	d
„ZNdgdd„ZOdvdd„ZPdgdd„ZQdwdxdd„ZRdedd„ZSdedd„ZTdedd„ZUdedd„ZVdedd„ZWdedd„ZXded d!„ZYded"d#„ZZdyd&d'„Z[dzd(d)„Z\d{d.d/„Z]d|d1d2„Z^dS (}  ÚBackendzT.Optional['Environment']Úenvironmentz	<UNKNOWN>r
   r¢   r£   r¤   c                 C  s~   |d u r	d | _ d S || _|| _|j | _ tƒ | _| j  ¡ | _| j  ¡ | _t	 
| j  ¡ | j  ¡ ¡| _t	 
| j  ¡ | j  ¡ ¡| _d S rW   )rÂ   r
   r£   ÚsetZprocessed_targetsÚget_build_dirr8   Úget_source_dirr7   r   ÚrelpathÚbuild_to_srcZsrc_to_build)rJ   r
   r£   r0   r0   r1   rˆ     s   ÿ
ÿzBackend.__init__FNÚcapturerh   Ú
vslite_ctxÚdictr=   úT.Optional[dict]c                 C  s   t dt| ƒj› ƒ‚)Nzgenerate is not implemented in )ÚRuntimeErrorrI   r,   )rJ   rÈ   rÉ   r0   r0   r1   Úgenerate,  s   zBackend.generateT©Úwarn_multi_outputÚtú.T.Union[build.Target, build.CustomTargetIndex]rÏ   r$   c                C  s”   t |tjƒr%|rt| ¡ ƒdkrt d|j›d|j› d¡ | ¡ d }nt |tjƒr2| ¡ d }nt |tj	ƒs<J |ƒ‚| 
¡ }tj |  |¡|¡S )Nr:   zcustom_target z@ has more than one output! Using the first one. Consider using `z[0]`.r   )rŸ   r
   ÚCustomTargetÚlenÚget_outputsr   Úwarningr‚   ÚCustomTargetIndexÚBuildTargetÚget_filenamers   rt   ru   Úget_target_dir)rJ   rÐ   rÏ   Úfilenamer0   r0   r1   Úget_target_filename/  s   
ÿzBackend.get_target_filenamer   c                 C  ó   t j | j ¡ |  |¡¡S rW   )rs   rt   ru   rÂ   rÄ   rÛ   ©rJ   r   r0   r0   r1   Úget_target_filename_abs<  ó   zBackend.get_target_filename_absúbuild.BuildTargetro   c                 C  s<   t |tjƒs
J |ƒ‚| ¡ r| ¡ }tj |  |¡|¡S d S rW   )rŸ   r
   r×   Úget_debug_filenamers   rt   ru   rÙ   )rJ   r   Údebug_filenamer0   r0   r1   Úget_target_debug_filename?  s
   z!Backend.get_target_debug_filenamec                 C  s:   t |tjƒs
J |ƒ‚| ¡ sd S tj | j ¡ |  	|¡¡S rW   )
rŸ   r
   r×   rá   rs   rt   ru   rÂ   rÄ   rã   rÝ   r0   r0   r1   Úget_target_debug_filename_absG  s   z%Backend.get_target_debug_filename_abs©Úabsolute_pathr'   ú
'Compiler'ræ   r&   c                C  s<   |  ¡ }|r
| j}n| j}tj tj ||¡¡}| |d¡S )NF)Ú
get_subdirr7   rÇ   rs   rt   Únormpathru   Úget_include_args)rJ   r   r'   ræ   ÚcurdirZleadZtmppathr0   r0   r1   Úget_source_dir_include_argsM  s   z#Backend.get_source_dir_include_argsc                C  s:   |rt j | j| ¡ ¡}n
| ¡ }|dkrd}| |d¡S )Nr¼   Ú.F)rs   rt   ru   r8   rè   rê   )rJ   r   r'   ræ   rë   r0   r0   r1   Úget_build_dir_include_argsV  s   z"Backend.get_build_dir_include_argsc                 C  sú   t |tjƒr*| ¡ p| ¡ }t ¡ r |jr t 	dd| 
dd¡¡}t|  |¡|ƒ ¡ S t |tjƒr<t|  |¡| ¡ ƒ ¡ S t |tjtjfƒr^| ¡ sRtd|j› dƒ‚t|  |¡| ¡ ƒ ¡ S t |tjƒru|jrst|  |¡| ¡ ƒ ¡ S d S td|›dƒ‚)Nz$[.][a]([.]?([0-9]+))*([.]?([a-z]+))*ú.aú.soz%Tried to link against custom target "z", which is not linkable.zBUG: Tried to link to z which is not linkable)rŸ   r
   ÚSharedLibraryÚget_import_filenamerØ   r   Úis_aixÚaix_so_archiveÚreÚsubÚreplacer   rÙ   Úas_posixÚStaticLibraryrÒ   rÖ   Úis_linkable_targetr   r‚   Ú
ExecutableÚimport_filenameÚAssertionError)rJ   r   Zlink_libr0   r0   r1   Úget_target_filename_for_linking_  s    z'Backend.get_target_filename_for_linking)Úmaxsizec                 C  s>   t |tjƒr
d}|S | jj tdƒ¡dkr| ¡ }|S d}|S )Nr¼   ÚlayoutÚmirrorú	meson-out)rŸ   r
   Ú	RunTargetrÂ   ÚcoredataÚ
get_optionr   rè   )rJ   r   Údirnamer0   r0   r1   rÙ   w  s   üÿzBackend.get_target_dirúbuild.TargetÚoc                 C  sB   t j | j ¡ |  |¡¡}t j | j ¡ |  |¡¡}t j ||¡S )z7Get a target dir relative to another target's directory)rs   rt   ru   rÂ   rÄ   rÙ   rÆ   )rJ   rÐ   r  Ú
target_dirZ
othert_dirr0   r0   r1   Úget_target_dir_relative_to‚  s   z"Backend.get_target_dir_relative_toc                 C  s$   |   |¡}|rtj | j|¡S | jS rW   )rÙ   rs   rt   ru   rÇ   )rJ   r   r	  r0   r0   r1   Úget_target_source_dirˆ  s   
zBackend.get_target_source_dirúGT.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]c                 C  s   t j | j|ddd ¡S )NFrÎ   z.p)rs   rt   ru   rÛ   rÝ   r0   r0   r1   Úget_target_private_dir  rß   zBackend.get_target_private_dirc                 C  rÜ   rW   )rs   rt   ru   rÂ   rÄ   r  rÝ   r0   r0   r1   Úget_target_private_dir_abs’  rß   z"Backend.get_target_private_dir_absÚgensrcúIT.Union[build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]Úsrcc                 C  s:   t |tjtjfƒrtj |  |¡|¡S tj |  |¡|¡S )zÔ
        Takes a BuildTarget, a generator source (CustomTarget or GeneratedList),
        and a generated source filename.
        Returns the full path of the generated source relative to the build root
        )	rŸ   r
   rÒ   rÖ   rs   rt   ru   rÙ   r  )rJ   r   r  r  r0   r0   r1   Úget_target_generated_dir•  s   z Backend.get_target_generated_dirÚsuffixÚnumberr›   úmesonlib.Filec                 C  s*   |j › d|› d|› }tj |  |¡|¡S )Nz-unityrí   )r‚   r   r   Úfrom_built_filer  )rJ   r   r  r  Úosrcr0   r0   r1   Úget_unity_source_file¦  s   zBackend.get_unity_source_fileÚ	unity_srcúT.List[mesonlib.File]c                   sê   g ‰ g ‰t ˆj ¡ |ƒ}ˆ tdƒ¡}t|tƒsJ dƒ‚d‡ ‡‡‡fd	d
„}| ¡ D ];\}}|d }d}	d }
|D ]&}||krQ|
rD|
 ¡  || 	¡ |	ƒ}
|	d7 }	d}|
 
d|› d¡ |d7 }q8|
re|
 ¡  q*ˆ D ]
}t ||d ¡ qhˆS )NÚ
unity_sizeúfor mypyr  r$   Úunity_file_numberr›   r=   úT.TextIOc                   sr   ˆ  ˆ| |¡}| ˆj ¡ ˆj ¡ ¡}|d }ˆ  |¡ tj |¡}tj 	|¡s-t 
|¡ ˆ |¡ t|dddS )Nú.tmpÚwúutf-8©Úencoding)r  ræ   rÂ   rÅ   rÄ   Úappendrs   rt   r  ÚexistsÚmakedirsÚopen)r  r  r  Z
outfileabsZoutfileabs_tmpZoutfileabs_tmp_dir©Z	abs_filesÚresultrJ   r   r0   r1   Úinit_language_file´  s   ÿ


z8Backend.generate_unity_files.<locals>.init_language_filer:   r   z	#include<z>
r  )r  r$   r  r›   r=   r  )r   Ú	compilersÚvaluesr  r   rŸ   r›   ÚitemsÚcloseÚget_default_suffixÚwriter   Úreplace_if_different)rJ   r   r  Úcompsrcsr  r*  ÚcompÚsrcsZfiles_in_currentr  Úofiler  Úxr0   r(  r1   Úgenerate_unity_files­  s2   
€zBackend.generate_unity_filesÚtodirÚfromdirc                 C  s"   t j t j d| ¡t j d|¡¡S )NZdummyprefixdir)rs   rt   rÆ   ru   )r8  r9  r0   r0   r1   rÆ   ×  s   ÿzBackend.relpathr¼   Úproj_dir_to_build_rootú4T.Tuple[T.List[str], T.List[build.BuildTargetTypes]]c                 C  s(   |   || ¡ |¡\}}tt |¡ƒ|fS rW   )Ú_flatten_object_listÚget_objectsÚlistrÊ   Úfromkeys)rJ   r   r:  Úobj_listÚdepsr0   r0   r1   Úflatten_object_listÜ  s   zBackend.flatten_object_listÚobjectsúbuild.ExtractedObjectsc                 C  s$   |   |j|g|¡\}}tt |¡ƒS rW   )r<  r   r>  rÊ   r?  )rJ   rC  r:  r@  Ú_r0   r0   r1   Údetermine_ext_objsá  s   zBackend.determine_ext_objsú8T.Sequence[T.Union[str, 'File', build.ExtractedObjects]]c           
      C  s   g }g }|D ]u}t |tƒrtj || j| ¡ |¡}| |¡ qt |tj	ƒrJ|j
r9tj || | j¡¡}| |¡ qtj || j¡}| | |¡¡ qt |tjƒrx|jrh|  |j|j|¡\}}	| |¡ | |	¡ | |  ||¡¡ | |j¡ qtdƒ‚||fS )Nz!Unknown data type in object list.)rŸ   r$   rs   rt   ru   rÇ   rè   r$  r   r   Úis_builtÚrel_to_builddirr
   ÚExtractedObjectsÚ	recursiver<  r   ÚobjlistÚextendÚ_determine_ext_objsr   )
rJ   r   rC  r:  r@  rA  Úobjr  Úobjsr2   r0   r0   r1   r<  å  s6   
ÿ
ÿÿ

zBackend._flatten_object_listc                 C  s    | j D ]
}| d¡r dS qdS )NÚswiftTF)r)   Úendswith)r   Úsr0   r0   r1   Úis_swift_target  s
   

ÿzBackend.is_swift_targetc                 C  s$   g }|j D ]
}| |  |¡¡ q|S rW   )Úlink_targetsr$  r  )rJ   r   r)  Úlr0   r0   r1   Údetermine_swift_dep_dirs
  s   
z Backend.determine_swift_dep_dirsÚcmdú_T.Sequence[T.Union[programs.ExternalProgram, build.BuildTarget, build.CustomTarget, File, str]]r˜   Úextra_bdepsú%T.Optional[T.List[build.BuildTarget]]Úfeedr•   ú)T.Optional[mesonlib.EnvironmentVariables]rp   rž   Úinstalldir_mapúT.Optional[T.Dict[str, str]]ú'ExecutableSerialisation'c
                 C  s  |^}
}t |
tjƒr|
 ¡ }|
j}n8t |
tjƒr"|  |
¡g}|
j}n(t |
tjƒr2|  |
¡g}t	j
}nt |
tjƒrD|
 | jj¡g}t	j
}n|
g}t	j
}g }|D ]A}t |tjƒrg| ¡ }t |tƒsaJ ‚| |¡ qNt |tjtjfƒry| |  |¡¡ qNt |tjƒrŠ| | | jj¡¡ qN| |¡ qN| jj| }| ¡ sž| ¡ r§|  |
|p¤g ¡}ng }| jj |¡ }|rÊ| j ¡ rÊ| j ¡ }|rÃ| ¡ sÉd}t|ƒ‚n(|d  d¡rØddg| }n|d  d¡rðt ¡ sðt ¡ sðt ¡ sðdg| }d }|pø| j ¡ }t|| |||||||||	ƒ
S )NzxAn exe_wrapper is needed but was not found. Please define one in cross file and check the command and/or add it to PATH.r   z.jarÚjavaz-jarz.exeZmono) rŸ   r   r    Úget_commandÚfor_machiner
   r×   rÞ   rÒ   r   ÚBUILDr   r   rI  rÂ   r7   Úget_pathr$   r$  ÚmachinesÚ
is_windowsÚ	is_cygwinÚdetermine_windows_extra_pathsÚmatches_build_machineÚneed_exe_wrapperÚget_exe_wrapperÚfoundr   rR  Úis_wslrÄ   r   )rJ   rX  r˜   rZ  rÈ   r\  r•   rp   rž   r^  ÚexeZraw_cmd_argsZexe_cmdZexe_for_machiner“   ÚcÚpÚmachiner™   r   r   Úmsgr0   r0   r1   Úget_executable_serialisation  s^   
ý&

þz$Backend.get_executable_serialisationro  ú\T.Union[str, mesonlib.File, build.BuildTarget, build.CustomTarget, programs.ExternalProgram]r“   úhT.Sequence[T.Union[str, mesonlib.File, build.BuildTarget, build.CustomTarget, programs.ExternalProgram]]Úforce_serializeúTT.Tuple[T.Sequence[T.Union[str, File, build.Target, programs.ExternalProgram]], str]c
              	   C  sÔ  g }
|
  |¡ |
 |¡ | j|
||||||	d}g }|jr"|  d¡ |jr*|  d¡ |r1|  d¡ tdd„ |jD ƒƒr@|  d¡ |rJ|jrJ|  d¡ | }|pRt|ƒ}|rZ|  d	¡ |ra|  d
¡ |r’|dgkr’t	 
d¡r’g }| i ¡ ¡ D ]\}}|  |› d|› ¡ qvdg| |j d |¡fS |sÅ|s|s|jdfS g }|r§|d|g7 }|r¯|d|g7 }| j ¡ ddg | dg |j d |¡fS t|tjtjtjfƒrØtj |j¡}nt|tjƒrætj |j¡}ntj |¡}t ¡ }|jrù|j  |¡ | !t"t#|jƒdd¡ | !t"t#|j$ƒdd¡ | !t"t#|ƒdd¡ | !t"t#|ƒdd¡ | %¡ }d|› d|› d}tj | j &¡ |¡}t'|dƒ}t( )||¡ W d  ƒ n	1 sUw   Y  | j ¡ ddd|g d |¡fS )zY
        Serialize an executable for running with a generator or a custom target
        )rž   zto set PATHzto use exe_wrapperzto set workdirc                 s  s    | ]}d |v V  qdS )Ú
Nr0   )Ú.0rp  r0   r0   r1   Ú	<genexpr>r  s   € z/Backend.as_meson_exe_cmdline.<locals>.<genexpr>z!because command contains newlinesz
to set envzto capture outputzto feed inputr•   ú=z, r¼   z	--capturez--feedz
--internalro  z--r!  r"  Z
meson_exe_rE  z.datÚwbNz
--unpickle)*r$  rM  rt  r™   r   Úanyr“   Úvarnamesrh   ÚshutilÚwhichÚget_envr-  ru   rÂ   Úget_build_commandrŸ   r   r    r
   r×   rÒ   rs   rt   rv   r‚   r   r   re   ÚhashlibÚsha1r•   ÚhashÚupdateÚbytesr$   r˜   Ú	hexdigestÚget_scratch_dirr'  ÚpickleÚdump)rJ   ro  r“   r˜   rZ  rÈ   r\  rw  r•   rž   rX  ÚesZreasonsZcan_use_envÚenvlistÚkÚvÚargsrv   ÚhasherÚdigestZscratch_fileZexe_dataÚfr0   r0   r1   Úas_meson_exe_cmdlineX  sx   










 þÿÿÿzBackend.as_meson_exe_cmdlineúT.Tuple[str, str]c                 C  sž   t j | j ¡ d¡}t|dƒ}|  |¡ W d   ƒ n1 sw   Y  t j | j ¡ d¡}t|dƒ}|  |¡ W d   ƒ ||fS 1 sFw   Y  ||fS )Nzmeson_test_setup.datr}  zmeson_benchmark_setup.dat)rs   rt   ru   rÂ   rŠ  r'  Úwrite_test_fileÚwrite_benchmark_file)rJ   Z	test_dataÚdatafileZbenchmark_datar0   r0   r1   Úserialize_tests¹  s   ÿ
ÿþzBackend.serialize_testsú9T.Tuple[T.Union['Compiler', 'StaticLinker'], T.List[str]]c                 C  s2   t |tjƒr| jj|j g fS | ¡ \}}||fS )z•
        If we're building a static library, there is only one static linker.
        Otherwise, we query the target for the dynamic linker.
        )rŸ   r
   rù   Ústatic_linkerrc  Ú$get_clink_dynamic_linker_and_stdlibs)rJ   r   rV  Ústdlib_argsr0   r0   r1   Ú determine_linker_and_stdlib_argsÂ  s   z(Backend.determine_linker_and_stdlib_argsrQ   r+  úT.Mapping[str, 'Compiler']ú'Environment'c                 C  s2   t j | ¡} | ¡ D ]}| | |¡v r dS q
dS )NTF)rs   rt   ré   r,  Úget_library_dirs)rQ   r+  r•   Úccr0   r0   r1   Ú_libdir_is_systemÌ  s   ÿzBackend._libdir_is_systemú
T.Set[str]c              	   C  s`   g }t D ]&}z| jj |j|¡}t|tƒr| |¡ n| |¡ W q t	y*   Y qw |  
|¡S rW   )r   rÂ   r  Úget_external_link_argsrc  rŸ   r$   r$  rM  Ú	ExceptionÚget_rpath_dirs_from_link_args)rJ   r   r‘  ÚlangÚer0   r0   r1   Úget_external_rpath_dirsÔ  s   

€ÿ
zBackend.get_external_rpath_dirsr‘  c           
      C  sÚ   t ƒ }t d¡}t d¡}t d¡}| D ]V}| |¡}|r-| d¡ d¡D ]}| |¡ q%| |¡}|rJ| d¡ d¡D ]}t|ƒ ¡ rI| |¡ q<| |¡}	|	rj|	 d¡ d¡D ]}t|ƒ ¡ rit	d|› dƒ‚qYq|S )Nz-Wl,-rpath[=,]([^,]+)z-Wl,-R[,]?([^,]+)z-Wl,--just-symbols[=,]([^,]+)r:   ú:z Invalid arg for --just-symbols, z is a directory.)
rÃ   rõ   ÚcompileÚmatchÚgroupÚsplitÚaddr   Úis_dirr   )
r‘  ÚdirsZrpath_regexZrunpath_regexZsymbols_regexÚargZrpath_matchÚdirZrunpath_matchZsymbols_matchr0   r0   r1   r¨  á  s.   





€
ÿ€z%Backend.get_rpath_dirs_from_link_argsÚexclude_systemú'ImmutableListProtocol[str]'c              
   C  s^  t ƒ }| j ¡ }|jD ]†}|jdvrq|jD ]q}tj |¡sqtj 	|¡}|r1|  
||j| j¡r1q||  |¡v r9qtj |¡d dvrDqz
tj ||f¡}W n tyY   d}Y nw ||kr‚|t|ƒd d … }	tj |	¡rvJ d|	› dƒ‚| tj | j|	¡¡ q| |¡ q| |  |j¡¡ qt|j|jƒD ]}
t|
tjƒrª| |  |
|¡¡ q™t|ƒS )N>   ÚlibraryÚ	pkgconfigr:   >   ú.dllz.librð   z.dylibr¼   zrel_to_src: z is absolute)r   rÂ   rÅ   Úexternal_depsÚ	type_nameÚ	link_argsrs   rt   Úisabsr  r¤  r+  r«  ÚsplitextÚ
commonpathÚ
ValueErrorrÓ   r±  ru   rÇ   Údifference_updater¨  r   rU  Úlink_whole_targetsrŸ   r
   r×   r‡  Ú/rpaths_for_non_system_absolute_shared_librariesr>  )rJ   r   r¶  ÚpathsÚsrcdirÚdepÚlibpathrQ   rÀ  Z
rel_to_srcÚir0   r0   r1   rÄ    s>   



ÿ€z7Backend.rpaths_for_non_system_absolute_shared_librariesúT.Tuple[str, ...]c                 C  sn   | j j tdƒ¡dkrt| ¡ ƒ}ntƒ }| d¡ t|tj	ƒr3| 
|  |¡¡ |j 
dd„ |D ƒ¡ t|ƒS )Nr   r  r  c                 S  s   g | ]}|  d ¡‘qS )r!  )Úencode)rz  r2   r0   r0   r1   Ú
<listcomp>:  s    z0Backend.determine_rpath_dirs.<locals>.<listcomp>)rÂ   r  r  r   r   Úget_link_dep_subdirsr±  rŸ   r
   r×   r‡  rÄ  rj   Útuple)rJ   r   r)  r0   r0   r1   Údetermine_rpath_dirs/  s   
zBackend.determine_rpath_dirsre   c                 C  sz   t | ƒj}d}t|ƒdkr.d |dd … ¡}t| ƒt|ƒd kr.t |  d¡¡ ¡ d }|} dD ]}|  |d¡} q0||  S )	Nr¼   é   ú/éûÿÿÿé)   r!  rE  )rÑ  ú\r¬  )	r   ÚpartsrÓ   ru   r„  r…  rË  r‰  r÷   )re   rÕ  ZhashedZtempÚchr0   r0   r1   Úcanonicalize_filename=  s   
zBackend.canonicalize_filenameÚsourceú'FileOrString'c                 C  sJ  t |tjƒsJ ‚t |tjƒr|j| S | j ¡ }| | j	¡}| 
d¡rR|jrAtj |¡r6|t|ƒd d … }tj ||  |¡¡}ntj |¡}d|d d…  d }nA|jrttj |¡re|t|ƒd d … }|  |¡}dtj ||¡ }ntj |¡r}|}ntj tj ||¡tj | j ¡ | ¡ ¡¡}| jj|j }|  |¡d | ¡  S )N)z.valaz.gsr:   zmeson-generated_rÒ  z.crí   )rŸ   r   r   r
   ÚCompileTargetÚsources_maprÂ   rÄ   rI  rÇ   rR  rH  rs   rt   r¾  rÓ   rÆ   r  rv   ru   rÅ   rè   rf  rc  r×  Úget_object_suffix)rJ   r   rØ  r8   Úrel_srcZ
gen_sourceÚ	targetdirrr  r0   r0   r1   Úobject_filename_from_sourceK  s0   



ÿz#Backend.object_filename_from_sourceÚextobjú'build.ExtractedObjects'c                 C  sè  g }|   |j¡}t|jƒ}|jD ]"}| ¡ D ]}|  |j||¡}tj 	|¡\}	}
| 
td|	|
ƒ¡ qqg }|D ]}| j |¡rE| 
|¡ q7| j |¡rR| 
| ¡ ¡ q7|jr„|  |j¡r„|jj ¡ D ]!\}}|jj| }| ¡ dkrƒ|  ||¡}| 
tj |||¡¡ qb|sˆ|S |jjrÙt|jj ¡ |ƒ}g }|j tdƒ¡}t|tƒs¨J dƒ‚| ¡ D ],\}}|jtv rº||7 }q¬t t!|ƒ| d | ƒD ]}|  "|j| #¡ |¡}| 
|¡ qÆq¬|D ]}|  $|j|¡}tj |||¡}| 
|¡ qÛ|S )NTÚmsvcr  r  r:   )%r  r   r>  ÚsrclistÚgenlistrÔ   r  rs   rt   r°  r$  r   rÂ   Ú	is_sourceÚ	is_objectÚrelative_nameÚpchÚtarget_uses_pchr-  r+  Úget_argument_syntaxÚget_msvc_pch_objnameru   Úis_unityr   r,  r  r   rŸ   r›   r%   ÚLANGS_CANT_UNITYÚrangerÓ   r  r/  rß  )rJ   rà  r:  r)  rÞ  Zraw_sourcesr  Úrrt   ÚdirpartÚ	fnamepartr)   rS  r©  rè  r'   Zobjnamer2  r  r3  r4  rÉ  Z_srcr  Úobjpathr0   r0   r1   rN  m  sZ   

ý€€
ÿýzBackend._determine_ext_objsc                 C  sH   g }|   |¡}| |d¡}| | ¡ ¡}|r || ||d ¡7 }|| S )NFr   )r  rê   Úget_pchÚget_languageÚget_pch_use_args)rJ   r'   r   r‘  ZpchpathZincludeargsrq  r0   r0   r1   Úget_pch_include_args§  s   
zBackend.get_pch_include_argsr©  rè  c                 C  s0   t |ƒdkrd|› dS tj |d ¡d d S )Nr:   ú
meson_pch-z.objr   )rÓ   rs   rt   r¿  )rJ   r©  rè  r0   r0   r1   rë  °  s   zBackend.get_msvc_pch_objnameÚ
pch_headerc           
      C  s®   d|› d|› }t j |  |¡|¡}t j | j|¡}t jt j |¡dd dt j |¡› d}|d }t|dd	d
}	|	 	|¡ W d   ƒ n1 sJw   Y  t
 ||¡ |S )Nr÷  rí   T)Úexist_okz
#include "ú"r  r   r!  r"  )rs   rt   ru   r  r8   r&  r  rv   r'  r0  r   r1  )
rJ   r   r©  rø  Z	impl_nameZpch_rel_to_buildZpch_fileÚcontentZpch_file_tmpr”  r0   r0   r1   Úcreate_msvc_pch_implementation¶  s   ÿz&Backend.create_msvc_pch_implementationc                 C  s.   zt  d| tdƒ¡¡W S  ty   Y dS w )Nrh   Úb_pchF)ÚTÚcastr  r   ÚKeyErrorrÝ   r0   r0   r1   ré  Ç  s
   ÿzBackend.target_uses_pchc                 C  s2   g }| D ]}|  d¡r| dd¡}| |¡ q|S )N)z-Dz/DrÔ  z\\)Ú
startswithr÷   r$  )r‘  Ú
extra_argsr´  r0   r0   r1   Úescape_extra_argsÍ  s   
zBackend.escape_extra_argsú'build.BuildTarget'c                 C  s    |j | jj|j v r| ¡ S g S rW   )r%   r
   Ústdlibsrc  Úget_no_stdinc_args)rJ   r   r'   r0   r0   r1   Úget_no_stdlib_argsØ  s   zBackend.get_no_stdlib_argsÚno_warn_argsú'CompilerArgs'c              
   C  sü  |  ¡ }| ¡ }||  ||¡7 }|| ¡ 7 }|r|| ¡ 7 }n|| t d| t	dƒ¡¡¡7 }| t	dƒ¡r<|| 
¡ 7 }|| |¡7 }| t	dƒ¡}t|tƒsSJ dƒ‚|| |¡7 }| t	dƒ¡}t|tƒsjJ dƒ‚|| |¡7 }| t	dƒ¡}t|tƒsJ dƒ‚|| |¡7 }|| j ||j|j¡7 }|| j ||j¡7 }|| jj |j| ¡ ¡7 }d|v r¼d	|v s·d
|v r¼| d¡ t|tjƒrÈ|| ¡ 7 }t|tjƒrØ|jrØ|| ¡ 7 }nt|tjtj fƒrê|j!rê|| "¡ 7 }t#| $¡ ƒD ]m}	|	 %¡ s÷qð|j&dkrH|	j'dkr9t|	t(j)ƒsJ ‚|	j*dkr1|	j+d ur1|	j+D ]}
|
 ,d¡r/|d|
dd … g7 } nq|d|	j*g7 }nt|	t(j-ƒrG||	 .d¡7 }n|| /|	¡7 }t|tj ƒr]||	 0|¡7 }qð|j&dkr|t1|j2|j3ƒD ]}|  4|¡}|| 5|d¡7 }qk|S )Nr$   Úwarning_levelÚwerrorÚ	buildtyper  ÚoptimizationÚdebugz/Ziz/ZIz/Z7r4   r¹  zglib-2.0)z>=z==z--target-glibr	   z--pkgr3   F)6Úcompiler_argsÚget_optionsr  Úget_always_argsÚget_no_warn_argsÚget_warn_argsrþ  rÿ  r  r   Úget_werror_argsÚget_option_compile_argsrŸ   r$   Úget_buildtype_argsÚget_optimization_argsrh   Úget_debug_argsr
   Úget_project_argsrm   rc  Úget_global_argsrÂ   r  Úget_external_argsrô  Úremoverñ   Úget_pic_argsrù   Úpicrû   ÚpieÚget_pie_argsÚreversedÚget_external_depsrm  r%   r¼  r   ÚExternalDependencyr‚   Úversion_reqsr  ÚExternalLibraryÚget_link_argsÚget_dependency_compile_argsÚget_exe_argsr   rU  rÃ  r  rê   )rJ   r   r'   r  ÚcommandsZ
copt_proxyr  r  r  rÇ  ÚreqÚltZpriv_dirr0   r0   r1   Úgenerate_basic_compiler_argsÝ  sn    

þ€€
z$Backend.generate_basic_compiler_argsrA  úT.List[build.Target]c                 C  sj   g }|D ].}|  ¡ std| ¡ › dƒ‚|  |¡}|sq| ¡ dkr'd| }n| ¡ | }| |¡ q|S )Nz)Tried to link with a non-library target "z".r2   z-Wl,)rú   rÌ   Úget_basenamerþ   rô  Úget_linker_lib_prefixr$  )rJ   r'   rA  r‘  r2   r´  r0   r0   r1   Úbuild_target_link_arguments@  s   

z#Backend.build_target_link_argumentsc                 C  s¢   t ƒ }| jj|j  ¡ }|r| tj |d¡¡ | jj|j  	¡ }|r-| tj |d¡¡ t
|tjƒrM|j ¡ D ]}| | | j¡¡ | | | j¡¡ q8t|ƒS )NÚbin)r   rÂ   Ú
propertiesrc  Úget_rootr±  rs   rt   ru   Úget_sys_rootrŸ   r
   r×   r+  r,  r‡  Úget_program_dirsr¢  r>  )rJ   r   rÅ  ÚrootÚsys_rootr£  r0   r0   r1   Úget_mingw_extra_pathsO  s   zBackend.get_mingw_extra_pathsÚlink_argc                 C  s¶   |   d¡r| dd … } t| ƒ}| ¡ sd S z|jdd}W n
 ty'   Y d S w |j d¡D ]}t|jƒ  S | ¡ r>|j}td 	| 
¡ jddd	¡ƒ}| d¡D ]}t|ƒ  S d S )
N)z-lz-Lr	   T)Ústrictz*.dllz/binz/libr:   )Úmaxsplit)r  r   Úis_absoluteÚresolveÚFileNotFoundErrorÚparentÚglobr$   Úis_fileru   rø   Úrsplit)r9  rq  r”  ZbinpathrE  r0   r0   r1   Úsearch_dll_path`  s$   
ÿzBackend.search_dll_pathc                 C  sˆ   t ƒ }|jD ]#}|jdkr|jddd}|r| |¡ q| tdt| j|j	ƒƒ¡ qt
|j|jƒD ]}t|tjƒrA| |  |¡¡ q1|S )a:  Find paths to all DLLs needed for a given target, since
        we link against import libs, and we don't know the actual
        path of the DLLs.

        1. If there are DLLs in the same directory than the .lib dir, use it
        2. If there is a sibbling directory named 'bin' with DLLs in it, use it
        r¹  Úbindirr¼   )r¹  Údefault_valueN)rÃ   r»  r¼  Úget_variabler±  r‡  ÚfilterÚmaprC  r½  r   rU  rÃ  rŸ   r
   r×   Úextract_dll_paths)rG   r   ÚresultsrÇ  rD  rÉ  r0   r0   r1   rI  |  s   



€zBackend.extract_dll_pathsú\T.Union[build.BuildTarget, build.CustomTarget, programs.ExternalProgram, mesonlib.File, str]ú:T.Sequence[T.Union[build.BuildTarget, build.CustomTarget]]c                 C  sÆ   t ƒ }t ƒ }t|tjƒr| | ¡ ¡ | |  |¡¡ |D ]}| |¡ t|tjƒr1| | ¡ ¡ q|D ]}tj	 
| j ¡ |  |¡¡}| |¡ q4t|tjƒr_| jj |j¡s_| |  |¡¡ t|ƒS )zÂOn Windows there is no such thing as an rpath.

        We must determine all locations of DLLs that this exe
        links to and return them so they can be used in unit
        tests.
        )rÃ   rŸ   r
   r×   r‡  Úget_transitive_link_depsrI  r±  rs   rt   ru   rÂ   rÄ   rÙ   rf  rj  rc  r8  r>  )rJ   r   rZ  r)  ÚprospectivesZbdepÚldZdirsegr0   r0   r1   ri  ˜  s$   	
€ÿz%Backend.determine_windows_extra_pathsr™  ú
T.BinaryIOrV   c                 C  ó   |   | j ¡ |¡ d S rW   )Úwrite_test_serialisationr
   Úget_benchmarks©rJ   r™  r0   r0   r1   r˜  µ  ó   zBackend.write_benchmark_filec                 C  rQ  rW   )rR  r
   Ú	get_testsrT  r0   r0   r1   r—  ¸  rU  zBackend.write_test_fileÚtestsúT.List['Test']úT.List[TestSerialisation]c                 C  s4  g }t |dd„ dD ]Œ}| ¡ }t|tjƒr| ¡ }ntj | j	 
¡ |  |¡¡g}t|tjtjfƒr7|j}ntj}|jD ]}t|tjƒrP|jtju rPtj} nq=| j	 |¡}| j	 ¡ }	| j	j|j }
|
 ¡ sk|
 ¡ ržg }t|tjƒryt| ¡ ƒ}|  ||¡}|jD ]}t|tjƒrœ|  |g ¡D ]}||vr›| |¡ qq‚ng }g }t|jƒ}t|tjƒr²|  |¡ |jD ]W}t|tjƒrÃ|  |¡ nt|tj!ƒrÏ|  |j"¡ t|t#j$ƒrétj | j	 
¡ | %| j&¡¡}| |¡ qµt|t'ƒrô| |¡ qµt|tjtj!fƒr	| (|  )||j*¡¡ qµt+dƒ‚t, -|j.¡}|
 ¡ s\|
 ¡ s\|
 /¡ s\tƒ }|D ](}t|tjƒrN| 0¡ D ]}t|tj1ƒrL|  tj | j	 
¡ | 2¡ ¡¡ q4q'|r\| 3dt|ƒd¡ t4| 5¡ |j6|j7|||	| j	 8¡ |j9|||j:|j;|j*||j<|j=t|tjƒt|tj>ƒdd„ |D ƒ| j	j?j@|jAƒ}| |¡ q
|S )	Nc                 S  s
   d| j  S )Néÿÿÿÿ)rœ   )Ztstr0   r0   r1   Ú<lambda>½  s   
 z3Backend.create_test_serialisation.<locals>.<lambda>)ÚkeyzBad object in test command.ÚLD_LIBRARY_PATHr¬  c                 S  s   g | ]}|  ¡ ‘qS r0   )Úget_id©rz  r6  r0   r0   r1   rÌ    s    z5Backend.create_test_serialisation.<locals>.<listcomp>)BÚsortedÚget_exerŸ   r   r    rb  rs   rt   ru   rÂ   rÄ   rÛ   r
   r×   rc  r   rd  r“   ÚHOSTÚis_cross_buildrl  rf  rg  rh  rÒ   r>  Ú get_transitive_build_target_depsri  r$  rÃ   r   ÚTargetr±  rÖ   r   r   r   rI  rÇ   r$   rM  Úconstruct_target_rel_pathsr˜   r   ÚcopyÚdeepcopyr•   Ú	is_darwinÚget_all_link_depsrñ   rè   ÚprependrŒ   Úget_namer   rŽ   rk  r’   r–   r—   rš   rœ   rû   r  rU   rž   )rJ   rW  ÚarrrÐ   ro  rX  Ztest_for_machineÚaÚis_crossr   rr  rZ  r™   rq  r“   r   Zt_envZld_lib_pathr2   rV  Útsr0   r0   r1   Úcreate_test_serialisation»  s   

€


€ü



€



÷
z!Backend.create_test_serialisationc                 C  s   t  |  |¡|¡ d S rW   )r‹  rŒ  rq  )rJ   rW  r™  r0   r0   r1   rR    rU  z Backend.write_test_serialisationc                   s®   ˆ   |¡‰t|tjƒrˆd u rˆpd‰t|tjƒr| ¡ g}nt|tjtjfƒs*J ‚| ¡ }‡fdd„|D ƒ}ˆd urUt	j
 ˆ¡sCJ ‚‡ fdd„|D ƒ}‡fdd„|D ƒ}|S )Nrí   c                   ó   g | ]	}t j ˆ |¡‘qS r0   ©rs   rt   ru   r_  )r	  r0   r1   rÌ    ó    z6Backend.construct_target_rel_paths.<locals>.<listcomp>c                   ó    g | ]}t j ˆ j ¡ |¡‘qS r0   ©rs   rt   ru   rÂ   rÄ   r_  r`   r0   r1   rÌ     ó     c                   s   g | ]	}t j |ˆ ¡‘qS r0   )rs   rt   rÆ   r_  )r˜   r0   r1   rÌ  !  rt  )rÙ   rŸ   r
   rû   r×   rØ   rÒ   rÖ   rÔ   rs   rt   r¾  )rJ   rÐ   r˜   Úoutputsr0   )rJ   r	  r˜   r1   rf    s   
z"Backend.construct_target_rel_pathsr2   rO   c                 C  s˜  | j j}|d u r&| jj tdƒ¡}t|tƒsJ dƒ‚|r$tj	 
|d¡}nd S tj	 
| j ¡ d¡}tj	 
| j ¡ |¡}tj	 
| j ¡ tj	 |¡¡}tj	 
d|¡}tj	 
dtj	 |¡¡}dddd„ | j j ¡ D ƒd	œ}	t|d
dd}
|
 t |	¡¡ W d   ƒ n1 sƒw   Y  |j t|||d dddd¡ | j j ¡ D ],}|jD ]&\}}tj	 
|| ¡ ¡}tj	 
|| ¡ ¡}|j t|||d |jddd¡ q¢qd S )NÚ
licensedirr  z
depmf.jsonrr   zdependency manifestz1.0c                 S  s   i | ]	\}}||  ¡ “qS r0   )Úto_json)rz  r  r  r0   r0   r1   Ú
<dictcomp>3  rt  z2Backend.generate_depmf_install.<locals>.<dictcomp>)rI   rU   Úprojectsr   r!  r"  r¼   ÚdevelZdepmf)rp   r}   )r
   Údep_manifest_namerÂ   r  r  r   rŸ   r$   rs   rt   ru   rÄ   Ú
get_prefixr  Údep_manifestr-  r'  r0  ÚjsonÚdumpsr\   r$  rz   r,  Úlicense_filesrç  rm   )rJ   r2   Z
depmf_pathZ
option_dirZ	ifilenameÚ	ofilenameZodirnamerw   Zout_dirZmfobjr”  Úmr‚   r0   r0   r1   Úgenerate_depmf_install$  s<   ÿÿÿ
ÿýÿzBackend.generate_depmf_installc                   sb   t ‡ fdd„ˆ j ¡ D ƒƒ}ˆ j ¡ r| ˆ jjj¡ | ˆ jjj¡ | 	d¡ ˆ  
|¡ t|ƒS )zcList of all files whose alteration means that the build
        definition needs to be regenerated.c                   s   g | ]}t tˆ jƒ| ƒ‘qS r0   )r$   r   rÇ   )rz  Údfr`   r0   r1   rÌ  C  s    ÿz.Backend.get_regen_filelist.<locals>.<listcomp>zmeson-private/coredata.dat)r   r£   Úget_build_def_filesrÂ   rc  r‡  r  Úcross_filesÚconfig_filesr±  Úcheck_clock_skewr>  )rJ   rA  r0   r`   r1   Úget_regen_filelist@  s   ÿ


zBackend.get_regen_filelistc                 C  sp   |   ¡ }t| j ¡ | j ¡ |ƒ}tj | j ¡ d¡}t	|dƒ}t
 ||¡ W d   ƒ d S 1 s1w   Y  d S )Nzregeninfo.dumpr}  )rŒ  r6   rÂ   rÅ   rÄ   rs   rt   ru   rŠ  r'  r‹  rŒ  )rJ   rA  Z	regeninforÚ   r”  r0   r0   r1   Úgenerate_regen_infoL  s   
þÿ"ÿzBackend.generate_regen_infoÚ	file_listúT.Iterable[str]c                 C  sf   dd l }|  ¡ }|D ]&}tj | j ¡ |¡}tj |¡}|| }|dkr0td|› d|d›dƒ‚q
d S )Nr   gü©ñÒMbP?zClock skew detected. File z has a time stamp z.4fzs in the future.)Útimers   rt   ru   rÂ   rÄ   Úgetmtimer   )rJ   rŽ  r  Únowr”  ZabsfZftimeÚdeltar0   r0   r1   r‹  V  s   ÿùzBackend.check_clock_skewÚbtú4T.Union[build.BuildTarget, programs.ExternalProgram]c                 C  s8   t |tjƒrtj | j ¡ |  |¡¡g}|S | 	¡ }|S rW   )
rŸ   r
   r×   rs   rt   ru   rÂ   rÄ   rÛ   rb  )rJ   r”  rm  r0   r0   r1   Úbuild_target_to_cmd_arrayf  s
   ÿz!Backend.build_target_to_cmd_arrayrä  ú'build.GeneratedList'c                 C  s2   g }|D ]}|dkr||  ¡ 7 }q| |¡ q|S )Nz@EXTRA_ARGS@)Úget_extra_argsr$  )rJ   r‘  rä  Z
final_argsrn  r0   r0   r1   Úreplace_extra_argsm  s   zBackend.replace_extra_argsÚprivate_dirÚoutput_listc           
   	   C  s~   g }t  d¡}|D ]3}| |¡}|d ur7t| d¡ƒ}d|› d}	| |	tj ||| ¡¡}| |¡}|d us| 	|¡ q	|S )Nz@OUTPUT(\d+)@r:   z@OUTPUTú@)
rõ   r­  Úsearchr›   r¯  r÷   rs   rt   ru   r$  )
rJ   r‘  rš  r›  ZnewargsÚregexr´  r…  Úindexr  r0   r0   r1   Úreplace_outputsv  s   


üzBackend.replace_outputsúD'T.OrderedDict[str, T.Union[build.BuildTarget, build.CustomTarget]]'c                 C  s0   t ƒ }| j ¡  ¡ D ]\}}|jr|||< q
|S rW   )r   r
   Úget_targetsr-  Úbuild_by_default)rJ   r)  r‚   Úbr0   r0   r1   Úget_build_by_default_targetsƒ  s   €z$Backend.get_build_by_default_targetsÚ	benchmarkúBT.OrderedDict[str, T.Union[build.BuildTarget, build.CustomTarget]]c                 C  sª   t ƒ }|r
| j ¡ n| j ¡ }|D ]A}|j}t|tjtjfƒr%||| ¡ < |j	D ]}t|tjtjfƒs4q(||| ¡ < q(|j
D ]}t|tjtjfƒsKJ ‚||| ¡ < q>q|S rW   )r   r
   rS  rV  ro  rŸ   rÒ   r×   r^  r“   r   )rJ   r¦  r)  rX   rÐ   ro  r´  rÇ  r0   r0   r1   Úget_testlike_targets‹  s   

þzBackend.get_testlike_targetsÚgenerated_sourceúbuild.CustomTargetc                 C  s<   g }|  ¡ D ]}| j |¡r| tj |  |¡|¡¡ q|S rW   )rÔ   rÂ   Ú
is_libraryr$  rs   rt   ru   rÙ   )rJ   r©  Úlibsr”  r0   r0   r1   Ú.get_custom_target_provided_by_generated_source›  s   €z6Backend.get_custom_target_provided_by_generated_sourceú.T.Union[build.BuildTarget, build.CustomTarget]c                 C  s4   g }|  ¡ D ]}t|tjƒsq| |  |¡¡ q|S rW   )Úget_generated_sourcesrŸ   r
   rÒ   rM  r­  )rJ   r   r¬  rÐ   r0   r0   r1   Ú$get_custom_target_provided_libraries£  s   z,Backend.get_custom_target_provided_librariesc                   s"  g }ˆ  ¡ D ]ˆ‰ tˆ tƒrtj ˆjˆjˆ ¡g}netˆ tj	ƒr&ˆ 
ˆ ¡g}nXtˆ tjtjfƒr<‡ ‡fdd„ˆ  ¡ D ƒ}nBtˆ tjƒrO‡‡fdd„ˆ  ¡ D ƒ}n/tˆ tjƒr[ˆ ˆ ¡}n#tˆ tjƒrwˆ  ¡ siJ dƒ‚ˆ jdusrJ dƒ‚ˆ jg}nˆ  ˆj¡g}ˆjrŠ‡fdd„|D ƒ}||7 }q|S )zÌ
        Custom target sources can be of various object types; strings, File,
        BuildTarget, even other CustomTargets.
        Returns the path to them relative to the build root directory.
        c                   s    g | ]}t j ˆ ˆ ¡|¡‘qS r0   )rs   rt   ru   Úget_custom_target_output_dir©rz  rq  )rÉ  rJ   r0   r1   rÌ  ¹  rw  z5Backend.get_custom_target_sources.<locals>.<listcomp>c                   s    g | ]}t j ˆ  ˆ¡|¡‘qS r0   )rs   rt   ru   r  r²  rÝ   r0   r1   rÌ  »  rw  zThis shouldn't be possibleNr  c                   ru  r0   rv  )rz  r”  r`   r0   r1   rÌ  Å  rw  )Úget_sourcesrŸ   r$   rs   rt   ru   rÇ   Úsubdirr
   r×   rÛ   rÒ   rÖ   rÔ   ÚGeneratedListrJ  rF  r   r    rm  rI  Úabsolute_paths)rJ   r   r4  re   r0   )rÉ  rJ   r   r1   Úget_custom_target_sources¬  s*   


z!Backend.get_custom_target_sourcesú.T.Union[build.CustomTarget, build.BuildTarget]r¶  c                 C  s–   g }|j D ]C}t|tjƒr)|r| | | j ¡ | j ¡ ¡¡ q| | 	| j
¡¡ q|r;| tj | j ¡ |j|¡¡ q| tj | j
|j|¡¡ q|S rW   )Údepend_filesrŸ   r   r   r$  ræ   rÂ   rÅ   rÄ   rI  rÇ   rs   rt   ru   r´  )rJ   r   r¶  rA  rÉ  r0   r0   r1   Úget_target_depend_filesÉ  s   
ÿ zBackend.get_target_depend_filesc                 C  s
   |   |¡S rW   )rÙ   rÝ   r0   r0   r1   r±  Ù  s   
z$Backend.get_custom_target_output_dirc                 C  s   t j |¡S rW   ©rs   rt   ré   )rJ   rØ  r0   r0   r1   Úget_normpath_targetã  s   zBackend.get_normpath_targetc                C  sl   g }|  ¡ D ]-}t|tjtjfƒsq|  |  |¡¡}|sd}|r*tj 	| j
 ¡ |¡}||vr3| |¡ q|S )Nrí   )r¯  rŸ   r
   rÒ   rÖ   r¼  r±  rs   rt   ru   rÂ   rÄ   r$  )rJ   r   r'   ræ   Zcustom_target_include_dirsrÉ  Úidirr0   r0   r1   Úget_custom_target_dirsç  s   
€zBackend.get_custom_target_dirsc                C  s.   g }| j |||dD ]
}|| |d¡7 }q
|S )Nrå   F)r¾  rê   )rJ   r   r'   ræ   ÚincsrÉ  r0   r0   r1   Ú"get_custom_target_dir_include_argsù  s   z*Backend.get_custom_target_dir_include_argsÚabsolute_outputsú.T.Tuple[T.List[str], T.List[str], T.List[str]]c                   s  | j }d}|  |¡‰ |r | j ¡ }| j ¡ }tj | j ¡ ˆ ¡‰ ‡ fdd„| ¡ D ƒ}|  	|¡}g }|j
D ]¸}t|tjƒrE||  |¡7 }q5t|tjƒr\| ¡ d }	tj |  |¡|	¡}nŒt|tjƒrx| | j ¡}|jsm|rwtj | j ¡ |¡}npt|tƒrÜd|v r‡| d|¡}d|v r‘| d|¡}d|v r¡| dtj ||j¡¡}d|v rÃ|jd u rµd	|j›d
}
t|
ƒ‚tj ˆ |j¡}| d|¡}d|v rÛ|jrÐ|  |¡}n|  |¡}| d|¡}ntd|› dt|ƒ› ƒ‚| |¡ q5t ||¡}t  ||¡}dd„ |D ƒ}|||fS )Nrí   c                   rr  r0   rs  ©rz  rÉ  ©rf   r0   r1   rÌ    rt  z6Backend.eval_custom_target_command.<locals>.<listcomp>r   z@SOURCE_ROOT@z@BUILD_ROOT@z@CURRENT_SOURCE_DIR@ú	@DEPFILE@zCustom target z/ has @DEPFILE@ but no depfile keyword argument.z@PRIVATE_DIR@z	Argument z is of unknown type c                 S  s   g | ]}|  d d¡‘qS )rÔ  rÑ  )r÷   rÃ  r0   r0   r1   rÌ  L  ó    )!rÇ   r±  rÂ   rÅ   rÄ   rs   rt   ru   rÔ   r·  ÚcommandrŸ   r
   r×   r–  rÒ   r   r   rI  r¶  r$   r÷   r´  Údepfiler‚   r   r  r  rÌ   rI   r$  Úget_filenames_templates_dictÚsubstitute_values)rJ   r   rÁ  Úsource_rootÚ
build_rootrx  ÚinputsrX  rÉ  Útmprs  Z	dfilenameZpdirr,  r0   rÄ  r1   Úeval_custom_target_command  s^   





€


€
z"Backend.eval_custom_target_commandúbuild.RunTargetr”   c                 C  sx   |j r|j nt ¡ }|jr:t| j ¡ dg ƒ}| d| j ¡ g¡ | d| j 	¡ g¡ | d|j
g¡ | d|g¡ |S )NÚ
introspectÚMESON_SOURCE_ROOTÚMESON_BUILD_ROOTÚMESON_SUBDIRÚMESONINTROSPECT)r•   r   ÚEnvironmentVariablesÚdefault_envr   rÂ   rƒ  rÃ   rÅ   rÄ   r´  )rJ   r   r•   Úintrospect_cmdr0   r0   r1   Úget_run_target_envO  s   zBackend.get_run_target_envc                 C  sp   ddl m} t| j ¡ dg ƒ}| j ¡ | j ¡ |dœ}| jjD ]}d 	|j
¡}t d|›¡ |||ƒ q d S )Nr	   )Úrun_exerÑ  )rÒ  rÓ  rÕ  ú zRunning postconf script )Zscripts.meson_exerÚ  r   rÂ   rƒ  rÅ   rÄ   r
   Úpostconf_scriptsru   r“   r   Úlog)rJ   rÚ  rØ  r•   rS  r‚   r0   r0   r1   Úrun_postconf_scriptsY  s   þýzBackend.run_postconf_scriptsc              	   C  s  | j  tjd¡}|d u r| j  ¡ rt d¡ ntjd d g}| j j	 
tdƒ¡}t|ttfƒs3J dƒ‚t| j  ¡ | j  ¡ | j  ¡ | j  ¡ ||| j  ¡ dg | j j	jƒ}|  |¡ |  |¡ |  |¡ |  |¡ |  |¡ |  |¡ |  |¡ |  |¡ |  |¡ |S )Nri   zFCross file does not specify strip binary, result will not be stripped.r   rS   r  rÑ  )rÂ   Úlookup_binary_entryr   rb  rc  r   rÕ   r   Údefaultsr  r  r   rŸ   r$   r›   rO   rÅ   rÄ   r  Ú
get_libdirrƒ  rU   r†  Úgenerate_target_installÚgenerate_header_installÚgenerate_man_installÚgenerate_emptydir_installÚgenerate_data_installÚgenerate_symlink_installÚgenerate_custom_install_scriptÚgenerate_subdir_install)rJ   rR   Úumaskr2   r0   r0   r1   Úcreate_install_dataf  s4   

ù








zBackend.create_install_datac                 C  sT   t j | j ¡ d¡}t|dƒ}t |  ¡ |¡ W d   ƒ d S 1 s#w   Y  d S )Nzinstall.datr}  )	rs   rt   ru   rÂ   rŠ  r'  r‹  rŒ  rë  )rJ   Zinstall_data_filer5  r0   r0   r1   Úcreate_install_data_files…  s   "ÿz!Backend.create_install_data_filesrf   c           
      C  s  | j  ¡ }t|| j  ¡ ƒ}t|| j  ¡ ƒ}t|| j  ¡ ƒ}| j j t 	d¡¡}t
|tƒs0J dƒ‚t||ƒ}|r@t||t|ƒjƒnt||ƒ}	||	jv rLdS ||	jv r`|	jdv rXdS |	jdv r_dS n||	jv rgdS ||	jv rndS d|	jv rud	S d
|	jv r|d
S t d|	¡ d S )NÚ	localedirr  Úruntime>   rï   z.pcr}  >   rº  rð   Zi18nzinstalled-testsrW  Z	systemtapzFailed to guess install tag for)rÂ   r  r   Ú
get_bindirrá  Úget_includedirr  r  r   r   rŸ   r$   r‚   Úparentsr  rÕ  r   r  )
rJ   re   rf   rP   rD  rQ   ZincdirZ_ldirrí  Z	dest_pathr0   r0   r1   Úguess_install_tagŠ  s4   

 



ÿ



zBackend.guess_install_tagc                 C  s  | j  ¡  ¡ D ]}| ¡ sq| ¡ \}}}t|ƒt| ¡ ƒ}}|d|hvr6d}t| |j	|| ¡ |¡ƒ‚t|j
ƒ|ks?J ‚| ¡ }	|d }
|d }t|t jƒrtt|t jƒ }|oa| tdƒ¡}t|tƒskJ dƒ‚|
dur%|j
d p~t|t jƒr}dnd}| |j¡}t|  |¡|
||||j|j|	|j||d	}|j |¡ | ¡ D ]\}}}tj |
|¡}t|||
|j|d
d}|j  |¡ q¤t|t j!t j"t j#fƒr%| $¡ rú|r×|
}n| j% &¡ }t|  '|¡||di t(ƒ d|	|jt|t j"ƒdd}|j |¡ |s%| )¡ r%tj |  *|¡| )¡ ¡}t||
|di t(ƒ d|	|jd
dd}|j |¡ |dkrst+| ¡ dd … |dd … |dd … |j
dd … ƒD ].\}}}}|du rQqDtj |  *|¡|¡}t|||di t(ƒ d |	|j|d
}|j |¡ qDqt|t j,ƒr
|dkrÅ|dkrÅ|
durÄt+| ¡ |j
ƒD ]1\}}|pž|  -||
¡}tj |  *|¡|¡}t||
|di t(ƒ d |	|j|j. |d}|j |¡ q’qt+| ¡ |||j
ƒD ]:\}}}}|du rÜqÏ|pä|  -||¡}tj |  *|¡|¡}t|||di t(ƒ d |	|j|j. |d}|j |¡ qÏqd S )Nr:   zÅTarget {!r} has {} outputs: {!r}, but only {} "install_dir"s were found.
Pass 'false' for outputs that should not be installed and 'true' for
using the default installation directory for an output.r   ri   r  Fr}  rî  )rp   rq   T)rƒ   r¼   )rn   rp   ©rp   )/r
   r¢  r,  Úshould_installÚget_install_dirrÓ   rÔ   r   Úformatr‚   Úinstall_tagÚget_custom_install_moderŸ   r×   rù   r  r   rh   Úget_link_deps_mappingrP   rd   rÛ   rj   rk   rm   rX   r$  Úget_aliasesrs   rt   ru   r€   r]   rñ   ÚSharedModulerû   rò   rÂ   Úget_import_lib_dirrþ   rÃ   rá   rÙ   ÚziprÒ   rò  r£  )rJ   r2   rÐ   ÚoutdirsÚinstall_dir_namesÚcustom_install_dirZnum_outdirsZnum_outr…  rl   Zfirst_outdirZfirst_outdir_namerq   Zshould_striprp   ÚmappingsrÉ  ÚaliasÚtorS  Zimplib_install_dirZ
debug_fileÚoutputrf   rg   r”  r0   r0   r1   râ  ¥  s°   

ü

ü
ü
@
þ€

ý€ 

ý€…zBackend.generate_target_installc                 C  s4   | j j|_|jD ]}|jst dd |j¡¡ qd S )Nz/Failed to guess install tag for install script:rÛ  )r
   r^   rp   r   r  ru   r“   )rJ   r2   rÉ  r0   r0   r1   rè  #  s   

€þz&Backend.generate_custom_install_scriptc                 C  sÄ   | j  ¡ }| j ¡ }| j  ¡ }| j  ¡ }|D ]I}| ¡  }}|d u r=| ¡ }	|	d u r/|}d}ntj	 
||	¡}tj	 
d|	¡}| ¡ D ]}
|
 ||¡}t|||| ¡ |jd|jd}|j |¡ qAqd S )Nz{includedir}r}  )rp   r   )rÂ   rð  r
   Úget_headersrÅ   rÄ   Úget_custom_install_dirÚget_install_subdirrs   rt   ru   r³  ræ   rz   rø  rm   r   rY   r$  )rJ   r2   ZincrootrY   rÆ  ÚbuilddirÚhrf   rg   r´  r”  ÚabspathrÉ  r0   r0   r1   rã  )  s&   



ýõzBackend.generate_header_installc              
   C  sþ   | j  ¡ }| j ¡ }|D ]p}| ¡ D ]i}| d¡d }| ¡ }|d u r;|jr2tj	 
d|jd| ¡}n	tj	 
dd| ¡}|j}|jrK| d|j› d¡}| | j  ¡ | j  ¡ ¡}	tj	 
|tj	 |¡¡}
|
 d|¡}t|	||
| ¡ |jdd}|j |¡ qqd S )Nrí   rZ  z{mandir}rZ   r¼   ró  )rÂ   Ú
get_mandirr
   Úget_manr³  r°  r  Úlocalers   rt   ru   re   r÷   ræ   rÅ   rÄ   rv   rz   rø  rm   rZ   r$  )rJ   r2   ZmanrootrZ   r…  r”  Únumr´  re   ZsrcabsÚdstnameZdstabsrÉ  r0   r0   r1   rä  ?  s(   

ñÿzBackend.generate_man_installc                 C  sJ   | j  ¡ }|D ]}|jp|  |j¡}t|j|j|j|ƒ}|j 	|¡ qd S rW   )
r
   Úget_emptydirr÷  rò  rt   rx   rl   rm   r[   r$  )rJ   r2   r[   rª  rp   rÉ  r0   r0   r1   rå  T  s   
ýz!Backend.generate_emptydir_installc                 C  sÐ   | j  ¡ }| j ¡ }| j ¡ }|D ]T}t|t jƒsJ ‚|j}|j}t	|j
|jƒD ]<\}}	t|tjƒs4J ‚tj ||	¡}
tj ||	¡}|jpI|  |
¡}t| ||¡|
||j|j||j|jd}|j |¡ q(qd S )N)rp   r}   r   )r
   Úget_datarÂ   rÅ   rÄ   rŸ   ÚDataÚinstall_dirÚinstall_dir_namerý  r)   Úrenamer   r   rs   rt   ru   r÷  rò  rz   ræ   rl   rm   r}   r   r\   r$  )rJ   r2   r\   rÆ  r  Úder´  Zsubdir_nameÚsrc_fileÚdst_nameZdst_absZdstdir_namerp   rÉ  r0   r0   r1   ræ  [  s&   


þøüzBackend.generate_data_installc                 C  sn   | j  ¡ }|D ]-}t|t jƒsJ ‚|j}tj ||j¡}|j	p#|  
|¡}t|j|||j|ƒ}|j |¡ qd S rW   )r
   Úget_symlinksrŸ   ÚSymlinkDatar  rs   rt   ru   r‚   r÷  rò  r€   r   rm   r]   r$  )rJ   r2   ÚlinksrV  r  Zname_absrp   rS  r0   r0   r1   rç  m  s   
úz Backend.generate_symlink_installc           	      C  sü   | j  ¡ D ]v}|jr| j ¡ }n| j ¡ }tj ||j	|j
¡ d¡}tj | j ¡ |j¡}tj d|j¡}|j|jkr>|j}|jsWtj |tj |¡¡}tj |tj |¡¡}|jpd|  tj |jd¡¡}t||||j|j|j||jd}|j |¡ qd S )NrÑ  rr   Zdummy)r   )r
   Úget_install_subdirsÚfrom_source_dirrÂ   rÅ   rÄ   rs   rt   ru   Úsource_subdirÚinstallable_subdirÚrstripr  r  r  Ústrip_directoryrv   r÷  rò  r„   rl   r…   rm   r   r_   r$  )	rJ   r2   ÚsdÚfrom_dirÚsrc_dirÚdst_dirr  rp   rÉ  r0   r0   r1   ré  w  s2   
þþÿÿízBackend.generate_subdir_installÚ	target_idú!T.List['TargetIntrospectionData']c                   sL  t |tjtjfƒr¤|j}g }|D ]<‰ t ˆ tjƒr$|ˆ  ˆjˆj	¡g7 }qt ˆ t
ƒr5|tj ˆjˆ ¡g7 }qt ˆ tjtjfƒrL|‡ ‡fdd„ˆ  ¡ D ƒ7 }qdd„ |D ƒ}g }t |tjƒr›|j}|D ]9‰ t ˆ tjƒru|ˆ  ˆjˆj	¡g7 }qat ˆ t
ƒr€|ˆ g7 }qat ˆ tjtjfƒr|ˆ  ¡ 7 }qatdtˆ ƒj› dƒ‚d|g |g dœgS g S )aK  
        Returns a list of source dicts with the following format for a given target:
        [
            {
                "language": "<LANG>",
                "compiler": ["result", "of", "comp.get_exelist()"],
                "parameters": ["list", "of", "compiler", "parameters],
                "sources": ["list", "of", "all", "<LANG>", "source", "files"],
                "generated_sources": ["list", "of", "generated", "source", "files"]
            }
        ]

        This is a limited fallback / reference implementation. The backend should override this method.
        c                   s"   g | ]}t j ˆjˆ  ¡ |¡‘qS r0   )rs   rt   ru   r8   rè   )rz  r  ©ÚjrJ   r0   r1   rÌ  ¥  s   " z2Backend.get_introspection_data.<locals>.<listcomp>c                 S  s   g | ]}t j |¡‘qS r0   r»  )rz  rS  r0   r0   r1   rÌ  ¦  rÆ  zType "z;" is not supported in get_introspection_data. This is a bugÚunknown)r%   r'   r(   r)   r*   )rŸ   r
   rÒ   r×   r)   r   r   ræ   r7   r8   r$   rs   rt   ru   rÔ   rÇ  rÌ   rI   r,   )rJ   r&  r   Zsource_list_rawZsource_listr'   Ztmp_compilerr0   r(  r1   Úget_introspection_data  s<   
€
ûzBackend.get_introspection_datac           
      C  sr  t  ¡ }tƒ }tƒ }| jjtj }| jjtj }| ¡  o | ¡ }| j	 
¡  ¡ D ]K}| ¡ o4| ¡ d  }|jtjks=|s>q(tj | j ¡ |  |¡¡}	t|t	jƒrh| |	¡ | ¡ s^| ¡ rg| |  |g ¡¡ q(t|t	jƒrs| |	¡ q(|r{| |¡ |r­|rŠ|jdt|ƒdd n#| ¡ s’| ¡ r˜| |¡ n| ¡ r¥| dt|ƒ¡ n| dt|ƒ¡ |r·| dt|ƒ¡ |S )Nr	   ZWINEPATHú;)Ú	separatorZDYLD_LIBRARY_PATHr]  ÚPATH)r   rÖ  rÃ   rÂ   rf  r   rd  rb  rg  r
   r¢  r,  rô  rõ  rc  rs   rt   ru   rÄ   rÙ   rŸ   rû   r±  rh  r‡  ri  rñ   rk  r>  ri  )
rJ   r•   r™   Zlibrary_pathsÚbuild_machineÚhost_machineZ	need_winerÐ   Zin_default_dirZtdirr0   r0   r1   Ú
get_devenv¿  s@   
€
€
zBackend.get_devenvr)   Ú_ALL_SOURCES_TYPEÚoutput_templúbuild.GeneratedListc           
      C  s¨   |  ¡ }t |d ¡}|dd… }|  ||¡}|| dd¡7 }|| d¡7 }|| ¡ dg 7 }||  ||¡7 }||  ||¡7 }t	j
||| ¡  |gdd}	|	 || j¡S )	zŠ
        Some backends don't support custom compilers. This is a convenience
        method to convert a Compiler to a Generator.
        r   r:   Nz@OUTPUT@rÅ  z@INPUT@z@PLAINNAME@.d)rÈ  )Úget_exelistr   r    r,  Úget_dependency_gen_argsÚget_output_argsÚget_compile_only_argsrì   rî   r
   Ú	GeneratorÚ	to_nativeÚprocess_filesr£   )
rJ   r   r'   r)   r3  Úexelistro  r‘  r)  Ú	generatorr0   r0   r1   Úcompiler_to_generatorì  s   zBackend.compiler_to_generatorúbuild.CompileTargetc                 C  s0   t  d|j¡t  d|j¡ }|  ||j||j¡S )Nr2  )rþ  rÿ  r)   Ú	generatedr>  r'   r3  )rJ   r   Zall_sourcesr0   r0   r1   Úcompile_target_to_generator  s   z#Backend.compile_target_to_generator)r
   r¢   r£   r¤   )FN)rÈ   rh   rÉ   rÊ   r=   rË   )rÐ   rÑ   rÏ   rh   r=   r$   )r   rÑ   r=   r$   )r   rà   r=   ro   )r   rà   r'   rç   ræ   rh   r=   r&   )r   rÑ   r=   ro   )rÐ   r  r  r  r=   r$   )r   r  r=   r$   )r   r  r=   r$   )r   r  r  r  r  r$   r=   r$   )r   r  r  r$   r  r›   r=   r  )r   rà   r  r$   r=   r  )r8  r$   r9  r$   r=   r$   )r¼   )r   rà   r:  r$   r=   r;  )rC  rD  r:  r$   r=   r&   )r   rà   rC  rG  r:  r$   r=   r;  )r   rà   r=   rh   )r   rà   r=   r&   )NNNNNNFN)rX  rY  r˜   ro   rZ  r[  rÈ   ro   r\  ro   r•   r]  rp   ro   rž   rh   r^  r_  r=   r`  )NNNNFNF)ro  ru  r“   rv  r˜   ro   rZ  r[  rÈ   ro   r\  ro   rw  rh   r•   r]  rž   rh   r=   rx  )r=   r–  )r   rà   r=   r›  )rQ   r$   r+  r   r•   r¡  r=   rh   )r   rà   r=   r¥  )r‘  r&   r=   r¥  )T)r   rà   r¶  rh   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è  r&   r=   r$   )r   rà   r©  r$   rø  r$   r=   r$   )r‘  r&   r=   r&   )r   r  r'   rç   r=   r&   )F)r   rà   r'   rç   r  rh   r=   r	  )r'   rç   rA  r-  r=   r&   )r9  r$   r=   ro   )r   rK  rZ  rL  r=   r&   )r™  rP  r=   rV   )rW  rX  r=   rY  )rW  rX  r™  rP  r=   rV   )rÐ   rÑ   r˜   ro   r=   r&   )r2   rO   r=   rV   )r=   r&   rb   )rŽ  r  r=   rV   )r”  r•  r=   r&   )r‘  r&   rä  r—  r=   r&   )r‘  r&   rš  r$   r›  r&   r=   r&   )r=   r¡  )r¦  rh   r=   r§  )r©  rª  r=   r·  )r   r®  r=   r·  )r   rª  r=   r&   )r   r¸  r¶  rh   r=   r&   )rØ  r$   r=   r$   )r   rª  r'   rç   ræ   rh   r=   r&   )r   rª  rÁ  rh   r=   rÂ  )r   rÐ  r=   r”   )r=   rO   rW   )re   r$   rf   ro   r=   ro   )r&  r$   r   r  r=   r'  )r=   r”   )
r   rà   r'   rç   r)   r2  r3  r$   r=   r4  )r   r?  r=   r4  )_r,   r-   r.   r/   r‚   rˆ   rÍ   rÛ   rÞ   rã   rä   rì   rî   rþ   r   rÙ   r
  r  r  r  r  r  r7  ÚstaticmethodrÆ   rB  rF  r<  rT  rW  rt  r•  rš  rŸ  r¤  r«  r¨  rÄ  rÏ  r×  rß  rN  rö  rë  rü  ré  r  r  r,  r0  r8  rC  rL   rI  ri  r˜  r—  rq  rR  rf  r†  rŒ  r  r‹  r–  r™  r   r¥  r¨  r­  r°  r·  rº  r±  r¼  r¾  rÀ  rÏ  rÙ  rÞ  rë  rì  rò  râ  rè  rã  rä  rå  ræ  rç  ré  r+  r1  r>  rA  r0   r0   r0   r1   rÁ     sø   
 		
*÷Jøa	
!+":	
cS
	
ÿþ	ÿN
~
2-rÁ   )NN)r¡   r$   r
   r¢   r£   r¤   r=   r¥   )r¿   r$   r
   r¢   r£   r¤   r=   r¥   )OÚ
__future__r   Úcollectionsr   Údataclassesr   r   Ú	functoolsr   Ú	itertoolsr   Úpathlibr   rg  Úenumr  rs   r‹  rõ   r€  Útypingrþ  r„  r¼   r
   r   r   r   r   r+  r   r   r   r   r   r   r   r   r   r   ÚTYPE_CHECKINGZ_typingr   Úarglistr   r   rÂ   r   r£   r   r   Úlinkers.linkersr   r    r!   Útyping_extensionsr"   ÚListÚUnionrÒ   rÖ   rµ  r2  r#   rí  r6   ÚEnumr9   rM   rO   rd   rx   rz   r€   r„   rŒ   r¾   rÀ   rÁ   r0   r0   r0   r1   Ú<module>   sn   (
		%