o
    e[N                     @  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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rdd
dlmZ d
dlmZ d
dlmZ d
dlmZ dBddZ dCddZ!dDddZ"dEd%d&Z#G d'd( d(eZ$G d)d* d*Z%G d+d, d,e%eej&d-Z'G d.d/ d/e%eej&d-Z(G d0d1 d1Z)G d2d3 d3e(Z*G d4d5 d5e(Z+G d6d7 d7e)e(Z,G d8d9 d9e'Z-G d:d; d;e'Z.G d<d= d=e)e'Z/ed>e	j0e	j1ge-e*d? ed>< Z2ed@e	j0e	j1ge.e+d? ed@< Z3edAe	j0e	j1ge/e,d? edA< Z4dS )F    )annotationsN   )DependencyExceptionDependencyMethods)ConfigToolDependency)packages)ExtraFrameworkDependency)PkgConfigDependency)DependencyFactory   )mlog)mesonlib)Compiler)MachineInfo)Environment)MissingCompilermod_inc_dirstrmodulemod_versionreturnT.List[str]c                   s   t |dd dk rg S tj |}tj rBtj|sB fddt D }t|ddD ]}t	|ddkrA|} nq2|tj|d	| gS )
N.r      c                   s&   g | ]}t jt j |r|qS  )ospathisdirjoin).0filenamer   r   ?/usr/lib/python3.10/site-packages/mesonbuild/dependencies/qt.py
<listcomp>9   s    
z,_qt_get_private_includes.<locals>.<listcomp>T)reverse   Qt)
intsplitr   r   r   r   existslistdirsortedlen)r   r   r   Zprivate_dirdirsdirnamer   r!   r"   _qt_get_private_includes)   s   
r/   qvarsT.Dict[str, str]c                 C  s   d| v r| d S | d S )NZQT_HOST_BINSZQT_INSTALL_BINSr   r0   r   r   r"   get_qmake_host_binsC   s   r3   T.Optional[str]c                 C  s   d| v r| d S |  dS )NZQT_HOST_LIBEXECSZQT_INSTALL_LIBEXECS)getr2   r   r   r"   get_qmake_host_libexecsK   s   
r6   versioninfo'MachineInfo'is_debugboolc                 C  s   d}|  r|r|d7 }| dr|d7 }| r|r|d7 }t| dr_| r_|jdkr4|d7 }|S |jdkr?|d	7 }|S |jd
krJ|d7 }|S |jdkrU|d7 }|S td|j d |S )z7Get the module suffix based on platform and debug type. d4Z_debugz	>= 5.14.0x86Z_x86x86_64Z_x86_64armz_armeabi-v7aaarch64z
_arm64-v8azAndroid target arch "z4"" for Qt5 is unknown, module detection may not work)	
is_windows
startswith	is_darwinr   Zversion_compareZ
is_androidZ
cpu_familyr   warning)r7   r8   r:   suffixr   r   r"   _get_modules_lib_suffixQ   s2   





rH   c                      s,   e Zd Zdd fddZddddZ  ZS )QtExtraFrameworkDependencyNnamer   env'Environment'kwargsT.Dict[str, T.Any]r0   r1   languager4   c                   s0   t  j||||d |dd  | _|d | _d S )NrO   r   QT_INSTALL_HEADERS)super__init__mod_nameqt_extra_include_directory)selfrJ   rK   rM   r0   rO   	__class__r   r"   rS   m   s   z#QtExtraFrameworkDependency.__init__F0with_private_headersr;   
qt_versionr   r   c                 C  s`   |   r.tj| jd}d| g}|r!|dd t|| j|D 7 }| jr,|d| j g7 }|S g S )NZHeaders-Ic                 S  s   g | ]}d | qS )r\   r   )r   r.   r   r   r"   r#   w   s    z?QtExtraFrameworkDependency.get_compile_args.<locals>.<listcomp>)foundr   r   r   Zframework_pathr/   rT   rU   )rV   rZ   r[   r   argsr   r   r"   get_compile_argsr   s   
z+QtExtraFrameworkDependency.get_compile_argsN)
rJ   r   rK   rL   rM   rN   r0   r1   rO   r4   )FrY   )rZ   r;   r[   r   r   r   )__name__
__module____qualname__rS   r_   __classcell__r   r   rW   r"   rI   l   s    rI   c                   @  sh   e Zd ZU dZded< ded< ded< dZd	ed
< d ddZd!ddZd"ddZd#ddZ	d$ddZ
dS )%_QtBasez>Mixin class for shared components between PkgConfig and Qmake.r   	link_argsz&T.Union['MissingCompiler', 'Compiler']clib_compilerrL   rK   Nr4   
libexecdirrJ   r   rM   rN   c                 C  s   || _ | | _|d | _| jdkrd| _n| j| _td|dd| _t	
t	|d| _| js;td| j d	 td|d
d| _t| jtsPtdd S )Nr>   r&   r;   private_headersFmoduleszNo z  modules specified.mainz!"main" argument must be a boolean)rJ   
capitalizeZqtnameqtver	qtpkgnameTcastr5   rj   r   ZstringlistifyZextract_as_listrequested_modulesr   qtmain
isinstancer;   )rV   rJ   rM   r   r   r"   rS      s   


z_QtBase.__init__r:   r;   libdirT.Union[str, T.List[str]]r   c                 C  sB   t |}| |}| j|| j|}|r| j|d  dS dS )Nr   TF)r   listifyget_qt_winmain_base_namerg   find_libraryrK   rf   append)rV   r:   ru   	base_nameZ
qt_winmainr   r   r"   _link_with_qt_winmain   s   

z_QtBase._link_with_qt_winmainc                 C     |rdS dS )NZqtmaindrs   r   rV   r:   r   r   r"   rx         z _QtBase.get_qt_winmain_base_namecompiler
'Compiler'c                 C  s   |  S r`   )Zget_pic_args)rV   r   r   r   r"   get_exe_args   s   z_QtBase.get_exe_argsc                 C  s   dd t| j S )Nz	modules: z, )r   r+   rr   rV   r   r   r"   log_details   s   z_QtBase.log_details)rJ   r   rM   rN   )r:   r;   ru   rv   r   r;   r:   r;   r   r   )r   r   r   r   r   r   )ra   rb   rc   __doc____annotations__rh   rS   r|   rx   r   r   r   r   r   r"   re   ~   s   
 


	
	re   c                   @  s\   e Zd ZdZddd	ZeejdddZeejdddZ	ejdddZ
dddZdS )QtPkgConfigDependencyz1Specialization of the PkgConfigDependency for Qt.rJ   r   rK   rL   rM   rN   c                   s  t | || t| | jd || d| jvrg | _g | _| jD ]Q}t| j| | j|| jd  	 s9d| _
 d S | jrg jdd}tj|d| }tj|sS|}t|| j}|D ]
} jd|  q\|  fdd	g q | jj| j  r| jr| jd t| j| jj| j d
 }	d}
|  D ]}|d|	 ks||	 ds||	 drd
}
 nq| jdd}| |
|sd| _
d S | | | _| js| jdd}|rtj|d| _| | | _ d S )NZCorerP   FZ
includedir	pkgconfigr&   r\   c                     s    S r`   r   r   modr   r"   <lambda>   s    z0QtPkgConfigDependency.__init__.<locals>.<lambda>Tz-lz.libz.aru   exec_prefixbin)!re   rS   r	   ro   rr   compile_argsrf   rK   rO   r]   is_foundrj   get_variabler   r   r   r   r/   r7   rz   Z_add_sub_dependencymachinesfor_machinerC   rs   rH   get_link_argsendswithr|   get_pkgconfig_host_binsbindirget_pkgconfig_host_libexecsrh   )rV   rJ   rK   rM   mZ
qt_inc_dirZmod_private_dirZmod_private_inc	directoryZdebug_lib_namer:   argru   prefixr   r   r"   rS      sJ   

".zQtPkgConfigDependency.__init__corer	   r   r4   c                 C     d S r`   r   r   r   r   r"   r         z-QtPkgConfigDependency.get_pkgconfig_host_binsc                 C  r   r`   r   r   r   r   r"   r      r   z1QtPkgConfigDependency.get_pkgconfig_host_libexecsr   r   r   c                 C  r   r`   r   rV   r   r   r   r   r"   get_private_includes      z*QtPkgConfigDependency.get_private_includesc                 C     dS )Nz
pkg-configr   r   r   r   r"   log_info      zQtPkgConfigDependency.log_infoNrJ   r   rK   rL   rM   rN   r   r	   r   r4   r   r   r   r   r   r   r   )ra   rb   rc   r   rS   staticmethodabcabstractmethodr   r   r   r   r   r   r   r"   r      s    
6r   )	metaclassc                   @  sV   e Zd ZdZdZd d	d
Zd!ddZd"ddZej	d#ddZ
d$ddZd%ddZdS )&QmakeQtDependencyz%Find Qt using Qmake as a config-tool.z-vrJ   r   rK   rL   rM   rN   c                   s  t | || d| j | _d| j d| j dg| _| }t|	dg }|
d| j dt| jd  g ||d< t| ||| |  sNd S | dgd}i }|D ]}| }|d	krdqY|d
d\}}	|	||< qY|	dd	 | jjj rt fdddD std | || j| | jrd S td |d }
| jd|
  |d }t|| _t|| _ | jj!"t#ddk}t#d| jj!j$v r| jj!j$t#d j%dv rd}t&| j'| jj| j( |}| jD ]{}t)j*+|
d| }| jd|  |dkr	d}n|dkrd}n|, }| jd| d | j-r7| .||}|D ]}| jd|  q+| j/0| j1| | | jt|}|rP|d  }nt2d!|| j1| | d"| d#| _ n| j3| q| jj| j( 4 r| j5r| 6||sd#| _d S d S d S d S )$Nqmakezqmake-r7   z>= z< r   -queryr^   r<   :ZQMAKE_XSPECc                 3  s    | ]}| v V  qd S r`   r   )r   sZxspecr   r"   	<genexpr>"  s    z-QmakeQtDependency.__init__.<locals>.<genexpr>)ZiosZtvosz)Building for macOS, looking for frameworkzKBuilding for macOS, couldn't find framework, falling back to library searchrQ   r\   QT_INSTALL_LIBSZ	buildtypedebugZb_vscrt>   ZmddZmtdTr&   Z	QuickTestZQMLTESTZTestZTESTLIBz-DQT_Z_LIBr   zCould not find:inF)7re   rS   rn   Z	tool_namerJ   toolscopyr   rw   r5   extendr'   r   r]   Zget_config_valuestripr(   rK   r   hostrE   anyr   r   _framework_detectrr   r   r   rz   r3   r   r6   rh   ZcoredataZ
get_optionZ	OptionKeyoptionsvaluerH   r7   r   r   r   r   upperrj   r   rg   ry   ro   logrf   rC   rs   r|   )rV   rJ   rK   rM   Z_versZstdor0   linekvincdirru   r:   Zmodules_lib_suffixr   ZmincdirZdefine_baseZpriv_incr   ZlibfilesZlibfiler   r   r"   rS     s   &
$








zQmakeQtDependency.__init__r7   r   c                 C  s.   t d| j d|}|r|ddS |S )N(z	(\.\d+)+)r   r   )researchrn   grouprstrip)rV   r7   r   r   r   r"   _sanitize_version[  s   z#QmakeQtDependency._sanitize_versionvariable_namer   c                 C  s
   d| gS )Nr   r   )rV   r   r   r   r"   get_variable_argsa  s   
z#QmakeQtDependency.get_variable_argsr   r   c                 C  r   r`   r   r   r   r   r"   r   d  r   z&QmakeQtDependency.get_private_includesr0   r1   rk   Nonec           	      C  s   |d }|  }|dd  |g|d< |D ]A}d| }td|  t|| j||| jd}| rQ| j	d|  |  j|j
| j| jd7  _|  j| 7  _qd	| _ d S d
| _t|| _t|| _d S )Nr   methodpathsr&   zLooking for qt framework rP   z-F)rZ   r[   FT)r   popr   r   rI   rK   rO   r]   r   rz   r_   rj   r7   rf   r   r   r3   r   r6   rh   )	rV   r0   rk   rM   ru   Z	fw_kwargsr   fnameZfwdepr   r   r"   r   h  s&   


z#QmakeQtDependency._framework_detectc                 C  r   )Nr   r   r   r   r   r"   r     r   zQmakeQtDependency.log_infoNr   )r7   r   r   r   )r   r   r   r   r   )r0   r1   rk   r   rM   rN   r   r   r   )ra   rb   rc   r   Zversion_argrS   r   r   r   r   r   r   r   r   r   r   r"   r      s    

V

r   c                   @  s   e Zd ZdddZdS )	Qt6WinMainMixinr:   r;   r   r   c                 C  r}   )NZQt6EntryPointdZQt6EntryPointr   r~   r   r   r"   rx     r   z(Qt6WinMainMixin.get_qt_winmain_base_nameNr   )ra   rb   rc   rx   r   r   r   r"   r         r   c                   @     e Zd Zd	ddZdS )
Qt4ConfigToolDependencyr   r   r   r   r   c                 C     g S r`   r   r   r   r   r"   r     r   z,Qt4ConfigToolDependency.get_private_includesNr   ra   rb   rc   r   r   r   r   r"   r     r   r   c                   @  r   )
Qt5ConfigToolDependencyr   r   r   r   r   c                 C     t ||| jS r`   r/   r7   r   r   r   r"   r        z,Qt5ConfigToolDependency.get_private_includesNr   r   r   r   r   r"   r     r   r   c                   @  r   )
Qt6ConfigToolDependencyr   r   r   r   r   c                 C  r   r`   r   r   r   r   r"   r     r   z,Qt6ConfigToolDependency.get_private_includesNr   r   r   r   r   r"   r     r   r   c                   @  s2   e Zd ZedddZdddZedddZdS )Qt4PkgConfigDependencyr   r	   r   r4   c              	   C  sJ   g d}|D ]}zt j| j| ddW   S  tjy"   Y qw d S )N)ZmocZuicZrccZlupdateZlreleaseZ	_locationr   )r   r   r.   r   r   ZMesonException)r   ZapplicationsZapplicationr   r   r"   r     s    z.Qt4PkgConfigDependency.get_pkgconfig_host_binsr   r   r   r   c                 C  r   r`   r   r   r   r   r"   r     r   z+Qt4PkgConfigDependency.get_private_includesc                 C  r   r`   r   r   r   r   r"   r     r   z2Qt4PkgConfigDependency.get_pkgconfig_host_libexecsNr   r   r   r	   r   r   )ra   rb   rc   r   r   r   r   r   r   r   r"   r     s    
r   c                   @  s2   e Zd ZedddZedddZdddZdS )Qt5PkgConfigDependencyr   r	   r   r   c                 C     | j ddS )NZ	host_binsr   r   r   r   r   r"   r        z.Qt5PkgConfigDependency.get_pkgconfig_host_binsc                 C  r   r`   r   r   r   r   r"   r     r   z2Qt5PkgConfigDependency.get_pkgconfig_host_libexecsr   r   r   c                 C  r   r`   r   r   r   r   r"   r     r   z+Qt5PkgConfigDependency.get_private_includesNr   r   )ra   rb   rc   r   r   r   r   r   r   r   r"   r     s    r   c                      sD   e Zd Zd fddZedddZedddZdddZ  ZS )Qt6PkgConfigDependencyrJ   r   rK   rL   rM   rN   c                   s8   t  ||| | jstd| j d d| _d S d S )Nzdetected Qt6 zC pkg-config dependency does not have proper tools support, ignoringF)rR   rS   rh   r   r   r7   r   )rV   rJ   rK   rM   rW   r   r"   rS     s
   
zQt6PkgConfigDependency.__init__r   r	   r   c                 C  r   )Nr   r   r   r   r   r   r"   r     r   z.Qt6PkgConfigDependency.get_pkgconfig_host_binsc                 C  r   )Nrh   r   r   r   r   r   r"   r     s   z2Qt6PkgConfigDependency.get_pkgconfig_host_libexecsr   r   r   c                 C  r   r`   r   r   r   r   r"   r     r   z+Qt6PkgConfigDependency.get_private_includesr   r   r   )	ra   rb   rc   rS   r   r   r   r   rd   r   r   rW   r"   r     s    r   Zqt4)Zpkgconfig_classZconfigtool_classZqt5Zqt6)r   r   r   r   r   r   r   r   )r0   r1   r   r   )r0   r1   r   r4   )r7   r   r8   r9   r:   r;   r   r   )5
__future__r   r   r   r   typingrp   baser   r   Z
configtoolr   detectr   	frameworkr   r   r	   factoryr
   r<   r   r   TYPE_CHECKING	compilersr   Z	envconfigr   environmentr   dependenciesr   r/   r3   r6   rH   rI   re   ABCMetar   r   r   r   r   r   r   r   r   Z	PKGCONFIGZCONFIG_TOOLZqt4_factoryZqt5_factoryZqt6_factoryr   r   r   r"   <module>   sj   



5L 


