o
    e#I                     @  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Zd dlZddl	m
Z
mZmZmZ ddl	mZmZmZmZ ddlmZmZ ddlmZ dd	lmZmZmZmZ dd
lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ej)rd dl*m+Z+ ddl	m,Z, ddlm-Z- ddl.m/Z/ ddlm0Z0m1Z1 ddlm2Z2m3Z3 G dd de+Z4G dd de+Z5G dd de1j6Z7g dZ8dZ9dZ:dZ;G dd deZ<G dd deZ=G dd  d e
Z>d'd%d&Z?dS )(    )annotationsN   )ExtensionModuleModuleReturnValueModuleObject
ModuleInfo   )buildmesonlibmlogdependencies)TargetOptionscmake_defines_to_args)SubprojectHolder)REQUIRED_KWINSTALL_DIR_KWNoneTypein_set_validator)
FeatureNewFeatureNewKwargs
stringArgspermittedKwargs	noPosargsnoKwargsInvalidArgumentsInterpreterExceptiontyped_pos_argstyped_kwargs	KwargInfoContainerTypeInfo)	TypedDict)ModuleState)SingleTargetOptions)Environment)Interpreterkwargs)TYPE_kwargsTYPE_varc                   @  s6   e Zd ZU ded< ded< ded< ded< ded< d	S )
WriteBasicPackageVersionFileboolarch_independentstrcompatibilityT.Optional[str]install_dirnameversionN__name__
__module____qualname____annotations__ r6   r6   =/usr/lib/python3.10/site-packages/mesonbuild/modules/cmake.pyr(   6   s   
 r(   c                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
ConfigurePackageConfigFilez&T.Union[build.ConfigurationData, dict]configurationzT.Union[str, mesonlib.File]inputr-   r.   r+   r/   Nr1   r6   r6   r6   r7   r8   >   s
   
 r8   c                   @  s   e Zd ZU ded< ded< dS )
Subprojectz"T.Optional[CMakeSubprojectOptions]optionsT.List[str]cmake_optionsNr1   r6   r6   r6   r7   r;   E   s   
 r;   )AnyNewerVersionZSameMajorVersionZSameMinorVersionZExactVersiona@  
####### Expanded from \@PACKAGE_INIT\@ by configure_package_config_file() #######
####### Any changes to this file will be overwritten by the next CMake run ####
####### The input file was @inputFileName@ ########

get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/@PACKAGE_RELATIVE_PATH@" ABSOLUTE)
as  
# Use original install prefix when loaded through a "/usr move"
# cross-prefix symbolic link such as /lib -> /usr/lib.
get_filename_component(_realCurr "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
get_filename_component(_realOrig "@absInstallDir@" REALPATH)
if(_realCurr STREQUAL _realOrig)
  set(PACKAGE_PREFIX_DIR "@installPrefix@")
endif()
unset(_realOrig)
unset(_realCurr)
a(  
macro(set_and_check _var _file)
  set(${_var} "${_file}")
  if(NOT EXISTS "${_file}")
    message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
  endif()
endmacro()

####################################################################################
c                      s   e Zd Zd( fddZd)d	d
Zeed*ddZedddge	dhed+ddZ
eed,ddZeed-ddZeed.dd Zeed/d!d"Zeeed#d$d0d&d'Z  ZS )1CMakeSubprojectsubpr   c              
     sb   t |tsJ |jd usJ t   || _|j| _| j| j| j	| j
| j| j| j| jd d S )N)get_variable
dependencyinclude_directoriestargettarget_typetarget_listfound)
isinstancer   cm_interpretersuper__init__rA   methodsupdaterB   rC   rD   rE   rF   rG   found_method)selfrA   	__class__r6   r7   rL   l   s   

zCMakeSubproject.__init__argsr=   returnT.Dict[str, str]c                   sf   t |dkr
td|d }| j|  d u r$td| dd d t fdd	d
D s1J  S )Nr   z!Exactly one argument is required.r   zThe CMake target z does not exist
zP  Use the following command in your meson.build to list all available targets:

zS    message('CMake targets:\n - ' + '\n - '.join(<cmake_subproject>.target_list()))c                 3  s    | ]}| v V  qd S Nr6   ).0xresr6   r7   	<genexpr>   s    z0CMakeSubproject._args_to_info.<locals>.<genexpr>)incsrcdeptgtfunc)lenr   rJ   Ztarget_infoall)rP   rS   r_   r6   rY   r7   _args_to_info{   s   zCMakeSubproject._args_to_infostater!   r%   r&   r'   c                 C  s   | j ||S rV   )rA   Zget_variable_methodrP   rd   rS   r%   r6   r6   r7   rB      s   zCMakeSubproject.get_variablerC   z0.56.0include_typedependencies.Dependencyc                 C  s   |  |}|d dkrt|d  d| ||d gi }t|tjs&J |j}d|v rE|d |krEtd	||d  |
|d S |S )Nr`   
executabler   zU is an executable and does not support the dependency() method. Use target() instead.r^   rf   z6Current include type is {}. Converting to requested {})rc   r   rB   rI   r   Z
Dependencyrf   r   debugformatZgenerate_system_dependency)rP   rd   rS   r%   infoorigZactualr6   r6   r7   rC      s   
zCMakeSubproject.dependencybuild.IncludeDirsc                 C     |  |}| ||d g|S )Nr\   rc   rB   rP   rd   rS   r%   rk   r6   r6   r7   rD         
z#CMakeSubproject.include_directoriesbuild.Targetc                 C  rn   )Nr_   ro   rp   r6   r6   r7   rE      rq   zCMakeSubproject.targetr+   c                 C  s   |  |}|d S )Nr`   )rc   rp   r6   r6   r7   rF      s   
zCMakeSubproject.target_typec                 C  s
   | j  S rV   )rJ   rG   re   r6   r6   r7   rG      s   
zCMakeSubproject.target_listzCMakeSubproject.found()z0.53.2r)   c                 C  s
   | j d uS rV   )rA   re   r6   r6   r7   rO      s   
zCMakeSubproject.found_method)rA   r   )rS   r=   rT   rU   )rd   r!   rS   r=   r%   r&   rT   r'   )rd   r!   rS   r=   r%   rU   rT   rg   )rd   r!   rS   r=   r%   r&   rT   rm   )rd   r!   rS   r=   r%   r&   rT   rr   )rd   r!   rS   r=   r%   r&   rT   r+   )rd   r!   rS   r'   r%   r&   rT   r=   )rd   r!   rS   r'   r%   r&   rT   r)   )r2   r3   r4   rL   rc   r   r   rB   r   r   rC   rD   rE   rF   r   rG   r   rO   __classcell__r6   r6   rQ   r7   r@   k   s4    
r@   c                      s   e Zd Zd( fddZd)dd	Zed
eded*ddZede	e	e
dhd+ddZedee
dhd,ddZede	e	dde
dhd-d d!Zede	dde
dhd.d#d$Zeed/d&d'Z  ZS )0CMakeSubprojectOptionsrT   Nonec              	     sB   t    g | _t | _| j| j| j| j	| j
| j| jd d S )N)add_cmake_definesset_override_optionset_installappend_compile_argsappend_link_argsclear)rK   rL   r>   r   target_optionsrM   rN   rv   rw   rx   ry   rz   r{   )rP   rQ   r6   r7   rL      s   
zCMakeSubprojectOptions.__init__r%   dictr"   c                 C  s   d|v r| j |d  S | j jS )NrE   )r|   global_options)rP   r%   r6   r6   r7   	_get_opts   s   z CMakeSubprojectOptions._get_optsz$subproject_options.add_cmake_defines)varargsrd   r!   rS   &T.Tuple[T.List[T.Dict[str, TYPE_var]]]r&   c                 C  s   |  j t|d 7  _ d S Nr   )r>   r   re   r6   r6   r7   rv      s   z(CMakeSubprojectOptions.add_cmake_definesz&subproject_options.set_override_optionrE   T.Tuple[str, str]c                 C     |  ||d |d  d S Nr   r   )r   Zset_optre   r6   r6   r7   rw         z*CMakeSubprojectOptions.set_override_optionzsubproject_options.set_installT.Tuple[bool]c                 C     |  ||d  d S r   )r   rx   re   r6   r6   r7   rx         z"CMakeSubprojectOptions.set_installz&subproject_options.append_compile_argsr   )r   Zmin_varargsT.Tuple[str, T.List[str]]c                 C  r   r   )r   Zappend_argsre   r6   r6   r7   ry      r   z*CMakeSubprojectOptions.append_compile_argsT.Tuple[T.List[str]]c                 C  r   r   )r   rz   re   r6   r6   r7   rz      r   z'CMakeSubprojectOptions.append_link_argsr'   c                 C  s   | j   t | _d S rV   )r>   r{   r   r|   re   r6   r6   r7   r{      s   
zCMakeSubprojectOptions.clear)rT   ru   )r%   r}   rT   r"   )rd   r!   rS   r   r%   r&   rT   ru   )rd   r!   rS   r   r%   r&   rT   ru   )rd   r!   rS   r   r%   r&   rT   ru   )rd   r!   rS   r   r%   r&   rT   ru   )rd   r!   rS   r   r%   r&   rT   ru   )rd   r!   rS   r'   r%   r&   rT   ru   )r2   r3   r4   rL   r   r   r}   r   rv   r+   r   rw   r)   rx   ry   rz   r   r{   rs   r6   r6   rQ   r7   rt      s*    


rt   c                      sl  e Zd ZdZdZeddZdO fd	d
ZdPddZdQddZ	e
edededddededeeedededdededdedRd%d&ZdSd.d/Ze
ed0ed1ejefdded2eejeeejfdd3d4 d5d4 d6ededdedTd9d:Zed;d<ed=eed=eed>e e!fd?d@edAeeeg dd?dBdCdUdHdIZ"edJd?e#e
dVdMdNZ$  Z%S )WCmakeModuleFNcmakez0.50.0interpreterr$   rT   ru   c                   s.   t  | | j| j| j| j| jd d S )N) write_basic_package_version_fileconfigure_package_config_file
subprojectsubproject_options)rK   rL   rM   rN   r   r   r   r   )rP   r   rQ   r6   r7   rL      s   zCmakeModule.__init__envr#   intc                 C  sF   |j jj}|dd }|s|dd }|std|dd|d S )Nccppz7Requires a C or C++ compiler to compute sizeof(void *).zvoid * r   )coredata	compilershostgetr
   MesonExceptionZsizeof)rP   r   r   compilerr6   r6   r7   detect_voidp_size  s   

zCmakeModule.detect_voidp_sizerd   r!   r)   c                 C  s   | j rdS |jddd}| sdS t| g d dd \}}}|jdkr:td|j d	| d
|  dS t	
d| }|sKtd dS t|d}tjj|j | _d| _ dS )NTr   F)Zsilent)z--system-informationz-GZNinjar      z/error retrieving cmake information: returnCode=z stdout=z stderr=z
CMAKE_ROOT \"([^"]+)"
zunable to determine cmake rootr   )cmake_detectedZfind_programrH   r
   Z
Popen_safeZget_command
returncoder   logresearchstrippathlibPurePathgroupospathjoinparts
cmake_root)rP   rd   ZcmakebinpstdoutstderrmatchZ	cmakePathr6   r6   r7   detect_cmake  s"   $

zCmakeModule.detect_cmakez&cmake.write_basic_package_version_filer*   0.62.0)defaultsincer,   r?   )r   	validatorr/   T)requiredr0   rS   r'   r%   'WriteBasicPackageVersionFile'r   c                 C  s(  |d }|d }|d }|d }|  |std|d  }}	|d u r<tj|jjt	dd|}tjd	d|}	tj| j
d
d| d}
tj|
sXtd| dtj|jj| d}|t| |j|d}t|
|t|d ttd|j |g||	d |j}t||gS )Nr*   r,   r/   r0   zUnable to find cmaker.   libdirr   z{libdir}ModuleszBasicConfigVersion-z	.cmake.inz,your cmake installation doesn't support the z compatibilityzConfigVersion.cmake)ZCVF_VERSIONZCMAKE_SIZEOF_VOID_PZCVF_ARCH_INDEPENDENTZmesonT)r   r
   r   r   r   r   environmentr   
get_option	OptionKeyr   existsZscratch_dirr+   r   Zdo_conf_filer	   ConfigurationDataDataFileZget_scratch_dirr   r   )rP   rd   rS   r%   r*   r,   r/   r0   ZpkgrootZpkgroot_nameZtemplate_fileZversion_fileconfrZ   r6   r6   r7   r   #  s*   


 &z,CmakeModule.write_basic_package_version_fileinfiler+   outfilePACKAGE_RELATIVE_PATHextraconfdatabuild.ConfigurationDatac              
   C  s6  t d|}|dtj|}||7 }|t7 }zt|dd}| }W d    n1 s.w   Y  W n tyK }	 zt	
d| d|	d }	~	ww g }
t	d}|D ]}|d|}t	||d|\}}|
| qU|d	 }t|d
dd}||
 W d    n1 sw   Y  t|| t	|| d S )Nz@PACKAGE_RELATIVE_PATH@z@inputFileName@zutf-8)encodingzCould not read input file z: zcmake@z@PACKAGE_INIT@~w)PACKAGE_INIT_BASEreplacer   r   basenamePACKAGE_INIT_SET_AND_CHECKopen	readlines	Exceptionr
   r   Zget_variable_regexZdo_replacementappend
writelinesshutilcopymodeZreplace_if_different)rP   r   r   r   r   r   Zpackage_initZfindataeresultZregexlineZ_missingZoutfile_tmpZfoutr6   r6   r7   create_package_fileJ  s2   

zCmakeModule.create_package_filez#cmake.configure_package_config_filer9   r:   c                 C  s   t | trt| dkrdS d S )Nr   zrequires exactly one file)rI   listra   rX   r6   r6   r7   <lambda>k  s    zCmakeModule.<lambda>c                 C  s   t | tr	| d S | S r   )rI   r   r   r6   r6   r7   r   l  s    )r   r   Z	convertor'ConfigurePackageConfigFile'
build.Datac                 C  s  |d }t |trtj|jj|j|}||jj|jj	}|d }t
jt
j|j| d\}}t
j|jj	||}	|d }
|
d u rUt
j|jjtdd|}
|d }t |trntjdd	|j|jd
 t|}|jjtd}|
}t
j|st
j||
}tt
j|| }d}td|rt d|}| d|}| !||	||| d|_"t
j#|$ }| j%j&'| t(td||g|
|
d |j}| j%jj)*| |S )Nr:   r/   zConfig.cmaker.   r   r   r9   z9cmake.configure_package_config_file dict as configurationr   )locationprefixr   z^(/usr)?/lib(64)?/.+z@absInstallDir@z@installPrefix@T)+rI   r+   r
   r   Zfrom_source_filer   
source_dirZsubdirZabsolute_path	build_dirr   r   splitr   r   r   r   r}   r   Z
single_user   Zcurrent_noder	   r   isabsr   r   relpathas_posixr   r   PACKAGE_INIT_EXTr   r   usednormpathZrelative_namer   Zbuild_def_filesaddr   r   r   )rP   rd   rS   r%   Z	inputfileZ	ifile_absr/   Z
ofile_pathZofile_fnameZ	ofile_absr.   r   r   Zabs_install_dirr   r   conffilerZ   r6   r6   r7   r   e  s<   
" 

 z)CmakeModule.configure_package_config_filer   z0.51.0zcmake.subprojectr<   z0.55.0)r   r>   zUse options instead)r   ZlistifyZ
deprecatedZdeprecated_messageT.Tuple[str]kwargs_r;   *T.Union[SubprojectHolder, CMakeSubproject]c                 C  sf   |d r|d d urt d|d }|d |d |d i g d}| jj||dd}| s/|S t|S )	Nr>   r<   z6"options" cannot be used together with "cmake_options"r   r   )r   r<   r>   Zdefault_optionsr0   r   )Zforce_method)r   r   Zdo_subprojectrH   r@   )rP   rd   rS   r   dirnamekwrA   r6   r6   r7   r     s   zCmakeModule.subprojectr   r&   rt   c                 C  s   t  S rV   )rt   re   r6   r6   r7   r     s   zCmakeModule.subproject_options)r   r$   rT   ru   )r   r#   rT   r   )rd   r!   rT   r)   )rd   r!   rS   r'   r%   r   rT   r   )r   r+   r   r+   r   r+   r   r+   r   r   rT   ru   )rd   r!   rS   r'   r%   r   rT   r   )rd   r!   rS   r   r   r;   rT   r   )rd   r!   rS   r'   r%   r&   rT   rt   )&r2   r3   r4   r   r   r   INFOrL   r   r   r   r   r   r)   r+   r   setCOMPATIBILITIESr   r   r   r	   r   r}   r
   r   r   r   r   r   r   r   rt   r   r   r   r   rs   r6   r6   rQ   r7   r      sf    

	


,r   rS   T.Anyr%   rT   c                  O  s   t | i |S rV   )r   )rS   r%   r6   r6   r7   
initialize  s   r   )rS   r   r%   r   rT   r   )@
__future__r   r   r   os.pathr   r   typingTr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zinterpreter.type_checkingr   r   r   r   Zinterpreterbaser   r   r   r   r   r   r   r   r   r   r   r   TYPE_CHECKINGtyping_extensionsr    r!   r"   r   r#   r$   r%   r&   r'   r(   r8   ZExtractRequiredr;   r   r   r   r   r@   rt   r   r   r6   r6   r6   r7   <module>   s<   8Q6 P