o
    ºùŠe¯Q ã                   @  s˜  d dl m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mZmZ ejrAdd
lmZ dZi dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d"“d#d$“d%d&“d'd(“d)d(i¥Zd*d+d,d-d.d/œZdd0d0d1d2d3d'd4œZd5d6d7œZh d8£ZG d9d:„ d:ƒZG d;d<„ d<ƒZG d=d>„ d>ƒZG d?d@„ d@ƒZG dAdB„ dBƒZG dCdD„ dDƒZG dEdF„ dFejƒZdS )Gé    )ÚannotationsNé   )Úbackendsé   )Úbuild)Úmesonlib)Úmlog)ÚMesonBugExceptionÚMesonExceptionÚ	OptionKey)ÚInterpreterú	Úczsourcecode.c.cÚaz
archive.arÚcczsourcecode.cpp.cppÚcxxÚcppzc++Úmzsourcecode.c.objcÚmmzsourcecode.cpp.objcppÚhzsourcecode.c.hÚhppzsourcecode.cpp.hZhxxZhhzsourcecode.cpp.hhZincÚswiftzsourcecode.swiftÚdylibzcompiled.mach-o.dylibÚozcompiled.mach-o.objfileÚszsourcecode.asmZasmÚCZ	CPLUSPLUSZOBJCZOBJCPLUSPLUSZSWIFT_)r   r   ÚobjcÚobjcppr   Ú0Ú1Ú2Ú3)Úplainr   Úgr   r    r!   r   ÚYESÚNO)TF>   ú.oz.soú.objz.dylibz.ac                   @  s   e Zd Zddd„ZdS )ÚFileTreeEntryÚreturnÚNonec                 C  s   i | _ g | _d S ©N)ÚsubdirsÚtargets©Úself© r0   úD/usr/lib/python3.10/site-packages/mesonbuild/backend/xcodebackend.pyÚ__init__C   s   
zFileTreeEntry.__init__N©r)   r*   ©Ú__name__Ú
__module__Ú__qualname__r2   r0   r0   r0   r1   r(   A   s    r(   c                   @  s,   e Zd Zddd„Zddd
d„Zddd„ZdS )ÚPbxArrayr)   r*   c                 C  s
   g | _ d S r+   )Úitemsr.   r0   r0   r1   r2   H   ó   
zPbxArray.__init__Ú ÚitemúT.Union[PbxArrayItem, str]ÚcommentÚstrc                 C  s0   t |tƒr| j |¡ d S | j t||ƒ¡ d S r+   )Ú
isinstanceÚPbxArrayItemr9   Úappend)r/   r<   r>   r0   r0   r1   Úadd_itemK   s   
zPbxArray.add_itemÚofileúT.TextIOÚindent_levelÚintc                 C  s€   |  d¡ |d7 }| jD ]$}|jr#|  |t |j› d|j› d ¡ q|  |t |j› d ¡ q|d8 }|  |t d ¡ d S )Nz(
r   ú z,
z);
)Úwriter9   r>   ÚINDENTÚvalue©r/   rD   rF   Úir0   r0   r1   rI   Q   s   

$zPbxArray.writeNr3   ©r;   )r<   r=   r>   r?   r)   r*   ©rD   rE   rF   rG   r)   r*   )r5   r6   r7   r2   rC   rI   r0   r0   r0   r1   r8   G   s    
r8   c                   @  s   e Zd Zdd	dd„ZdS )
rA   r;   rK   r?   r>   c                 C  s8   || _ |rd|v r|| _d S d|› d| _d S || _d S ©Nz/*ú/* ú */)rK   r>   )r/   rK   r>   r0   r0   r1   r2   ]   s   

zPbxArrayItem.__init__NrN   )rK   r?   r>   r?   r4   r0   r0   r0   r1   rA   \   ó    rA   c                   @  s    e Zd Zddd„Zddd„ZdS )Ú
PbxCommentÚtextr?   c                 C  s,   t |tƒsJ ‚d|vsJ ‚d|› d| _d S rP   )r@   r?   rU   )r/   rU   r0   r0   r1   r2   h   s   zPbxComment.__init__rD   rE   rF   rG   r)   r*   c                 C  s   |  d| j› d¡ d S )NÚ
)rI   rU   )r/   rD   rF   r0   r0   r1   rI   m   s   zPbxComment.writeN)rU   r?   rO   )r5   r6   r7   r2   rI   r0   r0   r0   r1   rT   g   s    
rT   c                   @  s   e Zd Zd
ddd„Zd	S )ÚPbxDictItemr;   Úkeyr?   rK   ú$T.Union[PbxArray, PbxDict, str, int]r>   c                 C  s>   || _ || _|rd|v r|| _d S d|› d| _d S || _d S rP   )rX   rK   r>   )r/   rX   rK   r>   r0   r0   r1   r2   q   s   

zPbxDictItem.__init__NrN   )rX   r?   rK   rY   r>   r?   r4   r0   r0   r0   r1   rW   p   rS   rW   c                   @  s>   e Zd Zddd„Zdddd„Zdd„ Zddd„Zddd„ZdS )ÚPbxDictr)   r*   c                 C  s   t ƒ | _g | _d S r+   )ÚsetÚkeysr9   r.   r0   r0   r1   r2   }   s   
zPbxDict.__init__r;   rX   r?   rK   rY   r>   c                 C  s6   || j vsJ ‚t|||ƒ}| j  |¡ | j |¡ d S r+   )r\   rW   Úaddr9   rB   )r/   rX   rK   r>   r<   r0   r0   r1   rC   ƒ   s   zPbxDict.add_itemc                 C  s
   || j v S r+   )r\   )r/   rX   r0   r0   r1   Úhas_item‰   r:   zPbxDict.has_itemrT   c                 C  s   t |tƒsJ ‚| j |¡ d S r+   )r@   rT   r9   rB   )r/   r>   r0   r0   r1   Úadd_commentŒ   s   zPbxDict.add_commentrD   rE   rF   rG   c              
   C  sÖ  |  d¡ |d7 }| jD ]¿}t|tƒr|  ||¡ qt|tƒrÄt|jttfƒrR|jr@|  |t	 |j
› d|j› d|j› d ¡ q|  |t	 |j
› d|j› d ¡ qt|jtƒr‚|jrm|  |t	 |j
› d|j› d ¡ n|  |t	 |j
› d ¡ |j  ||¡ qt|jtƒr²|jr|  |t	 |j
› d|j› d ¡ n|  |t	 |j
› d ¡ |j  ||¡ qt|ƒ t|j
ƒ t|jƒ tdƒ‚t|ƒ tdƒ‚|d8 }|  |t	 d ¡ |d	krä|  d
¡ d S |  d¡ d S )Nz{
r   z = rH   z;
zmissing codezmissing code2Ú}r   rV   )rI   r9   r@   rT   rW   rK   r?   rG   r>   rJ   rX   rZ   r8   ÚprintÚRuntimeErrorrL   r0   r0   r1   rI      s>   



,$$$

zPbxDict.writeNr3   rN   )rX   r?   rK   rY   r>   r?   r)   r*   )r>   rT   r)   r*   rO   )r5   r6   r7   r2   rC   r^   r_   rI   r0   r0   r0   r1   rZ   |   s    

rZ   c                      s"  e Zd ZdZd‰‡ fdd„Zdd	„ ZdŠdd„Zdd„ Zdd„ Zdd„ Z	dd„ Z
d‹dŒdd„Zdd „ Zdd"d#„Zdd$d%„Zdd&d'„Zdd(d)„Zdd*d+„Zdd,d-„Zdd.d/„Zdd0d1„Zdd2d3„Zdd4d5„Zdd6d7„Zd8d9„ Zdd:d;„Zdd<d=„Zdd>d?„Zdd@dA„ZddBdC„ZdDdE„ ZddFdG„ZddHdI„Z dJdK„ Z!dLdM„ Z"dNdO„ Z#dPdQ„ Z$dRdS„ Z%dTdU„ Z&dVdW„ Z'dXdY„ Z(dZd[„ Z)d\d]„ Z*d^d_„ Z+d`da„ Z,dbdc„ Z-ddde„ Z.dfdg„ Z/dhdi„ Z0djdk„ Z1dldm„ Z2dndo„ Z3dpdq„ Z4drds„ Z5dtdu„ Z6dvdw„ Z7dxdy„ Z8dzd{„ Z9d|d}„ Z:d~d„ Z;dŽd‚dƒ„Z<dd…d†„Z=dd‡dˆ„Z>‡  Z?S )‘ÚXCodeBackendZxcoder   úT.Optional[build.Build]ÚinterpreterúT.Optional[Interpreter]c                   sà   t ƒ  ||¡ | jjjd  dd¡d d… | _t d| jj 	t
dƒ¡¡| _|  ¡ | _|  ¡ | _|  ¡ | _|  ¡ | _| jg| _|  ¡ | _|  ¡ | _|  ¡ | _|  ¡ | _|  ¡ | _|  ¡ | _|  ¡ | _tƒ | _i | _i | _i | _d S )NÚdefaultú-r;   é   r?   Ú	buildtype)Úsuperr2   ÚenvironmentÚcoredataZ
lang_guidsÚreplaceÚproject_uidÚTÚcastÚ
get_optionr   rj   Úgen_idÚproject_conflistÚmaingroup_idÚall_idÚall_buildconf_idÚ
buildtypesÚtest_idÚtest_command_idÚtest_buildconf_idÚregen_idÚregen_command_idÚregen_buildconf_idÚregen_dependency_idrZ   Útop_level_dictÚgenerator_outputsÚbuildfile_idsÚfileref_ids)r/   r   re   ©Ú	__class__r0   r1   r2   ¼   s&    












zXCodeBackend.__init__c                 C  s\   |d }t |ddd}| d¡ | |d¡ W d   ƒ n1 s!w   Y  t ||¡ d S )Nz.tmpÚwzutf-8)Úencodingz// !$*UTF8*$!
r   )ÚopenrI   Úosrn   )r/   r€   Z	ofilenameZtmpnamerD   r0   r0   r1   Úwrite_pbxfileÙ   s   
þzXCodeBackend.write_pbxfiler)   r?   c                 C  s    t t ¡ ƒ ¡  dd¡d d… S )Nrh   r;   ri   )r?   ÚuuidZuuid4Úupperrn   r.   r0   r0   r1   rs   à   s    zXCodeBackend.gen_idc              
   C  s,   t j | ¡ t d| jj t	dƒ¡¡¡}|S )Nr?   rj   )
r‰   ÚpathÚjoinÚ
get_subdirrp   rq   rl   rm   rr   r   ©r/   ÚtargetÚdirnamer0   r0   r1   Úget_target_dirã   s   (zXCodeBackend.get_target_dirc                 C  s*   |  ¡ }tjtj | j ¡ |¡dd |S )NT©Úexist_ok)r   r‰   Úmakedirsr   rŽ   rl   Úget_build_dirr   r0   r0   r1   Úget_custom_target_output_dirè   s   z)XCodeBackend.get_custom_target_output_dirc                 C  sB   |   |¡dkr	dS tj |   |¡¡ tj¡}tj dgt|ƒ ¡S )Nr;   z..)r“   r‰   r   ÚnormpathÚsplitÚseprŽ   Úlen)r/   r‘   Zdirectoriesr0   r0   r1   Útarget_to_build_rootí   s   z!XCodeBackend.target_to_build_rootc           	   
   C  sj   | j j}| j}| ¡ }d}t|tjƒr|j}tj	 
tj	 |¡¡d }|› d|› d|› d|› d|› d
}|S )NÚx86_64r   z.build/ú/z.build/Objects-normal/r&   )r   Úproject_namerj   Úget_idr@   r   ÚFileÚfnamer‰   r   ÚsplitextÚbasename)	r/   r‘   ÚsourceÚprojectrj   ÚtnameÚarchÚstemZobj_pathr0   r0   r1   Úobject_filename_from_sourceó   s   "z(XCodeBackend.object_filename_from_sourceFNÚcaptureÚboolÚ
vslite_ctxÚdictúT.Optional[dict]c                 C  sP  |rt dƒ‚|rt dƒ‚|  ¡  | j ¡ | _| j ¡ | _|  ¡  |  ¡  |  	¡  |  
¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  tj | j ¡ | jjd ¡| _tj | jdd tj | jd¡| _!|  "| j#¡}| $t%dƒ¡ |  &|¡ | $t%dƒ¡ | $t%d	ƒ¡ |  '|¡ | $t%d
ƒ¡ | $t%dƒ¡ |  (|¡ | $t%dƒ¡ | $t%dƒ¡ |  )|¡ | $t%dƒ¡ | $t%dƒ¡ |  *|¡ | $t%dƒ¡ | $t%dƒ¡ |  +|¡ | $t%dƒ¡ | $t%dƒ¡ |  ,|¡ | $t%dƒ¡ | $t%dƒ¡ |  -|¡ | $t%dƒ¡ | $t%dƒ¡ |  .|¡ | $t%dƒ¡ | $t%dƒ¡ |  /|¡ | $t%dƒ¡ | $t%dƒ¡ |  0|¡ | $t%dƒ¡ | $t%dƒ¡ |  1|¡ | $t%dƒ¡ | $t%dƒ¡ |  2|¡ | $t%d ƒ¡ | $t%d!ƒ¡ |  3|¡ | $t%d"ƒ¡ |  4| j#¡ |  5| j#| j!¡ |  6¡  d S )#NzDWe do not expect the xcode backend to generate with 'capture = True'zCWe do not expect the xcode backend to be given a valid 'vslite_ctx'z
.xcodeprojTr”   zproject.pbxprojz Begin PBXAggregateTarget sectionzEnd PBXAggregateTarget sectionzBegin PBXBuildFile sectionzEnd PBXBuildFile sectionzBegin PBXBuildStyle sectionzEnd PBXBuildStyle sectionz#Begin PBXContainerItemProxy sectionz!End PBXContainerItemProxy sectionzBegin PBXFileReference sectionzEnd PBXFileReference sectionz%Begin PBXFrameworksBuildPhase sectionz#End PBXFrameworksBuildPhase sectionzBegin PBXGroup sectionzEnd PBXGroup sectionzBegin PBXNativeTarget sectionzEnd PBXNativeTarget sectionzBegin PBXProject sectionzEnd PBXProject sectionz&Begin PBXShellScriptBuildPhase sectionz$End PBXShellScriptBuildPhase sectionz"Begin PBXSourcesBuildPhase sectionz End PBXSourcesBuildPhase sectionz!Begin PBXTargetDependency sectionzEnd PBXTargetDependency sectionz"Begin XCBuildConfiguration sectionz End XCBuildConfiguration sectionz!Begin XCConfigurationList sectionzEnd XCConfigurationList section)7r	   Zserialize_testsr   Zget_build_targetsÚbuild_targetsÚget_custom_targetsÚcustom_targetsÚgenerate_filemapÚgenerate_buildstylemapÚgenerate_build_phase_mapÚ generate_build_configuration_mapÚ$generate_build_configurationlist_mapÚ#generate_project_configurations_mapÚ$generate_buildall_configurations_mapÚ generate_test_configurations_mapÚgenerate_native_target_mapÚgenerate_native_frameworks_mapÚgenerate_custom_target_mapÚgenerate_generator_target_mapÚgenerate_source_phase_mapÚgenerate_target_dependency_mapÚgenerate_pbxdep_mapÚgenerate_containerproxy_mapÚgenerate_target_file_mapsÚgenerate_build_file_mapsr‰   r   rŽ   rl   r—   r    Zproj_dirr–   Z	proj_fileÚgenerate_prefixr€   r_   rT   Úgenerate_pbx_aggregate_targetÚgenerate_pbx_build_fileÚgenerate_pbx_build_styleÚ!generate_pbx_container_item_proxyÚgenerate_pbx_file_referenceÚ"generate_pbx_frameworks_buildphaseÚgenerate_pbx_groupÚgenerate_pbx_native_targetÚgenerate_pbx_projectÚgenerate_pbx_shell_build_phaseÚ generate_pbx_sources_build_phaseÚgenerate_pbx_target_dependencyÚgenerate_xc_build_configurationÚgenerate_xc_configurationListÚgenerate_suffixrŠ   Zgenerate_regen_info)r/   r¬   r®   Úobjects_dictr0   r0   r1   Úgenerate   s”   













zXCodeBackend.generatec                 C  s4   |  d¡d }|dkrd}t | ¡ ¡}|sd}|S )NÚ.éÿÿÿÿr   r   zsourcecode.unknown)rš   ÚXCODETYPEMAPÚgetÚlower)r/   r£   Ú	extensionÚ	xcodetyper0   r0   r1   Úget_xcodetypeN  s   zXCodeBackend.get_xcodetyper*   c                 C  sž   i | _ i | _| j ¡ D ]A\}}|jD ]}t|tjƒr*tj	 
|j|j¡}|  ¡ | j |< q|jD ]}t|tƒrDtj	 
|j|¡}|  ¡ | j |< q.|  ¡ | j|< qd S r+   )ÚfilemapÚtarget_filemapr±   r9   Úsourcesr@   r   r¢   r‰   r   rŽ   Úsubdirr£   rs   Úobjectsr?   )r/   ÚnameÚtr   r   r0   r0   r1   r´   W  s   
€

€÷zXCodeBackend.generate_filemapc                 C  ó   | j |  ¡ i| _d S r+   )rj   rs   Úbuildstylemapr.   r0   r0   r1   rµ   e  ó   z#XCodeBackend.generate_buildstylemapc                 C  sV   | j  ¡ D ]#\}}i |_|  ¡ |j|< |  ¡ |jd< |  ¡ |jd< |  ¡ |jd< qd S )NÚ
FrameworksÚ	ResourcesÚSources)r±   r9   Úbuildphasemaprs   )r/   r¨   ræ   r0   r0   r1   r¶   h  s   ùz%XCodeBackend.generate_build_phase_mapc                 C  sR   i | _ | jD ]}| j|  ¡ i}|| j |< q| jD ]}| j|  ¡ i}|| j |< qd S r+   )Úbuildconfmapr±   rj   rs   r³   )r/   ræ   Zbconfsr0   r0   r1   r·   r  s   

þz-XCodeBackend.generate_build_configuration_mapc                 C  rç   r+   )rj   rs   Úproject_configurationsr.   r0   r0   r1   r¹   {  ré   z0XCodeBackend.generate_project_configurations_mapc                 C  rç   r+   )rj   rs   Úbuildall_configurationsr.   r0   r0   r1   rº   ~  ré   z1XCodeBackend.generate_buildall_configurations_mapc                 C  rç   r+   )rj   rs   Útest_configurationsr.   r0   r0   r1   r»     ré   z-XCodeBackend.generate_test_configurations_mapc                 C  s>   i | _ | jD ]	}|  ¡ | j |< q| jD ]	}|  ¡ | j |< qd S r+   )Úbuildconflistmapr±   rs   r³   ©r/   ræ   r0   r0   r1   r¸   „  s   

ÿz1XCodeBackend.generate_build_configurationlist_mapc                 C  ó$   i | _ | jD ]	}|  ¡ | j |< qd S r+   )Únative_targetsr±   rs   ró   r0   r0   r1   r¼   ‹  ó   
ÿz'XCodeBackend.generate_native_target_mapc                 C  s|   i | _ i | _i | _| j ¡ D ]-\}}|  ¡ | j |< t|tjƒs q|  	|¡\}}}|D ]}|  ¡ | j|< |  ¡ | j|< q*qd S r+   )
Úshell_targetsÚcustom_target_output_buildfileÚcustom_target_output_filerefr³   r9   rs   r@   r   ÚCustomTargetÚeval_custom_target_command)r/   r¨   ræ   ÚsrcsÚ
ofilenamesÚcmdr   r0   r0   r1   r¾     s   þûz'XCodeBackend.generate_custom_target_mapc                 C  s¤   i | _ i | _| j ¡ D ]\}}d}|jD ]}t|tjƒsq|  ||||¡ |d7 }qq| j	 ¡ D ]\}}d}|j
D ]}t|tjƒsBq9|  ||||¡ |d7 }q9q0d S ©Nr   r   )Úgenerator_fileref_idsÚgenerator_buildfile_idsr±   r9   Ú	generatedr@   r   ÚGeneratedListÚgen_single_target_mapr³   râ   )r/   r¨   ræ   Úgenerator_idÚgenlistr0   r0   r1   r¿     s&   

ü

üþz*XCodeBackend.generate_generator_target_mapc                 C  sÚ   ||f}|| j vsJ ‚|  ¡ | j |< g }| ¡ D ]!}| |¡D ]}tj |  |¡|¡}	| tj | j	 
¡ |	¡¡ qq|| jvsAJ ‚|| j|< g }
g }tt|ƒƒD ]}|
 |  ¡ ¡ | |  ¡ ¡ qP|
| j|< || j|< d S r+   )r÷   rs   Ú
get_inputsÚget_outputs_forr‰   r   rŽ   Úget_target_private_dirrB   rl   r—   r   Úrangerœ   r  r   )r/   r  r¨   ræ   r  ÚkÚ	ofile_absrM   Úo_baser   r‚   rƒ   r0   r0   r1   r  ²  s$   þ

z"XCodeBackend.gen_single_target_mapc                 C  s`   i | _ i | _| j ¡ D ]"}| ¡ D ]}|jdkr,|jD ]}|  ¡ | j |< |  ¡ | j|< qqqd S )NÚappleframeworks)Únative_frameworksÚnative_frameworks_filerefr±   ÚvaluesÚget_external_depsrå   Ú
frameworksrs   )r/   ræ   ÚdepÚfr0   r0   r1   r½   Å  s   

€üÿz+XCodeBackend.generate_native_frameworks_mapc                 C  s®   i | _ | j ¡ D ]2\}}|jD ]*}t|tjƒr%||j ¡ f}|| j v r$qn|| ¡ f}|| j vs2J ‚|  	¡ | j |< qq| j
 ¡ D ]\}}|}|| j vsMJ ‚|  	¡ | j |< q@d S r+   )Ztarget_dependency_mapr±   r9   Úlink_targetsr@   r   ÚCustomTargetIndexr‘   Úget_basenamers   r³   )r/   r¨   ræ   r‘   r  r0   r0   r1   rÁ   Ï  s"   

ÿø	ýz+XCodeBackend.generate_target_dependency_mapc                 C  sD   i | _ i | _| jD ]	}|  ¡ | j |< q	| jD ]	}|  ¡ | j|< qd S r+   )Úpbx_dep_mapÚpbx_custom_dep_mapr±   rs   r³   ró   r0   r0   r1   rÂ   à  s   

ÿz XCodeBackend.generate_pbxdep_mapc                 C  rô   r+   )Úcontainerproxy_mapr±   rs   ró   r0   r0   r1   rÃ   è  rö   z(XCodeBackend.generate_containerproxy_mapc                 C  s   |   | j¡ |   | j¡ d S r+   )Úgenerate_target_file_maps_implr±   r³   r.   r0   r0   r1   rÄ   í  s   z&XCodeBackend.generate_target_file_mapsc                 C  s:  |  ¡ D ]–\}}|jD ]7}t|tjƒrtj |j|j	¡}t|t
ƒs"q||f}|| jvs-J ‚|  ¡ | j|< || jvs;J ‚|  ¡ | j|< qt|dƒsIq|jD ]M}t|tjƒrUqLt|tjƒrdtj |j|j	¡}t|t
ƒr’tj |j|¡}||f}|| jvs|J ‚|  ¡ | j|< || jvsŠJ ‚|  ¡ | j|< qLtdt
|ƒ ƒ‚qd S )Nrä   zUnknown input type )r9   râ   r@   r   r¢   r‰   r   rŽ   rã   r£   r?   r‚   rs   rƒ   Úhasattrrä   r   ÚExtractedObjectsrb   )r/   r-   r¨   ræ   r   r  r   r0   r0   r1   r  ñ  s8   




òóz+XCodeBackend.generate_target_file_maps_implc                 C  s>   | j  ¡ D ]}t|tƒsJ ‚|  ¡ | j|< |  ¡ | j|< qd S r+   )re   Úget_build_def_filesr@   r?   rs   r‚   rƒ   )r/   Ú	buildfiler0   r0   r1   rÅ     s
   ýz%XCodeBackend.generate_build_file_mapsc                 C  rô   r+   )Úsource_phaser±   rs   ró   r0   r0   r1   rÀ     rö   z&XCodeBackend.generate_source_phase_mapc                   sL  i ˆ _ ˆ  ¡ ˆ _‡ fdd„ˆ jD ƒ}‡ fdd„ˆ jD ƒ}g }| ˆ jdˆ jg ˆ jg| | f¡ | ˆ j	dˆ j
ˆ jgˆ jˆ jgf¡ | ˆ jdˆ jˆ jgg f¡ ˆ j ¡  ¡ D ]U\}}ˆ  ¡ }|ˆ j |< g }ˆ jg}	d}
|jD ]'}t|tjƒsxqo| ˆ j||
f ¡ |jD ]}|	 ˆ j| ¡  ¡ q…|
d7 }
qo| ˆ j| ¡ | ||ˆ j| ||	f¡ qWt|t d¡d	}|D ]k}tƒ }|d }|d
 }|d }|d }	| dd¡ | d|d|› d¡ tƒ }| d|¡ |D ]}| |d¡ qétƒ }| d|¡ |	D ]}| |d¡ qý| dd|› d¡ | dd|› d¡ | |d ||¡ q¸d S )Nc                   ó   g | ]}ˆ j | ‘qS r0   )r  ©Ú.0ræ   r.   r0   r1   Ú
<listcomp>  ó    z>XCodeBackend.generate_pbx_aggregate_target.<locals>.<listcomp>c                   r"  r0   )r  r#  r.   r0   r1   r%    r&  Ú	ALL_BUILDÚ	RUN_TESTSÚ
REGENERATEr   r   ©rX   r   é   é   ÚisaZPBXAggregateTargetÚbuildConfigurationListú1Build configuration list for PBXAggregateTarget "ú"ÚbuildPhasesÚShellScriptÚdependenciesÚPBXTargetDependencyrå   ÚproductName) Úcustom_aggregate_targetsrs   Úbuild_all_tdep_idr±   r³   rB   rv   rw   r   ry   r{   rz   r|   r~   r}   r   r²   r9   râ   r@   r  r÷   Údependsr  r¡   rò   ÚsortedÚoperatorÚ
itemgetterrZ   rC   r8   )r/   rÖ   Ztarget_dependenciesZcustom_target_dependenciesZaggregated_targetsr¨   ræ   Zct_idZbuild_phasesr3  r  r   ÚdZsorted_aggregated_targetsZagt_dictrå   Zbuildconf_idZbp_arrZbpZdep_arrÚtdr0   r.   r1   rÇ     st   

ý
üü



îz*XCodeBackend.generate_pbx_aggregate_targetc              	   C  s  | j  ¡ D ] \}}| ¡ D ]4}|jdkrB|jD ])}tƒ }| j| }||jvr1| |||› d¡ | dd¡ | d| j	| |¡ qq|j
D ]Y}d}	t|tjƒr^|jrUd}	tj |j|j¡}t|tƒsdqFtƒ }
||f}| j| }| j| }|	r‚tj | j ¡ |¡}n
tj | j ¡ |¡}|
 dd¡ |
 d||¡ | ||
¡ qF|jD ]e}t|tjƒr¬q£t|tjƒr¼tj |j|j¡}nt|tƒrÉtj |j|¡}| j||f }||f}| j| }|| jvsàJ ‚|| j|< tj | j ¡ |¡}|}tƒ }| |||¡ | dd¡ | d||¡ q£d}|jD ]}t|tjƒsq|   |||¡ |d	7 }qq| j! ¡ D ]Y\}}t|tj"ƒs9q,|  #|¡\}}}|D ]#}tƒ }| | j$| |d
|› d¡ | dd¡ | d| j%| ¡ qCd}|j
D ]}t|tjƒswql|   |||¡ |d	7 }qlq,d S )Nr  ú.framework in Frameworksr-  ÚPBXBuildFileÚfileRefFTr   r   rQ   rR   )&r±   r9   r  rå   r  rZ   r  r\   rC   r  râ   r@   r   r¢   Úis_builtr‰   r   rŽ   rã   r£   r?   r‚   rƒ   rl   r—   Úget_source_dirrä   r   r  rà   r  r  Úcreate_generator_shellphaser³   rú   rû   rø   rù   )r/   rÖ   r¨   ræ   r  r  Úfw_dictZfwkeyr   Úin_build_dirZsdictr  ÚidvalZfilerefÚfullpathr   Z	fullpath2Úo_dictr  r#   rü   rý   rþ   Úcustom_dictr0   r0   r1   rÈ   U  sŽ   



€








ü
üöz$XCodeBackend.generate_pbx_build_filec           	      C  sr   | j ||f }| j||f }t|ƒt|ƒksJ ‚t||ƒD ]\}}tƒ }| ||¡ | dd¡ | d|¡ qd S )Nr-  r?  r@  )r  r   rœ   ÚziprZ   rC   )	r/   rÖ   r¨   r  Zfile_idsÚref_idsZfile_oÚref_idÚodictr0   r0   r1   rC  ¤  s   üz(XCodeBackend.create_generator_shellphasec                 C  sj   | j  ¡ D ]-\}}tƒ }| |||¡ | dd¡ tƒ }| d|¡ | dd¡ | dd|› d¡ qd S )Nr-  ZPBXBuildStyleÚbuildSettingsZCOPY_PHASE_STRIPr%   rå   r0  )rè   r9   rZ   rC   )r/   rÖ   rå   rF  Z	styledictÚsettings_dictr0   r0   r1   rÉ   ®  s   ùz%XCodeBackend.generate_pbx_build_stylec                 C  sx   | j D ]6}tƒ }| | j| |d¡ | dd¡ | d| jd¡ | dd¡ | d| j| ¡ | dd	| d	 ¡ qd S )
NÚPBXContainerItemProxyr-  ZcontainerPortalúProject objectZ	proxyTyper   ZremoteGlobalIDStringZ
remoteInfor0  )r±   rZ   rC   r  ro   rõ   )r/   rÖ   ræ   Z
proxy_dictr0   r0   r1   rÊ   ¹  s   
ùz.XCodeBackend.generate_pbx_container_item_proxyc           $   	   C  sJ  | j  ¡ D ]þ\}}| ¡ D ]G}|jdkrU|jD ]<}tƒ }| j| }| |¡r(q| |||¡ | dd¡ | dd¡ | d|› d¡ | dd	|› d¡ | d
d¡ qq|j	D ]“}d}	t
|tjƒrq|jrhd}	tj |j|j¡}t
|tƒswqY| j||f }
tj | j ¡ |¡}tƒ }|  |¡}tj |¡}|}| |
||¡ | dd¡ | dd| d ¡ | dd¡ |	rÒ| dd| d ¡ | dd| d ¡ | d
d¡ qY| dd| d ¡ | dd| d ¡ | d
d¡ qYd}|jD ]}t
|tjƒsûqò| j||f }| j||f }t|ƒt|ƒksJ ‚t||ƒD ]S\}}tƒ }tj |¡}| |||¡ |  |¡}t  || j ¡ ¡}| dd¡ | dd| d ¡ | dd¡ | dd|› d¡ | dd|› d¡ | d
d¡ q|d7 }qò|j!D ]Ž}t
|tj"ƒr€qut
|tjƒr| #| j ¡ | j $¡ ¡}tj |j|j¡}ntj |j|¡}tj | j ¡ |¡}| j||f }
t  || j ¡ ¡}tƒ }tj |¡}| |
||¡ | dd¡ | dd|  |¡ d ¡ | dd¡ | dd|› d¡ | dd|› d¡ | d
d¡ quq| j% ¡ D ]y\}}
tƒ }| |
||¡ | j | }| &¡ }d}t
|tj'ƒr/d}|}nt
|tj(ƒr>|  d¡}|}n|  |¡}d| &¡  }| dd¡ | dd| d ¡ d|v rp|d dkrp| dd|› d¡ n| d|¡ | d|¡ | d
d¡ q
| j) ¡ D ]Ç\}}t
|tj*ƒs–q‰|  +|¡\}}}|j	D ]h}t
|tjƒr´tj |j|j¡}nt
|tƒrÃtj |j|¡}nq¡tƒ } |  |¡}|  dd¡ |  dd| d ¡ |  dd|› d¡ |  dd|› d¡ |  dd¡ |  d
d¡ | | j||f | ¡ q¡|D ]B}tƒ } |  |¡}|  dd¡ |  dd| d ¡ |  d|¡ |  dtj | j,|¡¡ |  dd¡ |  d
d¡ | | j-| | ¡ qq‰| j. /¡ D ]L}!tj 0|!¡d }"tƒ }#|  |!¡}|# dd¡ |# dd| d ¡ |# dd|"› d¡ |# dd|!› d¡ |# dd¡ |# d
d¡ | | j|! |#¡ qVd S )Nr  r-  ZPBXFileReferenceZlastKnownFileTypezwrapper.frameworkrå   z
.frameworkr   zSystem/Library/Frameworks/Ú
sourceTreeÚSDKROOTFTZexplicitFileTyper0  ZfileEncodingÚ4Z
BUILD_ROOTZSOURCE_ROOTr   r   zcompiled.mach-o.executablezdummy.dylibú"%s"rH   ZrefTypeZBUILT_PRODUCTS_DIR)1r±   r9   r  rå   r  rZ   r  r^   rC   râ   r@   r   r¢   rA  r‰   r   rŽ   rã   r£   r?   rƒ   rl   rB  rß   r¥   r  r   r  r   r   rœ   rJ  Úrelpathrä   r  Úabsolute_pathr—   rá   Úget_filenameÚ
ExecutableÚSharedLibraryr³   rú   rû   Zsrc_to_buildrù   re   r  rš   )$r/   rÖ   r¨   ræ   r  r  rD  Zframework_filerefr   rE  rF  rG  Zsrc_dictrÞ   rå   r   r  r#   ÚoutputsrK  r   rL  rM  Zrel_namerH  Útarget_dictr£   ZreftypeÚtypestrrü   rý   rþ   rI  r   r¥   Zbuildfile_dictr0   r0   r1   rË   Ã  s  



€






ì





÷
öz(XCodeBackend.generate_pbx_file_referencec                 C  s    | j  ¡ D ]H}tƒ }| |jd |d¡ | dd¡ | dd¡ tƒ }| d|¡ | ¡ D ]}|jdkrF|jD ]}| | j	| |› d¡ q7q-| d	d
¡ qd S )Nrê   r-  ZPBXFrameworksBuildPhaseÚbuildActionMaskéÿÿÿÚfilesr  r>  Ú"runOnlyForDeploymentPostprocessingr   )
r±   r  rZ   rC   rí   r8   r  rå   r  r  )r/   rÖ   ræ   Úbt_dictZ	file_listr  r  r0   r0   r1   rÌ   ]  s   

€õz/XCodeBackend.generate_pbx_frameworks_buildphasec              	   C  sŒ  i }i }| j D ]}|  ¡ ||< |  ¡ ||< q| jD ]}|  ¡ ||< |  ¡ ||< q|  ¡ }|  ¡ }|  ¡ }|  ¡ }tƒ }	| | j|	¡ |	 dd¡ tƒ }
|	 d|
¡ |
 |d¡ |
 |d¡ |
 |d¡ |
 |d¡ |	 dd	¡ |  ||¡ tƒ }| ||d¡ | dd¡ tƒ }| d|¡ | d
d¡ | dd	¡ tƒ }| ||d¡ | dd¡ tƒ }| d|¡ | j  ¡ D ]}| 	¡ D ]}|j
dkrÔ|jD ]}| | j| |¡ qÈq¾q¸| d
d¡ | dd	¡ | j ¡ D ]§\}}tƒ }| || ||¡ | dd¡ tƒ }| d|¡ | || d¡ |jr"| d
d|j› d|j
› d¡ n| d
d|j
› d¡ | dd	¡ tƒ }| || |d¡ | dd¡ tƒ }| d|¡ |jD ]0}t|tjƒrdtj |j|j¡}nt|tƒrstj |j|¡}nqQ| | j||f |¡ qQ| d
d¡ | dd	¡ qçtƒ }| ||d¡ | dd¡ tƒ }| d|¡ | j D ]}| | j| |¡ q«| d
d¡ | dd	¡ d S )Nr-  ÚPBXGroupÚchildrenzProject treerë   ZProductsrê   rR  ú	"<group>"rå   r  zSource filesr0  u    â€¢ ú"Source files")r±   rs   r³   rZ   rC   ru   r8   Úadd_projecttreer  r  rå   r  r  r9   Ú
subprojectrâ   r@   r   r¢   r‰   r   rŽ   rã   r£   r?   rƒ   rá   )r/   rÖ   ZgroupmapZtarget_src_mapræ   Úprojecttree_idZresources_idZproducts_idZframeworks_idZ	main_dictZmain_childrenZresource_dictZresource_childrenZframeworks_dictZframeworks_childrenr  r  r¨   r\  Útarget_childrenÚsource_files_dictZsource_file_childrenr   Zproduct_dictZproduct_childrenr0   r0   r1   rÍ   k  sœ   



€ý 

zXCodeBackend.generate_pbx_groupc           
      C  sD  |  ¡ }|  ¡ }tƒ }| |||¡ | dd¡ tƒ }| d|¡ | dd|› d¡ | dd¡ tƒ }|jD ],}t|tjƒrIt	j
 |j|j¡}nt|tƒrWt	j
 |j|¡}nq7| | j||f |¡ q7|jD ],}	t|	tjƒrpqgt|	tjƒr€t	j
 |	j|	j¡}	nt	j
 |j|	¡}	| | j||	f |	¡ qg| dd	¡ | dd¡ |S )
Nr-  rc  rd  rå   r0  u    Â· target"rR  re  rf  )r¡   rs   rZ   rC   r8   râ   r@   r   r¢   r‰   r   rŽ   rã   r£   r?   rƒ   rä   r   r  )
r/   rÖ   ræ   ÚtidÚgroup_idr\  rj  rk  r   r   r0   r0   r1   Úwrite_group_target_entryÄ  s6   


z%XCodeBackend.write_group_target_entryc                 C  sf   t ƒ }| ||d¡ | dd¡ tƒ }| d|¡ | dd¡ | dd¡ |  ¡ }|  |||d	¡ d S )
NzRoot of project treer-  rc  rd  rå   z"Project root"rR  re  r;   )rZ   rC   r8   Úgenerate_project_treeÚ
write_tree)r/   rÖ   ri  Z	root_dictrj  Zproject_treer0   r0   r1   rg  ä  s   zXCodeBackend.add_projecttreec              
   C  s  |j  ¡ D ]B\}}tƒ }tƒ }|  ¡ }	| |	|¡ | |	¡ | dd¡ | d|¡ | dd|› d¡ | dd¡ |  |||tj 	||¡¡ q|j
D ]}
|  ||
¡}| |¡ qKtj 	|d¡tj 	|d	¡tj 	|d
¡g}|D ]}| j |d ¡}|r| |¡ qod S )Nr-  rc  rd  rå   r0  rR  re  zmeson.buildzmeson.optionszmeson_options.txt)r,   r9   rZ   r8   rs   rC   rp  r‰   r   rŽ   r-   rn  rƒ   rÛ   )r/   rÖ   Z	tree_nodeZchildren_arrayZcurrent_subdirZsubdir_nameZsubdir_nodeZsubdir_dictZsubdir_childrenZ	subdir_idr‘   rm  Z
potentialsZbfrM   r0   r0   r1   rp  ð  s0   

þ
€ýzXCodeBackend.write_treec                 C  s*   t ƒ }| j ¡ D ]
\}}|  ||¡ q|S r+   )r(   r±   r9   Úadd_target_to_tree)r/   Z	tree_infor¨   ræ   r0   r0   r1   ro    s   z"XCodeBackend.generate_project_treec                 C  sP   |}|j  d¡}|D ]}|sq
||jvrtƒ |j|< |j| }q
|j |¡ d S )NrŸ   )rã   rš   r,   r(   r-   rB   )r/   Z	tree_rootræ   Zcurrent_nodeZpath_segmentsr   r0   r0   r1   rq    s   
zXCodeBackend.add_target_to_treec              	   C  s¾  | j  ¡ D ]V\}}tƒ }| j| }| |||¡ | dd¡ | d| j| d|› d¡ tƒ }| d|¡ d}|jD ]}t|t	j
ƒrX| | j||f d|› d	|› ¡ |d
7 }q;|j ¡ D ]\}	}
| |
|	› d¡ q^| dtƒ ¡ tƒ }| d|¡ | | j¡ | j| jD ]7}t|t	jƒr| | j| ¡  |j¡ qˆt|t	jƒr²| | j|j ¡  |jj¡ qˆ| j| ¡  }| |d¡ qˆ|jD ]}t|t	jƒrÛ|j ¡ }| j| }| |d¡ qÃd}|jD ].}t|t	jƒrö| | j| ¡  |j¡ nt|t	jƒr| | j|j ¡  |jj¡ |d
7 }qá| dd|› d¡ | dd|› d¡ | d| j| |¡ t|t	jƒr8d}nt|t	jƒrBd}nt|t	jƒrLd}ntd| ƒ‚| dd|› d¡ qd S )Nr-  ZPBXNativeTargetr.  ú.Build configuration list for PBXNativeTarget "r0  r1  r   z
Generator rŸ   r   z yyyZ
buildRulesr3  r4  rå   r5  ZproductReferencezcom.apple.product-type.toolz%com.apple.product-type.library.staticz&com.apple.product-type.library.dynamiczUnknown target type for %sZproductType)rõ   r9   rZ   r±   rC   rò   r8   r  r@   r   r  r÷   rí   r   r  rú   r  r¡   rå   r  r‘   r  rä   r  rá   rY  ÚStaticLibraryrZ  r
   )r/   rÖ   r¨   rF  Zntarget_dictræ   Zbuildphases_arrayr  r#   ZbpnameZbpvalZ	dep_arrayÚltr   Zsource_target_idr]  r0   r0   r1   rÎ     sh   

"€


€

Åz'XCodeBackend.generate_pbx_native_targetc           	      C  sd  t ƒ }| | j|d¡ | dd¡ t ƒ }| d|¡ | dd¡ | d| jd| jj› d	¡ | d
t ƒ ¡ tƒ }| d|¡ | j ¡ D ]
\}}| ||¡ qC| dd¡ | dd¡ | d| j	¡ | dd	| j
 ¡  d	 ¡ | dd¡ tƒ }| d|¡ | | jd¡ | | jd¡ | | jd¡ | jD ]}| | j| |¡ q•| jD ]}| | j| |¡ q¤d S )NrQ  r-  Z
PBXProjectZ
attributesZ!BuildIndependentTargetsInParallelr$   r.  ú)Build configuration list for PBXProject "r0  rN  ZbuildStylesZcompatibilityVersionz"Xcode 3.2"ZhasScannedForEncodingsr   Z	mainGroupZprojectDirPathZprojectRootú""r-   r'  r(  r)  )rZ   rC   ro   rt   r   r    r8   rè   r9   ru   rl   rB  rv   ry   r|   r±   rõ   r³   r6  )	r/   rÖ   Zproject_dictÚ	attr_dictZ	style_arrrå   rF  Ztargets_arrræ   r0   r0   r1   rÏ   V  s6   

ÿz!XCodeBackend.generate_pbx_projectc                 C  s,   |   |¡ |  |¡ |  |¡ |  |¡ d S r+   )Úgenerate_test_shell_build_phaseÚ generate_regen_shell_build_phaseÚ)generate_custom_target_shell_build_phasesÚ,generate_generator_target_shell_build_phases)r/   rÖ   r0   r0   r1   rÐ   r  s   


z+XCodeBackend.generate_pbx_shell_build_phasec                 C  sÂ   t ƒ }| | j|d¡ | dd¡ | dd¡ | dtƒ ¡ | dtƒ ¡ | dtƒ ¡ | d	d
¡ | dd¡ t ¡ ddd| j ¡ g }d dd„ |D ƒ¡}| dd|› d¡ | dd
¡ d S )Nr2  r-  ÚPBXShellScriptBuildPhaser^  r_  r`  Ú
inputPathsÚoutputPathsra  r   Ú	shellPathú/bin/shÚtestz--no-rebuildz-CrH   c                 S  ó   g | ]}d | ‘qS ©ú'%s'r0   ©r$  rM   r0   r0   r1   r%  ƒ  ó    z@XCodeBackend.generate_test_shell_build_phase.<locals>.<listcomp>ÚshellScriptr0  ÚshowEnvVarsInLog)	rZ   rC   rz   r8   r   Úget_meson_commandrl   r—   rŽ   ©r/   rÖ   Z
shell_dictrþ   Úcmdstrr0   r0   r1   rx  x  s   z,XCodeBackend.generate_test_shell_build_phasec                 C  sÊ   t ƒ }| | j|d¡ | dd¡ | dd¡ | dtƒ ¡ | dtƒ ¡ | dtƒ ¡ | d	d
¡ | dd¡ t ¡ ddtj | j	 
¡ d¡g }d dd„ |D ƒ¡}| dd|› d¡ | dd
¡ d S )Nr2  r-  r|  r^  r_  r`  r}  r~  ra  r   r  r€  z
--internalZ
regencheckzmeson-privaterH   c                 S  r‚  rƒ  r0   r…  r0   r0   r1   r%  ’  r†  zAXCodeBackend.generate_regen_shell_build_phase.<locals>.<listcomp>r‡  r0  rˆ  )rZ   rC   r}   r8   r   r‰  r‰   r   rŽ   rl   r—   rŠ  r0   r0   r1   ry  ‡  s   "z-XCodeBackend.generate_regen_shell_build_phasec              	   C  s¢  | j  ¡ D ]É\}}t|tjƒsq| j|dd\}}}| j|d |dd … |jr+|d nd |jr3|d nd |j	d\}}t
ƒ }	| | j| |	d|› d¡ |	 dd	¡ |	 d
d¡ |	 dtƒ ¡ |	 dtƒ ¡ tƒ }
|	 dd |d ¡¡ |	 d|
¡ |D ]}|
 tj | j ¡ |¡¡ q||	 dd¡ |	 dd¡ | j ¡ }g }|D ]}| | dtdƒd ¡¡ q¡d dd„ |D ƒ¡}|	 dd|› d|› d¡ |	 dd¡ qd S )NT)Zabsolute_outputsr   r   )r¬   ÚfeedÚenvz/* Custom target rR   r-  r|  r^  r_  r`  r}  rå   z"Generate {}."r~  ra  r  r€  r0  é\   rH   c                 S  s   g | ]}d |› d ‘qS )z\'r0   )r$  Úxr0   r0   r1   r%  ²  s    zJXCodeBackend.generate_custom_target_shell_build_phases.<locals>.<listcomp>r‡  z"cd z; rˆ  )r³   r9   r@   r   rú   rû   Zas_meson_exe_cmdliner¬   rŒ  r  rZ   rC   r÷   r8   Úformatr‰   r   rŽ   rl   r—   rB   rn   Úchr)r/   rÖ   r¨   ræ   rü   rý   rþ   Z	fixed_cmdÚ_rI  Úoutarrayr   ÚworkdirZ
quoted_cmdr   r‹  r0   r0   r1   rz  –  s>   


ü
äz6XCodeBackend.generate_custom_target_shell_build_phasesc              	   C  s˜   | j  ¡ D ]\}}d}|jD ]}t|tjƒr#|  |||||¡ |d7 }qq| j ¡ D ]\}}d}|jD ]}t|tjƒrH|  |||||¡ |d7 }q3q*d S rÿ   )	r±   r9   r  r@   r   r  Úgenerate_single_generator_phaser³   râ   )r/   rÖ   r¨   ræ   r  r  r0   r0   r1   r{  ¶  s"   
€ý
€ýþz9XCodeBackend.generate_generator_target_shell_build_phasesc              
   C  s|  |  ¡ }| ¡ }|  |¡}| j ¡ }	tƒ }
| | j||f |
d|› d|› d¡ | ¡ }| 	¡ }|
 dd¡ |
 dd¡ |
 dt
ƒ ¡ |
 d	t
ƒ ¡ |
 d
d|› d|› d¡ d|	gg}||f}| j| }t
ƒ }|
 d|¡ |D ]}| |¡ qp|D ]t}| | j¡}| |¡}| |¡D ]a}tj |  |¡|¡}g }|D ]'}| d|¡}| d|¡ d|  |¡¡}| dtj | j|j¡¡}| |¡ qœ|  ||  |¡|¡}|  ||¡}|jrädg| | d|dg }n|| }| |¡ qŒqz|
 dd¡ |
 dd¡ g }|D ]'}g }|D ]}d|v r| d|› d¡ q| |¡ q| d |¡¡ qÿdd |¡ d }|
 d|¡ |
 dd¡ d S )Nz"Generator rŸ   r0  r-  r|  r^  r_  r`  r}  rå   Úcdr~  z@INPUT@z@OUTPUT@z@BUILD_DIR@z@CURRENT_SOURCE_DIR@ú(ú>ú)ra  r   r  r€  rH   ú\"z && r‡  rˆ  )Zget_generatorZget_exeZbuild_target_to_cmd_arrayrl   r—   rZ   rC   r÷   r  Úget_outputsr8   r   Zrel_to_builddirZbuild_to_srcZget_arglistr  r‰   r   rŽ   r	  rn   rã   rB   Zreplace_outputsZreplace_extra_argsr¬   )r/   r¨   ræ   r  r  rÖ   Ú	generatorÚexeZexe_arrr”  Zgen_dictZ
infilelistZoutfilelistÚcommandsr  r  r“  ZofrM   Z
infilenameZ	base_argsr  r   ÚargsÚargZfull_commandZquoted_cmdsZcmndÚqr   r‹  r0   r0   r1   r•  Ä  sf   

&


ñ
z,XCodeBackend.generate_single_generator_phasec              
   C  sž  | j D ]É}tƒ }| j| }| |j| |d¡ | dd¡ | dd¡ tƒ }| d|¡ | j| jD ]$}tj 	|j
|j¡}| j |¡sV| | j||f tj 	| j ¡ |¡¡ q2d}|jD ]i}t|tjƒrƒ|  |¡\}	}
}|
D ]}| | j| tj 	| j ¡ |¡¡ qnq\t|tjƒr¢| ¡ D ]}| | j| tj 	| j ¡ |¡¡ qq\t|tjƒr¾| j||f }|d7 }|D ]}| |¡ qµq\td	t|ƒ ƒ‚| d
d¡ qd S )Nrì   r-  ZPBXSourcesBuildPhaser^  r_  r`  r   r   zUnknown input type: ra  )r!  rZ   r±   rC   rí   r8   râ   r‰   r   rŽ   rã   r£   rl   Z	is_headerr‚   rB  r  r@   r   rú   rû   rø   r—   r  r›  r  r  rb   r?   )r/   rÖ   rå   Z
phase_dictræ   Zfile_arrr   r  Úgtrü   rý   rþ   r   Zgenfilesr0   r0   r1   rÑ     sJ   

&€
ÿÿÿÿÿâz-XCodeBackend.generate_pbx_sources_build_phasec                 C  s$  t ƒ }| | j|d¡ | dd¡ | d| j¡ g }| | j| jdd f¡ | jD ]}| j| }| || j	| || j
| f¡ q(| jD ]}| j| }| || j| |d f¡ qBt|t d¡d}|D ].}t ƒ }| |d |d¡ | dd¡ | d|d |d	 ¡ |d
 d ur| d|d
 d¡ qad S )Nr'  r-  r4  r‘   ZREGENr   r*  r   r   r+  ZtargetProxyrP  )rZ   rC   r7  rv   rB   r   r|   r±   r  rõ   r  r³   r  r6  r9  r:  r;  )r/   rÖ   Úall_dictr-   ræ   rF  Zsorted_targetsÚt_dictr0   r0   r1   rÒ   "  s,   

 

€úz+XCodeBackend.generate_pbx_target_dependencyc                 C  sv  | j D ]K}tƒ }| | j| ||¡ | dd¡ tƒ }| d|¡ | dd¡ | dd¡ | dd	¡ | d
d¡ | dd| j ¡  ¡ | dd|› d¡ q| j D ]A}tƒ }| | j| ||¡ | dd¡ tƒ }| d|¡ | dd| j ¡  ¡ tƒ }| d¡ | d|¡ | dd|› d¡ qR| j D ]A}tƒ }| | j| ||¡ | dd¡ tƒ }| d|¡ | dd| j ¡  ¡ tƒ }| d|¡ | d¡ | dd|› d¡ q—| j	 
¡ D ]\}}|  |||¡ qÞ| j 
¡ D ]I\}}tƒ }| | j| | ||¡ | dd¡ tƒ }| d|¡ | dd¡ | dd¡ | d
d¡ | dd| j ¡  ¡ | dd|› d¡ qïd S )Nr-  ÚXCBuildConfigurationrN  ZARCHSz"$(NATIVE_ARCH_ACTUAL)"ZONLY_ACTIVE_ARCHr$   ZSWIFT_VERSIONz5.0rS  z"macosx"ÚSYMROOTz
"%s/build"rå   r0  rU  ú"$(inherited)"ÚWARNING_CFLAGS)rx   rZ   rC   rï   rl   r—   rð   r8   rñ   r±   r9   Úgenerate_single_build_targetr³   rî   )r/   rÖ   rj   rb  rO  Ú
warn_arrayÚtarget_namer‘   r0   r0   r1   rÓ   ;  s`   




öz,XCodeBackend.generate_xc_build_configurationc                 C  sê   d}g }|j D ]i}t|tjƒrt|tjƒrqt|tjƒr'|  |j¡}| ¡ }nt|tj	ƒr7|  |¡}| ¡ }n	|  
|¡}| ¡ }tj | j ¡ ||¡}| d| ¡ t|tjƒrZd}t|tjƒrp|  ||¡\}	}
||	7 }|po|
}q||fS )NFr„  T)r  r@   r   ÚSharedModulerY  r  r˜   r‘   rX  rú   r“   r‰   r   rŽ   rl   r—   rB   rZ  rs  Ú determine_internal_dep_link_args)r/   r‘   rj   Úlinks_dylibÚdep_libsÚlZrel_dirÚlibnameZabs_pathZsub_libsZsub_links_dylibr0   r0   r1   r­  u  s.   




€z-XCodeBackend.determine_internal_dep_link_argsc           :   	   C  sè  | j D ]m}g }d}g }|jD ]=}|jD ]$}	tj |j|	¡}
| tj | j 	¡ |
¡¡ | tj | j 
¡ |
¡¡ q|jD ]}| tj | j 
¡ |¡¡ q<q|  ||¡\}}|r]ddg| }d }t|tjƒrˆt|tjƒrng }ndg}|dg| 7 }tj | j 
¡ |j|¡}|j}n|}d}|d ur™| ¡ d | }n| ¡ }||j7 }|  |¡r°|jd g }}n|  |¡\}}t|tjƒsÓ|| j ||j|j¡7 }|| j ||j¡7 }g }| ¡ D ]}|| ¡ 7 }|| ¡ 7 }qÙ|j D ]4}t|tj!ƒrt"ƒ }|  #|¡D ]"}tj | j 
¡ |j$j|¡}||vr| %|¡ |d| d g7 }qüqëd	}|j&D ]”}t|tj'ƒrV| j(||f }|d
7 }|D ]}| )d¡sI| )d¡rR|d| d g7 }q;q%t|tj*ƒr‰|  +|¡\}}}|D ]}tj ,|¡d t-v r…|dtj | j 
¡ |¡ d g7 }qgq%t|tj.ƒr¶| /¡ D ]}tj ,|¡d t-v r²|dtj | j 
¡ |¡ d g7 }q”q%t0|ƒ‚t|tjƒrË|| 1| 2¡ ¡7 }nt|tjƒrØ|| 3¡ 7 }d |¡}| j4| | } i }!| jj5j|j D ]¯}"|"t6vr÷qî|j 7|"¡}#|#d u rqî|# 8| 9t:dƒ¡¡}$| 2¡ }%|# ;|%¡}&| jj<|j  7|ji ¡ 7|"g ¡}'| jj=|j  7|"g ¡}(| >|"¡})|$|& |' |( |) }*|"dkrY|  ?|¡}+|+D ]}|*|# @|d¡7 }*qM|*rœ|},|#ro|jAro|,| jB||#dd7 },|"dkrwd}"n|"dkr~d}"t6|" }-|-|!v r|!|-  |*7  < n|*|!|-< |!|-  |,7  < qîtj | j 
¡ |j¡}.tCƒ }/| D| |/|¡ |/ Ddd¡ tCƒ }0|/ Dd|0¡ |0 Ddd¡ t|tjƒrÜ|0 Ddd¡ |0 Ddd¡ n|d urë|0 Ddd|› d¡ |jErö|0 Dd|jE¡ |jFrd|jF }1|0 Dd |1¡ |0 Dd!tG| 9t:d"ƒ¡ ¡ |0 Dd#d$¡ tH| 9t:d%ƒ¡ }2|2d ur,|0 Dd&|2¡ |jIr}| Jd¡| Jd¡ | Jd¡ | Jd¡ }3d'd(„ |3D ƒ}3|3r}tK|3ƒd
krbtL Md)|3›d*|jN› d+¡ tj | O¡ |3d	 ¡}4|0 Dd,d¡ |0 Dd-d.|4› d¡ |0 Dd/d¡ |0 Dd0d$¡ tPƒ }5g }6|6 |  Q|¡¡ |jAr¸|6 tj | j 
¡ | O¡ ¡¡ |6 tj | j 	¡ | O¡ ¡¡ |rÌ|D ]}7tj R|7¡}7|6 |7¡ q½|6D ]}7|5 Dd1|7› d2¡ qÎ|0 Dd3|5¡ |0 Dd4d|› d¡ |0 Dd5d¡ t|tjƒr|0 Dd6d7¡ |0 Dd8d9¡ nt|tjƒr|0 Dd6d:¡ |  S|0|!¡ |0 Dd;d|› d¡ |0 Dd<d¡ d|v r8|0 Dd=d|› d¡ n|0 Dd=|¡ |0 Dd>d¡ |0 Dd?d|.› d¡ tPƒ }8|0 Dd@|8¡ |0 DdAd$¡ tPƒ }9|0 DdB|9¡ |9 DdC¡ |/ DdD|¡ qd S )ENFz-Wl,-search_paths_firstz -Wl,-headerpad_max_install_namesz-dynamiclibr;   rØ   r   rš  r   r   r&   r'   rÙ   rH   Zwarning_levelT)rW  r   r   r   r   r-  r¥  rN  ZCOMBINE_HIDPI_IMAGESr$   ZDYLIB_CURRENT_VERSIONrv  ZDYLIB_COMPATIBILITY_VERSIONr0  ZEXECUTABLE_PREFIXZEXECUTABLE_SUFFIXZGCC_GENERATE_DEBUGGING_SYMBOLSÚdebugZGCC_INLINES_ARE_PRIVATE_EXTERNr%   ÚoptimizationZGCC_OPTIMIZATION_LEVELc                 S  s.   g | ]}|  d ¡s|  d¡s|  d¡r|‘qS )z.hz.hhr   )Úendswith)r$  Zpchr0   r0   r1   r%  &  s   . z=XCodeBackend.generate_single_build_target.<locals>.<listcomp>zGUnsupported Xcode configuration: More than 1 precompiled header found "z". Target "z" might not compile correctly.ZGCC_PRECOMPILE_PREFIX_HEADERZGCC_PREFIX_HEADERz"$(PROJECT_DIR)/ZGCC_PREPROCESSOR_DEFINITIONSZGCC_SYMBOLS_PRIVATE_EXTERNz"\"z\""ZHEADER_SEARCH_PATHSZINSTALL_PATHZLIBRARY_SEARCH_PATHSZLIBRARY_STYLEZBUNDLEZMACH_O_TYPEZ	mh_bundleZDYNAMICZOTHER_LDFLAGSZOTHER_REZFLAGSZPRODUCT_NAMEZSECTORDER_FLAGSr¦  ZSYSTEM_HEADER_SEARCH_PATHSZUSE_HEADERMAPr¨  r§  rå   )Trx   Úinclude_dirsÚincdirsr‰   r   rŽ   ÚcurdirrB   rl   rB  r—   Zextra_build_dirsr­  r@   r   rZ  r¬  rã   Ú	soversionr  Z	link_argsZis_swift_targetÚ	compilersZ determine_linker_and_stdlib_argsrs  Zget_project_link_argsrh  Zfor_machineZget_global_link_argsr  Zget_compile_argsZget_link_argsrä   r  r[   Zdetermine_ext_objsr‘   r]   r  r  r   r´  rú   rû   r¤   ÚLINKABLE_EXTENSIONSr  r›  rb   Zget_std_shared_module_link_argsZget_optionsZget_std_shared_lib_link_argsrî   rm   ÚLANGNAMEMAPrÛ   Zget_warn_argsrr   r   Zget_option_compile_argsZprojects_argsZglobal_argsZget_extra_argsZdetermine_swift_dep_dirsZget_include_argsZimplicit_include_directoriesZ"get_custom_target_dir_include_argsrZ   rC   ÚprefixÚsuffixÚBOOL2XCODEBOOLÚOPT2XCODEOPTZhas_pchZget_pchrœ   r   Úwarningrå   r   r8   Zget_target_private_dir_absr™   Úadd_otherargs):r/   rÖ   r«  r‘   rj   r¯  r®  Z
headerdirsr<  Úsdr–  ÚextraZdylib_versionZldargsZinstall_pathZproduct_nameZlinkerZstdlib_argsZcargsr  r   Z
added_objsZobjname_relZobjname_absr  r[  Zo_absrü   rý   rþ   ZofnameZldstrÚvalidÚlangargsÚlangÚcompilerZ	warn_argsZ
copt_proxyZstd_argsZpargsZgargsZtargsrŸ  Zswift_dep_dirsZ
lang_cargsÚlangnameZsymrootrb  rO  r½  Zopt_flagZpchsZrelative_pch_pathZ
header_arrZunquoted_headersrM   Zsysheader_arrrª  r0   r0   r1   r©  Ž  sh  


ÿ




€
€þ"€þ"€þ



 





€


(

 ¹z)XCodeBackend.generate_single_build_targetc                 C  s”   |  ¡ D ]C\}}|rGg }|D ]'}| tdƒdtdƒ ¡}| dd¡}d|v s*d|v r0d| d }| |¡ q| d|› d	dd |¡ d ¡ qd S )
NrŽ  é   r0  z\\\"rH   ú'rš  ZOTHER_ÚFLAGS)r9   rn   r‘  rB   rC   rŽ   )r/   rO  rÅ  rÈ  rŸ  Zquoted_argsr   r0   r0   r1   rÁ  W  s   "€ôzXCodeBackend.add_otherargsrÖ   rZ   c                 C  sÒ  t ƒ }| | j|d| jj› d¡ | dd¡ tƒ }| d|¡ | jD ]}| | j| |¡ q#| dd¡ | d| j¡ t ƒ }| | j	|d	¡ | dd¡ tƒ }| d|¡ | jD ]}| | j
| |¡ qY| dd¡ | d| j¡ t ƒ }| | j|d
¡ | dd¡ tƒ }| d|¡ | jD ]}| | j| |¡ q| dd¡ | d| j¡ t ƒ }| | j|d¡ | dd¡ tƒ }| d|¡ | jD ]}| | j| |¡ qÅ| dd¡ | d| j¡ | jD ]@}	t ƒ }
| j|	 }| ||
d|	› d¡ |
 dd¡ tƒ }|
 d|¡ | j|	 | j }| || j¡ |
 dd¡ |
 d| j¡ qá| jD ]A}	t ƒ }
| j|	 }| ||
d|	› d¡ |
 dd¡ tƒ }|
 d|¡ | j|	 | j }| || j¡ |
 dd¡ |
 d| j¡ q%d S )Nru  r0  r-  ZXCConfigurationListZbuildConfigurationsZdefaultConfigurationIsVisibler   ZdefaultConfigurationNamez;Build configuration list for PBXAggregateTarget "ALL_BUILD"z:Build configuration list for PBXAggregateTarget "RUN_TEST"z<Build configuration list for PBXAggregateTarget "REGENERATE"rr  r/  )rZ   rC   rt   r   r    r8   rx   rï   rj   rw   rð   r{   rñ   r~   r±   rò   rî   r³   )r/   rÖ   Z	conf_dictZ	confs_arrrj   r£  Zconf_arrZ	test_dictZ
regen_dictr«  r¤  ZlistidrF  r0   r0   r1   rÔ   f  sv   







öz*XCodeBackend.generate_xc_configurationListÚpbxdictc                 C  s<   |  dd¡ |  dtƒ ¡ |  dd¡ tƒ }|  d|¡ |S )NZarchiveVersionr   ÚclassesZobjectVersionZ46rä   )rC   rZ   )r/   rÌ  rÖ   r0   r0   r1   rÆ   «  s   zXCodeBackend.generate_prefixc                 C  s   |  d| jd¡ d S )NZ
rootObjectrQ  )rC   ro   )r/   rÌ  r0   r0   r1   rÕ   ´  ré   zXCodeBackend.generate_suffix)r   rd   re   rf   )r)   r?   )FN)r¬   r­   r®   r¯   r)   r°   r3   )rÖ   rZ   r)   r*   )rÌ  rZ   r)   rZ   )rÌ  rZ   r)   r*   )@r5   r6   r7   rå   r2   rŠ   rs   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È   rC  rÉ   rÊ   rË   rÌ   rÍ   rn  rg  rp  ro  rq  rÎ   rÏ   rÐ   rx  ry  rz  r{  r•  rÑ   rÒ   rÓ   r­  r©  rÁ  rÔ   rÆ   rÕ   Ú__classcell__r0   r0   r„   r1   rc   ¸   s~    
N
	




	













;O

 Y > =!: J

E	rc   ) Ú
__future__r   r‹   r‰   r:  Útypingrp   r;   r   r   r   r   r	   r
   r   ÚTYPE_CHECKINGre   r   rJ   rÚ   r»  r¿  r¾  rº  r(   r8   rA   rT   rW   rZ   ZBackendrc   r0   r0   r0   r1   Ú<module>   sŠ   ÿþýüûúùø	÷
öõôóòñðïüú
	<