o
    uJAfc                     @  s
  d dl mZ d dlZd dlZd dlZddlmZ ddlmZ ddl	m
Z
mZ ddl	mZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ ejr_ddlmZ ddlmZ eejejhdbddZ e ed< G dd deZ!G dd  d eZ"G d!d" d"eZ#e#ed#< G d$d% d%eZ$G d&d' d'eZ%e%ed(< G d)d* d*eZ&G d+d, d,eZ'G d-d. d.eZ(G d/d0 d0eZ)G d1d2 d2eZ*G d3d4 d4eZ+G d5d6 d6eZ,G d7d8 d8eZ-G d9d: d:eZ.G d;d< d<eZ/G d=d> d>eZ0G d?d@ d@eZ1G dAdB dBeZ2eejej3ej4hdbdCdDZ5e5edE< eejej4hdbdFdGZ6e6edH< edIejej3ej7ejge'dJdK edI< Z8edLej9ej4ge!e"dM edL< Z:edNejej3ge*dO edN< Z;edPejej3ge)dO edP< Z<edQejej3ge(dO edQ< Z=edRejej3ge&dSdT edR< Z>edUej4ejgdVe$dW edU< Z?edXej9ej4ge.e/dM edX< Z@edYej9ej4ge0e1dM edY< ZAedZejej4ejge2ed[d\d]gd^d_ edZ< ZBed`ejej4ejge2ed[d\gd^d_ ed`< ZCedaejej4ejge2ed[d]gd^d_ eda< ZDdS )c    )annotationsN   )mesonlib)mlog   )DependencyExceptionDependencyMethods)BuiltinDependencySystemDependency)CMakeDependencyCMakeDependencyFactory)ConfigToolDependency)packages)DependencyFactoryfactory_methods)PkgConfigDependency)Environment)DependencyGeneratorenv'Environment'for_machine'mesonlib.MachineChoice'kwargsT.Dict[str, T.Any]methodsT.List[DependencyMethods]returnT.List['DependencyGenerator']c              	   C  s   | dd}|dvrtd| dg }tj|v r/|dkr d}nd}|tjt|| ||d	 tj|v rA|tjt	d
| ||d	 |S )Nlanguagec)r   cppfortranz	Language z is not supported with NetCDF.r!   znetcdf-fortrannetcdfr   NetCDF)
getr   r   	PKGCONFIGappend	functoolspartialr   CMAKEr   )r   r   r   r   r   
candidatespkg r-   A/usr/lib/python3.10/site-packages/mesonbuild/dependencies/misc.pynetcdf_factory%   s   

r/   r"   c                         e Zd Zd	 fddZ  ZS )
DlBuiltinDependencynamestrr   r   r   r   c                   s8   t  ||| d| _| jdd|d rd| _d S d S )Nz0.62.0zDconsider checking for `dlopen` with and without `find_library('dl')`Zdlopenz#include <dlfcn.h>r   T)super__init__feature_sinceclib_compilerhas_functionis_found)selfr2   r   r   	__class__r-   r.   r6   A   s
   
zDlBuiltinDependency.__init__r2   r3   r   r   r   r   __name__
__module____qualname__r6   __classcell__r-   r-   r<   r.   r1   @       r1   c                      r0   )
DlSystemDependencyr2   r3   r   r   r   r   c                   \   t  ||| d| _| jdd|}| jd|g | j| _|d r*| jr,d| _d S d S d S )Nr4   zdlfcn.h dlr   T	r5   r6   r7   r8   
has_headerfind_librarylibtype	link_argsr:   r;   r2   r   r   hr<   r-   r.   r6   J      
zDlSystemDependency.__init__r>   r?   r-   r-   r<   r.   rE   I   rD   rE   c                      s:   e Zd Zddddddddd	d
ddZd fddZ  ZS )OpenMPDependencyz5.2z5.1z5.0z5.0-revision1z4.5z4.03.1z3.0z2.5z2.0z1.0)Z202111Z202011Z201811Z201611Z201511Z201307Z201107Z200805Z200505Z200203Z199810environmentr   r   r   r   Nonec              
     s  | d}t jd|||d d| _| j dkr*d| _d| _| j  | _| _	d S | j dkrBd| _d| _| j  | _| _	d S z| jj
d	d
| j| j | gddd }W n tjyv } ztd t| d }W Y d }~nd }~ww |rz| j| | _W n ty   td|  |d	krtd Y d S w d}|D ]"}| jj|d
| j| gddd rd| _| j | _| j | _	 nq| jsttdd d S d S d S )Nr   openmpr#   FZnagforrR   TpgiZ_OPENMPrG   disable_cacher   z,OpenMP support not available in the compilerz*Could not find an OpenMP version matching zbThis can be caused by flags such as gcc's `-fdirectives-only`, which affect preprocessor behavior.)zomp.hz	omp_lib.h)dependenciesrX   zWARNING:zOpenMP found but omp.h missing.)r%   r5   r6   r:   r8   get_idversionopenmp_flagscompile_argsrM   
get_definer   r   EnvironmentExceptionr   debugVERSIONSKeyErrorrJ   openmp_link_flagslogyellow)r;   rS   r   r   Zopenmp_dateeheader_namesr2   r<   r-   r.   r6   e   s\   



zOpenMPDependency.__init__rS   r   r   r   r   rT   )r@   rA   rB   ra   r6   rC   r-   r-   r<   r.   rQ   U   s    rQ   rU   c                      s   e Zd Zd fd	d
Z  ZS )ThreadDependencyr2   r3   rS   r   r   r   r   rT   c                   sL   t  ||| d| _| jsg | _g | _d S | j|| _| j|| _d S )NT)r5   r6   r:   r8   r]   rM   thread_flagsthread_link_flagsr;   r2   rS   r   r<   r-   r.   r6      s   
zThreadDependency.__init__)r2   r3   rS   r   r   r   r   rT   r?   r-   r-   r<   r.   ri      rD   ri   c                      r0   )
BlocksDependencyrS   r   r   r   r   rT   c                   s   t  d|| d| _d| _| jj| j  rg | _g | _	n%dg| _dg| _	| j
jdd|ddr8| j
d	|g sCttd
d d S d}| j
j|| j| j	 d#}|jdkrittd
d 	 W d    d S d| _W d    d S 1 sww   Y  d S )NblocksFz-fblocksz-lBlocksRuntimezBlock.hrG   TrW   ZBlocksRuntimezERROR:zBlocksRuntime not found.z
            int main(int argc, char **argv)
            {
                int (^callback)(void) = ^ int (void) { return 0; };
                return callback();
            })
extra_argsr   z+Compiler does not support blocks extension.)r5   r6   r2   r:   r   machinesr   	is_darwinr]   rM   r8   rJ   rK   r   rd   redcompile
returncode)r;   rS   r   sourcepr<   r-   r.   r6      s*   
"zBlocksDependency.__init__rh   r?   r-   r-   r<   r.   rm      rD   rm   rn   c                      s6   e Zd ZdgZdZdZd fd	d
ZdddZ  ZS )PcapDependencyConfigToolzpcap-configz--helpr2   r3   rS   r   r   r   c                   sV   t  ||| | jsd S | dgd| _| dgd| _| jd u r)|  | _d S d S N--cflagsr]   --libsrM   )r5   r6   r:   get_config_valuer]   rM   r[   get_pcap_lib_versionrl   r<   r-   r.   r6      s   
z!PcapDependencyConfigTool.__init__r   T.Optional[str]c                 C  sR   | j j| js
d S | jddd| j g | g}tddt|}tdd|}|S )NZpcap_lib_versionstringz#include <pcap.h>zlibpcap version rG   z -- Apple version.*$)	r   rp   matches_build_machiner   r8   get_return_valueresubr3   )r;   vr-   r-   r.   r|      s   
z-PcapDependencyConfigTool.get_pcap_lib_versionr2   r3   rS   r   r   r   )r   r}   )	r@   rA   rB   tools	tool_nameZskip_versionr6   r|   rC   r-   r-   r<   r.   rw      s    
rw   c                      (   e Zd ZdgZdZd
 fdd	Z  ZS )CupsDependencyConfigToolzcups-configr2   r3   rS   r   r   r   c                   s@   t  ||| | jsd S | dgd| _| ddgd| _d S )Nry   r]   z	--ldflagsrz   rM   r5   r6   r:   r{   r]   rM   rl   r<   r-   r.   r6      s
   z!CupsDependencyConfigTool.__init__r   r@   rA   rB   r   r   r6   rC   r-   r-   r<   r.   r          r   c                      r   )LibWmfDependencyConfigToolzlibwmf-configr2   r3   rS   r   r   r   c                   s>   t  ||| | jsd S | dgd| _| dgd| _d S rx   r   rl   r<   r-   r.   r6      s
   z#LibWmfDependencyConfigTool.__init__r   r   r-   r-   r<   r.   r      r   r   c                      r   )LibGCryptDependencyConfigToolzlibgcrypt-configr2   r3   rS   r   r   r   c                   R   t  ||| | jsd S | dgd| _| dgd| _| dgdd | _d S Nry   r]   rz   rM   z	--versionr[   r   r5   r6   r:   r{   r]   rM   r[   rl   r<   r-   r.   r6        z&LibGCryptDependencyConfigTool.__init__r   r   r-   r-   r<   r.   r      r   r   c                      s(   e Zd ZdgZdZd fd	d
Z  ZS )GpgmeDependencyConfigToolzgpgme-configz
gpg-configr2   r3   rS   r   r   r   c                   r   r   r   rl   r<   r-   r.   r6     r   z"GpgmeDependencyConfigTool.__init__r   r   r-   r-   r<   r.   r     r   r   c                      s   e Zd Zd fddZ  ZS )ShadercDependencyrS   r   r   r   c                   s   t  d|| d}d}||g}| jr|  |  }|D ])}|||g | _| jd urFd| _| jrC||krCt	d|d| j
d  d S qd S )Nshadercshaderc_combinedZshaderc_sharedTzStatic library z not found for dependency z, may not be statically linked)r5   r6   staticreverseget_compilerrK   rM   r:   r   warningr2   )r;   rS   r   
static_lib
shared_liblibscclibr<   r-   r.   r6     s$   

zShadercDependency.__init__)rS   r   r   r   r?   r-   r-   r<   r.   r     s    r   c                      s0   e Zd ZdZdZg dZdd fddZ  ZS )CursesConfigToolDependencyzUse the curses config tools.zcurses-config)zncursesw6-configzncursesw5-configzncurses6-configzncurses5-configzncurses5.4-configNr2   r3   r   r   r   r   r   r}   c                   s@   t  |||| | jsd S | dgd| _| dgd| _d S rx   r   )r;   r2   r   r   r   r<   r-   r.   r6   =  s
   z#CursesConfigToolDependency.__init__N)r2   r3   r   r   r   r   r   r}   )r@   rA   rB   __doc__toolr   r6   rC   r-   r-   r<   r.   r   5  s
    r   c                      s"   e Zd ZdZd
 fdd	Z  ZS )CursesSystemDependencya  Curses dependency the hard way.

    This replaces hand rolled find_library() and has_header() calls. We
    provide this for portability reasons, there are a large number of curses
    implementations, and the differences between them can be very annoying.
    r2   r3   r   r   r   r   c              	     s  t  ||| ddgfdddgfdg dfdd	gfg}|D ]\}}| j||g }|r|D ]}| j|d
|}	|	d rd| _|| _|dr^| jdd| d|g | g\}
}|
	d| _
|dr| jdd| d|g | g\}}| jdd| d|g | g\}}| d| | _
|d}|r| j
rt| j
|| _ntd | jrtd| td|  nq.| jr d S qd S )Npdcurseszpdcurses/curses.hncurseswzncursesw/ncurses.h	ncurses.hncurses)zncurses/ncurses.hzncurses/curses.hr   curseszcurses.hrG   r   TZNCURSES_VERSIONz
#include <>"ZPDC_VER_MAJORZPDC_VER_MINOR.r[   z6Cannot determine version of curses to compare against.zCurses library:zCurses header:)r5   r6   r8   rK   rJ   r:   rM   
startswithr^   stripr[   r%   r   version_comparer   r   r`   )r;   r2   r   r   r+   r   headerslheaderrO   r   _Zv_majorZv_minorreqr<   r-   r.   r6   N  sF   


"
""

zCursesSystemDependency.__init__r>   )r@   rA   rB   r   r6   rC   r-   r-   r<   r.   r   E  s    r   c                      r0   )
IconvBuiltinDependencyr2   r3   r   r   r   r   c                   :   t  ||| d| _d}| j||d rd| _d S d S )N)0.60.0zKconsider checking for `iconv_open` with and without `find_library('iconv')`z9#include <iconv.h>

int main() {
    iconv_open("","");
}r   Tr5   r6   r7   r8   linksr:   r;   r2   r   r   coder<   r-   r.   r6   }     
zIconvBuiltinDependency.__init__r>   r?   r-   r-   r<   r.   r   |  rD   r   c                      r0   )
IconvSystemDependencyr2   r3   r   r   r   r   c                   rF   )N)r   zIconsider checking for `iconv_open` with and without find_library('iconv')ziconv.hrG   iconvr   TrI   rN   r<   r-   r.   r6     rP   zIconvSystemDependency.__init__r>   r?   r-   r-   r<   r.   r     rD   r   c                      r0   )
IntlBuiltinDependencyr2   r3   r   r   r   r   c                   r   )Nz0.59.0zHconsider checking for `ngettext` with and without `find_library('intl')`z@#include <libintl.h>

int main() {
    gettext("Hello world");
}r   Tr   r   r<   r-   r.   r6     r   zIntlBuiltinDependency.__init__r>   r?   r-   r-   r<   r.   r     rD   r   c                      r0   )
IntlSystemDependencyr2   r3   r   r   r   r   c                   s   t  ||| d| _| jdd|}| jd|g | j| _|d r<| jr>d| _| j	r@| 
t|| jddisBd| _d S d S d S d S d S )	Nr   z	libintl.hrG   intlr   Tr   F)r5   r6   r7   r8   rJ   rK   rL   rM   r:   r   _add_sub_dependencyiconv_factoryr   rN   r<   r-   r.   r6     s   zIntlSystemDependency.__init__r>   r?   r-   r-   r<   r.   r     rD   r   c                      r0   )
OpensslSystemDependencyr2   r3   r   r   r   r   c                   s  t  ||| d| jd}| jdd|d sd S | jdd|g | gd | _| jse| jdd|g | gd   s<d S  d	  fd
ddD }ddd |d d D t	t
d|d  d  | _|dkr| t|| j|r| t|| j|rd| _d S | j|d|g | j| _| jsd S | jsd| _d S |dkr| t|| j|rd| _d S d S |dkr| jjddd|| gdd }|r| t|| ji rd| _| jd|g | j}|r| j| d S d S d S )Nsystem)methodr   zopenssl/ssl.hrG   r   ZOPENSSL_VERSION_STRz#include <openssl/opensslv.h>OPENSSL_VERSION_NUMBERLc                   s(   g | ]}t  d dd| ? d@ qS )r            )intrstrip.0iZversion_hexr-   r.   
<listcomp>  s   ( z4OpensslSystemDependency.__init__.<locals>.<listcomp>)   r      r   r   c                 s  s    | ]}t |V  qd S r   )r3   r   r-   r-   r.   	<genexpr>  s    z3OpensslSystemDependency.__init__.<locals>.<genexpr>   ar   opensslTr   libssl	libcryptozopenssl/opensslconf.hZOPENSSL_THREADS)rY   rH   )r5   r6   r   r8   rJ   r^   r[   r   joinchrordr   libssl_factoryr   libcrypto_factoryr:   rK   lstriprL   rM   has_header_symbolthreads_factoryextend)r;   r2   r   r   Zdependency_kwargsZversion_intsZuse_threadsZsublibr<   r   r.   r6     sL   
6

z OpensslSystemDependency.__init__r>   r?   r-   r-   r<   r.   r     rD   r   c              	   C  s   g }t j|v rg d}|D ]}|tt|| | q| j|  sBt j|v r2|tt	d| | t j
|v rB|ttd| | |S )N)r   r   r   r   r   )r   r&   r'   r(   r)   r   rp   
is_windowsCONFIG_TOOLr   SYSTEMr   )r   r   r   r   r+   Zpkgconfig_filesr,   r-   r-   r.   curses_factory  s   


r   r   c                   s   g }t j|v r9dg}ddg}d jtdr( fdd|| D }n fdd|| D }|| t j|v rH|	t
t  |S )	zCustom DependencyFactory for ShaderC.

    ShaderC's odd you get three different libraries from the same build
    thing are just easier to represent as a separate function than
    twisting DependencyFactory even more.
    r   r   Zshaderc_staticr   prefer_staticc                      g | ]
}t t| qS r-   r(   r)   r   r   r2   r   r   r-   r.   r         z#shaderc_factory.<locals>.<listcomp>c                   r   r-   r   r   r   r-   r.   r     r   )r   r&   r%   coredata
get_optionr   	OptionKeyr   r   r'   r(   r)   r   )r   r   r   r   r+   Zshared_libsZstatic_libsr   r-   r   r.   shaderc_factory  s   


r   r   cupsZCups)configtool_class
cmake_namerH   )Zbuiltin_classsystem_classgpgme)r   	libgcryptlibwmfpcapZlibpcap)r   Zpkgconfig_namethreadsZThreads)r   r   r   r   r   ZOpenSSLzOpenSSL::CryptozOpenSSL::SSL)modules)r   Zcmake_classr   r   )
r   r   r   r   r   r   r   r   r   r   )E
__future__r   r(   r   typingTrG   r   r   baser   r   r	   r
   cmaker   r   
configtoolr   detectr   factoryr   r   	pkgconfigr   TYPE_CHECKINGrS   r   r   r&   r*   r/   r1   rE   rQ   ri   rm   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   EXTRAFRAMEWORKZcups_factoryBUILTINZ
dl_factoryZgpgme_factoryZlibgcrypt_factoryZlibwmf_factoryZpcap_factoryr   r   Zintl_factoryZopenssl_factoryr   r   r-   r-   r-   r.   <module>   s   	; !7

1 







