o
    ºùŠeF  ã                   @  s¢   d dl mZ ddlmZmZmZ ddlmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ d d	lZd d	lZd d	lZd d	lZejrGdd
lmZ G dd„ deƒZd	S )é    )Úannotationsé   )ÚExternalDependencyÚDependencyExceptionÚDependencyTypeName)ÚPkgConfigDependencyé   )Ú
Popen_safeÚ	OptionKeyÚ	join_argsÚversion_compare)ÚExternalProgram)ÚmlogN)ÚEnvironmentc                      s\   e Zd ZU dZded< dZd ‡ fdd„Zd!dd„Zd"d#dd„Zd"d#dd„Z	d$dd„Z
‡  ZS )%ÚDubDependencyNú)T.Optional[T.Tuple[ExternalProgram, str]]Úclass_dubbinFÚnameÚstrÚenvironmentú'Environment'ÚkwargsúT.Dict[str, T.Any]c                   s6  t ƒ jtdƒ||dd |ˆ_ddlm}m} t ƒ  ¡ }t||ƒs#J ‚|ˆ_	d|v r0| 
d¡ˆ_tjd u r@tjs@ˆ ¡ t_dt_tjd u rQˆjrLtdƒ‚d	ˆ_d S tj\ˆ_}tˆjtƒs_J ‚t|d
ƒrtˆjrotd|› dƒ‚d	ˆ_d S t d |ˆj ¡ ¡¡ |‰d|v r›|d }t|tƒr”d |¡}|› d|› ‰ˆj	j‰t|j tdƒ¡ƒ‰ˆdkr°d‰nˆdkr¶d‰dˆdˆ dˆ dˆj	  ¡ d  g}	ˆ !|	¡\}
}}|
dkrüt d| ¡ d|v r÷ddˆg}t "t #ˆ¡d¡ t $t #t%|ƒ¡¡ d	ˆ_d S dT‡‡‡‡fd"d#„‰ˆj	 &¡  'd$d%¡ 'd&d'¡‰t( )|¡‰ g ˆ_*g  ˆ_+ˆ_,d	‰dU‡ ‡‡‡‡‡‡fd+d,„}d	ˆ_i }ˆ d- D ]J}|||d. < |d/ sHq9|d0 d1krZt "d2¡ d	ˆ_ d S |d. |kr‚dˆ_|d0 d3vrzt "t #|¡d4¡ d	ˆ_ d S |d ˆ_-|ˆ_.q9i }ˆ d5 D ]	}|||d6 < qŠ||vr¸d	ˆ_ˆj.d0 d7kr¯t "d8t #d7¡d9¡ n	t "d:t #ˆ¡¡ ˆjsÇt "d;|› d<¡ d S dˆ_/|ˆj.ƒsÕd	ˆ_d S || d= D ]}|| }||ƒsìd	ˆ_ d S qÛˆrt $d>t #d?¡¡ t $t #ˆƒ ¡¡ || d@ }|dA D ]	}ˆj* 0|¡ q|dB D ]}ˆj* 0dC| ¡ q|dD D ]!}dE|ˆj	j1 vr8 n|ˆj	j1 dE }ˆj* 0|› dF|› ¡ q+|dG D ]!}d|ˆj	j1 vr^ n|ˆj	j1 d }ˆj* 0|› dF|› ¡ qQ|dH r€ˆj* 0|dH ¡ |dI D ]}| 2dJ¡s’| 2dK¡r˜ˆj+ 0|¡ q„|dL D ]	}ˆj+ 0|¡ qžˆj3j4j5 6¡ }|r¶g dM¢}|dN D ]^}t7jdOkrýt8||dPdPdQœƒ}|jrý| 9¡ D ]	}ˆj* 0|¡ qÓ| :¡ D ]	}ˆj+ 0|¡ qá|j:ddRD ]	}ˆj, 0|¡ qñqº|r||v rˆj+ 0|dJ ¡ qºˆj+ 0dS| ¡ qºd S )VNÚdubÚd)Úlanguager   )Ú	DCompilerÚd_feature_argsÚrequiredTzDUB not found.Fz>1.31.1zDUB version zC is not compatible with Meson (can't locate artifacts in Dub cache)z4Determining dependency {!r} with DUB executable {!r}Úversionú ú@Z	buildtypeZdebugoptimizedzrelease-debugZminsizeÚreleaseZdescribeú--arch=ú--build=ú--compiler=éÿÿÿÿr   zDUB describe failed: ZlocallyZfetchz:is not present locally. You may try the following command:Úreturnr   c               
     s4   dddddˆdˆ  dˆj  ¡ d  d	ˆ g	} t| ƒS )
Nr   Úrunzdub-build-deepz--yesz--r#   r%   r&   r$   )ÚcompilerÚget_exelistr   )Úcmd)Údub_archÚdub_buildtypeÚmain_pack_specÚself© ú@/usr/lib/python3.10/site-packages/mesonbuild/dependencies/dub.pyÚdub_build_deep_commandm   s
   ýz6DubDependency.__init__.<locals>.dub_build_deep_commandZllvmZldcÚgccÚgdcÚpkgúT.Dict[str, str]Úboolc              	     sŠ  | d › d| d › }ˆ  ˆ | ˆ¡\}}|d u rª|s$t t |¡d¡ nvd|vr6t t |¡dt ˆ¡¡ ndˆdkrSd|vrSt t |¡d	t ˆ› d
ˆjj› ¡¡ nGd|vret t |¡dt ˆ¡¡ n5d|vr|t t |¡dt ˆ d  d¡¡¡ nd|vr‘t t |¡dt | d ¡d¡ n	t t |¡d¡ t d¡ t t ˆƒ ¡¡ dS d|vr½t t |¡dt ˆ¡¡ d‰ˆj	 
|¡ dS )Nr   r!   r   z	not foundr)   zfound but not compiled with r4   Úcompiler_versionzfound but not compiled withú-Úarchzfound but not compiled forÚplatformÚ.Úconfigurationzfound but not compiled for thezIYou may try the following command to install the necessary DUB libraries:FÚ
build_typezfound but not compiled asT)Ú_find_compatible_package_targetr   ÚerrorÚboldr)   r   ÚjoinÚlogÚwarningÚ	link_argsÚappend)r5   Zpack_idZtgt_fileÚcompatibilities)Údescriptionr,   r2   r-   Údub_comp_idr/   Úshow_buildtype_warningr0   r1   Úfind_package_target}   s<   ÿÿÿ
z3DubDependency.__init__.<locals>.find_package_targetÚpackagesr   ZactiveZ
targetTypeZdynamicLibraryz3DUB dynamic library dependencies are not supported.)ZlibraryÚsourceLibraryZstaticLibraryzfound but it isn't a libraryÚtargetsZrootPackagerM   zDUB targets of typezare not supported.z%Could not find target description forzCould not find z in DUB descriptionZlinkDependencieszKIf it is not suitable, try the following command and reconfigure Meson withz--clearcacheZbuildSettingsZdflagsZimportPathsz-IZstringImportPathsZ
import_dirú=ZversionsZmainSourceFileZsourceFilesz.libz.aZlflags)Úkernel32Zuser32Zgdi32ZwinspoolÚshell32Zole32Zoleaut32ÚuuidZcomdlg32Zadvapi32Zws2_32ZlibsÚntÚtrue)r   Úsilent)Úrawz-l)r'   r   )r5   r6   r'   r7   );ÚsuperÚ__init__r   r   Zcompilers.dr   r   Zget_compilerÚ
isinstancer)   Úgetr   r   r   Úclass_dubbin_searchedÚ
_check_dubr   Zis_foundÚdubbinr   r   r   ÚdebugÚformatÚget_pathÚlistrB   r:   r   ZcoredataZ
get_optionr
   r*   Ú_call_dubbinr@   rA   rC   r   Zget_idÚreplaceÚjsonÚloadsZcompile_argsrE   Zraw_link_argsr   r5   ÚstaticrF   ÚidÚendswithÚenvZmachinesÚhostÚ
is_windowsÚosr   Zget_compile_argsZget_link_args)r/   r   r   r   r   r   Z
_temp_compÚdubverZversion_specZdescribe_cmdÚretÚresÚerrZ	fetch_cmdrK   rL   r5   rN   ZtgtZlink_depÚbsÚflagÚpathÚverÚfilerk   ZwinlibsÚlibZpkgdepÚarg©Ú	__class__)rH   r,   r2   r-   rI   r.   r/   rJ   r1   rX   #   s   




ÿÿ


þ

/


€

þ
€îzDubDependency.__init__Újdescr6   ÚjpackrI   r'   úT.Tuple[str, T.Set[str]]c                   s  t j |d dd¡}t j |¡sdS |d }|d }|d }|d }g }	|d	kro|	 | jj¡ |  d
g¡dd… \}
}|
dkrJt 	dt 
|¡¡ dS t d|¡}|d uro| ¡ }| dd¡d  dd¡ dd¡}|	 ||g¡ tƒ }d}t  |¡D ]ƒ‰t j |ˆ|d ¡}t j |¡s“t d| ¡ qytƒ ‰ |ˆv rŸˆ  d¡ |ˆv r¨ˆ  d¡ t‡fdd„|D ƒƒr¸ˆ  d¡ t‡fdd„|D ƒƒrÈˆ  d¡ |ˆv rÑˆ  d¡ |d	ksàt‡fdd„|	D ƒƒråˆ  d¡ t‡ fdd„|D ƒƒrö|ˆ f  S t |ˆ ¡}qyd |fS )Nrs   z.dubÚbuild)NNr=   Z	buildTyper;   Úarchitecturer4   ú	--versionr   r   zFailed to run {!r}zv[0-9].[0-9][0-9][0-9].[0-9]r<   r   ÚvÚ )r=   r;   r:   r)   r8   ZtargetFileNamez&WARNING: Could not find a Dub target: r>   c                 3  ó    | ]}|ˆ v V  qd S ©Nr0   )Ú.0r;   ©Úentryr0   r1   Ú	<genexpr>r  ó   € z@DubDependency._find_compatible_package_target.<locals>.<genexpr>c                 3  r‚   rƒ   r0   )r„   r:   r…   r0   r1   r‡   u  rˆ   r:   r)   c                 3  r‚   rƒ   r0   )r„   Zcvr…   r0   r1   r‡   {  rˆ   r8   c                 3  r‚   rƒ   r0   )r„   Úkey)Úcompsr0   r1   r‡   ~  rˆ   )rl   rs   rB   ÚexistsrF   r)   r   Ú_call_compbinr   r@   rA   ÚreÚsearchÚgroupÚrsplitrc   ÚextendÚsetÚlistdirr^   ÚaddÚallÚanyÚunion)r/   rz   r{   rI   Zdub_build_pathZconfr>   Ú	platformsZarchsZcomp_versionsrn   ro   Z	d_ver_regZfrontend_versionZfrontend_idrG   Z
check_listÚtargetr0   )rŠ   r†   r1   r?   /  s^   ÿÿ





z-DubDependency._find_compatible_package_targetÚargsúT.List[str]ri   úT.Optional[T.Dict[str, str]]úT.Tuple[int, str, str]c                 C  s@   t | jtƒsJ ‚t| j ¡ | |d\}}}|j| ¡ | ¡ fS ©N)ri   )rY   r]   r   r	   Úget_commandÚ
returncodeÚstrip©r/   rš   ri   ÚpÚoutrp   r0   r0   r1   rb   …  s   zDubDependency._call_dubbinc                 C  s0   t | j ¡ | |d\}}}|j| ¡ | ¡ fS rž   )r	   r)   r*   r    r¡   r¢   r0   r0   r1   rŒ   Š  s   zDubDependency._call_compbinc                 C  sV   ddd„}|ƒ }|d u rt  dt  d¡¡ |S |\}}t  dt  | ¡ ¡d| ¡ |S )	Nr'   r   c               	   S  sÌ   t ddd} |  ¡ sd S z&t|  ¡ dg ƒdd… \}}|jdkr1t d d |  ¡ ¡¡¡ W d S W n t	t
fy>   Y d S w t d	| ¡ ¡}|rR| d
¡}| |fS t dd |  ¡ ¡› d| ¡ › ¡ d S )Nr   T)rU   r   r   r   z"Found dub {!r} but couldn't run itr    zDUB version (\d+\.\d+\.\d+.*), r   z
Found dub z but couldn't parse version in )r   Úfoundr	   rŸ   r    r   rD   r_   rB   ÚFileNotFoundErrorÚPermissionErrorr   rŽ   r¡   r   )r]   r£   r¤   Zvermatchrm   r0   r0   r1   Úfind  s(   
ÿýÿ
$ýz&DubDependency._check_dub.<locals>.findz
Found DUB:ZNOz(version %s)©r'   r   )r   rC   ZredrA   r`   )r/   r¨   r¥   r]   rm   r0   r0   r1   r\   Ž  s   
üÿzDubDependency._check_dub)r   r   r   r   r   r   )rz   r6   r{   r6   rI   r   r'   r|   rƒ   )rš   r›   ri   rœ   r'   r   r©   )Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r[   rX   r?   rb   rŒ   r\   Ú__classcell__r0   r0   rx   r1   r      s   
   
Vr   )Ú
__future__r   Úbaser   r   r   Z	pkgconfigr   Zmesonlibr	   r
   r   r   Zprogramsr   r   r   r   rl   rd   ÚtypingÚTÚTYPE_CHECKINGr   r   r   r0   r0   r0   r1   Ú<module>   s   