o
    nc2                     @  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)Z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apiZ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   whome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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-   r.   objectsr*   )r   is_dirr   recompileiterdirmatchname_reply_file_content_strip_data_resolve_referencesr   resolver1   r2   r3   r   Z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_entryrH   r   T.Tuple[Path, Path]c                   s`   t | dd}t | dd}| r|n| }| r |n | }| }| }||fS )NrJ   .rK   )r	   getis_absoluter?   )rL   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)rO   lenr	   )rU   rV   gensrcidxZsrc_list_rawrD   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 )+NrI   installprefixrY   c                   s   g | ]} |d   qS )rY   r   .0xra   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 )rY    )r	   rO   rb   r   r   r   rf      s    	artifactsr;   rm   Z
nameOnDisklanguageCXX type
EXECUTABLE)rn   sourceDirectorybuildDirectoryr;   ZfullNameZhasInstallRuleZinstallPathsZlinkerLanguageZlinkLibrariesZ	linkFlagsrr   
fileGroupsZcompileGroupsZcompileCommandFragmentsc                 S  s   g | ]}| d dqS )Zdefinerm   )rO   rb   r   r   r   rf      rg   definesCincludes)rw   ZcompileFlagsro   rZ   rX   ZincludePathFrZ   rX   rv   T)rZ   rX   )rO   r	   listsetformatjoinrB   	enumerate)rV   rQ   rR   Zinstall_pathsZ
link_flagsZ	link_libsrD   Ztgt_dataZprocessed_src_idxZcgri   Zcg_dataZ
normal_srcZgenerated_srcZsrc_idxr^   r]   )cnfrT   r_   re   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 )	NZdirectoriesZdirectoryIndexesr   r;   rm   )r;   rt   ru   targetsZtargetIndexesr   )
IndexErrorKeyErrorrO   )r   Z	p_src_dirZ	p_bld_dirZpro_datarefrV   )r   r   rT   r   rS   r   r   parse_project   s*    
z4CMakeFileAPI._parse_codemodel.<locals>.parse_projectr;   rm   )r;   projectsr   )rL   rH   r   rM   )rU   rH   rV   rH   r   rW   )rV   rH   r   rH   )r   rH   r   rH   )rO   r   r   )r   rG   r   Zcnf_datar   r   )r   r   rT   r_   r   rS   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inputsrI   rJ   rY   ZisCMakeFrZ   )r	   rP   r   r   rO   )r   rG   rQ   rD   rY   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   )rA   rz   r~   r=   rB   items
STRIP_KEYS)r   rG   r^   rD   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)rA   rz   r~   r>   rB   updater<   r   )r   rG   r^   rD   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-   r.   )
r   existsr   r2   loads	read_textrA   rB   keysstr)r   r   	real_pathrG   rD   r   r   r   r<   8  s   
z CMakeFileAPI._reply_file_contentN)r   r	   )r   r   )r   r#   )r   r%   )rG   rH   r   r%   )rG   r   r   r   )r   r	   r   rH   )__name__
__module____qualname__r   r!   r$   r4   rF   r   r   r=   r>   r<   r   r   r   r   r      s    





! 
6

r   )
__future__r   commonr   r   r   typingTrm   r   pathlibr	   r2   r7   r   r   r   r   r   r   <module>   s   