o
    uJAf2                     @  sj   d dl mZ ddlmZmZmZ d dlZddlm	Z	 d dl
mZ d dlZd dlZg dZG d	d
 d
ZdS )    )annotations   )CMakeExceptionCMakeBuildFileCMakeConfigurationN   )mlog)Path)cmakereplyZ	backtraceZbacktraceGraphversionc                   @  sp   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%ddZ
d%ddZd&ddZdS )'CMakeFileAPI	build_dirr	   c                 C  sV   || _ | j d d d | _| jd d | _| jd | _g | _g | _| j| jd| _d S )Nz.cmakeZapiv1queryzclient-mesonr   )	codemodel
cmakeFiles)	r   Zapi_base_dirrequest_dir	reply_dircmake_sourcescmake_configurations_parse_codemodel_parse_cmakeFileskind_resolver_map)selfr    r   =/usr/lib/python3.10/site-packages/mesonbuild/cmake/fileapi.py__init__   s   zCMakeFileAPI.__init__returnT.List[CMakeBuildFile]c                 C     | j S N)r   r   r   r   r   get_cmake_sources&      zCMakeFileAPI.get_cmake_sourcesT.List[CMakeConfiguration]c                 C  r    r!   )r   r"   r   r   r   get_cmake_configurations)   r$   z%CMakeFileAPI.get_cmake_configurationsNonec                 C  sZ   | j jddd ddddddd	d
dddgi}| j d }|jtj|dddd d S )NT)parentsexist_okZrequestsr   r   r   )majorminor)kindr   r   r   z
query.jsonindentutf-8encoding)r   mkdir
write_textjsondumps)r   r   Z
query_filer   r   r   setup_request,   s   
zCMakeFileAPI.setup_requestc                 C  s  | j  s	tdd }td}| j  D ]}||jr!|} nq|s(td| |}| 	|}| 
|}| 	|}| jd d }| }|jtj|dddd	 t|  |d
 D ]!}t|tsgJ d|v smJ |d | jv svJ | j|d  | q^d S )Nz#No response from the CMake file APIz^index-.*\.json$z'Failed to find the CMake file API indexz..zfileAPI.jsonr   r-   r/   r0   objectsr,   )r   is_dirr   recompileiterdirmatchname_reply_file_content_strip_data_resolve_referencesr   resolver3   r4   r5   r   cmd_ci_includeas_posix
isinstancedictr   )r   rootZ	reg_indexiindexZ
debug_jsonr   r   r   
load_reply9   s2   





zCMakeFileAPI.load_replydataT.Dict[str, T.Any]c                   s   d|v sJ d|v sJ |d d |d d  d fd	d
ddddfddd fdd}| dg D ]) ddg d} dg D ]}|d  ||g7  < qP|  jt|g7  _q?d S )NZconfigurationspathssourcebuild	dir_entryrK   r   T.Tuple[Path, Path]c                   s`   t | dd}t | dd}| r|n| }| r |n | }| }| }||fS )NrM   .rN   )r	   getis_absoluterA   )rO   src_dirbld_dir)r   
source_dirr   r   helper_parse_dirg   s   z7CMakeFileAPI._parse_codemodel.<locals>.helper_parse_dir
comp_grouptgt0T.Tuple[T.List[Path], T.List[Path], T.List[int]]c                 S  s   g }g }g }| dg }|  dg D ]3}|t|ks d|| vr!q||  ddr5|t|| d g7 }n|t|| d g7 }||g7 }q|||fS )NsourcesZsourceIndexespathisGeneratedF)rR   lenr	   )rX   rY   gensrcidxZsrc_list_rawrG   r   r   r   parse_sourcesq   s   
z4CMakeFileAPI._parse_codemodel.<locals>.parse_sourcesc                   s   di \}}g }d| v r-t| d d d   fdd| d d D }tt|}g }g }|  di  d	g D ]?}|d
 dkrK||d g7 }q;|d
 dkrY||d g7 }q;|d
 dkrj|d|d g7 }q;|d
 dkrz|d|d g7 }q;|  di  d	g D ]}|d
 dkr||d g7 }qdd |  dg D |||  dd|  ddd| v ||  di  ddd|d||  ddg d}g }|  dg D ]m}	g }
|	 dg D ]	}|
|d g7 }
qd d |	 d!g D d|
|	 dd"d g |	 d#g d$}|	| \}}}|r"t|}d%|d&< ||d'< |d(  |g7  < |r:t|}d)|d&< ||d'< |d(  |g7  < ||7 }qg }g }t|  d'g D ]#\}}||v rVqK| d&d%rf||d g7 }qK||d g7 }qK|r~|d(  d%|d*g7  < |r|d(  d)|d*g7  < |S )+NrL   installprefixr\   c                   s   g | ]} |d   qS )r\   r   .0xrd   r   r   
<listcomp>       zGCMakeFileAPI._parse_codemodel.<locals>.parse_target.<locals>.<listcomp>ZdestinationslinkZcommandFragmentsZroleflagsfragment	librariesZlibraryPathz-L{}ZframeworkPathz-F{}archivec                 S  s   g | ]
}t |d dqS )r\    )r	   rR   re   r   r   r   ri      s    	artifactsr=   rp   Z
nameOnDisklanguageCXX type
EXECUTABLE)rq   sourceDirectorybuildDirectoryr=   fullNamehasInstallRuleinstallPathslinkerLanguagelinkLibraries	linkFlagsru   
fileGroupsZcompileGroupsZcompileCommandFragmentsc                 S  s   g | ]}| d dqS )definerp   )rR   re   r   r   r   ri      rj   definesCincludes)r   compileFlagsrr   r]   r[   includePathFr]   r[   r   T)r]   r[   )rR   r	   listsetformatjoinrE   	enumerate)rY   rT   rU   install_paths
link_flagsZ	link_libsrG   Ztgt_dataZprocessed_src_idxZcgrl   Zcg_dataZ
normal_srcZgenerated_srcZsrc_idxra   r`   )cnfrW   rb   rh   r   parse_target   s   




	

z3CMakeFileAPI._parse_codemodel.<locals>.parse_targetproc              
     s   } }zd | d d  \}}W n t tfy   Y nw | dd||g d}| dg D ]#}i }zd | }W n t tfyH   Y nw |d  |g7  < q1|S )	NdirectoriesZdirectoryIndexesr   r=   rp   )r=   rw   rx   targetsZtargetIndexesr   )
IndexErrorKeyErrorrR   )r   Z	p_src_dirZ	p_bld_dirZpro_datarefrY   )r   r   rW   r   rV   r   r   parse_project   s*    
z4CMakeFileAPI._parse_codemodel.<locals>.parse_projectr=   rp   )r=   projectsr   )rO   rK   r   rP   )rX   rK   rY   rK   r   rZ   )rY   rK   r   rK   )r   rK   r   rK   )rR   r   r   )r   rJ   r   Zcnf_datar   r   )r   r   rW   rb   r   rV   r   r   Z   s    

g
zCMakeFileAPI._parse_codemodelc              
   C  s   d|v sJ d|v sJ t |d d }|d D ]&}t |d }| r&|n|| }|  jt||dd|ddg7  _qd S )NinputsrL   rM   r\   ZisCMakeFr]   )r	   rS   r   r   rR   )r   rJ   rT   rG   r\   r   r   r   r     s   *zCMakeFileAPI._parse_cmakeFilesT.Anyc                 C  sl   t |trt|D ]\}}| |||< q	|S t |tr4i }| D ]\}}|tvr1| |||< q"|}|S r!   )rD   r   r   r?   rE   items
STRIP_KEYS)r   rJ   ra   rG   newkeyvalr   r   r   r?     s   
	
zCMakeFileAPI._strip_datac                 C  sx   t |trt|D ]\}}| |||< q	|S t |tr:d|v r*|| |d  | D ]\}}| |||< q.|S )NZjsonFile)rD   r   r   r@   rE   updater>   r   )r   rJ   ra   rG   r   r   r   r   r   r@   (  s   

z CMakeFileAPI._resolve_referencesfilenamec                 C  sb   | j | }| std| dt|jdd}t|ts!J | D ]	}t|t	s.J q%|S )NzFile "z" does not existr/   r0   )
r   existsr   r4   loads	read_textrD   rE   keysstr)r   r   Z	real_pathrJ   rG   r   r   r   r>   8  s   
z CMakeFileAPI._reply_file_contentN)r   r	   )r   r   )r   r%   )r   r'   )rJ   rK   r   r'   )rJ   r   r   r   )r   r	   r   rK   )__name__
__module____qualname__r   r#   r&   r6   rI   r   r   r?   r@   r>   r   r   r   r   r      s    





! 
6

r   )
__future__r   commonr   r   r   typingTrp   r   pathlibr	   r4   r9   r   r   r   r   r   r   <module>   s   