
    eI                    8   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZ	ddl
mZmZ ddl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 ddlmZ ddlmZ ddlmZ ddlm Z  e	jB                  r&d dl"m#Z# ddlm$Z$ ddlm%Z% ddlm&Z&  G d de#      Z'eZ(ne)Z( G d de      Z* G d de       Z+ G d de(      Z, G d dee,      Z- G d dee,      Z. G d d ee,      Z/	 d%	 	 	 	 	 d&d!Z0e0ed"<    ed#ejb                  ejd                  ejf                  ge*$      xed#<   Z4y)'    )annotationsN)Path   )mesonlibmlog   )process_method_kwDependencyMethodsDependencyTypeNameExternalDependencySystemDependency)ConfigToolDependency)packages)DependencyFactory)ExtraFrameworkDependency)PkgConfigDependency)detect_cpu_family)ExternalProgram)	TypedDict)DependencyGenerator)Environment)MachineChoicec                  |    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   d	ed<   d	ed<   ded<   d	ed<   y)PythonIntrospectionDictzT.Dict[str, str]install_pathsboolis_pypyis_venvlink_libpythonsysconfig_pathspathsstrplatformsuffixlimited_api_suffix	variablesversionN)__name__
__module____qualname____annotations__     @/usr/lib/python3/dist-packages/mesonbuild/dependencies/python.pyr   r   %   s?    ''))##r-   r   c                  .     e Zd ZdgZdZdZd fdZ xZS )Pybind11ConfigToolDependencyzpybind11-configTz--pkgconfigdirc                r    t         |   |||       | j                  sy | j                  dgd      | _        y )Nz
--includescompile_args)super__init__is_foundget_config_valuer2   )selfnameenvironmentkwargs	__class__s       r.   r4   z%Pybind11ConfigToolDependency.__init__C   s5    {F3}} 11<..Qr-   )r8   r"   r9   r   r:   T.Dict[str, T.Any])r(   r)   r*   toolsallow_default_for_crossskip_versionr4   __classcell__r;   s   @r.   r0   r0   8   s&    E # $LR Rr-   r0   c                  8     e Zd Z	 	 d	 d fdZddZddZ xZS )BasicPythonExternalProgramc                    |t         |   ||d       n0|| _        |j                  | _        |j                  | _        d | _        i dddi i dddi dd| _        d| _        y )NT)commandsilentFsentinelz0.0)r   r   r   r   r    r!   r#   r$   r%   r&   r'   )r3   r4   r8   rE   pathcached_versioninfopure)r7   r8   rE   ext_progr;   s       r.   r4   z#BasicPythonExternalProgram.__init__K   sy    GT74@DI#++DL DI"&D  #!" ",0
	 	r-   c                    | j                   dk(  rt        j                  |d      S | j                   dk(  rt        j                  |d      S y)Npython2z< 3.0python3>= 3.0T)r8   r   version_compare)r7   r'   s     r.   _check_versionz)BasicPythonExternalProgram._check_versionh   sC    99	!++GW==YY)#++GX>>r-   c                    dd l }|j                  j                  dd      5 }| j                         t	        |      gz   }t
        j                  j                         }d|d<   t        j                  ||      \  }}}d d d        	 t        j                        }|0| j#                  |d
         rt%        j&                  d|      | _        yy# 1 sw Y   RxY w# t        j                  $ r d }t        j                  dt	        j                        |j                   fz         t        j                  d       t        j                         t        j                  d	       t        j                         Y w xY w)Nr   zmesonbuild.scriptszpython_info.pystdlibSETUPTOOLS_USE_DISTUTILS)envz.Could not introspect Python (%s): exit code %dzProgram stdout:
zProgram stderr:
r'   r   TF)importlib.resources	resourcesrH   get_commandr"   osenvironcopyr   
Popen_safejsonloadsJSONDecodeErrorr   debugargs
returncoderR   TcastrJ   )	r7   	importlibfcmdrV   pstdoutstderrrJ   s	            r.   sanityz!BasicPythonExternalProgram.sanityo   s@    	#  %%&:<LM 	BQR""$Ax/C**//#C.6C*+ ( 3 3CS AAvv		B	::f%D  3 3DO D8$?DI)	B 	B ## 	DJJG3qvv;XYXdXdJeefJJ*+JJvJJ*+JJv	s   ACC CB E=<E=)NN)r8   r"   rE   T.Optional[T.List[str]]rL   zT.Optional[ExternalProgram])r'   r"   returnr   )rn   r   )r(   r)   r*   r4   rR   rl   r@   rA   s   @r.   rC   rC   J   s     EI9=6:r-   rC   c                      e Zd ZddZy)_PythonDependencyBasec                v   || _         |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   | _        |j                  d   xs || _        d | _        t        j                  | j                  d      rd| _
        y d	| _
        y )
Nr'   r#   r&   r!   r   r   rP      r   )embedrJ   r'   r#   r&   r!   r   r   r   rQ   major_version)r7   python_holderrs   s      r.   r4   z_PythonDependencyBase.__init__   s    
)..y9%**:6&++K8"''0
$)))4 ,001ABKe26	##DLL(;!"D!"Dr-   N)ru   'BasicPythonExternalProgram'rs   r   r(   r)   r*   r4   r,   r-   r.   rp   rp      s    #r-   rp   c                  "    e Zd Z	 d	 	 	 	 	 ddZy)PythonPkgConfigDependencyc                   |rt        j                  d|d       nt        j                  d|d       t        j                  | |||       t        j                  | ||j                  dd             |r/| j                  s#t        j                  d| j                   d       | j                  s)t        j                  | j                  d      rg | _        y y y )	NzSearching for z via pkgconfig lookup in LIBPCz/ via fallback pkgconfig lookup in default pathsrs   Fz"python-zT" could not be found in LIBPC, this is likely due to a relocated python installationz< 3.8)r   ra   r   r4   rp   getr5   r'   r   r   rQ   	link_args)r7   r8   r9   r:   installationlibpcs         r.   r4   z"PythonPkgConfigDependency.__init__   s     JJx/MNOJJx/^_`$$T4fE&&t\6::gu;UVJJ$,,  0D  E  F ""x'?'?g'VDN (W"r-   NF)
r8   r"   r9   'Environment'r:   r<   r}   rv   r~   r   rw   r,   r-   r.   ry   ry      s$      % + ;W  r-   ry   c                      e Zd Z	 	 	 	 ddZy)PythonFrameworkDependencyc                    t        j                  | |||       t        j                  | ||j                  dd             y )Nrs   F)r   r4   rp   r{   )r7   r8   r9   r:   r}   s        r.   r4   z"PythonFrameworkDependency.__init__   s3     ))$k6J&&t\6::gu;UVr-   Nr8   r"   r9   r   r:   r<   r}   rv   rw   r,   r-   r.   r   r      s    W+W;WWr-   r   c                  P    e Zd Z	 	 	 	 ddZd	dZd
dZddZdddZedd       Z	y)PythonSystemDependencyc                r   t        j                  | |||       t        j                  | ||j                  dd             | j                  r:t        j                         r| j                  |d       n| j                  |       nd| _	        t        j                  | j                  j                  d      | j                  j                  d      | j                  j                  d      g      }| xj                  |D cg c]
  }|sd|z    c}z  c_        t        j                         rU| j                         j                  d	      r6t        j                   | j"                  d
      r| xj                  dgz  c_        | j$                  j'                  dd|| j                        sd| _	        y y c c}w )Nrs   F)limited_apiT	INCLUDEPYincludeplatincludez-I64z<3.12z-DMS_WIN64=zPython.h )
extra_args)r   r4   rp   r{   r   r   
is_windowsfind_libpy_windows
find_libpyr5   
OrderedSetr&   r!   r2   get_windows_python_archendswithrQ   r'   clib_compiler
has_header)r7   r8   r9   r:   r}   	inc_pathsrH   s          r.   r4   zPythonSystemDependency.__init__   sk   !!$k6B&&t\6::gu;UV ""$'''G, DM ''NN{+JJNN9%JJNN=))+ ,	
 	iHd4dTkHH  T%A%A%C%L%LT%RW_WoWoptp|p|  F  XG-0!!,,Z[UYUfUf,g!DM h Is    F4F4c                   | j                   rQ| j                  dk(  rd}nd}t        j                  j	                  | j
                  j                  d      d      }|g}nQd| j                   }d| j
                  v r|| j
                  d   z  }d| j
                  v r|| j
                  d   z  }g }| j                  j                  |||      }||| _
        d	| _        y y )
Nrr   zpypy3-czpypy-cbasebinpython	DEBUG_EXTABIFLAGST)r   rt   rZ   rH   joinr&   r{   r'   r   find_libraryr|   r5   )r7   r9   libnamelibdirlibdirslargss         r.   r   z!PythonSystemDependency.find_libpy   s    <<!!Q&#"WW\\$.."4"4V"<eDFhGt||n-Gdnn,4>>+66T^^+4>>*55G""//gN"DN DM r-   c                |   | j                   j                  d      rQd| j                   v ryd| j                   v ryd| j                   v ryt        j                  d| j                   d       y | j                   dk(  ry| j                   d	v ry| j                   d
v ryt        j                  d| j                          y )Nmingwx86_64i686x86aarch64z)MinGW Python built with unknown platform z, please file a bugwin32>   	win-amd64win64>   	win-arm64z Unknown Windows Python platform )r#   
startswithr   log)r7   s    r.   r   z.PythonSystemDependency.get_windows_python_arch   s    ==##G,4==(4==(dmm+ DT]]DUUhij]]g%]]44]]m+3DMM3DEFr-   c                   | j                   j                  d      r_| j                  j                  d      }| j                  j                  d      }| j                  j                  dd      }| j                  rt        d      d| dz  }n| j                         }|j                  d	k(  r>|d
k(  r|dk(  rt        d      }n|d
k(  rt        d| d      }nyt        d| d      }nh|r|d   }t        d      d| dz  }| j                  j                  j                  t        j                  d            }t        |t              sJ | j                  j                  j                  t        j                  d            }|xs |dk(  }	d}
t        j                  d      | j                  j                  j                  v rF| j                  j                  j                  t        j                  d         j                   }|dv rd}
|	rE|
rC| j                  j                  d      s(t#        j$                  t'        j(                  d             t        | j                  j                  d            |z  }n| j                   j                  d      rk| j                  r| j                  j                  d      }n| j                  j                  d      }t        | j                  j                  d            |z  }nt        j*                  d      |j-                         s.t#        j.                  d j1                  t        |                   y t        |      gS )!Nwinpy_version_nodotpy_version_shortimplementation_lowerr   libs	libpythonz.agccpypyz3.8zlibpypy3-c.dlllibpypyz-c.dllz.dllr   z.lib	buildtypera   Fb_vscrt>   mddmtdfrom_buildtypestatic_from_buildtypeTPy_DEBUGau                              Using a debug build type with MSVC or an MSVC-compatible compiler
                            when the Python interpreter is not also a debug build will almost
                            certainly result in a failed build. Prefer using a release build
                            type or a debug Python interpreter.
                            base_prefixr   LIBRARY	LDLIBRARYLIBDIRzDOn a Windows path, but the OS doesn't appear to be Windows or MinGW.z#Could not find Python3 library {!r})r#   r   r&   r{   staticr   get_compileridrV   coredata
get_optionr   	OptionKey
isinstancer"   optionsvaluer   warningtextwrapdedentMesonBugExceptionexistsr   format)r7   r   vernumverdot	imp_lowerlibpathcompr   ra   is_debug_buildvscrt_debugvscrtlibr   s                 r.   get_windows_link_argsz,PythonSystemDependency.get_windows_link_args  s   ==##E*^^''(:;F^^''(:;F**+A8LI{{v,9VHB)??((*77e# F*v"&'7"8"f,"&'?"@"&xt'<"="!'"6lvfXT-BBG !% 1 1 < <X=O=OP[=\ ]I%i555 HH--889K9KG9TUE%*%Bi7.BN"'K)))48I8I8Q8QQ $ 1 1 9 9(:L:LY:W X ^ ^ $]]*.K%+dnn>P>PQ[>\X__ 6  &! " t~~))-89GCC]]%%g.{{..,,Y7..,,[9t~~))(34w>C,,WY Yzz|HH:AA#c(KLCzr-   c                j   | j                         }|d| _        yt        |j                  j                  j
                        }||k7  rBt        j                  dt        j                  | j                        d| d|        d| _        y| j                  |      }|d| _        y|| _        d| _        y)z{
        Find python3 libraries on Windows and also verify that the arch matches
        what we are building for.
        NFNeedzfor z, but found T)r   r5   r   r   	compilershostr   r   boldr8   r   r|   )r7   rV   r   pyarcharchr   s         r.   r   z)PythonSystemDependency.find_libpy_windowsG  s    
 --/>!DM !7!7!<!<=6>HHVTYYtyy1T$|F83TU!DM**;7=!DMr-   c                      y)N	sysconfigr,   r,   r-   r.   	log_triedz PythonSystemDependency.log_tried]  s    r-   Nr   )r9   r   rn   None)rn   zT.Optional[str])r   r   rn   rm   r   )rV   r   r   r   rn   r   )rn   r"   )
r(   r)   r*   r4   r   r   r   r   staticmethodr   r,   r-   r.   r   r      s@    "+";W">!*(:x,  r-   r   c           	     n   t        t        j                  t        j                  h|      }|j	                  dd      }g }|d u}|*t        dt        j                        }|j                          |j                  d   j	                  d      xs |j                  d   }t        j                  |v r|r|j                  d   j	                  d      |r%t        j                  |j                  d   d      rd	nd
}	d| |	 }
	 	 	 	 dfd}|j                  t        j                  ||
| ||             X|j                  t        j                  t        |
| ||             n+|j                  t        j                  t        d| |             t        j                  |v r,|j                  t        j                  t         d| ||             t        j"                  |v rX|j%                         }t        j                  |d      rdg|d<   |j                  t        j                  t&        d| ||             |S )Nrs   FrO   r&   	LDVERSIONr'   LIBPCz>=3.8z-embedr   zpython-c                n   st        t        d      |i       }d|_        |S t        j                  j                  dd       }t        j                  j                  dd       }t        j                  d<   	 t        | |||d      dd} |d|        |d|       S # dd} |d|        |d|       w xY w)N	pkgconfigr   PKG_CONFIG_LIBDIRPKG_CONFIG_PATHTc                x    ||t         j                  | <   y | t         j                  v rt         j                  | = y y N)rZ   r[   )r8   r   s     r.   set_envz?python_factory.<locals>.wrap_in_pythons_pc_dir.<locals>.set_env  s3     ,/4BJJt,!RZZ/ "

4 0 0r-   )r8   r"   r   r"   rn   r   )r   r   r8   rZ   r[   popry   )	r8   rV   r:   r}   emptyold_pkg_libdirold_pkg_pathr   
pkg_libdirs	           r.   wrap_in_pythons_pc_dirz.python_factory.<locals>.wrap_in_pythons_pc_dirw  s    !./A+/NPSUWXE!)EJ L!#0CT!J!zz~~.?F2<

./	=4T3VZ[1
 /@-|<1
 /@-|<s   7B B4r   z>= 3z/Library/Frameworksr!   Python)
r8   r"   rV   r   r:   r<   r}   rv   rn   z'ExternalDependency')r	   r
   	PKGCONFIGSYSTEMr{   rC   r   python_commandrl   rJ   rQ   append	functoolspartialry   r   r   EXTRAFRAMEWORKr\   r   )rV   for_machiner:   r}   methodsrs   
candidatesfrom_installationpkg_version	pkg_embedpkg_namer   nkwargsr   s                @r.   python_factoryr
  a  s   
  !2!<!<>O>V>V WY_`GJJw&E02J$D01)X=T=TU##K044[Aa\EVEVW`EaK""g-%**;7;;GDJ$)h.F.F|GXGXYbGcel.msuI i[9H=5Q=Vj=, i//0FRUW]_klm %!!)"3"34MxY\^dfr"sti//0CYPSU[\]7*)++,BHcSY[ghi''72++-##K8 !66GG)++,ExQTV]_klmr-   rO   pybind11)configtool_classr   )
rV   r   r  z'MachineChoice'r:   r<   r}   z(T.Optional['BasicPythonExternalProgram']rn   zT.List['DependencyGenerator'])5
__future__r   r   r^   rZ   r   pathlibr   typingrd   r   r   r   r   r	   r
   r   r   r   
configtoolr   detectr   factoryr   	frameworkr   r   r   r9   r   programsr   TYPE_CHECKINGtyping_extensionsr   r   r   r   r   _Baseobjectr0   rC   rp   ry   r   r   r
  r   CONFIG_TOOLCMAKEpybind11_factoryr,   r-   r.   <module>r     s(   # $ $    p p ,  & / * + &??+,)()  EER#7 R$> >B#E #2  35J  *W 8:O W^-/D ^D MQ?-?!I?Ur?B % *;  "3"?"?ARAXAXY1+  'r-   