o
    uJAf?                     @  sl  d dl 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mZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZm Z m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? e
j@rddlmAZAmBZB ddlmCZC ddlDmEZE ddlFmGZG ddlHmIZI e
jJeKeLeMee3f ZNe
jJeNe
jOeN f ZPe
jQeKePf ZRg dZSddddddd ZTd!gZUg d"ZVg d#ZWg d$ZXg d%ZYdgZZe[d&Z\d6d*d+Z]G d,d- d-Z^G d.d/ d/Z_G d0d1 d1Z`G d2d3 d3ZaG d4d5 d5ZbdS )7    )annotations)	lru_cache)environPathN   )CMakeExceptionCMakeTargetlanguage_mapcmake_get_generator_argscheck_cmake_args)CMakeFileAPI)CMakeExecutor)CMakeToolchainCMakeExecScope)CMakeTraceParser)resolve_cmake_trace_targets   )mlogmesonlib)MachineChoice
OrderedSetpath_is_in_rootrelative_to_if_possible	OptionKey)DataFile)assembler_suffixeslang_suffixesheader_suffixesobj_suffixeslib_suffixes	is_header)ExternalProgram)FORBIDDEN_TARGET_NAMES)TokenBaseNodeCodeBlockNodeFunctionNode	ArrayNodeArgumentNodeAssignmentNodeBooleanNode
StringNodeIdNode	IndexNode
MethodNode
NumberNode
SymbolNode)CMakeConfigurationTargetOptions)CMakeGeneratorTarget)ImmutableListProtocol)Backend)Environment)
ZCMP0025ZCMP0047ZCMP0056ZCMP0060ZCMP0065ZCMP0066ZCMP0067ZCMP0082ZCMP0089ZCMP0102static_libraryshared_moduleshared_library
executableheader_only)ZSTATIC_LIBRARYZMODULE_LIBRARYZSHARED_LIBRARY
EXECUTABLEOBJECT_LIBRARYINTERFACE_LIBRARYZUTILITY) z-Wallz-Wextraz-Weverythingz-Werrorz
-Wpedanticz	-pedanticz-wz/W1z/W2z/W3z/W4z/Wallz/WXz/wz/O1z/O2z/Obz/Odz/Ogz/Oiz/Osz/Otz/Oxz/Oyz/Ob0/RTC1z/RTCcz/RTCsz/RTCuz/Z7/Ziz/ZI)	z/machine:x64z/machine:x86z/machine:armz/machine:ebcz/debugz/debug:fastlinkz/debug:fullz/debug:nonez/incremental)z/GRz/EHscz/MDdrA   r@   )
zkernel32.libz
user32.libz	gdi32.libzwinspool.libzshell32.libz	ole32.libzoleaut32.libzuuid.libzcomdlg32.libzadvapi32.libz[^_a-zA-Z0-9]namestrreturnc                 C  s*   t d| } | tv s| drd|  } | S )N_mesonZcm_)_cmake_name_regexsubr#   
startswithrB    rK   A/usr/lib/python3.10/site-packages/mesonbuild/cmake/interpreter.py_sanitize_cmake_name|   s   rM   c                   @  s   e Zd ZedZd.ddZd/d
dZd0ddZd1ddZ	d2ddZ
d1ddZd3ddZd4dd Zd5d"d#Zd6d%d&Zd7d'd(Zd6d)d*Zd7d+d,Zd-S )8OutputTargetMapz(\.[0-9]+)+$	build_dirr   c                 C  s   i | _ || _d S N)tgt_maprO   )selfrO   rK   rK   rL   __init__      
zOutputTargetMap.__init__tgt3T.Union['ConverterTarget', 'ConverterCustomTarget']rD   Nonec                   s   d fdd}  jg}ttr2|jg7 }| fddjD 7 }| fd	djD 7 }ttrO| fd
djD 7 }| fddjD 7 }|| d S )NkeysT.List[str]rD   rW   c                   s"   dd | D D ]} j |< qd S )Nc                 S  s   g | ]}|r|qS rK   rK   .0xrK   rK   rL   
<listcomp>       z<OutputTargetMap.add.<locals>.assign_keys.<locals>.<listcomp>rQ   )rX   irR   rU   rK   rL   assign_keys   s   z(OutputTargetMap.add.<locals>.assign_keysc                      g | ]}  |qS rK   )_rel_artifact_keyrZ   rR   rK   rL   r]          z'OutputTargetMap.add.<locals>.<listcomp>c                   rc   rK   )_base_artifact_keyrZ   re   rK   rL   r]      rf   c                   rc   rK   )_rel_generated_file_keyrZ   re   rK   rL   r]      rf   c                   rc   rK   )_base_generated_file_keyrZ   re   rK   rL   r]      rf   )rX   rY   rD   rW   )_target_key
cmake_name
isinstanceConverterTarget	full_name	artifactsConverterCustomTargetoriginal_outputs)rR   rU   rb   rX   rK   ra   rL   add   s   

zOutputTargetMap.addrX   rY   ?T.Optional[T.Union['ConverterTarget', 'ConverterCustomTarget']]c                 C  s*   |D ]}|r|| j v r| j |   S qd S rP   r_   )rR   rX   r`   rK   rK   rL   _return_first_valid_key   s
   z'OutputTargetMap._return_first_valid_keyrB   rC   c                 C  s   |  | |gS rP   )rt   rj   )rR   rB   rK   rK   rL   target      zOutputTargetMap.targetT.Optional['ConverterTarget']c                 C  s4   |  |}|d u st|tsd S | dkrd S |S )Nr;   )ru   rl   rm   
meson_func)rR   rB   rU   rK   rK   rL   r;      s   
zOutputTargetMap.executablec                 C  s   g }|t jd|g}tD ]&}|d| sq|d t| d  }t jd|}|| d| g7 }q|D ]}|| t|t|j| 	t|g7 }q6| 
|S )N .r   )rN   rm_so_versionrH   r    endswithlenrd   r   rB   rg   rt   )rR   rB   rX   
candidatesr`   new_namerK   rK   rL   artifact   s   *
zOutputTargetMap.artifact#T.Optional['ConverterCustomTarget']c                 C  s4   |  | || |g}|d u st|tsJ |S rP   )rt   rh   ri   rl   rp   )rR   rB   resrK   rK   rL   	generated   s   zOutputTargetMap.generatedfnameT.Optional[Path]c                 C  s(   z	|  | jW S  ty   Y d S w rP   )resolverelative_torO   
ValueErrorrR   r   rK   rK   rL   	_rel_path   s   zOutputTargetMap._rel_pathtgt_namec                 C  s   d| dS )NZ__tgt___rK   )rR   r   rK   rK   rL   rj      s   zOutputTargetMap._target_keyT.Optional[str]c                 C  "   |  |}|rd|  dS d S )NZ	__relgen_r   r   as_posixrR   r   pathrK   rK   rL   rh         
z'OutputTargetMap._rel_generated_file_keyc                 C     d|j  dS )NZ__gen_r   rJ   r   rK   rK   rL   ri         z(OutputTargetMap._base_generated_file_keyc                 C  r   )NZ	__relart_r   r   r   rK   rK   rL   rd      r   z!OutputTargetMap._rel_artifact_keyc                 C  r   )NZ__art_r   rJ   r   rK   rK   rL   rg      r   z"OutputTargetMap._base_artifact_keyN)rO   r   )rU   rV   rD   rW   )rX   rY   rD   rs   )rB   rC   rD   rs   )rB   rC   rD   rw   )rB   r   rD   r   )r   r   rD   r   )r   rC   rD   rC   )r   r   rD   r   )r   r   rD   rC   )__name__
__module____qualname__recompiler{   rS   rr   rt   ru   r;   r   r   r   rj   rh   ri   rd   rg   rK   rK   rK   rL   rN      s    












rN   c                   @  s   e Zd Zd3d	d
Zd4ddZedZd5ddZd6ddZ	d7d!d"Z
ed#d$d8d&d'Zed#d$d9d)d*Zd:d+d,Zd:d-d.Zd4d/d0Zd:d1d2Zd#S );rm   ru   r	   env'Environment'for_machiner   rD   rW   c                   sX  |_ |_|j_|j_|j_|j_|j_|j_|j_|j	_	d _
|j_|j|j _g _g _|jrC|jd _
t _g _g _g _g _g _g _g _i _g _d_g _tj_g _|j D ]}t }t }|jD ]}|j!sq|"|j!dd   qdd t#$ D }|"|%|j&' d |D ]}	t($ D ]\}
}|	|v r|"|
  nqq|D ] j"   jvrg j < q|j)}|dd |j*D 7 }|D ] j    fd	d|D 7  < q jfd
d|jD 7  _ jfdd|jD 7  _|j+r! j|j7  _qt j|j7  _qtd S )Nr   Fr   c                 S  s   i | ]	\}}|  |qS rK   )lower)r[   keyvalrK   rK   rL   
<dictcomp>      z,ConverterTarget.__init__.<locals>.<dictcomp>cc                 S     g | ]}d | qS )z-DrK   rZ   rK   rK   rL   r]     rf   z,ConverterTarget.__init__.<locals>.<listcomp>c                      g | ]}|j   vr|qS rK   compile_optsrZ   langrR   rK   rL   r]         c                   s$   g | ]}|j  jvr|js|j qS rK   )r   includesisSystemrZ   re   rK   rL   r]        $ c                   s$   g | ]}|j  jvr|jr|j qS rK   )r   sys_includesr   rZ   re   rK   rL   r]      r   ),r   r   ro   src_dirrO   rB   rk   rn   typeinstallinstall_dirlink_libraries
link_flagslink_lang_flagsdepends_rawdependsinstall_pathsset	languagessourcesr   generated_ctgtr   r   	link_withobject_libsr   public_compile_optspieoverride_optionsrM   generated_rawfilessuffixrr   r
   itemsgetlanguager   r   flagsdefinesis_generated)rR   ru   r   r   r`   r   Zsrc_suffixesjZlang_cmake_to_mesonZsfxr   r   argsrK   r   rL   rS      s|   




$zConverterTarget.__init__rC   c                 C  s   d| j j d| j dS )N<: >)	__class__r   rB   re   rK   rK   rL   __repr__(  s   zConverterTarget.__repr__z'([-]{1,2}std=|/std:v?|[-]{1,2}std:)(.*)output_target_maprN   root_src_dirr   subdirinstall_prefixtracer   c              
     s  dD ]y}|j vr
qg }j | D ]d}tj|}	|t|}
|	rN|	d}||vr@tj	d
||ddd q j| d| g7  _q|dv rVd_qt|
trk jt|g7  _||g7 }q|tv rpq||g7 }q|j |< qj d	krd_jj}|rňjj j_tjj} jd
d |jD 7  _ j|j7  _ j|j7  _ j|j 7  _nj dvrt	dt!jd g }jD ]"}d|v rqt|" s|#|}|r j$|g7  _$q||g7 }q|_t%t&t%t' t%t( j)D ]}t%t*| 7 qdd D fddj+D _+fddjD _d.fddj,-tj.  }fddjD _t%t/fddt/jD |g _t%t/fddt/j0D _0fddj+D _+jD ]<}||}
|
rt|
tsJ |
1|}t|t2r|3 sJ  j4|g7  _4q|d urʈ j|g7  _qd d jD _d!d j0D _0d"d j+D _+td#jvr jtd#g7  _j5rj5" rt6j5|rj5-|_5d/d&d' d(d jD _ fd)djD _d0d,d-}|j_|j_jD ]}|7|}|rNj8| q>d S )1N)r   cppr   zwUnknown {0}_std "{1}" -> Ignoring. Try setting the project-level {0}_std if build errors occur. Known {0}_stds are: {2} Toncez_std=>   z-fpicz-fPIEz-fpiez-fPICr>   c                 S  s   g | ]}t |qS rK   r   rZ   rK   rK   rL   r]   \  r^   z/ConverterTarget.postprocess.<locals>.<listcomp>)r=   r>   zCMake: Targetz7not found in CMake trace. This can lead to build errorsz,-rpath,c                 S  r   rz   rK   rZ   rK   rK   rL   r]   v  rf   c                   &   g | ] t  fd dD r qS )c                 3      | ]	} j |V  qd S rP   rB   r|   r[   yr\   rK   rL   	<genexpr>w      9ConverterTarget.postprocess.<locals>.<listcomp>.<genexpr>anyr[   	supportedr   rL   r]   w     & c                   r   )c                 3  r   rP   r   r   r   rK   rL   r   x  r   r   r   r   r   r   rL   r]   x  r   r\   r   r!   boolr   rD   r   c                   sd     s	j         sJ   sVt fddtD sV|sVt tj	 ddrC j
ddd  tj	  S tdt  d td d S  jv r]d S t tj rt st tj	 stdt  d	td
d td d S t tj	 r|r tj	  S t r S  S )Nc                 3  r   rP   r   r   r   rK   rL   r     r   z@ConverterTarget.postprocess.<locals>.rel_path.<locals>.<genexpr>Tr   parentsexist_okzCMake: pathzdoes not exist.z- --> Ignoring. This can lead to build errors.zis inside the root project butnotzinside the subproject.)is_absoluter   r   existsr   r   r   r   r   get_build_dirmkdirr   r   warningboldr   Zexplicit_headersget_source_dir)r\   r!   r   )r   rR   r   r   r   rL   rel_path{  s6   
"

"


z-ConverterTarget.postprocess.<locals>.rel_pathc                      g | ]} |d dqS )FTrK   rZ   r   rK   rL   r]         c                   r   TFrK   rZ   r   rK   rL   r]     r   c                   r   r   rK   rZ   r   rK   rL   r]     r   c                   s   g | ]} |d d qS )FrK   rZ   r   rK   rL   r]     r   c                 S     g | ]}|d ur|qS rP   rK   rZ   rK   rK   rL   r]     r   c                 S  r   rP   rK   rZ   rK   rK   rL   r]     r   c                 S  r   rP   rK   rZ   rK   rK   rL   r]     r   rz   flagrC   c                 S  s.   |   tv s| tt v rdS | drdS dS )NFz/DT)r   blacklist_link_flagsblacklist_compiler_flagsblacklist_clang_cl_link_flagsrI   )r   rK   rK   rL   
check_flag  s
   
z/ConverterTarget.postprocess.<locals>.check_flagc                 S  s   g | ]
}|  tvr|qS rK   )r   blacklist_link_libsrZ   rK   rK   rL   r]         c                   s   g | ]} |r|qS rK   rK   rZ   )r  rK   rL   r]     r   r   rY   c                 S  sH   g }| D ]}t |}| r|jds||g7 }q|d|jg7 }q|S )Nz
.frameworkz
-framework)r   r   rB   r|   stem)r   r   r`   prK   rK   rL   handle_frameworks  s   
z6ConverterTarget.postprocess.<locals>.handle_frameworks)r\   r   r!   r   r   r   rD   r   )r   rC   rD   r   )r   rY   rD   rY   )9r   rm   	std_regexmatchr   r   group_all_lang_stdsr   r   formatjoinr   r   rl   rp   r   r   r   uppertargetsr   rk   r   r   r   r   r   include_directoriesr   r   r   	librariesr   r   r   r   listr   r   r   r   r   r   rO   r   r   r   r   get_refCustomTargetReferencevalidr   r   r   ru   append)rR   r   r   r   r   r   r`   tempr   mctgtstdrU   rtgtr   build_dir_relZgen_filerefr  Zdep_tgtrK   )r  r   r   rR   r   r   r   rL   postprocess-  s   






("








zConverterTarget.postprocessobj_target_listT.List['ConverterTarget']linker_workaroundr   c                   s   dd | j D }dd |D }|  }|D ]_}dd |j|j  D |D ]O  g}t fdd|D sFtjddd	 | fd
d|D 7 }tfdd|D rs|rY| | n|  j|j7  _tt	| j| _|  j
|g7  _
 nq$qdd | j D | _ d S )Nc                   s&   g | ] t  fd dtD r qS )c                 3       | ]} j d | V  qdS rz   Nr   r   r   rK   rL   r         AConverterTarget.process_object_libs.<locals>.<listcomp>.<genexpr>r   r   r   rK   r   rL   r]     r   z7ConverterTarget.process_object_libs.<locals>.<listcomp>c                 S     g | ]}|j qS rK   )r  rZ   rK   rK   rL   r]         c                 S  r'  rK   rJ   rZ   rK   rK   rL   r]     r(  c                 3  s    | ]
}  d | V  qdS r#  )r|   rZ   r   rK   rL   r     s    z6ConverterTarget.process_object_libs.<locals>.<genexpr>zWObject files do not contain source file extensions, thus falling back to guessing them.Tr   c                   s   g | ]	}  d | qS r   rK   rZ   r)  rK   rL   r]     r   c                 3  s    | ]}| v V  qd S rP   rK   rZ   )source_filesrK   rL   r     s    c                   s&   g | ] t  fd dtD s qS )c                 3  r"  r#  r   r   r   rK   rL   r     r$  r%  r&  r   rK   r   rL   r]     r   )r   _all_source_suffixesr   r   r   r   _append_objlib_sourcesr   r  r   r   )rR   r  r!  r  r  extsr`   r~   rK   )r   r*  rL   process_object_libs  s(   
z#ConverterTarget.process_object_libsrU   'ConverterTarget'c                   s    j |j 7  _  j|j7  _ j|j7  _ j|j7  _ttj _ ttj_ttj_ttj_|j D ]\ } jvrSg j < j    fdd|D 7  < qEd S )Nc                   r   rK   r   rZ   r   rK   rL   r]     r   z:ConverterTarget._append_objlib_sources.<locals>.<listcomp>)r   r   r   r   r  r   r   r   )rR   rU   optsrK   r   rL   r,    s   

$z&ConverterTarget._append_objlib_sourcesN)maxsize'ImmutableListProtocol[str]'c                 C  s    g }t  D ]}|| q|S rP   )r   valuesextend)rR   suffixesr-  rK   rK   rL   r+    s   z$ConverterTarget._all_source_suffixesr   c                 C  sb   z| j jjtdtj|d j}W n ty   g  Y S w t|t	s#J |D ]	}t|t
s.J q%|S )Nr  )machiner   )r   coredataoptionsr   r   BUILDchoicesKeyErrorrl   r  rC   )rR   r   r   r`   rK   rK   rL   r    s    zConverterTarget._all_lang_stdsc                   r   t | j}g  g }|D ]$} |g7  t|tr*| tv r*| fdd|jD 7 }q||g7 }qt t|| _d S )Nc                      g | ]}| vr|qS rK   rK   rZ   	processedrK   rL   r]   #  r   zEConverterTarget.process_inter_target_dependencies.<locals>.<listcomp>r  r   rl   rm   rx   transfer_dependencies_fromr   rR   Z
to_processZnew_depsr`   rK   r>  rL   !process_inter_target_dependencies     

z1ConverterTarget.process_inter_target_dependenciesc                 C  s   |   tv rg | _d S d S rP   )rx   rA  r   re   rK   rK   rL   cleanup_dependencies(  s   
z$ConverterTarget.cleanup_dependenciesc                 C  s   t | j S rP   )target_type_mapr   r   r  re   rK   rK   rL   rx   -  s   zConverterTarget.meson_funcc              
   C  s  t dt | jd| j d t dt t| j t dt | j t dt | j t dt | j	r:dnd	 t d
t | j
rK| j
 nd t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt t| j t dt | jrdnd	 t dt t| j t dt t| j t d | j D ]\}}t d|dt t| qd S )NTarget()z  -- artifacts:      z  -- full_name:      z  -- type:           z  -- install:        truefalsez  -- install_dir:    ry   z  -- link_libraries: z  -- link_with:      z  -- object_libs:    z  -- link_flags:     z  -- languages:      z  -- includes:       z  -- sys_includes:   z  -- sources:        z  -- generated:      z  -- generated_ctgt: z  -- pie:            z  -- override_opts:  z  -- depends:        z  -- options:z    -=)r   logr   rB   rk   rC   ro   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rR   r   r   rK   rK   rL   rM  0  s.    "
zConverterTarget.log)ru   r	   r   r   r   r   rD   rW   rD   rC   )r   rN   r   r   r   r   r   r   r   r   rD   rW   )r  r   r!  r   rD   rW   )rU   r/  rD   rW   )rD   r2  )r   rC   rD   r2  rD   rW   )r   r   r   rS   r   r   r   r  r  r.  r,  r   r+  r  rC  rE  rx   rM  rK   rK   rK   rL   rm      s     

T

 
,



rm   c                   @  s4   e Zd ZdddZdd
dZdddZdddZdS )r  r  'ConverterCustomTarget'indexintrD   rW   c                 C  s   || _ || _d S rP   r  rQ  )rR   r  rQ  rK   rK   rL   rS   I  rT   zCustomTargetReference.__init__rC   c                 C  s8   |   rd| jj| jj| jj| j S d| jj dS )Nz<{}: {} [{}]>r   z: INVALID REFERENCE>)r  r  r   r   r  rB   outputsrQ  re   rK   rK   rL   r   M  s    zCustomTargetReference.__repr__r   c                 C  s   | j d uo	| jdkS Nr   rS  re   rK   rK   rL   r  S     zCustomTargetReference.validc                 C  s   | j j| j S rP   )r  rT  rQ  re   rK   rK   rL   filenameV  r   zCustomTargetReference.filenameN)r  rP  rQ  rR  rD   rW   rN  )rD   r   )r   r   r   rS   r   r  rW  rK   rK   rK   rL   r  H  s
    


r  c                   @  sP   e Zd ZdZdZd"d
dZd#ddZd$ddZd%ddZd&ddZ	d%dd Z
d!S )'rp   r   ru   r4   r   r   r   r   rD   rW   c                 C  s   |j d usJ |jd usJ |j| _| js#dtj | _t jd7  _t| j| _t|j| _	dd | j	D | _i | _
g | _|j| _|j| _g | _g | _|j | _ |j| _|| _|| _|| _t| j| _d S )NZcustom_tgt_r   c                 S  r'  rK   rJ   rZ   rK   rK   rL   r]   f  r(  z2ConverterCustomTarget.__init__.<locals>.<listcomp>)current_bin_dircurrent_src_dirrB   rp   tgt_counterrC   rk   r  rT  rq   conflict_mapcommandworking_dirr   r   inputsr   r   _raw_targetrM   )rR   ru   r   r   rK   rK   rL   rS   ]  s*   zConverterCustomTarget.__init__rC   c                 C  s    d| j j d| j d| j dS )Nr   r   r   r   )r   r   rB   rT  re   rK   rK   rL   r   v  s    zConverterCustomTarget.__repr__r   rN   r   r   all_outputsrY   r   r   c              	     s  j d u r	j_ j  sjj  _ dfdd  fddjD _g }jD ])}||v rKt|}dtj d	| }t jd
7  _|j|< ||g7 }||g7 }q,|_g }j	j
D ]{}	t|	tshJ |	d dksrJ dg }
|	D ]^}|s{qv||}|rjjd urjjj  rtjjtsJ |
jj 7 }
|
|g7 }
qv||jv r|j| }|jdkrd|jv r|
|jd 7 }
qvtd| d|  |
|g7 }
qv||
g7 }q_|_
jsjd g_jD ]}|sqt|}||}||}||}d }z||}W n t y   d }Y nw | s7j!| " r7 j#j!| |$ g7  _#q| rQ|% rQ|d urQ j#|$ g7  _#q|r] j&|g7  _&q|ri j&|g7  _&q|r|'|}|d usxJ  j#|g7  _#qd S )Nr\   r   rD   c                   s   |   r| S  j|  S rP   )r   rX  r   re   rK   rL   ensure_absolute  s   
z:ConverterCustomTarget.postprocess.<locals>.ensure_absolutec                      g | ]} |qS rK   rK   rZ   )ra  rK   rL   r]     r^   z5ConverterCustomTarget.postprocess.<locals>.<listcomp>r   rE   r   r   ry   z)An empty string is not a valid executabler=   ZIMPORTED_LOCATIONz#CMake: Found invalid CMake target "z" --> ignoring 
z.h)r\   r   rD   r   )(r]  rX  r   rq   rT  rC   rp   out_counterr[  r_  r\  rl   r  r;   r   exe_wrapper
propertiesr   get_cmake_use_exe_wrapperr"   get_commandr  r   r   debugrB   r   r   r   ru   r   r   r   rY  is_filer^  r   r   r   r  )rR   r   r   r`  r   Ztemp_outputsr`   oldcommandsZcurr_cmdcmdr   ru   Z	trace_tgtrawZartrU   genZrel_to_rootctgt_refrK   )ra  rR   rL   r  y  s   












"
z!ConverterCustomTarget.postprocessc                   r<  )Nc                   r=  rK   rK   rZ   r>  rK   rL   r]     r   zKConverterCustomTarget.process_inter_target_dependencies.<locals>.<listcomp>r@  rB  rK   r>  rL   rC    rD  z7ConverterCustomTarget.process_inter_target_dependenciesr   !T.Optional[CustomTargetReference]c                 C  sH   |j }z|| jv r| j| }| j|}t| |W S  ty#   Y d S w rP   )rB   r[  rT  rQ  r  r   )rR   r   rB   idxrK   rK   rL   r    s   

zConverterCustomTarget.get_refc                 C  s   t dt | jd| j d t dt t| j t dt t| j t dt t| j t dt t| j	 t dt t| j
 t d	t t| j t d
t t| j d S )NzCustom TargetrH  rI  z  -- command:      z  -- outputs:      z  -- conflict_map: z  -- working_dir:  z  -- depends_raw:  z  -- inputs:       z  -- depends:      )r   rM  r   rB   rk   rC   r\  rT  r[  r]  r   r^  r   re   rK   rK   rL   rM    s    zConverterCustomTarget.logN)ru   r4   r   r   r   r   rD   rW   rN  )
r   rN   r   r   r`  rY   r   r   rD   rW   rO  )r   r   rD   rp  )r   r   r   rZ  rc  rS   r   r  rC  r  rM  rK   rK   rK   rL   rp   Y  s    



e

rp   c                   @  sR   e Zd Zd"dd	Zd#ddZd$ddZd%ddZd&ddZd'ddZd(dd Z	d!S ))CMakeInterpreterr   r   r   r   r   backend	'Backend'c                 C  s   || _ t| || _|d | _t| | j | _|| _|| _t	j
| _|j| _t | _t| j| _g | _d | _d | _d| _g | _g | _g | _|  t| j| _i | _i | _d| _| jdrw| jjj | j ! D ]}|" dkrvd| _ d S qhd S d S )NZ__CMake_buildry   FvslinkT)#r   r   r   r   r  r   rO   r   r   r   HOSTr   rB   backend_namer   linkersr   fileapibs_filescodemodel_configscmake_stderrproject_namer   r  custom_targetsrN   r   generated_targetsinternal_name_map_object_lib_workaroundrI   r7  	compilersr3  get_linker_id)rR   r   r   r   rs  comprK   rK   rL   rS      s<   
zCMakeInterpreter.__init__extra_cmake_optionsrY   rD   r   c              
   C  s  t | jdtj}| stdt| | j| jdd| _	t
d| j}t|| j| jtj| j|}| }t|}g }|t| j7 }|d| j g7 }||7 }| j	 }dd tD }| j  t  t  td	td
dt|  ttdd| ttd| j  ttd| j  ttd|  ttd|  ttdd| ttdd dt t  | jj!ddd t"# }	d|	d< || | |$  | j g }
|j%d| j	& d |j'|
| j|	dd\}}| _(W d    n	1 sw   Y  t  |dkr)t)dnt*d}td| |dkrad| j	j+d i| j	_+| j	,| j( | j	j-rXd | j	j-d!  nd"}td#| |S )$Nz>=3.14zUnable to find CMakeT)
permissivezcmake/data/preload.cmakez-DCMAKE_INSTALL_PREFIX=c                 S  s   g | ]}d | dqS )z-DCMAKE_POLICY_WARNING_z=OFFrK   rZ   rK   rK   rL   r]   9  r   z.CMakeInterpreter.configure.<locals>.<listcomp>z$Configuring the build directory withCMakeversionzRunning CMake with:r   z  - build directory:         z  - source directory:        z  - toolchain file:          z  - preload file:            z  - trace args:              z  - disabled policy warnings:z[{}]z, r   CLC_ALL)print_cmoutalways_capture_stderr)r   disable_cacher   Z	SUCCEEDEDFAILEDzCMake configuration:messager   ry   z(Failed to configure the CMake subproject).r   r   r   r9  foundr   r   r  rO   r   r   Zwrite_to_privater   r   r   Z
SUBPROJECTwriter   r   r   
trace_argsdisable_policy_warningsrz  Zsetup_requestr   rM  nestedr   cyanr  r   r   r  r   r   copyget_cmake_argsset_exec_modeZrequires_stderrcallr}  greenred	functionsparseerrors)rR   r  Z	cmake_exeZpreload_file	toolchainZtoolchain_file
cmake_argsr  Z
cmcmp_argsos_env
final_argsrcrE   herrorrK   rK   rL   	configure%  sT   


  
 zCMakeInterpreter.configurerW   c                   sz     |  j   j }dd |D  _ fdd jD  _ fdd jD  _tt j _ j  _d S )Nc                 S  s   g | ]}|j s|js|jqS rK   )is_cmakeis_tempfilerZ   rK   rK   rL   r]   f  r   z/CMakeInterpreter.initialise.<locals>.<listcomp>c                   s    g | ]}t |t j qS rK   )r   r   r   r   rZ   re   rK   rL   r]   g  s     c                   s(   g | ]}t |t j d ds|qS )Tr   )r   r   r   r   rZ   re   rK   rL   r]   h  s   ( )	r  rz  Z
load_replyZget_cmake_sourcesr{  r  r   Zget_cmake_configurationsr|  )rR   r  cmake_filesrK   re   rL   
initialise]  s   


zCMakeInterpreter.initialisec                   s   j d u r	tdd _g  _g  _g  _ j j g } j D ]3}|j	D ]-} js/|j
 _|jD ] }|jtvrR|j
|vrR||j
g7 }  jt| j jg7  _q2q&q!dd  jD } jj D ]*}|jdksr|j
|v sr|jrsqct|j
d j jd}  jt| j jg7  _qc jjD ]}  jt| j jg7  _qg  j jD ]}	t|	ttfsJ  j|	 qg }
g } jD ]}| j j| j qĈ jD ])}| j j j j j |jdkr|
|g7 }
  j fd	d|jD 7  _qՈ jD ]
}||
 j q jD ]}|  q jD ]}|  q jD ]}|  q&t !d
t " jdt "t#t$ jt$ j d d S )Nz$CMakeInterpreter was not initializedry   c                 S  r'  rK   rJ   rZ   rK   rK   rL   r]     r(  z,CMakeInterpreter.analyse.<locals>.<listcomp>Z	INTERFACEr?   )rB   r   sourceDirectorybuildDirectoryr>   c                   s   g | ]	}| j vr|qS rK   )r   rZ   re   rK   rL   r]     r   zCMake projecthaszbuild targets.)%r|  r   r~  r   r  r  r   r  r}  projectsrB   r   skip_targetsrm   r   r   r3  Zimportedr	   r   rO   rp   rl   r   rr   r  r   r   r.  r  rC  rE  r   rM  r   rC   r}   )rR   Zadded_target_namesZi_0Zj_0Zk_0Zapi_target_name_listZi_1dummyZi_2Zi_3r   Zcustom_target_outputsr  rU   rK   re   rL   analysen  sj   







 



8zCMakeInterpreter.analyser8  r3   r&   c                   s  j stddKdLfd
ddMfdddNfdddOfdddPfdd
dQ 
fdd	dR	fd!d"dS	fd%d& dTdU	fd-d.dTdV	fd1d2dWfd5d6t  jd7j gj g7  _g i i dXfd:d;dYfd>d?dZfdCdDd[ fdFdGd\f
dIdJjD ]}|jvrȈ| qjD ]}|jvr׈| q̈__	S )]Nz!CMakeInterpreter was not analysedstringry   tidrC   r   
TYPE_mixedrD   r$   c                   s   t |  j dddd |S rU  )r$   r   r   )r  r   re   rK   rL   token     z3CMakeInterpreter.pretend_to_be_meson.<locals>.tokenr1   c                   s   t  d| S )Nry   )r1   r   r  rK   rL   symbol  r   z4CMakeInterpreter.pretend_to_be_meson.<locals>.symbolvaluer,   c                   s   t  | dddS )Nr  F)escape)r,   r  r  rK   rL   r    rv   z4CMakeInterpreter.pretend_to_be_meson.<locals>.stringr-   c                   s   t  | dS Nr  )r-   r  r  rK   rL   id_node  r   z5CMakeInterpreter.pretend_to_be_meson.<locals>.id_noderR  r0   c                   s   t  t| dS r  )r0   rC   r  r  rK   rL   number  rv   z4CMakeInterpreter.pretend_to_be_meson.<locals>.numberTYPE_mixed_listr%   c                   s   t | tr	| S t | tr|  S t | tr t| dS t | tr)| S t | tr2 | S t | tr9| S t	d
t| jt| )Nr  zinvalid type of value: {} ({}))rl   rC   r   r   r   r+   rR  r  r%   RuntimeErrorr  r   r   r  )arrayr  r  r  rK   rL   nodeify  s   





z5CMakeInterpreter.pretend_to_be_meson.<locals>.nodeifynoderQ  r.   c                   s   t | d |dS )N[])r.   )r  rQ  )r  r  rK   rL   indexed  r  z5CMakeInterpreter.pretend_to_be_meson.<locals>.indexedelementsr(   c                   sJ   t  }t| ts|g} | j fdd| D 7  _td|dS )Nc                      g | ]
}|d ur |qS rP   rK   rZ   r  rK   rL   r]     r  zGCMakeInterpreter.pretend_to_be_meson.<locals>.array.<locals>.<listcomp>r  r  )r)   rl   r  	argumentsr(   )r  r   )r  r  r  rK   rL   r    s
   

z3CMakeInterpreter.pretend_to_be_meson.<locals>.arrayrB   r   T.Optional[TYPE_mixed_list]kwargsT.Optional[TYPE_mixed_kwargs]r'   c                   s   |d u rg n|}|d u ri n|}t  }t|ts)t|tttttfs&J |g}fdd|D |_ fdd|	 D |_
t | d|d}|S )Nc                   r  rP   rK   rZ   r  rK   rL   r]     r  zJCMakeInterpreter.pretend_to_be_meson.<locals>.function.<locals>.<listcomp>c                   &   i | ]\}}|d ur ||qS rP   rK   r[   kvr  r  rK   rL   r     r   zJCMakeInterpreter.pretend_to_be_meson.<locals>.function.<locals>.<dictcomp>rH  rI  )r)   rl   r  rC   rR  r   r   r%   r  r   r  r'   )rB   r   r  args_nZfunc_nr  r  r  r  rK   rL   function  s   

z6CMakeInterpreter.pretend_to_be_meson.<locals>.functionobjr/   c                   s   |d u rg n|}|d u ri n|}t  }t|ts)t|tttttfs&J |g}fdd|D |_ fdd|	 D |_
t| d |d|dS )Nc                   r  rP   rK   rZ   r  rK   rL   r]     r  zHCMakeInterpreter.pretend_to_be_meson.<locals>.method.<locals>.<listcomp>c                   r  rP   rK   r  r  rK   rL   r     r   zHCMakeInterpreter.pretend_to_be_meson.<locals>.method.<locals>.<dictcomp>rz   rH  rI  )r)   rl   r  rC   rR  r   r   r%   r  r   r  r/   )r  rB   r   r  r  r  rK   rL   method  s   

"z4CMakeInterpreter.pretend_to_be_meson.<locals>.methodvar_namer*   c                   s   t  | d|S )NrL  )r*   )r  r  )r  r  rK   rL   assign  rV  z4CMakeInterpreter.pretend_to_be_meson.<locals>.assignprojectrU   FT.Union[ConverterTarget, ConverterCustomTarget, CustomTargetReference]c                   s\   d }t | ttfr| j}n	t | tr| jj}|d ur|v s J | d }|r, |S d S )NrU   )rl   rm   rp   rB   r  r  )rU   r   Zres_var)r  r?  rK   rL   extract_tgt  s   
z9CMakeInterpreter.pretend_to_be_meson.<locals>.extract_tgt/T.Union[ConverterTarget, ConverterCustomTarget]rW   c                   s"   | j  v r	td | j  d S )Nz+Cycle in CMake inputs/dependencies detected)rB   r   r  )rU   )
processingrK   rL   detect_cycle  s   
z:CMakeInterpreter.pretend_to_be_meson.<locals>.detect_cycler  r  T.Union[IdNode, IndexNode]c                   s(    | }t | jjdkr|S || jS )Nr   )r}   r  rT  rQ  )r  tgt_var)r  r  rK   rL   resolve_ctgt_ref  s   z>CMakeInterpreter.pretend_to_be_meson.<locals>.resolve_ctgt_refrm   c              	     s   |  g }g }g }g }g }g }g }| j D ]}t|tsJ |jvr'
| ||g7 }q| jD ]}t|ts;J |jvrD
| ||g7 }q2| jD ]}t|tsWqO|jvr`	| ||g7 }qO|| j7 }|| j7 }| j	D ]%}	|	j
}
|
jvr	|
 ||	g7 }||	 g7 }|
|vr||
g7 }qu|D ]"}
|
jD ]}t|r||v rq||
t|g7 }||g7 }qq|  }|std| j d| j d}| j d}| j d}| j d}| j d}| j}| j| j}|| j| j| j |||| j| jfdd	|D d
}|r&| jr&| j|d< | j D ]\}}| j|||| d< q+|dkrI| j|d< n
|dkrS| j|d< | j| j || j |d}|rj||7 }|d| j!}|d| j"ddi}| ||g}|||g}|dkr|d= |d|d}||g7 }d }d }nJ|d|}||||g||}|||g7 }|dv r݈|d|d}||g7 }n|dkr|d= |d|d}||g7 }nd } j#|7  _#|||||d| j< | j| j< d S )NzUnknown target type ""Z_incZ_dir_sys_srcZ_depc                   s   g | ]} |d qS )extract_all_objectsrK   rZ   )r  rK   rL   r]   o  rf   zPCMakeInterpreter.pretend_to_be_meson.<locals>.process_target.<locals>.<listcomp>)build_by_default	link_argsr   r  r   r   objectsr   _argsr;   r   r8   pic)r  r   compile_argsr  r  	is_systemTr<   r   declare_dependency)r  r   >   r:   r8   r9   ZincsrcdeprU   func)$r   rl   rm   rB   r   r   rp   r   r   r   r  rW  rT  r!   r  r   rx   r   r   get_installrk   r   get_link_argsr   r   get_override_optionsr   r   r   r   get_compile_argsr   r   r   r   lines)rU   r   Z
objec_libsr   r   Zgenerated_filenamesr  dependenciesr`   ro  r  r   Ztgt_funcZinc_varZdir_varZsys_varZsrc_vardep_varr  Zinstall_tgt
tgt_kwargsr   r   Z
dep_kwargsZdir_nodeZsys_nodeZinc_node	node_listZdep_nodeZsrc_nodeZtgt_node)r  r  r  r  r  r  r  name_mapr8  process_custom_targetprocess_targetr?  r  root_cbrK   rL   r  !  s   






















z<CMakeInterpreter.pretend_to_be_meson.<locals>.process_targetrp   c                   s  |  | j }d	fdd g }|t 7 }|ddg7 }|d	d
g7 }| jr6|dgdd | jD  7 }|d| j g7 }| jD ]}| fdd|D dg 7 }qB fdd| jD | j| fdd| j	D d}
 j
|d| j g|g7  _
d d d |dd| j < | j | j< d S )Nr\   KT.Union[str, ConverterTarget, ConverterCustomTarget, CustomTargetReference]rD   T.Union[str, IdNode, IndexNode]c                   st   t | tr| jvr|   | S t | tr$| jvr |   | S t | tr8| jjvr4| j | S | S rP   )rl   rm   rB   rp   r  r  r   )r  r  r  r?  r  rK   rL   resolve_source  s   





z[CMakeInterpreter.pretend_to_be_meson.<locals>.process_custom_target.<locals>.resolve_sourcez
--internalZcmake_run_ctgtz-oz@OUTPUT@z-Oc                 S  s   g | ]}|  qS rK   )r   rZ   rK   rK   rL   r]     r^   zWCMakeInterpreter.pretend_to_be_meson.<locals>.process_custom_target.<locals>.<listcomp>z-dc                   rb  rK   rK   rZ   r  rK   rL   r]     r^   z;;;c                   rb  rK   rK   rZ   r  rK   rL   r]     r^   c                   rb  rK   rK   rZ   r  rK   rL   r]     r^   )inputoutputr\  r   custom_targetr  )r\   r  rD   r  )rB   r   get_meson_commandrq   r]  r   r\  r^  rT  r   r  rk   )rU   r  r\  rl  r  )
r  r  r  r  r   r  r  r?  r  r  r  rL   r    s(   
"zCCMakeInterpreter.pretend_to_be_meson.<locals>.process_custom_target)r  ry   )r  rC   r   r  rD   r$   )r   rC   rD   r1   )r  rC   rD   r,   )r  rC   rD   r-   )r  rR  rD   r0   )r  r  rD   r%   )r  r%   rQ  rR  rD   r.   )r  r  rD   r(   )NN)rB   rC   r   r  r  r  rD   r'   )
r  r%   rB   rC   r   r  r  r  rD   r/   )r  rC   r  r%   rD   r*   )rU   r  rD   r-   )rU   r  rD   rW   )r  r  rD   r  )rU   rm   rD   rW   )rU   rp   rD   rW   )
r~  r   r&   r  r   r  rB   r  r  r  )rR   r8  r  rU   rK   )r  r  r  r  r  r  r  r  r   r  r  r8  r  r  r?  r  r  r  rR   r  r  r  rL   pretend_to_be_meson  sF   
 
(  	
2


z$CMakeInterpreter.pretend_to_be_mesonru   rC   T.Optional[T.Dict[str, str]]c                 C  sL   t |}|| jv r| j| S || jv r$| j| }|| jv sJ | j| S d S rP   )rM   r  r  )rR   ru   Zprx_tgtrK   rK   rL   target_info  s   




zCMakeInterpreter.target_infoc                 C  s   t | j S rP   )r  r  rX   re   rK   rK   rL   target_list  r   zCMakeInterpreter.target_listN)r   r   r   r   r   r   rs  rt  )r  rY   rD   r   )r  rY   rD   rW   rO  )r8  r3   rD   r&   )ru   rC   rD   r  )rD   rY   )
r   r   r   rS   r  r  r  r  r  r  rK   rK   rK   rL   rr    s    

%
8

L  
.rr  )rB   rC   rD   rC   )c
__future__r   	functoolsr   osr   pathlibr   r   typingTcommonr   r	   r
   r   r   rz  r   executorr   r  r   r   traceparserr   tracetargetsr   ry   r   r   r   r   r   r   r   Z	mesondatar   Zcompilers.compilersr   r   r   r   r    r!   programsr"   r7  r#   mparserr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   TYPE_CHECKINGr2   r3   r4   Z_typingr5   Zbackend.backendsr6   environmentr7   UnionrC   rR  r   r  Sequencer  DictZTYPE_mixed_kwargsr  rF  r  r   r   r  r  rA  r   rG   rM   rN   rm   r  rp   rr  rK   rK   rK   rL   <module>   sh    @	

Q  w '