o
    Wªod¬w ã                   @  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=d>d9d:„ZLG d;d<„ d<ƒZMdS )?é    )Ú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   úzhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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_umaskZ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=   rU   ©r,   r-   r.   r/   r`   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=   rU   c                 C  s6   |d u rt j d| j¡}t j |t j | j¡¡| _d S )Nú{prefix})ÚosÚpathÚjoinre   Úbasenamerd   Úout_name)rJ   rf   r0   r0   r1   r`   š   s   zTargetInstallData.__post_init__)rf   rn   r=   rU   )r,   r-   r.   r/   rm   ro   rp   r`   r0   r0   r0   r1   rc   Š   s   
 rc   c                   @  s2   e Zd ZU ded< ded< ded< dZded< dS )	ÚInstallEmptyDirr$   rs   ú
'FileMode'rk   rl   Nrn   ro   )r,   r-   r.   r/   ro   r0   r0   r0   r1   rw   Ÿ   s
   
 rw   c                   @  sN   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S )ÚInstallDataBaser$   rs   Úinstall_pathÚinstall_path_namerx   rk   rl   Nrn   ro   Ú	data_type)r,   r-   r.   r/   ro   r|   r0   r0   r0   r1   ry   ¦   s   
 ry   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Únamerz   rl   Nrn   ro   Frg   Úallow_missing)r,   r-   r.   r/   ro   r€   r0   r0   r0   r1   r}   °   s   
 r}   c                      s"   e Zd Z	dd‡ fdd„Z‡  ZS )ÚSubdirInstallDataNrs   r$   rz   r{   rk   rx   ÚexcludeúT.Tuple[T.Set[str], T.Set[str]]rl   ro   rn   r|   c	           	   	     s"   t ƒ  |||||||¡ || _d S rV   )ÚsuperÚ__init__r‚   )	rJ   rs   rz   r{   rk   r‚   rl   ro   r|   ©Ú	__class__r0   r1   r…   »   s   
zSubdirInstallData.__init__©NN)rs   r$   rz   r$   r{   r$   rk   rx   r‚   rƒ   rl   r$   ro   rn   r|   rn   )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&   Úsuiterd   rg   Úis_cross_builtz$T.Optional[programs.ExternalProgram]Úexe_wrapperZneeds_exe_wrapperÚis_parallelÚcmd_argsúbuild.EnvironmentVariablesÚenvÚshould_failzT.Optional[int]Útimeoutrn   ÚworkdirÚextra_pathsr9   ÚprotocolÚintÚpriorityZcmd_is_builtZ
cmd_is_exeÚdependsrT   Úverboser=   rU   c                 C  s$   | j d urt| j tjƒsJ ‚d S d S rV   )rŽ   Ú
isinstancer   ÚExternalProgramr_   r0   r0   r1   r`   Ú   s   
ÿzTestSerialisation.__post_init__Nra   rb   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 )NZninjar:   )ÚninjabackendÚvs)Úvs2010backendZvs2010Zvs2012)Úvs2012backendZvs2013)Úvs2013backendZvs2015)Úvs2015backendZvs2017)Úvs2017backendZvs2019)Úvs2019backendZvs2022)Úvs2022backendZxcode)ÚxcodebackendÚnone)Únonebackend)Ú r£   ZNinjaBackendr¥   Zautodetect_vs_versionZVs2010Backendr¦   ZVs2012Backendr§   ZVs2013Backendr¨   ZVs2015Backendr©   ZVs2017Backendrª   ZVs2019Backendr«   Z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°   c                   @  sÜ  e Zd ZU ded< dZd!dd	„Zd"dd„Zddœd#dd„Zd$dd„Zddœd%d!d"„Z	ddœd%d#d$„Z
d&d&d'„Zed(d)d$d*d+„ƒZd'd.d/„Zd(d0d1„Zd)d3d4„Zd)d5d6„Zed(d)d*d:d;„ƒZd+d@dA„Zd,dDdE„Zed-dHdI„ƒZd.d/dMdN„Zd.d0dQdR„Zd1dTdU„Zed2dVdW„ƒZd3dXdY„Z	(	(	(	(	(	(	d4d5dgdh„Z	(	(	(	(		(	d6d7dodp„Zd8drds„Zd9dudv„Zed:d{d|„ƒZ d;d~d„Z!ed<dd‚„ƒZ"ed(d)d=d>d…d†„ƒZ#d?dˆd‰„Z$ed@d‹dŒ„ƒZ%dAdd„Z&dBd“d”„Z'dCd•d–„Z(dDd™dš„Z)edEd›dœ„ƒZ*dFdždŸ„Z+dGdHd¢d£„Z,dId¦d§„Z-d3d¨d©„Z.dJd¬d­„Z/dKd°d±„Z0dKd²d³„Z1dLd·d¸„Z2dMd¹dº„Z3dNd»d¼„Z4dOd¿dÀ„Z5dPdÁdÂ„Z6d"dÃdÄ„Z7dQdÇdÈ„Z8dRdËdÌ„Z9dSdÏdÐ„Z:dTdÓdÔ„Z;dUdÖd×„Z<dGdVdÚdÛ„Z=ed(d)dWdÞdß„ƒZ>ed(d)dXdádâ„ƒZ?dYdãdä„Z@dGdZdædç„ZAd$dèdé„ZBed(d)d[dêdë„ƒZCddœd\dìdí„ZDddœd\dîdï„ZE	dGd]dòdó„ZFd^död÷„ZGd"dødù„ZHedúd)d_dûdü„ƒZId"dýdþ„ZJd`dad d„ZKdOdd„ZLdOdd„ZMdOdd„ZNdOdd	„ZOdOd
d„ZPdOdd„ZQdOdd„ZRdOdd„ZSdbdd„ZTdcdd„ZUdddd„ZVdedd „ZWd(S (f  Ú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 rV   )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__r=   rU   c                 C  s   t dt| ƒj› ƒ‚)Nzgenerate is not implemented in )ÚRuntimeErrorrI   r,   r_   r0   r0   r1   Úgenerate  s   zBackend.generateT©Úwarn_multi_outputÚtú.T.Union[build.Target, build.CustomTargetIndex]r»   rg   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_filenamerr   rs   rt   Úget_target_dir)rJ   r¼   r»   Úfilenamer0   r0   r1   Úget_target_filename  s   
ÿzBackend.get_target_filenamer~   c                 C  ó   t j | j ¡ |  |¡¡S rV   )rr   rs   rt   r²   r´   rÇ   ©rJ   r~   r0   r0   r1   Úget_target_filename_abs+  ó   zBackend.get_target_filename_absF©Úabsolute_pathúbuild.BuildTargetr'   ú
'Compiler'rÍ   r&   c                C  s<   |  ¡ }|r
| j}n| j}tj tj ||¡¡}| |d¡S )NF)Ú
get_subdirr7   r·   rr   rs   Únormpathrt   Úget_include_args)rJ   r~   r'   rÍ   ÚcurdirÚleadZtmppathr0   r0   r1   Úget_source_dir_include_args.  s   z#Backend.get_source_dir_include_argsc                C  s:   |rt j | j| ¡ ¡}n
| ¡ }|dkrd}| |d¡S )Nr¯   Ú.F)rr   rs   rt   r8   rÐ   rÒ   )rJ   r~   r'   rÍ   rÓ   r0   r0   r1   Úget_build_dir_include_args7  s   z"Backend.get_build_dir_include_argsrn   c                 C  sÖ   t |tjƒr| ¡ p| ¡ }tj |  |¡|¡S t |tj	ƒr*tj |  |¡| ¡ ¡S t |tj
tjfƒrL| ¡ s@td|j› dƒ‚tj |  |¡| ¡ ¡S t |tjƒrc|jratj |  |¡| ¡ ¡S d S td|›dƒ‚)Nz%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Ä   rr   rs   rt   rÅ   ÚStaticLibraryr¾   rÂ   Úis_linkable_targetr   r   Ú
ExecutableZimport_filenameÚAssertionError)rJ   r~   Zlink_libr0   r0   r1   Úget_target_filename_for_linking@  s   z'Backend.get_target_filename_for_linkingN)Ú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
   Z	RunTargetr²   ÚcoredataÚ
get_optionr   rÐ   )rJ   r~   Údirnamer0   r0   r1   rÅ   U  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)rr   rs   rt   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 rV   )rÅ   rr   rs   rt   r·   )rJ   r~   rè   r0   r0   r1   Úget_target_source_dirf  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)rr   rs   rt   rÇ   rÉ   r0   r0   r1   Úget_target_private_dirm  rË   zBackend.get_target_private_dirc                 C  rÈ   rV   )rr   rs   rt   r²   r´   rì   rÉ   r0   r0   r1   Úget_target_private_dir_absp  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Â   rr   rs   rt   rÅ   rì   )rJ   r~   rî   rð   r0   r0   r1   Úget_target_generated_dirs  s   z Backend.get_target_generated_dirÚsuffixÚnumberr˜   úmesonlib.Filec                 C  s*   |j › d|› d|› }tj |  |¡|¡S )Nz-unityrÖ   )r   r   r   Z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´   Úappendrr   rs   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)rr   rs   r¶   rt   )r  r  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 rV   )Ú_flatten_object_listZget_objectsÚlistÚdictÚ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 rV   )r  r~   r  r  r  )rJ   r!  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$   rr   rs   rt   r·   rÐ   r  r   r   Úis_builtÚrel_to_builddirr
   ÚExtractedObjectsÚ	recursiver  r~   ZobjlistÚextendÚ_determine_ext_objsr   )
rJ   r~   r!  r  r  r  Úobjrç   Zobjsr2   r0   r0   r1   r  Ã  s6   
ÿ
ÿÿ

zBackend._flatten_object_listc                 C  s    | j D ]
}| d¡r dS qdS )NZswiftTF)r)   Úendswith)r~   Úsr0   r0   r1   Úis_swift_targetá  s
   

ÿzBackend.is_swift_targetc                 C  s$   g }|j D ]
}| |  |¡¡ q|S rV   )Ú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]]ÚcaptureúT.Optional[bool]Úfeedr’   ú&T.Optional[build.EnvironmentVariables]ro   r›   ú'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   r'  r²   r7   Úget_pathr$   r  ÚmachinesÚ
is_windowsÚ	is_cygwinÚdetermine_windows_extra_pathsÚmatches_build_machineÚneed_exe_wrapperÚget_exe_wrapperÚfoundr   r-  Zis_wslr´   r   )rJ   r3  r•   r5  r7  r9  r’   ro   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_serialisationrI  ú\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t|ƒg7 }|r³|dt|ƒ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 sYw   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   )Ú.0rJ  r0   r0   r1   Ú	<genexpr>O  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
--internalrI  z--rÿ   r   Z
meson_exe_r#  z.datÚwbNz
--unpickle)*r  r*  rN  r–   rŽ   Úanyr   Úvarnamesrg   ÚshutilÚwhichZget_envr  rt   r$   r²   Úget_build_commandrœ   r   r   r
   rÃ   r¾   rr   rs   ru   r   r   r   rd   ÚhashlibÚsha1r’   ÚhashÚupdateÚbytesr•   Ú	hexdigestÚget_scratch_dirr  ÚpickleÚdump)rJ   rI  r   r•   r5  r7  r9  rQ  r’   r›   r3  ÚesZreasonsZcan_use_envZenvlistÚkÚvÚargsru   ZhasherÚdigestZscratch_fileZexe_dataÚfr0   r0   r1   Úas_meson_exe_cmdline5  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.datrW  zmeson_benchmark_setup.dat)rr   rs   rt   r²   rc  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Ú   Zstatic_linkerr>  Z$get_clink_dynamic_linker_and_stdlibs)rJ   r~   r1  Z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)rr   rs   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 rV   )r   r²   rã   Zget_external_link_argsr>  rœ   r$   r  r*  Ú	ExceptionÚget_rpath_dirs_from_link_args)rJ   r~   ri  ÚlangÚer0   r0   r1   Úget_external_rpath_dirs±  s   

€ÿ
zBackend.get_external_rpath_dirsri  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³   ÚreÚcompileÚmatchÚgroupÚsplitÚaddr   Úis_dirr   )
ri  Ú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                   s|  t ƒ ‰ ˆj ¡ ‰d‡ ‡‡fdd„}|jD ]Œ}t|tjtjfƒs q|jD ]s}t	j
 |¡s,q#t	j
 |¡}|r>ˆ ||jˆj¡r>q#|ˆ |¡v rFq#t	j
 |¡d dvrQq#t ¡ r’| d	¡r’t|tjƒro|jd
g dd}|ro||ƒ q#t|ƒ d¡}| ¡ s’d | ¡ jddd¡}	t|	ƒ ¡ r’t	j
 |	¡}||ƒ q#ˆ  ˆ |j¡¡ qt|j|jƒD ]}
t|
t j!ƒr¹ˆ  "ˆ #|
|¡¡ q¨t$ˆ ƒS )NrQ   r$   r=   rU   c                   sŒ   z
t j | ˆf¡}W n ty   d}Y nw |ˆkr?| tˆƒd d … }t j |¡r2J d|› dƒ‚ˆ  t j ˆj|¡¡ d S ˆ  | ¡ d S )Nr¯   r:   zrel_to_src: z is absolute)	rr   rs   Ú
commonpathÚ
ValueErrorr¿   Úisabsr…  rt   r·   )rQ   rŒ  Z
rel_to_src©ÚpathsrJ   Úsrcdirr0   r1   Úadd_pathå  s   ÿzIBackend.rpaths_for_non_system_absolute_shared_libraries.<locals>.add_pathr:   )ú.dllú.libú.soz.dylibr”  Úbindirr¯   )Údefaultr“  z/bin/z/lib/)Úmaxsplit)rQ   r$   r=   rU   )%r   r²   rµ   Zexternal_depsrœ   r   ÚExternalLibraryÚPkgConfigDependencyZ	link_argsrr   rs   rŽ  rå   rx  r	  r~  Úsplitextr   rB  r-  Zget_pkgconfig_variabler   Úwith_suffixr  rt   Úas_posixÚrsplitÚdifference_updater{  r   r0  Úlink_whole_targetsr
   rÃ   r`  Ú/rpaths_for_non_system_absolute_shared_librariesr  )rJ   r~   rŠ  r’  ÚdepÚlibpathrQ   r–  rK  ZbinpathÚir0   r  r1   r¡  à  sD   



€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)rT  r2   r0   r0   r1   Ú
<listcomp>-  s    z0Backend.determine_rpath_dirs.<locals>.<listcomp>)r²   rã   rä   r   r   Zget_link_dep_subdirsr…  rœ   r
   rÃ   r`  r¡  ri   Útuple)rJ   r~   r  r0   r0   r1   Údetermine_rpath_dirs"  s   
zBackend.determine_rpath_dirsrd   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ÿ   r#  )r«  ú\r  )	r   Úpartsr¿   rt   r]  r^  r¦  rb  Úreplace)rd   r¯  ZhashedÚtempÚchr0   r0   r1   Úcanonicalize_filename0  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
   ZCompileTargetZsources_mapr²   r´   r'  r·   r-  r&  rr   rs   rŽ  r¿   r¶   rì   ru   rt   rµ   rÐ   rA  r>  r³  Zget_object_suffix)rJ   r~   r´  r8   Zrel_srcZ
gen_sourceÚ	targetdirrL  r0   r0   r1   Úobject_filename_from_source>  s0   



ÿz#Backend.object_filename_from_sourceÚextobjú'build.ExtractedObjects'c                 C  s‚  g }t |jƒ}|jD ]"}| ¡ D ]}|  |j||¡}tj |¡\}}	| 	t
d||	ƒ¡ qq
g }
|D ]}| j |¡r?|
 	|¡ q1| j |¡rL| 	| ¡ ¡ q1|
sQ|S |  |j¡}|jjr¦t|jj ¡ |
ƒ}g }
|j tdƒ¡}t|tƒswJ dƒ‚| ¡ D ]*\}}|jtv r‰|
|7 }
q{tt|ƒ| d ƒD ]}|  |j| ¡ |¡}|
 	|¡ q“q{|
D ]}|  |j|¡}tj  |||¡}| 	|¡ q¨|S )NTrù   rú   r:   )!r  ZsrclistÚgenlistrÀ   rñ   r~   rr   rs   r„  r  r   r²   Z	is_sourceZ	is_objectÚrelative_namerì   Zis_unityr   r	  r
  rä   r   rœ   r˜   r  r%   ÚLANGS_CANT_UNITYÚranger¿   rö   r  r·  rt   )rJ   r¸  r  r  Zraw_sourcesrî   Úrrs   ZdirpartZ	fnamepartr)   r.  r¶  r  rù   r  r  r¤  Z_srcrõ   ZobjnameZobjpathr0   r0   r1   r+  `  sL   

ý€
ÿýzBackend._determine_ext_objsc                 C  sH   g }|   |¡}| |d¡}| | ¡ ¡}|r || ||d ¡7 }|| S )NFr   )rì   rÒ   Zget_pchÚget_languageZget_pch_use_args)rJ   r'   r~   ri  ZpchpathZincludeargsrK  r0   r0   r1   Úget_pch_include_args’  s   
zBackend.get_pch_include_argsr|  Ú
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 )Nz
meson_pch-rÖ   T)Úexist_okz
#include "ú"rý   rþ   rÿ   r   )rr   rs   rt   rì   r8   r  rå   ru   r  r  r   r  )
rJ   r~   r|  rÁ  Z	impl_nameZpch_rel_to_buildZpch_fileÚcontentZpch_file_tmprk  r0   r0   r1   Úcreate_msvc_pch_implementation›  s   ÿz&Backend.create_msvc_pch_implementationc                 C  s2   g }| D ]}|  d¡r| dd¡}| |¡ q|S )N)z-Dz/Dr®  z\\)Ú
startswithr°  r  )ri  Ú
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 rV   )r%   r
   Zstdlibsr>  Z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 ]e}	|	 %¡ s÷qð|j&dkr@t|	t'j(ƒr1|	j)dkr)|	j*d ur)|	j*D ]}
|
 +d¡r'|d|
dd … g7 } nq|d|	j)g7 }nt|	t'j,ƒr?||	 -d¡7 }n|| .|	¡7 }t|tj ƒrU||	 /|¡7 }qð|j&dkrtt0|j1|j2ƒD ]}|  3|¡}|| 4|d¡7 }qc|S )Nr$   Zwarning_levelZwerrorÚ	buildtyperú   ÚoptimizationÚdebugz/Ziz/ZIz/Z7r4   zglib-2.0)z>=z==z--target-glibr	   z--pkgr3   F)5Zcompiler_argsZget_optionsrÊ  Zget_always_argsZget_no_warn_argsZget_warn_argsÚTÚcasträ   r   Zget_werror_argsZget_option_compile_argsrœ   r$   Zget_buildtype_argsZget_optimization_argsrg   Zget_debug_argsr
   Zget_project_argsrl   r>  Zget_global_argsr²   rã   Zget_external_argsr¿  ÚremoverØ   Zget_pic_argsrÚ   ZpicrÜ   ZpieZget_pie_argsÚreversedZget_external_depsrH  r%   r   rš  r   Zversion_reqsrÆ  r™  Zget_link_argsZget_dependency_compile_argsZget_exe_argsr   r0  r   rì   rÒ   )rJ   r~   r'   rË  ÚcommandsZ
copt_proxyrÍ  rÎ  rÏ  r¢  ÚreqÚltZpriv_dirr0   r0   r1   Úgenerate_basic_compiler_args¼  sl    

þ€€
z$Backend.generate_basic_compiler_argsr  ú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¸   Zget_basenamerÞ   r¿  Zget_linker_lib_prefixr  )rJ   r'   r  ri  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²   Z
propertiesr>  Zget_rootr…  rr   rs   rt   Zget_sys_rootrœ   r
   rÃ   r	  r
  r`  Zget_program_dirsrv  r  )rJ   r~   r  ÚrootZsys_rootrw  r0   r0   r1   Úget_mingw_extra_paths-  s   zBackend.get_mingw_extra_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.| | ¡ ¡ | j|ddD ]}| tj	 
tj	 | j ¡ |¡¡¡ q|D ]}| |¡ t|tjƒrD| | ¡ ¡ q0|D ]}tj	 | j ¡ |  |¡¡}| |¡ qGt|tjƒrr| jj |j¡sr| |  |¡¡ 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.
        F)rŠ  )r³   rœ   r
   rÃ   r`  Zget_transitive_link_depsr¡  r…  rr   rs   rÑ   rt   r²   r´   rÅ   rA  rE  r>  rÜ  r  )	rJ   r~   r5  r  ZprospectivesZdeppathZbdepÚldZdirsegr0   r0   r1   rD  >  s&   	$
€ÿz%Backend.determine_windows_extra_pathsrp  ú
T.BinaryIOc                 C  ó   |   | j ¡ |¡ d S rV   )Úwrite_test_serialisationr
   Úget_benchmarks©rJ   rp  r0   r0   r1   ro  [  ó   zBackend.write_benchmark_filec                 C  rá  rV   )râ  r
   Ú	get_testsrä  r0   r0   r1   rn  ^  rå  zBackend.write_test_fileÚtestsúT.List['Test']úT.List[TestSerialisation]c                 C  s  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| ¡ ƒ}|  ||¡}ng }g }t|jƒ}t|tjƒr”| |¡ |jD ]d}t|tjƒr¥| |¡ nt|tj ƒr±| |j!¡ t|tjƒr¿||  |g ¡7 }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.¡}|
 ¡ sK|
 ¡ sK|
 /¡ sKtƒ }|D ](}t|tjƒr=| 0¡ D ]}t|tj1ƒr;| tj | j	 
¡ | 2¡ ¡¡ q#q|rK| 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>c  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©rT  r  r0   r0   r1   r§  «  s    z5Backend.create_test_serialisation.<locals>.<listcomp>)BÚsortedZget_exerœ   r   r   r=  rr   rs   rt   r²   r´   rÇ   r
   rÃ   r>  r   r?  r   ÚHOSTÚis_cross_buildrG  rA  rB  rC  r¾   r  Z get_transitive_build_target_depsrD  r³   rš   ÚTargetr…  rÂ   r~   r   r   r'  r·   r  r$   r*  Úconstruct_target_rel_pathsr•   r   ÚcopyÚdeepcopyr’   Ú	is_darwinZget_all_link_depsrØ   rÐ   ÚprependrŠ   Úget_namer‹   rŒ   rF  r   r“   r”   r—   r™   rÜ   rã   rT   r›   )rJ   rç  Úarrr¼   rI  r3  Ztest_for_machineÚaZis_crossrŽ   rL  r5  r–   r   rš   Zt_envZld_lib_pathr2   r1  Útsr0   r0   r1   Úcreate_test_serialisationa  s†   

€




€



÷
z!Backend.create_test_serialisationc                 C  s   t  |  |¡|¡ d S rV   )rd  re  rý  )rJ   rç  rp  r0   r0   r1   râ  ±  rå  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   ©rr   rs   rt   rï  )rè   r0   r1   r§  À  ó    z6Backend.construct_target_rel_paths.<locals>.<listcomp>c                   ó    g | ]}t j ˆ j ¡ |¡‘qS r0   ©rr   rs   rt   r²   r´   rï  r_   r0   r1   r§  Ã  ó     c                   s   g | ]	}t j |ˆ ¡‘qS r0   )rr   rs   r¶   rï  )r•   r0   r1   r§  Ä  r   )rÅ   rœ   r
   rÜ   rÃ   rÄ   r¾   rÂ   rÀ   rr   rs   rŽ  )rJ   r¼   r•   Úoutputsr0   )rJ   rè   r•   r1   rô  ´  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 )NZ
licensedirrú   z
depmf.jsonrq   zdependency manifestz1.0c                 S  s   i | ]	\}}||  ¡ “qS r0   )Zto_json)rT  rg  rh  r0   r0   r1   Ú
<dictcomp>Ö  r   z2Backend.generate_depmf_install.<locals>.<dictcomp>)rI   rT   Zprojectsrþ   rÿ   r   r¯   ÚdevelZdepmf©ro   r|   )r
   Zdep_manifest_namer²   rã   rä   r   rœ   r$   rr   rs   rt   r´   Ú
get_prefixrå   Zdep_manifestr  r  r  ÚjsonÚdumpsr[   r  ry   r
  Úlicense_filesr»  rl   )rJ   r2   Z
depmf_pathZ
option_dirZ	ifilenameZ	ofilenameZodirnamerv   Zout_dirZmfobjrk  Ú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·   )rT  Údfr_   r0   r1   r§  æ  s    ÿz.Backend.get_regen_filelist.<locals>.<listcomp>zmeson-private/coredata.dat)r   r    Zget_build_def_filesr²   rò  r`  rã   Zcross_filesZconfig_filesr…  Úcheck_clock_skewr  )rJ   r  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.dumprW  )r  r6   r²   rµ   r´   rr   rs   rt   rc  r  rd  re  )rJ   r  Z	regeninforÆ   rk  r0   r0   r1   Úgenerate_regen_infoï  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.)Útimerr   rs   rt   r²   r´   Úgetmtimer   )rJ   r  r  Únowrk  ZabsfZftimeÚdeltar0   r0   r1   r  ù  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 rV   )
rœ   r
   rÃ   rr   rs   rt   r²   r´   rÇ   r=  )rJ   r  rú  r0   r0   r1   Úbuild_target_to_cmd_array	  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@)Zget_extra_argsr  )rJ   ri  rº  Z
final_argsrû  r0   r0   r1   Úreplace_extra_args  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°  rr   rs   rt   r  )
rJ   ri  r  r  ZnewargsZregexrˆ  r  Úindexrð   r0   r0   r1   Úreplace_outputs  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 rV   )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 rV   )r   r
   rã  ræ  rI  rœ   r¾   rÃ   rî  r   rš   )rJ   r(  r  rW   r¼   rI  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 rV   )rÀ   r²   Z
is_libraryr  rr   rs   rt   rÅ   )rJ   r+  Úlibsrk  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 rV   )Úget_generated_sourcesrœ   r
   r¾   r*  r.  )rJ   r~   r-  r¼   r0   r0   r1   Ú$get_custom_target_provided_librariesF  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   )rr   rs   rt   Úget_custom_target_output_dir©rT  rK  )r¤  rJ   r0   r1   r§  \  r  z5Backend.get_custom_target_sources.<locals>.<listcomp>c                   s    g | ]}t j ˆ  ˆ¡|¡‘qS r0   )rr   rs   rt   rì   r3  rÉ   r0   r1   r§  ^  r  zThis shouldn't be possibleNrú   c                   r  r0   r  )rT  rk  r_   r0   r1   r§  h  r  )Úget_sourcesrœ   r$   rr   rs   rt   r·   Úsubdirr
   rÃ   rÇ   r¾   rÂ   rÀ   ÚGeneratedListr(  r$  r   r   rH  r'  Úabsolute_paths)rJ   r~   r  rd   r0   )r¤  rJ   r~   r1   Úget_custom_target_sourcesO  s*   


z!Backend.get_custom_target_sourcesr7  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 rV   )Zdepend_filesrœ   r   r   r  rÍ   r²   rµ   r´   r'  r·   rr   rs   rt   r5  )rJ   r~   r7  r  r¤  r0   r0   r1   Úget_custom_target_depend_filesl  s   
ÿ z&Backend.get_custom_target_depend_filesc                 C  s
   |   |¡S rV   )rÅ   rÉ   r0   r0   r1   r2  |  s   
z$Backend.get_custom_target_output_dirc                 C  s   t j |¡S rV   ©rr   rs   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Ö   )r0  rœ   r
   r¾   rÂ   r;  r2  rr   rs   rt   r²   r´   r  )rJ   r~   r'   rÍ   Zcustom_target_include_dirsr¤  Z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Í   Z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                   rþ  r0   rÿ  ©rT  r¤  ©re   r0   r1   r§  °  r   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§  ï  ó    )!r·   r2  r²   rµ   r´   rr   rs   rt   rÀ   r8  Úcommandrœ   r
   rÃ   r  r¾   r   r   r'  r7  r$   r°  r5  Údepfiler   r   rí   rì   r¸   rI   r  Zget_filenames_templates_dictZsubstitute_values)rJ   r~   r>  Zsource_rootZ
build_rootr  Úinputsr3  r¤  ÚtmprM  Z	dfilenameÚpdirr
  r0   rA  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_ROOTZMESON_SUBDIRÚMESONINTROSPECT)r’   r
   ÚEnvironmentVariablesZdefault_envr   r²   r\  r³   rµ   r´   r5  )rJ   r~   r’   Úintrospect_cmdr0   r0   r1   Úget_run_target_envò  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_exerK  )rL  rM  rN  ú zRunning postconf script )Zscripts.meson_exerR  r   r²   r\  rµ   r´   r
   Zpostconf_scriptsrt   r   r   Úlog)rJ   rR  rP  r’   r.  r   r0   r0   r1   Úrun_postconf_scriptsü  s   þýzBackend.run_postconf_scriptsr:   c              	   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 )Nrh   zFCross file does not specify strip binary, result will not be stripped.r   rS   rú   rK  )r²   Zlookup_binary_entryr   rñ  rò  r   rÁ   r   Údefaultsrã   rä   r   rœ   r$   r˜   rO   rµ   r´   r  Ú
get_libdirr\  rT   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_data	  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.datrW  )	rr   rs   rt   r²   rc  r  rd  re  ra  )rJ   Zinstall_data_filer  r0   r0   r1   Úcreate_install_data_files)  s   "ÿz!Backend.create_install_data_filesre   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>   z.pcz.ar  >   r“  r•  Zi18nzinstalled-testsrç  Z	systemtapzFailed to guess install tag for)r²   r  r   Z
get_bindirrW  Úget_includedirrã   rä   r   r   rœ   r$   r   Úparentsrò   r¯  r   rÏ  )
rJ   rd   re   rP   r–  rQ   ÚincdirZ_ldirrc  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   rh   rú   Fr  rd  )ro   rp   T)r€   r¯   )rm   ro   ©ro   )/r
   r$  r
  Úshould_installÚget_install_dirr¿   rÀ   r   Úformatr   Úinstall_tagÚget_custom_install_moderœ   rÃ   rÚ   rä   r   rg   Zget_link_deps_mappingrP   rc   rÇ   ri   rj   rl   rW   r  Zget_aliasesrr   rs   rt   r}   r\   rØ   ZSharedModulerÜ   rÙ   r²   Zget_import_lib_dirrÞ   r³   Zget_debug_filenamerÅ   Úzipr¾   rh  r%  )rJ   r2   r¼   ZoutdirsZinstall_dir_namesZcustom_install_dirZnum_outdirsZnum_outr  rk   Zfirst_outdirZfirst_outdir_namerp   Zshould_stripro   Zmappingsr¤  ÚaliasÚtor.  Zimplib_install_dirZ
debug_fileÚoutputre   rf   rk  r0   r0   r1   rX  I  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:rS  )r
   r]   ro   r   rÏ  rt   r   )rJ   r2   r¤  r0   r0   r1   r^  Ç  s   

€þz&Backend.generate_custom_install_scriptc              
   C  sÚ   | j  ¡ }| j ¡ }| j  ¡ }| j  ¡ }|D ]T}| ¡  }}|d u r=| ¡ }	|	d u r/|}d}ntj	 
||	¡}tj	 
d|	¡}| ¡ D ](}
t|
tƒsPtd|
›dƒ‚|
 ||¡}t|||| ¡ |jdd}|j |¡ qAqd S )Nz{includedir}zInvalid header type z can't be installedr  ri  )r²   re  r
   Zget_headersrµ   r´   Úget_custom_install_dirZget_install_subdirrr   rs   rt   r4  rœ   r   r   rÍ   ry   rn  rl   rX   r  )rJ   r2   ZincrootrX   r‘  ÚbuilddirÚhre   rf   r5  rk  Úabspathr¤  r0   r0   r1   rY  Í  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Ö   rê  z{mandir}rY   r¯   ri  )r²   Z
get_mandirr
   Zget_manr4  r„  rs  Úlocalerr   rs   rt   rd   r°  rÍ   rµ   r´   ru   ry   rn  rl   rY   r  )rJ   r2   ZmanrootrY   r  rk  Únumr5  rd   ZsrcabsÚdstnameZdstabsr¤  r0   r0   r1   rZ  å  s(   

ñÿzBackend.generate_man_installc                 C  sJ   | j  ¡ }|D ]}|jp|  |j¡}t|j|j|j|ƒ}|j 	|¡ qd S rV   )
r
   Zget_emptydirrm  rh  rs   rw   rk   rl   rZ   r  )rJ   r2   rZ   r}  ro   r¤  r0   r0   r1   r[  ú  s   
ýz!Backend.generate_emptydir_installc                 C  sþ   | j  ¡ }| j ¡ }| j ¡ }|D ]k}t|t jƒsJ ‚|j}|j}|s:t	j
 | j ¡ | jj j¡}t	j
 d| jj j¡}t|j|jƒD ]:\}}	t|tjƒsMJ ‚t	j
 ||	¡}
t	j
 ||	¡}|jpb|  |
¡}t| ||¡|
||j|j||jd}|j |¡ qAqd S )Nz	{datadir}r  )r
   Úget_datar²   rµ   r´   rœ   ZDataÚinstall_dirÚinstall_dir_namerr   rs   rt   Zget_datadirr    r‹   ro  r)   Úrenamer   r   rm  rh  ry   rÍ   rk   rl   r|   r[   r  )rJ   r2   r[   r‘  rt  Úder5  Zsubdir_nameZsrc_fileÚdst_nameZdst_absZdstdir_namero   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 rV   )r
   Zget_symlinksrœ   ZSymlinkDatar{  rr   rs   rt   r   rm  rh  r}   r~   rl   r\   r  )rJ   r2   Zlinksr1  r{  Zname_absro   r.  r0   r0   r1   r]    s   
úz Backend.generate_symlink_installc           	   	   C  sö   | j  ¡ D ]s}|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 |¡ qd S )Nr«  rq   Údummy)r
   Zget_install_subdirsZfrom_source_dirr²   rµ   r´   rr   rs   rt   Zsource_subdirZinstallable_subdirÚrstripr  r{  r|  Zstrip_directoryru   rm  rh  r   rk   r‚   rl   r^   r  )	rJ   r2   ÚsdZfrom_dirÚsrc_dirZdst_dirr  ro   r¤  r0   r0   r1   r_    s.   
þþÿî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   )rr   rs   rt   r8   rÐ   )rT  rç   ©ÚjrJ   r0   r1   r§  L  s   " z2Backend.get_introspection_data.<locals>.<listcomp>c                 S  s   g | ]}t j |¡‘qS r0   r:  )rT  r.  r0   r0   r1   r§  M  rC  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$   rr   rs   rt   rÀ   rD  r¸   rI   r,   )rJ   r„  r~   Zsource_list_rawZsource_listr'   Ztmp_compilerr0   r†  r1   Úget_introspection_data4  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
   rO  r³   r²   rA  r   r?  rñ  rB  r$  r
  rj  rk  r>  rr   rs   rt   r´   rÅ   rœ   rÜ   r…  rC  r`  rD  rØ   rø  r  r÷  )
rJ   r’   r–   Zlibrary_pathsZbuild_machineZhost_machineZ	need_winer¼   Zin_default_dirZtdirr0   r0   r1   Ú
get_devenvf  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@rB  z@INPUT@z@PLAINNAME@.d)rE  )Zget_exelistr   r   r×  Zget_dependency_gen_argsZget_output_argsZget_compile_only_argsrÕ   r×   r
   Ú	GeneratorZ	to_nativeZprocess_filesr    )
rJ   r~   r'   r)   r  ZexelistrI  ri  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 )NrŽ  )rÐ  rÑ  r)   Z	generatedr“  r'   r  )rJ   r~   Zall_sourcesr0   r0   r1   Úcompile_target_to_generator¨  s   z#Backend.compile_target_to_generator)r
   rŸ   r    r¡   ra   )r¼   r½   r»   rg   r=   r$   )r~   r½   r=   r$   )r~   rÎ   r'   rÏ   rÍ   rg   r=   r&   )r~   r½   r=   rn   )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Î   r  r$   r=   r  )r!  r"  r  r$   r=   r&   )r~   rÎ   r!  r%  r  r$   r=   r  )r~   rÎ   r=   rg   )r~   rÎ   r=   r&   )NNNNNNF)r3  r4  r•   rn   r5  r6  r7  r8  r9  r8  r’   r:  ro   rn   r›   rg   r=   r;  )NNNNFNF)rI  rO  r   rP  r•   rn   r5  r6  r7  r8  r9  r8  rQ  rg   r’   r:  r›   rg   r=   rR  )r=   rm  )r~   rÎ   r=   rr  )rQ   r$   r	  rt  r’   ru  r=   rg   )r~   rÎ   r=   ry  )ri  r&   r=   ry  )T)r~   rÎ   rŠ  rg   r=   r‹  )r~   rë   r=   r¥  )rd   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$   )ri  r&   r=   r&   )r~   rÉ  r'   rÏ   r=   r&   )F)r~   rÎ   r'   rÏ   rË  rg   r=   rÌ  )r'   rÏ   r  rØ  r=   r&   )r~   rÝ  r5  rÞ  r=   r&   )rp  rà  r=   rU   )rç  rè  r=   ré  )rç  rè  rp  rà  r=   rU   )r¼   r½   r•   rn   r=   r&   )r2   rO   r=   rU   )r=   r&   )r  r  r=   rU   )r  r  r=   r&   )ri  r&   rº  r  r=   r&   )ri  r&   r  r$   r  r&   r=   r&   )r=   r#  )r(  rg   r=   r)  )r+  r,  r=   r‹  )r~   r/  r=   r‹  )r~   r,  r=   r&   )r~   r,  r7  rg   r=   r&   )r´  r$   r=   r$   )r~   r,  r'   rÏ   rÍ   rg   r=   r&   )r~   r,  r>  rg   r=   r?  )r~   rJ  r=   r‘   )r=   rO   rV   )rd   r$   re   rn   r=   rn   )r„  r$   r~   ræ   r=   r…  )r=   r‘   )
r~   rÎ   r'   rÏ   r)   rŽ  r  r$   r=   r  )r~   r”  r=   r  )Xr,   r-   r.   r/   r   r…   r¹   rÇ   rÊ   rÕ   r×   rÞ   r   rÅ   ré   rê   rì   rí   rñ   rö   r  Ústaticmethodr¶   r   r$  r  r/  r2  rN  rl  rq  rs  rx  r~  r{  r¡  r©  r³  r·  r+  rÀ  rÅ  rÈ  rÊ  r×  rÙ  rÜ  rD  ro  rn  rý  râ  rô  r  r  r  r  r  r  r"  r'  r*  r.  r1  r8  r9  r2  r;  r<  r=  rI  rQ  rU  ra  rb  rh  rX  r^  rY  rZ  r[  r\  r]  r_  r‰  r  r“  r•  r0   r0   r0   r1   r±     sä   
 		
*øIøa	
!A"2	
bP
	
ÿþ	ÿN
~
2-r±   rˆ   )rž   r$   r
   rŸ   r    r¡   r=   r¢   )NÚ
__future__r   Úcollectionsr   Údataclassesr   r   Ú	functoolsr   Ú	itertoolsr   Úpathlibr   rõ  Úenumr	  rr   rd  r€  rZ  ÚtypingrÐ  r]  r¯   r
   r   r   r   r   r	  r   r   r   r   r   r   r   r   r   r   ÚTYPE_CHECKINGZ_typingr   Zarglistr   r   r²   r   r    r   r   Zlinkersr   r    r!   Útyping_extensionsr"   ÚListÚUnionr¾   rÂ   r6  rŽ  r#   r¼  r6   ÚEnumr9   rM   rO   rc   rw   ry   r}   r   rŠ   r°   r±   r0   r0   r0   r1   Ú<module>   sl   (		&