o
    uJAfI                     @  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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	j!rd dl"m#Z# ddlm$Z$ ddlm%Z% ddlm&Z& G dd de#Z'eZ(ne)Z(G dd deZ*G dd de Z+G dd de(Z,G dd dee,Z-G dd dee,Z.G dd  d ee,Z/	d0d1d+d,Z0e0ed-< ed.ej1ej2ej3ge*d/ ed.< Z4dS )2    )annotationsN)Path   )mesonlibmlog   )process_method_kwDependencyMethodsDependencyTypeNameExternalDependencySystemDependency)ConfigToolDependency)packages)DependencyFactory)ExtraFrameworkDependency)PkgConfigDependency)detect_cpu_family)ExternalProgram)	TypedDict)DependencyGenerator)Environment)MachineChoicec                   @  sf   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< dS )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__ r*   r*   C/usr/lib/python3.10/site-packages/mesonbuild/dependencies/python.pyr   %   s   
 r   c                      s,   e Zd ZdgZdZdZd fd
dZ  ZS )Pybind11ConfigToolDependencyzpybind11-configTz--pkgconfigdirnamer    environmentr   kwargsT.Dict[str, T.Any]c                   s.   t  ||| | jsd S | dgd| _d S )Nz
--includescompile_args)super__init__is_foundget_config_valuer1   )selfr-   r.   r/   	__class__r*   r+   r3   C   s   z%Pybind11ConfigToolDependency.__init__)r-   r    r.   r   r/   r0   )r&   r'   r(   toolsallow_default_for_crossskip_versionr3   __classcell__r*   r*   r7   r+   r,   8   s
    r,   c                      s8   e Zd Z		dd fdd	ZdddZdddZ  ZS )BasicPythonExternalProgramNr-   r    commandT.Optional[T.List[str]]ext_progT.Optional[ExternalProgram]c                   s`   |d u rt  j||dd n|| _|j| _|j| _d | _i dddi i dddi dd| _d| _d S )NT)r>   silentFsentinelz0.0)r   r   r   r   r   r   r!   r"   r#   r$   r%   )r2   r3   r-   r>   pathcached_versioninfopure)r6   r-   r>   r@   r7   r*   r+   r3   K   s&   
z#BasicPythonExternalProgram.__init__r%   returnr   c                 C  s0   | j dkrt|dS | j dkrt|dS dS )Npython2z< 3.0python3>= 3.0T)r-   r   version_compare)r6   r%   r*   r*   r+   _check_versionh   s
   

z)BasicPythonExternalProgram._check_versionc           	      C  s  dd l }|jdd$}|  t|g }tj }d|d< tj	||d\}}}W d    n1 s2w   Y  zt
|}W n- t
jyk   d }tdt|j|jf  td t| td	 t| Y nw |d ur| |d
 rtd|| _dS dS )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	resourcesrD   get_commandr    osenvironcopyr   
Popen_safejsonloadsJSONDecodeErrorr   debugargs
returncoderM   TcastrF   )	r6   	importlibfcmdrP   pstdoutstderrrF   r*   r*   r+   sanityo   s*   



z!BasicPythonExternalProgram.sanity)NN)r-   r    r>   r?   r@   rA   )r%   r    rH   r   )rH   r   )r&   r'   r(   r3   rM   rf   r<   r*   r*   r7   r+   r=   J   s    
r=   c                   @  s   e Zd ZdddZdS )	_PythonDependencyBasepython_holder'BasicPythonExternalProgram'embedr   c                 C  sz   || _ |jd | _|jd | _|jd | _|jd | _|jd | _|jd p'|| _d | _t	| jdr8d| _
d S d	| _
d S )
Nr%   r!   r$   r   r   r   rK      r   )rj   rF   r%   r!   r$   r   r   r   r   rL   major_version)r6   rh   rj   r*   r*   r+   r3      s   	

z_PythonDependencyBase.__init__N)rh   ri   rj   r   r&   r'   r(   r3   r*   r*   r*   r+   rg          rg   c                   @  s   e Zd Z	ddddZdS )PythonPkgConfigDependencyFr-   r    r.   'Environment'r/   r0   installationri   libpcr   c                 C  s   |rt d|d n	t d|d t| ||| t| ||dd |r7| js7t d| j d | jsFt	
| jdrHg | _d S d S d S )	NzSearching for z via pkgconfig lookup in LIBPCz/ via fallback pkgconfig lookup in default pathsrj   Fz"python-zT" could not be found in LIBPC, this is likely due to a relocated python installationz< 3.8)r   r[   r   r3   rg   getr4   r%   r   r   rL   	link_args)r6   r-   r.   r/   rq   rr   r*   r*   r+   r3      s   

z"PythonPkgConfigDependency.__init__NF)
r-   r    r.   rp   r/   r0   rq   ri   rr   r   rm   r*   r*   r*   r+   ro      s    ro   c                   @  s   e Zd Zdd	d
ZdS )PythonFrameworkDependencyr-   r    r.   rp   r/   r0   rq   ri   c                 C  s*   t | ||| t| ||dd d S )Nrj   F)r   r3   rg   rs   )r6   r-   r.   r/   rq   r*   r*   r+   r3      s   z"PythonFrameworkDependency.__init__Nr-   r    r.   rp   r/   r0   rq   ri   rm   r*   r*   r*   r+   rv      rn   rv   c                   @  sN   e Zd Zdd	d
ZdddZd ddZd!ddZd"d#ddZed$ddZ	dS )%PythonSystemDependencyr-   r    r.   rp   r/   r0   rq   ri   c                 C  s   t | ||| t| ||dd | jr(t r"| j|dd n	| | nd| _	t
| jd| jd| jdg}|  jdd	 |D 7  _t re|  d
ret| jdre|  jdg7  _| jjdd|| jdsud| _	d S d S )Nrj   F)limited_apiTZ	INCLUDEPYincludeZplatincludec                 S  s   g | ]}|rd | qS )z-Ir*   ).0rD   r*   r*   r+   
<listcomp>   s    z3PythonSystemDependency.__init__.<locals>.<listcomp>64z<3.12z-DMS_WIN64=zPython.h )
extra_args)r   r3   rg   rs   r   r   
is_windowsfind_libpy_windows
find_libpyr4   
OrderedSetr$   r   r1   get_windows_python_archendswithrL   r%   clib_compiler
has_header)r6   r-   r.   r/   rq   Z	inc_pathsr*   r*   r+   r3      s$   


$
zPythonSystemDependency.__init__rH   Nonec                 C  s   | j r| jdkrd}nd}tj| jdd}|g}n d| j }d| jv r.|| jd 7 }d| jv r:|| jd 7 }g }| j	|||}|d urP|| _
d	| _d S d S )
Nrk   zpypy3-czpypy-cbasebinpythonZ	DEBUG_EXTZABIFLAGST)r   rl   rT   rD   joinr$   rs   r%   r   find_libraryrt   r4   )r6   r.   libnamelibdirlibdirslargsr*   r*   r+   r      s"   



z!PythonSystemDependency.find_libpyT.Optional[str]c                 C  s   | j dr'd| j v rdS d| j v rdS d| j v rdS td| j d d S | j dkr.dS | j d	v r5dS | j d
v r<dS td| j  d S )Nmingwx86_64i686x86aarch64z)MinGW Python built with unknown platform z, please file a bugwin32>   z	win-amd64Zwin64>   z	win-arm64z Unknown Windows Python platform )r!   
startswithr   log)r6   r*   r*   r+   r      s"   





z.PythonSystemDependency.get_windows_python_archry   r   r?   c                 C  s  | j dr| jd}| jd}| jdd}| jr'tdd| d }n|  }|jd	krS|d
kr=|dkr=td}nv|d
krJtd| d}nitd| d}n`|rY|d }tdd| d }| jj	
td}t|tstJ | jj	
td}|p|dk}	d}
td| jj	jv r| jj	jtd j}|dv rd}
|	r|
r| jdsttd t| jd| }n&| j dr| jr| jd}n| jd}t| jd| }ntd| std t| d S t|gS )!NwinZpy_version_nodotZpy_version_shortZimplementation_lowerr   libsZ	libpythonz.agccZpypyz3.8zlibpypy3-c.dllZlibpypyz-c.dllz.dllr   z.lib	buildtyper[   Fb_vscrt>   mddfrom_buildtypemtdstatic_from_buildtypeTZ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   ZLIBRARYZ	LDLIBRARYZ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$   rs   staticr   get_compileridrP   coredata
get_optionr   	OptionKey
isinstancer    optionsvaluer   warningtextwrapdedentMesonBugExceptionexistsr   format)r6   ry   ZvernumZverdotZ	imp_lowerlibpathcompr   r[   Zis_debug_buildZvscrt_debugZvscrtlibr   r*   r*   r+   get_windows_link_args  sP   


z,PythonSystemDependency.get_windows_link_argsFrP   c                 C  s   |   }|du rd| _dS t|jjj}||kr.tdt| j	d| d|  d| _dS | 
|}|du r<d| _dS || _d| _dS )z{
        Find python3 libraries on Windows and also verify that the arch matches
        what we are building for.
        NFZNeedzfor z, but found T)r   r4   r   r   	compilershostr   r   boldr-   r   rt   )r6   rP   ry   Zpyarcharchr   r*   r*   r+   r   G  s   "

z)PythonSystemDependency.find_libpy_windowsc                   C  s   dS )N	sysconfigr*   r*   r*   r*   r+   	log_tried]  s   z PythonSystemDependency.log_triedNrw   )r.   rp   rH   r   )rH   r   )ry   r   rH   r?   ru   )rP   rp   ry   r   rH   r   )rH   r    )
r&   r'   r(   r3   r   r   r   r   staticmethodr   r*   r*   r*   r+   rx      s    



<rx   rP   rp   for_machine'MachineChoice'r/   r0   rq   (T.Optional['BasicPythonExternalProgram']rH   T.List['DependencyGenerator']c              	     sn  t tjtjh|}|dd}g }|d u}|d u r#tdtj}|  |j	d dp/|j	d }tj|v r|ry|j	d d |rLt
|j	d drLd	nd
}	d| |	 }
d fdd}|t||
| ||  d urx|tt|
| || n|ttd| | tj|v r|ttd| || tj|v r| }t
|drdg|d< |ttd| || |S )Nrj   FrJ   r$   Z	LDVERSIONr%   ZLIBPCz>=3.8z-embedr~   zpython-r-   r    rP   rp   r/   r0   rq   ri   rH   'ExternalDependency'c              	     s    st td|i }d|_|S tjdd }tjdd } tjd< zt| |||dW ddd}|d| |d| S ddd}|d| |d| w )N	pkgconfigr   PKG_CONFIG_LIBDIRPKG_CONFIG_PATHTr-   r    r   rH   r   c                 S  s0   |d ur|t j| < d S | t jv rt j| = d S d S N)rT   rU   )r-   r   r*   r*   r+   set_env  s
   
z?python_factory.<locals>.wrap_in_pythons_pc_dir.<locals>.set_env)r-   r    r   r    rH   r   )r   r
   r-   rT   rU   popro   )r-   rP   r/   rq   emptyZold_pkg_libdirZold_pkg_pathr   Z
pkg_libdirr*   r+   wrap_in_pythons_pc_dirw  s   




z.python_factory.<locals>.wrap_in_pythons_pc_dirr   z>= 3z/Library/Frameworksr   Python)
r-   r    rP   rp   r/   r0   rq   ri   rH   r   )r   r	   	PKGCONFIGSYSTEMrs   r=   r   python_commandrf   rF   rL   append	functoolspartialro   r   rx   EXTRAFRAMEWORKrV   rv   )rP   r   r/   rq   methodsrj   
candidatesZfrom_installationZpkg_versionZ	pkg_embedZpkg_namer   nkwargsr*   r   r+   python_factorya  s6   



r   rJ   pybind11)configtool_classr   )
rP   rp   r   r   r/   r0   rq   r   rH   r   )5
__future__r   r   rX   rT   r   pathlibr   typingr^   r~   r   r   r   r   r	   r
   r   r   
configtoolr   detectr   factoryr   	frameworkr   r   r   r.   r   programsr   TYPE_CHECKINGtyping_extensionsr   r   r   r   r   Z_Baseobjectr,   r=   rg   ro   rv   rx   r   r   CONFIG_TOOLCMAKEZpybind11_factoryr*   r*   r*   r+   <module>   sH    A #A