
    ee              
         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j4                  rddlmZ ddlmZ  eej<                  ej>                  h      	 	 	 	 	 	 	 	 dUd       Z e ed<    G d de      Z! G d de      Z" G d de      Z#e#ed<    G d de      Z$ G d de      Z%e%ed<    G d de      Z& G d  d!e      Z' G d" d#e      Z( G d$ d%e      Z) G d& d'e      Z* G d( d)e      Z+ G d* d+e      Z, G d, d-e      Z- G d. d/e      Z. G d0 d1e      Z/ G d2 d3e      Z0 G d4 d5e      Z1 G d6 d7e      Z2 eej<                  ejf                  ejh                  h      	 	 	 	 	 	 	 	 dUd8       Z5e5ed9<    eej<                  ejh                  h      	 	 	 	 	 	 	 	 dUd:       Z6e6ed;<    ed<ej<                  ejf                  ejn                  ej>                  ge'd=>      xed<<   Z8 ed?ejr                  ejh                  ge!e"@      xed?<   Z: edAej<                  ejf                  ge*B      xedA<   Z; edCej<                  ejf                  ge)B      xedC<   Z< edDej<                  ejf                  ge(B      xedD<   Z= edEej<                  ejf                  ge&dFG      xedE<   Z> edHejh                  ej>                  gdIe$J      xedH<   Z? edKejr                  ejh                  ge.e/@      xedK<   Z@ edLejr                  ejh                  ge0e1@      xedL<   ZA edMej<                  ejh                  ej>                  ge2 edNdOdPgQ      R      xedM<   ZB edSej<                  ejh                  ej>                  ge2 edNdOgQ      R      xedS<   ZC edTej<                  ejh                  ej>                  ge2 edNdPgQ      R      xedT<   ZDy)V    )annotationsN   )mesonlib)mlog   )DependencyExceptionDependencyMethods)BuiltinDependencySystemDependency)CMakeDependencyCMakeDependencyFactory)ConfigToolDependency)packages)DependencyFactoryfactory_methods)PkgConfigDependency)Environment)DependencyGeneratorc           	     d   |j                  dd      }|dvrt        d| d      g }t        j                  |v r7|dk(  rd}nd}|j	                  t        j                  t        || ||	             t        j                  |v r-|j	                  t        j                  t        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   )envfor_machinekwargsmethodsr   
candidatespkgs          >/usr/lib/python3/dist-packages/mesonbuild/dependencies/misc.pynetcdf_factoryr*   %   s    
 zz*c*H..!IhZ7U"VWW02J""g-y "CC)++,?c6\def'))++OXsF]efg    r   c                        e Zd Zd fdZ xZS )DlBuiltinDependencyc                    t         |   |||       d| _        | j                  j	                  dd|      d   rd| _        y y )Nz0.62.0zDconsider checking for `dlopen` with and without `find_library('dl')`dlopenz#include <dlfcn.h>r   T)super__init__feature_sinceclib_compilerhas_functionis_found)selfnamer#   r%   	__class__s       r)   r2   zDlBuiltinDependency.__init__A   sH    sF+o**85I3OPQR DM Sr+   r8   strr#   'Environment'r%   T.Dict[str, T.Any]__name__
__module____qualname__r2   __classcell__r9   s   @r)   r-   r-   @   s    ! !r+   r-   c                        e Zd Zd fdZ xZS )DlSystemDependencyc                    t         |   |||       d| _        | j                  j	                  dd|      }| j                  j                  d|g | j                        | _        |d   r| j                  rd| _        y y y )Nr/   zdlfcn.h dlr   T	r1   r2   r3   r4   
has_headerfind_librarylibtype	link_argsr6   r7   r8   r#   r%   hr9   s        r)   r2   zDlSystemDependency.__init__J   ss    sF+o)))R=++88sBUQ4DNN DM #4r+   r:   r>   rC   s   @r)   rE   rE   I       ! !r+   rE   c                  <     e Zd Zddddddddd	d
ddZd fdZ x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)202111202011201811201611201511201307201107200805200505200203199810c                P   |j                  d      }t        	| 	  d|||       d| _        | j                  j                         dk(  r5d| _        d| _        | j                  j                         x| _        | _	        y | j                  j                         dk(  r5d| _        d| _        | j                  j                         x| _        | _	        y 	 | j                  j                  d	d
| j                  | j                  j                         | gd      d   }|r}	 | j                   |   | _        | j                  j                         dk(  rn| j                  j%                  d| j                  g       }|s*t        j&                  t        j(                  d      d       y | j                  j+                  |       d}|D ]  }| j                  j-                  |d
| j                  | gd      d   s2d| _        | j                  j+                  | j                  j                                | j                  j+                  | j                  j/                                 n | j                  s*t        j&                  t        j(                  d      d       y y y # t        j                  $ r7}t        j                  d       t        j                  |       d }Y d }~d }~ww xY w# t"        $ r5 t        j                  d|        |d	k(  rt        j                  d       Y y w xY w)Nr   openmpr   FnagforrS   Tpgi_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clang-cllibompzWARNING:z-OpenMP found but libomp for clang-cl missing.)zomp.hz	omp_lib.h)dependenciesre   zOpenMP found but omp.h missing.)r   r1   r2   r6   r4   get_idversionopenmp_flagscompile_argsrM   
get_definer#   r   EnvironmentExceptionr   debugVERSIONSKeyErrorrK   logyellowextendrJ   openmp_link_flags)
r7   environmentr%   r   openmp_dateeclangcl_openmp_link_argsheader_namesr8   r9   s
            r)   r2   zOpenMPDependency.__init__e   s   ::j);J$$&(2 DL DM151C1C1P1P1RRD$$&%/ DL DM151C1C1P1P1RRD	,,772txx););)H)H)JTFbf 8 hhikK #}}[9 !!((*j8+/+=+=+J+J8UYU]U]_a+b(/HHT[[46ef%%&>? 2L$ %%00r488SWRXhl0mnop$(DM%%,,T-?-?-L-L-NONN))$*<*<*N*N*PQ ==Z02ST !3  ,, 	JJEFJJqMK	  

G}UV)+JJ   E  F	s+   AJ K' K$-,KK$';L%$L%ru   r<   r%   r=   returnNone)r?   r@   rA   ro   r2   rB   rC   s   @r)   rR   rR   U   s9     !H3U 3Ur+   rR   r`   c                        e Zd Zd fdZ xZS )ThreadDependencyc                    t         |   |||       d| _        | j                  sg | _        g | _        y | j                  j                  |      | _        | j                  j                  |      | _        y )NT)r1   r2   r6   r4   rk   rM   thread_flagsthread_link_flagsr7   r8   ru   r%   r9   s       r)   r2   zThreadDependency.__init__   sf    {F3 !! "DDN $ 2 2 ? ? LD!//AA+NDNr+   )r8   r;   ru   r<   r%   r=   r{   r|   r>   rC   s   @r)   r~   r~      s    
O 
Or+   r~   c                        e Zd Zd fdZ xZS )BlocksDependencyc                   t         |   d||       d| _        d| _        | j                  j
                  | j                     j                         rg | _        g | _	        nvdg| _        dg| _	        | j                  j                  dd|d      r| j                  j                  d	|g       s*t        j                  t        j                  d
      d       y d}| j                  j!                  || j                  | j                  z         5 }|j"                  dk7  r3t        j                  t        j                  d
      d       	 d d d        y d| _        d d d        y # 1 sw Y   y xY w)NblocksFz-fblocksz-lBlocksRuntimezBlock.hrG   Trd   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.)r1   r2   r8   r6   r#   machinesr$   	is_darwinrk   rM   r4   rJ   rK   r   rq   redcompile
returncode)r7   ru   r%   sourcepr9   s        r)   r2   zBlocksDependency.__init__   s;   ;7	88T--.88: "DDN!+D/0DN%%00B[_0`%%22?KQST(+-GH ''4;L;Lt~~;]'^ 	!bc||q (+-Z[	! 	!
 !DM	! 	! 	!s   :E E  E)rz   r>   rC   s   @r)   r   r      s    ! !r+   r   r   c                  6     e Zd ZdgZdZdZd fdZddZ xZS )PcapDependencyConfigToolzpcap-configz--helpc                    t         |   |||       | j                  sy | j                  dgd      | _        | j                  dgd      | _        | j                  | j                         | _        y y N--cflagsrk   --libsrM   )r1   r2   r6   get_config_valuerk   rM   ri   get_pcap_lib_versionr   s       r)   r2   z!PcapDependencyConfigTool.__init__   sj    {F3}} 11:,O..z;G<<446DL  r+   c                *   | j                   j                  j                  | j                        sy | j                  j                  ddd| j                   g | g      }t        j                  ddt        |            }t        j                  dd|      }|S )Npcap_lib_versionstringz#include <pcap.h>zlibpcap version rG   z -- Apple version.*$)	r#   r   matches_build_machiner$   r4   get_return_valueresubr;   )r7   vs     r)   r   z-PcapDependencyConfigTool.get_pcap_lib_version   s     xx  66t7G7GH//0BH0CTXXrTXSY[FF&CF3FF*B2r+   r8   r;   ru   r<   r%   r=   )r{   T.Optional[str])	r?   r@   rA   tools	tool_nameskip_versionr2   r   rB   rC   s   @r)   r   r      s     OEI L7r+   r   c                  *     e Zd ZdgZdZd fdZ xZS )CupsDependencyConfigToolzcups-configc                    t         |   |||       | j                  sy | j                  dgd      | _        | j                  ddgd      | _        y )Nr   rk   z	--ldflagsr   rM   r1   r2   r6   r   rk   rM   r   s       r)   r2   z!CupsDependencyConfigTool.__init__   sN    {F3}} 11:,O..X/FTr+   r   r?   r@   rA   r   r   r2   rB   rC   s   @r)   r   r      s    OEIU Ur+   r   c                  *     e Zd ZdgZdZd fdZ xZS )LibWmfDependencyConfigToolzlibwmf-configc                    t         |   |||       | j                  sy | j                  dgd      | _        | j                  dgd      | _        y r   r   r   s       r)   r2   z#LibWmfDependencyConfigTool.__init__  sK    {F3}} 11:,O..z;Gr+   r   r   rC   s   @r)   r   r      s    EIH Hr+   r   c                  *     e Zd ZdgZdZd fdZ xZS )LibGCryptDependencyConfigToolzlibgcrypt-configc                    t         |   |||       | j                  sy | j                  dgd      | _        | j                  dgd      | _        | j                  dgd      d   | _        y Nr   rk   r   rM   z	--versionri   r   r1   r2   r6   r   rk   rM   ri   r   s       r)   r2   z&LibGCryptDependencyConfigTool.__init__  f    {F3}} 11:,O..z;G,,k]IFqIr+   r   r   rC   s   @r)   r   r   	  s     E"IJ Jr+   r   c                  *     e Zd ZdgZdZd fdZ xZS )GpgmeDependencyConfigToolzgpgme-configz
gpg-configc                    t         |   |||       | j                  sy | j                  dgd      | _        | j                  dgd      | _        | j                  dgd      d   | _        y r   r   r   s       r)   r2   z"GpgmeDependencyConfigTool.__init__  r   r+   r   r   rC   s   @r)   r   r     s    EIJ Jr+   r   c                        e Zd Zd fdZ xZS )ShadercDependencyc                f   t         |   d||       d}d}||g}| j                  r|j                          | j	                         }|D ]f  }|j                  ||g       | _        | j                  (d| _        | j                  r+||k7  r&t        j                  d|d| j                  d        y  y )Nshadercshaderc_combinedshaderc_sharedTzStatic library z not found for dependency z, may not be statically linked)r1   r2   staticreverseget_compilerrK   rM   r6   r   warningr8   )	r7   ru   r%   
static_lib
shared_liblibscclibr9   s	           r)   r2   zShadercDependency.__init__'  s    K8'
%
J';;LLN  		C__S+rBDN~~) $;;3*#4LL?:.@Z$(II=0N"P Q 		r+   )ru   r<   r%   r=   r>   rC   s   @r)   r   r   %  s     r+   r   c                  2     e Zd ZdZdZg dZdd fdZ xZS )CursesConfigToolDependencyzUse the curses config tools.zcurses-config)zncursesw6-configzncursesw5-configzncurses6-configzncurses5-configzncurses5.4-configc                    t         |   ||||       | j                  sy | j                  dgd      | _        | j                  dgd      | _        y r   r   )r7   r8   r#   r%   r   r9   s        r)   r2   z#CursesConfigToolDependency.__init__G  sM    sFH5}} 11:,O..z;Gr+   N)r8   r;   r#   r<   r%   r=   r   r   )r?   r@   rA   __doc__toolr   r2   rB   rC   s   @r)   r   r   ?  s    &DoEH Hr+   r   c                  $     e Zd ZdZd fdZ x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.
    c           	        t         |   |||       ddgfdddgfdg dfdd	gfg}|D ]  \  }}| j                  j                  ||g       }|r|D ]  }| j                  j	                  |d
|      }	|	d   s'd| _        || _        |j                  d      r=| j                  j                  dd| d|g | g      \  }
}|
j                  d      | _
        |j                  d      rZ| j                  j                  dd| d|g | g      \  }}| j                  j                  dd| d|g | g      \  }}| d| | _
        |j                  d      }|rG| j                  r&t        j                  | j                  |      | _        nt        j                  d       | j
                  sVt        j                   d|       t        j                   d|        n | j
                  s y  y )Npdcurseszpdcurses/curses.hncurseswzncursesw/ncurses.h	ncurses.hncurses)zncurses/ncurses.hzncurses/curses.hr   curseszcurses.hrG   r   TNCURSES_VERSIONz
#include <>"PDC_VER_MAJORPDC_VER_MINOR.ri   z6Cannot determine version of curses to compare against.zCurses library:zCurses header:)r1   r2   r4   rK   rJ   r6   rM   
startswithrl   stripri   r   r   version_comparer   r   rn   )r7   r8   r#   r%   r'   r   headerslheaderrO   r   _v_majorv_minorreqr9   s                  r)   r2   zCursesSystemDependency.__init__X  s   sF+ -.//=>OP%	

 '  	LC""//S"=A% "F**55fb#FAt(,)* >>)4#'#5#5#@#@ARV`ag`hhiTjloqsvzu{#|DAq+,773<DL>>*5)-););)F)FZdekdllmXnpsuwz~y  *AJGQ)-););)F)FZdekdllmXnpsuwz~y  *AJGQ.5Yay+ADL %jj3#||080H0HWZ0[ $-e f== JJ'8!< JJ'7@!7"8 }}A 	r+   r:   )r?   r@   rA   r   r2   rB   rC   s   @r)   r   r   O  s    + +r+   r   c                        e Zd Zd fdZ xZS )IconvBuiltinDependencyc                    t         |   |||       d| _        d}| j                  j	                  ||      d   rd| _        y y )N)0.60.0zKconsider checking for `iconv_open` with and without `find_library('iconv')`z9#include <iconv.h>

int main() {
    iconv_open("","");
}r   Tr1   r2   r3   r4   linksr6   r7   r8   r#   r%   coder9   s        r)   r2   zIconvBuiltinDependency.__init__  sH    sF+vR##D#.q1 DM 2r+   r:   r>   rC   s   @r)   r   r         ! !r+   r   c                        e Zd Zd fdZ xZS )IconvSystemDependencyc                    t         |   |||       d| _        | j                  j	                  dd|      }| j                  j                  d|g | j                        | _        |d   r| j                  rd| _        y y y )N)r   zIconsider checking for `iconv_open` with and without find_library('iconv')ziconv.hrG   iconvr   TrI   rN   s        r)   r2   zIconvSystemDependency.__init__  ss    sF+t)))R=++88#r4<<XQ4DNN DM #4r+   r:   r>   rC   s   @r)   r   r     rP   r+   r   c                        e Zd Zd fdZ xZS )IntlBuiltinDependencyc                    t         |   |||       d| _        d}| j                  j	                  ||      d   rd| _        y y )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   s        r)   r2   zIntlBuiltinDependency.__init__  sH    sF+sY##D#.q1 DM 2r+   r:   r>   rC   s   @r)   r   r     r   r+   r   c                        e Zd Zd fdZ xZS )IntlSystemDependencyc                x   t         |   |||       d| _        | j                  j	                  dd|      }| j                  j                  d|g | j                        | _        |d   rR| j                  rEd| _        | j                  r1| j                  t        || j                  ddi            sd| _        y y y y y )	Nr   z	libintl.hrG   intlr   Tr   F)r1   r2   r3   r4   rJ   rK   rL   rM   r6   r   _add_sub_dependencyiconv_factoryr$   rN   s        r)   r2   zIntlSystemDependency.__init__  s    sF+s))+r3?++88b$,,WQ4DNN DM{{//c4CSCSV^`dUe0fg$)DM h  #4r+   r:   r>   rC   s   @r)   r   r     s     r+   r   c                        e Zd Zd fdZ xZS )OpensslSystemDependencyc                X   t         
|   |||       d| j                  d}| j                  j	                  dd|      d   sy | j                  j                  dd|g | g      d   | _        | j                  s| j                  j                  dd|g | g      d   }|sy |j                  d	      }d
D cg c]&  }t        |j                  d	      d      d|z   z	  dz  ( }}dj                  d |d d D              t        t        d      |d   z   dz
        z   | _        |dk(  rT| j                  t        || j                  |            r-| j                  t        || j                  |            rd| _        y | j                  j#                  |j%                  d      |g | j&                        | _        | j(                  sy | j                  sd| _        y |dk(  r/| j                  t        || j                  |            rd| _        y y |dk(  r| j                  j+                  ddd|| g      d   }|r&| j                  t-        || j                  i             rd| _        | j                  j#                  d|g | j&                        }	|	r| j(                  j/                  |	       y y y c c}w )Nsystem)methodr   zopenssl/ssl.hrG   r   OPENSSL_VERSION_STRz#include <openssl/opensslv.h>OPENSSL_VERSION_NUMBERL)         r   r        r   c              3  2   K   | ]  }t        |        y wr   )r;   ).0is     r)   	<genexpr>z3OpensslSystemDependency.__init__.<locals>.<genexpr>  s     #EqCF#Es      ar   opensslTr   libssl	libcryptozopenssl/opensslconf.hOPENSSL_THREADS)rg   rH   )r1   r2   r   r4   rJ   rl   ri   rstripintjoinchrordr   libssl_factoryr$   libcrypto_factoryr6   rK   lstriprL   rM   has_header_symbolthreads_factoryrs   )r7   r8   r#   r%   dependency_kwargsversion_hexr	  version_intsuse_threadssublibr9   s             r)   r2   z OpensslSystemDependency.__init__  s   sF+ kk
 !!,,_b#FqI ))445JLkmprtw{v|}~  A||,,778PRqsvxz  ~B  }C  D  EF  GK%,,S1KZhiUVc+"4"4S"92>!a%G4OiLi88#EL!4D#EECPSHWcdeWfLfijLjHkkDL9''sD<L<LN_(`a,,->sDDTDTVg-hi $!//<<T[[=OQTVXZ^ZfZfgDN>>{{ DMx++,=c4CSCSUf,gh$(DM i$"00BBCZ\moqsv  GK  FLB  M  NO  P"d&>&>sTXTdTdfh?i&j$(DM++88sBUNN))&1  %) js   2+J'r:   r>   rC   s   @r)   r   r     s    -2 -2r+   r   c           	        g }t         j                  |v r6g d}|D ]-  }|j                  t        j                  t
        || |             / | j                  |   j                         szt         j                  |v r+|j                  t        j                  t        d| |             t         j                  |v r+|j                  t        j                  t        d| |             |S )N)r   r   r   r   r   )r	   r   r   r    r!   r   r   
is_windowsCONFIG_TOOLr   SYSTEMr   )r#   r$   r%   r&   r'   pkgconfig_filesr(   s          r)   curses_factoryr%    s    
 13J""g-G" 	XCi//0CS#vVW	X <<$//1((G3i//0JHVY[abc##w.i//0FRUW]^_r+   r   c           	        g }t         j                  |v rdg}ddg}|j                  d| j                  j	                  t        j                  d                  r-||z   D cg c]  }t        j                  t        || |        }}n,||z   D cg c]  }t        j                  t        || |        }}|j                  |       t         j                  |v r*|j                  t        j                  t        | |             |S c c}w c c}w )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   shaderc_staticr   prefer_static)r	   r   r   coredata
get_optionr   	OptionKeyr    r!   r   rs   r#  r   r   )	r#   r$   r%   r&   r'   shared_libsstatic_libsr8   r   s	            r)   shaderc_factoryr.    s    13J""g-
 !k)+;<::h 7 78J8J?8[ \](;68 ""#6c6J 8A 8 );68 ""#6c6J 8A 8!7*)++,=sFKL88s   !#D#Dr   cupsCups)configtool_class
cmake_namerH   )builtin_classsystem_classgpgme)r1  	libgcryptlibwmfpcaplibpcap)r1  pkgconfig_namethreadsThreads)r2  r4  r   r   r  OpenSSLzOpenSSL::CryptozOpenSSL::SSL)modules)r4  cmake_classr  r  )
r#   r<   r$   z'mesonlib.MachineChoice'r%   r=   r&   zT.List[DependencyMethods]r{   zT.List['DependencyGenerator'])E
__future__r   r    r   typingTrG   r   r   baser   r	   r
   r   cmaker   r   
configtoolr   detectr   factoryr   r   	pkgconfigr   TYPE_CHECKINGru   r   r   r   r"   r*   r-   rE   rR   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"  r#  r%  r.  EXTRAFRAMEWORKcups_factoryBUILTIN
dl_factorygpgme_factorylibgcrypt_factorylibwmf_factorypcap_factoryr  r   intl_factoryopenssl_factoryr  r   r+   r)   <module>rU     sE    #  	    8 5 : ,  7 *??), #--/@/F/FGH 8- 6 ;X I. $ !+ !	!) 	!CU' CUJ & O' O!' !@ & 3 B
U3 
U
H!5 
HJ$8 JJ 4 J( 4H!5 H 4- 4n!. !	!, 	!!- !+ ".2. .2b #--/@/L/LN_NfNfgh 8- 6 ;X i, $  #--/@/G/GHI!9. 7 <Y J@ &  #4
  "3"?"?ARAaAactczcz{-	#  < 0 1 8 89%#	  %6  "3"?"?@.%  M ->  "3"?"?@2-  ) '8  "3"?"?@/'  ^ #4
  "3"?"?@-	#  < ):0667!	)  o %6 1 8 89(&	%  M #4
 1 8 89'%	#  < ):  "3":":<M<S<ST(&y;Ln:]^	)  o ->  "3":":<M<S<ST(&y;L:MN	-  ) '8  "3":":<M<S<ST(&y>:JK	'  ^r+   