o
    Woduh                     @  sF  d dl mZ 	 d dlmZ d dlZd dlZd dlZd dlmZm	Z	 d dl
Z
d dlZddlmZmZ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mZ dd
lmZmZmZm Z  ej!rnd dl"Z"ddl#m$Z$ ddlm%Z% dddZ&dddZ'dddZ(G dd dZ)				ddd"d#Z*dd'd(Z+dd,d-Z,dd1d2Z-dd4d5Z.dd8d9Z/dd;d<Z0dd@dAZ1ddCdDZ2dddGdHZ3ddJdKZ4ddNdOZ5ddQdRZ6ddTdUZ7ddYdZZ8dd[d\Z9dd^d_Z:ddadbZ;ddcddZ<ddkdlZ=dddndoZ>dddrdsZ?dddudvZ@ddwdxZAg ZBddzd{ZCdd|d}ZDdd~dZEdddZFddddZGdS )    )annotations)redirect_stdoutN)PathPurePath   )buildmesonlibcoredata)IntrospectionInterpreterBUILD_TARGET_FUNCTIONSAstConditionLevelAstIDGeneratorAstIndentationGeneratorAstJSONPrinter)backends)	OptionKey)FunctionNode	ArrayNodeArgumentNode
StringNode)Interpreter)BaseNodeinfo_dirstrreturnc                 C  s   t j| dS )Nmeson-info.jsonospathjoin)r    r    phome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/mintro.pyget_meson_info_file+   s   r"   c                   C  s   dS )Nz1.0.0r    r    r    r    r!   get_meson_introspection_version.   s   r#   T.List[str]c                   C  s   ddgS )Nz>=1.0z<2.0r    r    r    r    r!   (get_meson_introspection_required_version1      r%   c                   @  s   e Zd Z		ddd
dZdS )IntroCommandNdescr   func/T.Optional[T.Callable[[], T.Union[dict, list]]]no_bdGT.Optional[T.Callable[[IntrospectionInterpreter], T.Union[dict, list]]]r   Nonec                 C  s   |d | _ || _|| _d S )N.)r(   r)   r+   )selfr(   r)   r+   r    r    r!   __init__5   s   

zIntroCommand.__init__)NN)r(   r   r)   r*   r+   r,   r   r-   )__name__
__module____qualname__r0   r    r    r    r!   r'   4   s    r'   r	   T.Optional[cdata.CoreData]	builddataT.Optional[build.Build]backendT.Optional[backends.Backend]	sourcedirT.Optional[str]'T.Mapping[str, IntroCommand]'c                   s:   rr         jnd   tdtdtdfdtdfdddfd	td
fddt	dfdtdfdddfdtdfddt
dfdtdt
dfdtdfdddfdtdfdddfdtdfddtdfdtd fd dtdfd!td"fd#ddfgS )$NastzDump the AST of the meson file)r+   
benchmarkszList all benchmarksc                        t  S N)list_benchmarksr    )benchmarkdatar    r!   <lambda>L       z/get_meson_introspection_types.<locals>.<lambda>)r)   buildoptionszList all build optionsc                     r>   r?   )list_buildoptionsr    r	   r    r!   rB   M   rC   )r)   r+   buildsystem_filesz(List files that make up the build systemc                     s
   t  S r?   )list_buildsystem_filesr    )r5   interpreterr    r!   rB   N      
 dependencieszList external dependenciesc                     r>   r?   )	list_depsr    rF   r    r!   rB   O   rC   Zscan_dependenciesz2Scan for dependencies used in the meson.build file	installedz(List all installed files and directoriesc                     r>   r?   )list_installedr    installdatar    r!   rB   Q   rC   Zinstall_planz;List all installed files and directories with their detailsc                     r>   r?   )list_install_planr    rO   r    r!   rB   R   rC   ZprojectinfozInformation about projectsc                     r>   r?   )list_projinfor    )r5   r    r!   rB   S   rC   targetszList top level targetsc                     s   t  S r?   )list_targetsr    )r7   r5   rP   r    r!   rB   T   s    testszList all unit testsc                     r>   r?   )
list_testsr    testdatar    r!   rB   U   rC   )Zcreate_test_serialisationZget_benchmarksZ	get_testsZcreate_install_datarI   collectionsOrderedDictr'   dump_astlist_buildoptions_from_sourcelist_deps_from_sourcelist_projinfo_from_sourcelist_targets_from_source)r	   r5   r7   r9   r    )r7   rA   r5   r	   rP   rI   rX   r!   get_meson_introspection_types=   s&   r`   parserargparse.ArgumentParserr-   c                 C  s   t  }| D ]\}}d|dd }| j|d|d|jd q| jdttjdd	d
d | jddddddd | jddddddd | jddddddd | jddddd d S )Nz--_-
store_trueF)actiondestdefaulthelpz	--backendr7   Zninjaz8The backend to use for the --buildoptions introspection.)choicesrg   rh   ri   z-az--allallz Print all available information.z-iz--indentindentzEnable pretty printed JSON.z-fz--force-object-output
force_dictz]Always use the new JSON format for multiple entries (even for 0 and 1 introspection commands)builddir?r.   zThe build directory)nargsrh   ri   )r`   itemsreplaceadd_argumentr(   sortedcdataZbackendlist)ra   intro_typeskeyvalflagr    r    r!   add_argumentsX   s"   rz   intrr
   T.Dict[str, T.Any]c                 C  s   t  }| j| |jS r?   )r   r<   acceptresult)r{   printerr    r    r!   r[   h   s   r[   rP   backends.InstallDataT.Dict[str, str]c                 C  s  i }| d ur| j D ]}tj| j|jtj|j|tj| j|j< q	| j	D ]}tj| j|j
||j< q'| jD ]}tj| j|j
tj|j||j< q9| jD ]}tj| j|j
||j< qQ| jD ]}tj| j|j
||j< qc| jD ]}tj|j}tj| j|j
|||< qu|S r?   )rS   r   r   r   prefixoutdirbasenamefname	build_dirdatainstall_pathheadersmaninstall_subdirssymlinksname)rP   restisr   r    r    r!   rN   m   s"   


&


rN   6T.Dict[str, T.Dict[str, T.Dict[str, T.Optional[str]]]]c           
        s   d fdd j D i} j j j jd D ]Q\}}|D ]J}|jp%|}|j}|dkr9tj	
|tj	|j	}||jp>d d}|dkrZ|jpKg g f\}}	t|	|d< t||d	< ||i ||< ||| |j	< qq|S )
NrS   c                   s.   i | ]}t j j|j|j|jpd dqS )NZdestinationtag)r   r   r   r   r   Zout_namer   ).0targetrO   r    r!   
<dictcomp>   s    z%list_install_plan.<locals>.<dictcomp>)r   r   r   r   r   r   r   exclude_dirsexclude_files)rS   r   r   r   r   rq   	data_typeinstall_path_namer   r   r   r   r   excludelistget)
rP   Zplanrw   Z	data_listr   r   r   entryr   r   r    rO   r!   rQ      s6   


rQ   cdata.CoreDatasubdirc                 C  s   |  tddkrdS |S )NZlayoutZflatz	meson-out)Z
get_optionr   )r	   r   r    r    r!   get_target_dir   s   r   kT.List[T.Dict[str, T.Union[bool, str, T.List[T.Union[str, T.Dict[str, T.Union[str, T.List[str], bool]]]]]]]c                   s   g }t | jd fdd}| jD ]L | d }| d }t| j d	 | d
  d  d  d fdd d D  d dg g dd |D g dgdd |D d  d d
g7 }q|S )N	node_listT.List[BaseNode]r   T.List[Path]c                   s   g }| D ]S}g }t |trt|jj}|jtv r|d nt |tr(|jj}nt |t	r0|j}|D ]$}t |t
rJt |jtsAJ |t|jg7 }q2t |trV|t|g7 }q2q fdd|D }dd |D }|S )Nr   c                   s   g | ]
} d   | qS )r   r    r   xr   root_dirr    r!   
<listcomp>       zDlist_targets_from_source.<locals>.nodes_to_paths.<locals>.<listcomp>c                 S  s   g | ]}|  qS r    )resolver   r    r    r!   r          )
isinstancer   r   args	arguments	func_namer   popr   r   r   valuer   r   )r   r   nr   jr   r    r!   nodes_to_paths   s.   







z0list_targets_from_source.<locals>.nodes_to_pathssourcesextra_filesr   r   idtype
defined_inc                   s   g | ]	}t j |qS r    r   r   )r   r    r!   r          z,list_targets_from_source.<locals>.<listcomp>outputsbuild_by_defaultunknownc                 S     g | ]}t |qS r    r   r   r    r    r!   r      r   )languagecompiler
parametersr   Zgenerated_sourcesc                 S  r   r    r   r   r    r    r!   r      r   rM   )
r   r   r   r   filenamer   target_sourcesr   
subprojectrM   )r   r   r   r   )r   source_rootrS   r   r	   )r{   tlistr   r   Zextra_fr    )r   r   r   r!   r_      s2   

r_   build.Buildbackends.BackendT.List[T.Any]c                   s  g }| j   | j  i |jD ]}tj|j}tt	|j
|j|g|< q|jD ].}tj|j}ztj|j |< | tt	|j
|j| W q+ tyY   Y q+w |   D ]s\}}t|tjsntdt| j j|j| || tjtj|jd fdd| D |j |!||fdd|j"D |j#pd d	}	|r|$ rd|	d< fd	d| D }
d
d |
D |	d< nd|	d< ||	 q`|S )NzxThe target object in `builddata.get_targets()` is not of type `build.Target`. Please file a bug with this error message.meson.buildc                   s   g | ]
}t j |qS r    r   r   )r   r   r    r!   r      r   z list_targets.<locals>.<listcomp>c              	     s(   g | ]}t jt j |j|jqS r    )r   r   normpathr   r   r   r   src_dirr    r!   r     s   ( )	r   r   r   r   r   r   r   r   r   TrM   c                   s   g | ]	}  |d gqS r?   )r   r   )install_lookuptabler    r!   r     r   c                 S  s   g | ]	}|D ]}|qqS r    r    )r   Zsublistr   r    r    r!   r     r   Zinstall_filenameF)%environmentget_build_dirget_source_dirrS   r   r   r   r   r   r   r   r   r   r   r   appendr   KeyErrorZget_targetsrq   r   r   TargetRuntimeErrorr   r	   r   Zget_basenameZget_typenamer   r   get_outputsr   Zget_introspection_datar   r   Zshould_install)r5   rP   r7   r   r   r   r   Zidnamer   r   Zifnr    )r   r   r   r   r!   rT      sH   



"
rT   9T.List[T.Dict[str, T.Union[str, bool, int, T.List[str]]]]c                 C  s    dd | j d D }t| j|S )Nc                 S  s   g | ]}|d  qS )r   r    )r   r   r    r    r!   r     r   z1list_buildoptions_from_source.<locals>.<listcomp>subprojects)project_datarE   r	   )r{   r   r    r    r!   r\     s   r\   r   T.Optional[T.List[str]]c                   s@  g |pg }t tj}tdtdh}i }i }i } j D ].\}}||v r+|||< q||v r4|||< q| rL|||< |jsL|D ]
}	|||j|	d< qAqd fd
d}
|
|d |
dd  j D d |
dd  j D d |
dd t	 j dd dD d |
|d |
dd  j D d |
|d S )NZ	errorlogsZstdsplit)r   options'cdata.KeyedOptionDictType'sectionr   r   r-   c                   s   t |  D ]d\}}t||j| |r|j ndd}t|tj	r'd}n5t|tj
r0d}n,t|tjr>|j|d< d}nt|tjrGd}nt|tjrXd}|jrW|j|d< ntd	||d
< |j|d< | qd S )Nany)r   r   r   machinestringZbooleanrj   combointegerarrayzUnknown option typer   description)rt   rq   r   r   Zis_per_machine_optionr   Zget_lower_case_namer   ru   ZUserStringOptionZUserBooleanOptionZUserComboOptionrj   ZUserIntegerOptionZUserArrayOptionr   r   r   )r   r   rw   optoptdictZtypestrr	   Zoptlistr    r!   add_keys(  s.   


z#list_buildoptions.<locals>.add_keyscorec                 S     i | ]\}}|  r||qS r    )Z
is_backendr   kvr    r    r!   r   @      z%list_buildoptions.<locals>.<dictcomp>r7   c                 S  r   r    )Zis_baser   r    r    r!   r   A  r   basec                 S  r   r    )Zis_compilerr   r    r    r!   r   C  r   c                 S  s
   | d j S )Nr   )r   )r   r    r    r!   rB   C  rJ   z#list_buildoptions.<locals>.<lambda>)rw   r   	directoryc                 S  r   r    )Z
is_projectr   r    r    r!   r   G  r   usertest)r   r   r   r   r   r-   )
setru   ZBUILTIN_DIR_OPTIONSr   r   rq   
is_builtinZyieldingZevolvert   )r	   r   Zdir_option_namesZtest_option_namesZdir_optionsZtest_optionsZcore_optionsr   r   r   r   r    r   r!   rE     s@   





rE   r   c                   sJ   t h d}g }tD ]\ }}| fdd||D  q|S )N>   zmeson_options.txtzmeson.optionsr   c                 3  s(    | ]}t jt j |V  qd S r?   )r   r   relpathr   )r   frootr   r    r!   	<genexpr>P  s     z.find_buildsystem_files_list.<locals>.<genexpr>)	frozensetr   walkextendintersection)r   build_filesfilelistrc   filesr    r   r!   find_buildsystem_files_listK  s   
r  rI   r   c                   s,   | j   t| } fdd|D }|S )Nc                   s   g | ]	}t  | qS r    )r   as_posixr   r   r    r!   r   W  r   z*list_buildsystem_files.<locals>.<listcomp>)r   r   r   Zget_build_def_files)r5   rI   r  r    r   r!   rH   T  s   
rH   'T.List[T.Dict[str, T.Union[str, bool]]]c                   s8   g }| j D ]}g d | fdd| D g7 }q|S )N)r   requiredversionZhas_fallbackZconditionalc                   s   i | ]\}}| v r||qS r    r    r   keysr    r!   r   d  r   z)list_deps_from_source.<locals>.<dictcomp>)rK   rq   )r{   r~   r   r    r
  r!   r]   Z  s
   
r]   .T.List[T.Dict[str, T.Union[str, T.List[str]]]]c                 C  sD   g }| j j D ]}| r||j| | | dg7 }q|S )N)r   r	  Zcompile_argsZ	link_args)depshostvaluesfoundr   get_versionZget_compile_argsZget_link_args)r	   r~   dr    r    r!   rL   g  s   
rL   rX   "T.List[backends.TestSerialisation]ET.List[T.Dict[str, T.Union[str, int, T.List[str], T.Dict[str, str]]]]c                 C  s   g }| D ]]}i }t |jtr|jg}n|j}||j |d< t |jtjr-|ji |d< n|j|d< |j|d< |j	|d< |j
|d< |j|d< |j|d< |j|d< t|j|d	< |j|d
< || q|S )Ncmdenvr   workdirtimeoutsuiteis_parallelpriorityprotocoldepends)r   r   r   Zcmd_argsr  r   ZEnvironmentVariablesZget_envr   r  r  r  r  r  r  r  r   )rX   r~   r   tor   r    r    r!   get_test_listq  s(   








r  c                 C     t | S r?   r  rW   r    r    r!   rV     r&   rV   	benchdatac                 C  r   r?   r!  )r"  r    r    r!   r@     r&   r@   3T.Dict[str, T.Union[str, T.List[T.Dict[str, str]]]]c                 C  sT   | j | j| jd}g }| j D ]\}}||| j|d}|| q||d< |S )N)r	  descriptive_namesubproject_dir)r   r	  r$  r   )Zproject_versionproject_namer%  r   rq   Zprojectsr   r   )r5   r~   r   r   r   cr    r    r!   rR     s   
rR   c                   s   | j }t|}dd |D }| jd D ] }tj| j|d   fdd|D |d<  fdd|D }q|| jd< | j| jd< | jS )	Nc                 S  s   g | ]}t j|qS r    )r   r   r   r   r    r    r!   r     s    z-list_projinfo_from_source.<locals>.<listcomp>r   r   c                   s   g | ]	}|  r|qS r    
startswithr   Zbasedirr    r!   r     r   rG   c                   s   g | ]	}|  s|qS r    r(  r   r*  r    r!   r     r   r%  )r   r  r   r   r   r   r%  )r{   r9   r  r   r    r*  r!   r^     s   
r^   r   argparse.Namespaceresults6T.Sequence[T.Tuple[str, T.Union[dict, T.List[T.Any]]]]rl   intc                 C  sz   |s| j std dS t|dkr#| j s#ttj|d d |d dS i }|D ]
}|d ||d < q'ttj||d dS )NzNo command specifiedr   r   )rl   )rm   printlenjsondumps)r   r,  rl   outr   r    r    r!   print_results  s   
r4  rn   c                 C  s   d}| d urt j| |}|S )Nz
meson-infor   )rn   infodirr    r    r!   get_infodir  s   r6  r5  kindc                 C  s    t j| |s	dS d| dS )Nr   intro-.jsonr   )r5  r7  r    r    r!   get_info_file  s
   
r:  T.Anyc                 C  s@   t t| |dd}t|W  d    S 1 sw   Y  d S )Nutf-8encoding)openr:  r1  load)r5  r7  fpr    r    r!   load_info_file  s   $rB  c              
   C  s\  d}t | j}| jd urtj| j|}| jrdnd }g }| jdkr$dn| jd d }t|d}dtj| j| jfv rtt	j
' t| j}|d usNJ t|d|jt t t gd}|  W d    n1 skw   Y  | D ]\}	}
| jst| |	d	r|
jsqt||	|
|fg7 }qtt| ||S zt|}|d
i di dd}W n& ty   tj|rtj|std Y dS tdt| Y dS w t  }|D ]}t!"||std|d|  dS q| D ]6\}}|j#sq| jst| |d	sqz||t||fg7 }W q ty'   tdt|| Y  dS w t| ||S )Nzmeson-private   r   r.   i)r9    )ZvisitorsFintrospectionr	  fullz0.0.0zyCurrent directory is not a meson build directory.
Please specify a valid build dir or change the working directory to it.zIntrospection file {} does not exist.
It is also possible that the build directory was generated with an old
meson version. Please regenerate it in this case.r   zFIntrospection version {} is not supported. The required version is: {}z and z%Introspection file {} does not exist.)$r6  rn   r   r   r   rl   r`   r   r   sysstderrr   Zget_backend_from_namer7   r
   r   r   r   r   Zanalyzerq   rk   getattrr+   r4  rB  r   FileNotFoundErrorisdirr/  formatr:  r%   r   Zversion_comparer)   )r   Zdatadirr5  rl   r,  r9   rv   r7   r{   rw   rx   rawZ
intro_versZvers_to_checkr   r   r    r    r!   run  sh   



 

rN  
intro_infoc              	   C  s   | D ]B\}}t j|d| d}t j|d}t|ddd}t|| |  W d    n1 s4w   Y  t || t	| qd S )Nr8  r9  tmp_dump.jsonwr<  r=  )
r   r   r   r?  r1  dumpflushrr   updated_introspection_filesr   )rO  r   r7  r   out_filetmp_filerA  r    r    r!   write_intro_info  s   
rW  c                 C  sZ   | j  }t|| |d}g }| D ]\}}|jsq||| fg7 }qt|| j j d S )N)r	   r5   r7   )r   Zget_coredatar`   rq   r)   rW  r   )r5   r7   r	   rv   rO  rw   rx   r    r    r!   generate_introspection_file  s   
rX  c                 C  s   dt | fg}t|| d S )NrD   )rE   rW  )r	   r   rO  r    r    r!   update_build_options  s   
rY  r	  T.Dict[str, T.Union[str, int]]c                 C  sf   |  d}| tt|dkr|d ndtt|dkr|d ndtt|dkr.|d dS ddS )Nr.   r   r      )rF  majorminorZpatch)splitr.  r0  )r	  Z	vers_listr    r    r!   split_version_string   s   
r_  Ferrorsr   build_files_updatedboolc                 C  s
  | j j}t|}t }i }| D ]\}}|jsqd| d|tv d||< qttj	| j 
 | j  |dtt |d|d}	|rQd|	d< d	d
 |D |	d< nd|	d< tj|d}
t|
ddd}t|	| |  W d    n1 sxw   Y  t|
| d S )Nr8  r9  )fileupdated)sourcer   info)r	  Zinformation)Zmeson_versionZdirectoriesrE  ra  Terrorc                 S  s"   g | ]}t |tr|nt|qS r    )r   r   r   r    r    r!   r   G  s   " z)write_meson_info_file.<locals>.<listcomp>Z
error_listFrP  rQ  r<  r=  )r   r   r"   r`   rq   r)   rT  r_  ru   r	  r   r   r#   r   r   r   r?  r1  rR  rS  rr   )r5   r`  ra  r   Z	info_filerv   rO  r   r   Z	info_datarV  rA  r    r    r!   write_meson_info_file)  s<   

rh  )r   r   r   r   )r   r   )r   r$   )NNNN)
r	   r4   r5   r6   r7   r8   r9   r:   r   r;   )ra   rb   r   r-   )r{   r
   r   r|   )rP   r   r   r   )rP   r   r   r   )r	   r   r   r   r   r   )r{   r
   r   r   )r5   r   rP   r   r7   r   r   r   )r{   r
   r   r   r?   )r	   r   r   r   r   r   )r   r   r   r$   )r5   r   rI   r   r   r$   )r{   r
   r   r  )r	   r   r   r  )rX   r  r   r  )r"  r  r   r  )r5   r   r   r#  )r{   r
   r   r#  )r   r+  r,  r-  rl   r.  r   r.  )rn   r:   r   r   )r5  r   r7  r:   r   r   )r5  r   r7  r:   r   r;  )r   r+  r   r.  )rO  r-  r   r   r   r-   )r5   r   r7   r   r   r-   )r	   r   r   r   r   r-   )r	  r   r   rZ  )F)r5   r   r`  r   ra  rb  r   r-   )H
__future__r   
contextlibr   rY   r1  r   pathlibr   r   rG  typingTrD  r   r   r	   ru   r<   r
   r   r   r   r   r   r7   r   r   Zmparserr   r   r   r   TYPE_CHECKINGargparserI   r   r   r"   r#   r%   r'   r`   rz   r[   rN   rQ   r   r_   rT   r\   rE   r  rH   r]   rL   r  rV   r@   rR   r^   r4  r6  r:  rB  rN  rT  rW  rX  rY  r_  rh  r    r    r    r!   <module>   sp    


	




&

4
.
9
	









;




	