o
    uJAfu                     @  s  d dl mZ ddlmZmZmZ ddlmZ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 ddlmZ d dlZ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!e!j"rudd
lm#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) G dd de!j*Z+G dd deZ,G dd dZ-dS )    )annotations   )ExternalDependencyDependencyExceptionDependencyTypeName   )
is_windowsMesonException
PerMachinestringlistifyextract_as_list)CMakeExecutorCMakeTraceParserCMakeExceptionCMakeToolchainCMakeExecScopecheck_cmake_argsresolve_cmake_trace_targetscmake_is_debug)mlogNPath)CMakeTarget)Environment)MachineInfo)PkgConfigDefineTypec                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	CMakeInfoT.List[str]module_pathsstr
cmake_rootarchscommon_pathsN)__name__
__module____qualname____annotations__ r'   r'   B/usr/lib/python3.10/site-packages/mesonbuild/dependencies/cmake.pyr   #   s
   
 r   c                      s8  e Zd ZU eddZded< dZg dZdZded< dYddZ	dZddZ
d[ddZd\ddZd\ddZd]ddZd^d_ fd'd(ZdZd)d*Zd`d-d.Zeejdd/dad2d3Zeejdd/dbd4d5Zdcd:d;Zddd>d?ZdedAdBZdfdDdEZ	dgdhdIdJZedZdKdLZdZdMdNZdddddddOdidWdXZ  ZS )jCMakeDependencyNz!PerMachine[T.Optional[CMakeInfo]]class_cmakeinfoz>=3.4) ZNinjazUnix MakefileszVisual Studio 10 2010T.Optional[str]class_working_generatormsgr   returnr   c                 C  s   t d| j d| S )NzDependency z not found: )r   name)selfr.   r'   r'   r(   _gen_exception3   s   zCMakeDependency._gen_exceptionc                 C     dS )NCMakeLists.txtr'   r1   r'   r'   r(   _main_cmake_file6      z CMakeDependency._main_cmake_filer   c                 C  s   g S Nr'   r5   r'   r'   r(   _extra_cmake_opts9   r7   z!CMakeDependency._extra_cmake_optsmodulesT.List[T.Tuple[str, bool]]
componentsc                 C     |S r8   r'   r1   r:   r<   r'   r'   r(   _map_module_list<   s   z CMakeDependency._map_module_listc                 C  s   |S r8   r'   r>   r'   r'   r(   _map_component_listE   s   z#CMakeDependency._map_component_listmodulec                 C  r=   r8   r'   )r1   rA   r'   r'   r(   _original_module_nameM   s   z%CMakeDependency._original_module_nameFr0   environment'Environment'kwargsT.Dict[str, T.Any]languageforce_use_global_compilersboolNonec                   s  g | _ |d u s	|r/d  |ddrjjj njjj g d}|  j  fdd|D 7  _ n|  j |g7  _ d| j v rD|  j dg7  _ tt| j | _ t j	t
d||d	 || _d| _d | _d | _j| _g | _d | _ttj| j| jd
| _| j sd | _d| j d}| jrt|t| d S t| j |  | j | _t!t"|d}t#|}tj$| j d u r| %|tj$| j< tj$| j | _| jd u r| &d|dd}	t'|	t(stddd t!t"|dD }
dd t!t"|dD }|dd t!t"|dD 7 }t!t"|d}fdd|D }|r#|)dd*|  | +||| j, j-| j s:td d S | .||	||
| d S )NnativeF)ccppfortranobjcZobjcxxc                   s   g | ]}| v r|qS r'   r'   .0x)	compilersr'   r(   
<listcomp>]       z,CMakeDependency.__init__.<locals>.<listcomp>rN   rL   cmake)rG   )silentzCMake binary for machine z not found. Giving up.
cmake_argsz)Unable to obtain CMake system informationcmake_package_versionr+   z1Keyword "cmake_package_version" must be a string.c                 S     g | ]}|d fqS Tr'   rP   r'   r'   r(   rT          r<   c                 S  rZ   r[   r'   rP   r'   r'   r(   rT      r\   r:   c                 S  rZ   )Fr'   rP   r'   r'   r(   rT      r\   optional_modulescmake_module_pathc                   s.   g | ]}t j|r|nt j  |qS r'   )ospathisabsjoinget_source_dirrP   )rC   r'   r(   rT      s   . z-DCMAKE_MODULE_PATH=;z)Preliminary CMake check failed. Aborting.)/language_listgetcoredatarS   buildhostlistsetsuper__init__r   r0   Z
is_libtoolcmakebin	cmakeinfoscratch_dircmake_root_dirfound_modulestraceparserr   r)   class_cmake_versionfor_machinerW   foundrequiredr   r   debugr   version_get_build_direnvr   r   r   r*   _get_cmake_infor2   
isinstancer   appendrb   _preliminary_find_checkZget_cmake_prefix_pathsmachines_detect_dep)r1   r0   rC   rE   rG   rH   
candidatesr.   cm_argspackage_versionr<   r:   Zcm_path	__class__)rS   rC   r(   rm   R   sd   






 
zCMakeDependency.__init__c              	   C  s(   d| j j d| j d| j d| j d	S )N< z: >)r   r#   r0   is_foundversion_reqsr5   r'   r'   r(   __repr__   s   (zCMakeDependency.__repr__r   T.Optional[CMakeInfo]c              	   C  s  t d g }tjd ur|tjg7 }|tj7 }t| j |  | j	}t
| j| j	| jtj|  }|  |D ]V}t dt|dkrE|nd | |  dg }||7 }t|dkrdd|g| }| |d\}}}	|dkrv|t_ nt d| d	|  t d
| d|	 d q7|dkrd S z||	 W n
 ty   Y d S w d$dd}
|
|d}||
|d t|}dd |D }|
|d}g }dd |D D ]}dd |D D ]}|t|||j  qqt||}dd |D }|d}g d}|D ]}|tj d|g7 }q
t!||dd ||d}t d |j"  t d!|j#  t d"|j$  t d#|j%  |S )%Nz"Extracting basic cmake informationTry CMake generator: {}r   auto.-GzCMakePathInfo.txtz8CMake failed to gather system information for generator  with error code OUT:



ERR:


lr   r/   
T.Set[str]c                 S  s:   t  rdd | D }ndd | D }dd |D }t|S )Nc                 S  s   g | ]}| tjqS r'   )splitr_   pathseprP   r'   r'   r(   rT      rU   zJCMakeDependency._get_cmake_info.<locals>.process_paths.<locals>.<listcomp>c                 S  s   g | ]}t d |qS )z:|;)rer   rP   r'   r'   r(   rT      rU   c                 S  s   g | ]	}|D ]}|qqS r'   r'   )rQ   sublistrR   r'   r'   r(   rT          )r   rk   )r   tmpZ	flattenedr'   r'   r(   process_paths   s
   z6CMakeDependency._get_cmake_info.<locals>.process_pathsZMESON_FIND_ROOT_PATHZMESON_CMAKE_SYSROOTc                 S     g | ]
}t j|r|qS r'   r_   r`   isdirrP   r'   r'   r(   rT          z3CMakeDependency._get_cmake_info.<locals>.<listcomp>ZMESON_PATHS_LISTc                 S     g | ]}t |qS r'   r   rP   r'   r'   r(   rT      r\   c                 S  r   r'   r   rP   r'   r'   r(   rT      r\   c                 S  r   r'   r   rP   r'   r'   r(   rT      r   ZMESON_ARCH_LIST)libZlib32lib64Zlibx32sharer+   r   ZMESON_CMAKE_ROOT)r   r    r!   r"   z  -- Module search paths:    z  -- CMake root:             z  -- CMake architectures:    z  -- CMake lib search paths: )r   r   r/   r   )&r   rx   r)   r-   class_cmake_generatorsr   rn   ry   rz   r{   r   ru   r   
DEPENDENCYwriteformatlen
trace_argsget_cmake_args_call_cmakeparser	   get_cmake_varupdatesortedr~   r   relative_toanchorunionr_   r`   rb   r   r   r    r!   r"   )r1   r   gen_listZtemp_parser	toolchaini
cmake_optsret1out1err1r   Zroot_paths_setZ
root_pathsZmodule_paths_setZrooted_pathsjpr   r!   r"   resr'   r'   r(   r|      sn   


 

zCMakeDependency._get_cmake_info)maxsizer`   T.Tuple[T.Tuple[str, str], ...]c                 C  s4   zt dd t| D W S  ty   t   Y S w )Nc                 s  s     | ]}|t | fV  qd S r8   )r   lowerrP   r'   r'   r(   	<genexpr>   s    z2CMakeDependency._cached_listdir.<locals>.<genexpr>)tupler_   listdirOSErrorr`   r'   r'   r(   _cached_listdir   s
   
zCMakeDependency._cached_listdirc                 C  s$   zt j| W S  ty   Y dS w NF)r_   r`   r   r   r   r'   r'   r(   _cached_isdir   s
   zCMakeDependency._cached_isdirmodule_pathprefix_pathmachine'MachineInfo'c              	     s$  t  dfdd d fdd}|tjjjd	g D ]	} |r, d
S q#|D ]	}||r8 d
S q/g }tjdd	tj
D ]'}|dsR|drX|d d }|dsb|drh|d d }||g7 }qFjj| D ]n} |r} d
S ||r d
S |}tfdd|D }|D ]}	|tj||	d r  d
S q| r d dfD ]+}
|D ]&}	|	d |
krq tj||	d dsۈ tj||	d dr   d
S qqqttj d}|r |rd
S t d d }| | fD ]}| r d
S qdS ) Nr`   r   r/   rI   c                   st   | t j| dt j| dfD ](}|sq|}g d fdd D  t fdd|D r7 dS qd	S )
NrV   ZCMake)zFind{}.cmakez{}Config.cmakez{}-config.cmakec                   s   g | ]	}|   qS r'   )r   r   rP   r0   r'   r(   rT     r   zPCMakeDependency._preliminary_find_check.<locals>.find_module.<locals>.<listcomp>c                 3  s    | ]	}|d   v V  qdS r   Nr'   rP   r   r'   r(   r     s    zOCMakeDependency._preliminary_find_check.<locals>.find_module.<locals>.<genexpr>TF)r_   r`   rb   r   r   any)r`   r   content)r0   r1   r   r(   find_module  s   "

z<CMakeDependency._preliminary_find_check.<locals>.find_modulec                   s    fddj jD D ]\}|sqtj|d}|rC|}tfdd|D }|D ]}tj||d rB  dS q1|}tfdd|D }|D ]}tj||d rf  dS qUqd	S )
Nc                   s   g | ]	}t j |qS r'   )r_   r`   rb   rP   r   r'   r(   rT     r   zTCMakeDependency._preliminary_find_check.<locals>.search_lib_dirs.<locals>.<listcomp>rV   c                 3  "    | ]}|d    r|V  qdS r   
startswithrP   lnamer'   r(   r   "       zSCMakeDependency._preliminary_find_check.<locals>.search_lib_dirs.<locals>.<genexpr>r   Tc                 3  r   r   r   rP   r   r'   r(   r   *  r   F)ro   r"   r   r_   r`   rb   r   r   )r`   r   Zcm_dirr   k)r   r   r1   r   r(   search_lib_dirs  s&   



z@CMakeDependency._preliminary_find_check.<locals>.search_lib_dirsZModulesTPATHr+   z/binz\binz/sbinz\sbinc                 3  r   r   r   rP   r   r'   r(   r   M  r   z:CMakeDependency._preliminary_find_check.<locals>.<genexpr>r   z
.frameworkz.appr   Z	ResourcesVersionZ_DIRz.cmakepackagesFr`   r   r/   rI   )r   r   r_   r`   rb   ro   r    environrf   r   r   endswithr   r   r   	is_darwinr   homeexists)r1   r0   r   r   r   r   r   Z
system_envr   r   r   Zenv_pathZ	linux_regr   r'   )r   r   r0   r1   r(   r     s`   
0

z'CMakeDependency._preliminary_find_checkr   argsc           $        s  t d | j  g }tjd ur|tjg7 }|tj7 }| ||}t	| j| j
| jtj|  }|  |D ]}	t dt|	dkrF|	nd g }
|
d  g7 }
|
dd| jjg7 }
|
d| g7 }
|
d	dd
d |D g7 }
|
d| j g7 }
|
|7 }
|
| j 7 }
|
| 7 }
|
|  7 }
|
dg7 }
t|	dkrd|	g|
 }
| |
|  \}}}|dkr|	t_ nt d|	 d  d|  t d| d| d q8|dkrd S z| j| W n+ ty } z| t|}| jr g | _ g | _!d| _"|| _#W Y d }~d S d }~ww | j$d| _"| j"s d S | j%d}t|dkr8|d | _&| j&'d | (||}d}t|dkr|| jj)D ]0}	|	* } * }| d| |ksh||+ddkrzt d|	 d |	dfg}d} nqKt|dkrg }| jj), D ]\}}|* } * }|-| dr||g7 }q|rt .t/0d  dd d |D  d!  d"  d#  d$ t d% |D ]}t | qd&d | j%d'D }d(d | j%d)D }d*d | j%d+D }g }d}t1| j
}|| dd,}|D ]}	|	* |v r||	*  }q
|r#||	g7 }d}q
t|dkrd-d |D | | _ g | _!|D ]+}t2|| j| j
| j3d.} |  j!| j47  _!|  j d/d | j5D 7  _ |  j | j67  _ q=t d0   t d1|  t d2|  t d3|  d S d| _"| d4 t7| jj)8 g }g }!g }"|D ]c\}	}#|	| jj)vr|#st .d5t 9| :|	d6t 9 d7 q| d8| :|	 t7| jj)8 |s|  j;|	g7  _;t2|	| j| j
| j3 fd9d:d;} || j57 }|!| j67 }!|"| j4| j< 7 }"qt=t>|}t=t>|!}!t=t>|"}"t d1|  t d<|!  t d3|"  |!d=d |D  | _ |"| _!d S )>Nz7
Determining dependency {!r} with CMake executable {!r}r   r   r   z-DNAME=z
-DARCHS={}rd   z
-DVERSION=z
-DCOMPS={}c                 S  s   g | ]}|d  qS )r   r'   rP   r'   r'   r(   rT     r\   z/CMakeDependency._detect_dep.<locals>.<listcomp>z	-DSTATIC=r   r   zCMake failed for generator z and package r   r   r   r   FZPACKAGE_FOUNDZPACKAGE_VERSIONz"' z::r+   zGuessed CMake target ''TzL                    Could not find and exact match for the CMake dependency zd.

                    However, Meson found the following partial matches:

                        c                 S  s   g | ]}|j qS r'   r   rP   r'   r'   r(   rT     s    a  

                    Using imported is recommended, since this approach is less error prone
                    and better supported by Meson. Consider explicitly specifying one of
                    these in the dependency call with:

                        dependency('z', modules: ['zS::<name>', ...])

                    Meson will now continue to use the old-style z_LIBRARIES CMake
                    variables to extract the dependency information since no explicit
                    target is currently specified.

                z(More info for the partial match targets:c                 S     g | ]}|r|qS r'   r'   rP   r'   r'   r(   rT     r\   ZPACKAGE_INCLUDE_DIRSc                 S  r   r'   r'   rP   r'   r'   r(   rT     r\   ZPACKAGE_DEFINITIONSc                 S  r   r'   r'   rP   r'   r'   r(   rT     r\   ZPACKAGE_LIBRARIES)rx   Z	optimizedZgeneralc                 S     g | ]}d | qS z-Ir'   rP   r'   r'   r(   rT         )clib_compilerc                 S  r   r   r'   rP   r'   r'   r(   rT     r   z/using old-style CMake variables for dependency zInclude Dirs:         zCompiler Definitions: zLibraries:            zCMake: failed to guess a CMake target for {}.
Try to explicitly specify one or more targets with the "modules" property.
Valid targets are:
{}zCMake: T.Optional moduleforwas not foundzCMake: invalid module {} for {}.
Try to explicitly specify one or more targets with the "modules" property.
Valid targets are:
{}c                   s   t dt | dt  dS )NzCMake: Dependencyr   r   )r   warningbold)rR   r   r'   r(   <lambda>*  s   z-CMakeDependency._detect_dep.<locals>.<lambda>)r   Znot_found_warningzCompiler Options:     c                 S  r   r   r'   rP   r'   r'   r(   rT   :  r   )?r   rx   r   rn   Zexecutable_pathr)   r-   r   r@   r   r{   ru   r   r   rz   r   r   rb   ro   r!   staticrs   r   r   r9   r   r6   r   r   r2   r   rw   compile_args	link_argsr   reasonZvar_to_boolr   ry   stripr?   targetsr   replaceitemsr   r   textwrapdedentr   r   r   	librariesinclude_directoriesZpublic_compile_optsrj   keysr   rB   rr   Z
link_flagsr   rk   )$r1   r0   r   r:   r<   r   r   Zcomp_mappedr   r   r   r   r   r   ee2Zvers_rawZautodetected_module_listtgr   Zpartial_modulesr   vtgtZincDirsdefsZlibs_rawlibsZcfg_matchesis_debugZ
cm_tag_mapr   ZrtgtZcompileOptionsr   rw   r'   r   r(   r   h  s&  

  

&





$



zCMakeDependency._detect_depr   c                 C  s(   t | jd| j  }|jddd |S )NZcmake_T)parentsexist_ok)r   rq   r0   mkdir)r1   	build_dirr'   r'   r(   rz   =  s   zCMakeDependency._get_build_dir
cmake_filec                   s   |   }|d }|d }| r|  tj| dd tjjd|dd}dd	l	m
   fd
d| jD }|s=|dg7 }tdd|| }|d }|j|dd t|   |S )NzCMakeCache.txtZ
CMakeFilesT)ignore_errorszmesonbuild.dependencies.datazutf-8)encodingr   language_mapc                   s   g | ]
}| v r | qS r'   r'   rP   r  r'   r(   rT   X  r   z4CMakeDependency._setup_cmake_dir.<locals>.<listcomp>NONEzt
            cmake_minimum_required(VERSION ${{CMAKE_VERSION}})
            project(MesonTemp LANGUAGES {})
        r   r4   )rz   r   unlinkshutilrmtreeas_posix	importlib	resources	read_textrV   r  re   r   r   r   rb   
write_textr   cmd_ci_includeabsolute)r1   r  r  cmake_cacheZcmake_filesZ	cmake_txtZcmake_languageZcm_filer'   r  r(   _setup_cmake_dirB  s$   	
z CMakeDependency._setup_cmake_dirr{   T.Optional[T.Dict[str, str]].T.Tuple[int, T.Optional[str], T.Optional[str]]c                 C  s   |  |}| jj|||dS )N)r{   )r  rn   call)r1   r   r  r{   r  r'   r'   r(   r   g  s   
zCMakeDependency._call_cmakec                   C  r3   )NrV   r'   r'   r'   r'   r(   	log_triedn  s   zCMakeDependency.log_triedc                   s6    fdd j D }tt|}|rdd| S dS )Nc                   s   g | ]}  |qS r'   )rB   rP   r5   r'   r(   rT   s  r   z/CMakeDependency.log_details.<locals>.<listcomp>z	modules: z, r+   )rr   r   rk   rb   )r1   r:   r'   r5   r(   log_detailsr  s
   zCMakeDependency.log_details)rV   	pkgconfig
configtoolinternaldefault_valuepkgconfig_definerV   r$  r%  r&  r'  r(  r   c                C  sV   |r| j d urz| j j| }W n	 ty   Y nw d|S |d ur$|S td| )Nrd   z9Could not get cmake variable and no default provided for )rs   varsKeyErrorrb   r   )r1   rV   r$  r%  r&  r'  r(  r  r'   r'   r(   get_variabley  s   
zCMakeDependency.get_variable)r.   r   r/   r   r/   r   )r/   r   )r:   r;   r<   r;   r/   r;   )rA   r   r/   r   r   )r0   r   rC   rD   rE   rF   rG   r,   rH   rI   r/   rJ   )r   r   r/   r   )r`   r   r/   r   r   )
r0   r   r   r   r   r   r   r   r/   rI   )r0   r   r   r   r:   r;   r<   r;   r   r   r/   rJ   )r/   r   )r  r   r/   r   r8   )r   r   r  r   r{   r  r/   r   )rV   r,   r$  r,   r%  r,   r&  r,   r'  r,   r(  r   r/   r   ) r#   r$   r%   r
   r*   r&   rt   r   r-   r2   r6   r9   r?   r@   rB   rm   r   r|   staticmethod	functools	lru_cacher   r   r   r   rz   r  r   r"  r#  r+  __classcell__r'   r'   r   r(   r)   )   sF   
 




	

L
V



a 
V
(
r)   c                   @  s2   e Zd ZddddZddddZedddZdS )CMakeDependencyFactoryNr0   r,   r:   T.Optional[T.List[str]]c                 C  s   || _ || _d S r8   )r0   r:   )r1   r0   r:   r'   r'   r(   rm     s   
zCMakeDependencyFactory.__init__Fr   r{   r   rE   rF   rG   rH   rI   r/   r)   c                 C  s&   | j r| j |d< t| jp|||||S )Nr:   )r:   r)   r0   )r1   r0   r{   rE   rG   rH   r'   r'   r(   __call__  s   
zCMakeDependencyFactory.__call__c                   C  s   t  S r8   )r)   r"  r'   r'   r'   r(   r"    s   z CMakeDependencyFactory.log_tried)NN)r0   r,   r:   r2  r   )r0   r   r{   r   rE   rF   rG   r,   rH   rI   r/   r)   r,  )r#   r$   r%   rm   r3  r-  r"  r'   r'   r'   r(   r1    s
    r1  ).
__future__r   baser   r   r   mesonlibr   r	   r
   r   r   rV   r   r   r   r   r   r   r   r   r+   r   Zimportlib.resourcesr  pathlibr   r.  r   r_   r  r   typingTTYPE_CHECKINGr   rC   r   	envconfigr   Zinterpreter.type_checkingr   
NamedTupler   r)   r1  r'   r'   r'   r(   <module>   s2   (    m