o
    uJAf8v  ã                   @  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Zd dlZd dlZ	d dl
Z
d dlmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZmZ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+ e	j,r£ddl-m.Z. ddlm/Z/ ddlm0Z0 d dl1m2Z2 G dd„ de2ƒZ3d>dd„Z4G dd„ deƒZ5G d d!„ d!e+ƒZ6G d"d#„ d#eƒZ7G d$d%„ d%e+ƒZ8G d&d'„ d'e#ƒZ9G d(d)„ d)e!ƒZ:G d*d+„ d+e+ƒZ;e;e%d,< G d-d.„ d.eƒZ<G d/d0„ d0eƒZ=e=e%d1< G d2d3„ d3e=ƒZ>e>e%d4< e'd5ej?ej@ge:e9d6 e%d7< ZAe'd8ejBejCge6e5d9 e%d8< ZDe'd:ejBejCge8e7d9 e%d:< ZEe'd;ejBej?ejCgd<e<d= e%d;< ZFdS )?é    )ÚannotationsN)ÚFeatureDeprecatedé   )ÚmesonlibÚmlog)Úget_llvm_tool_names)Úversion_compareÚversion_compare_manyÚsearch_versionÚstringlistifyÚextract_as_listé   )ÚDependencyExceptionÚDependencyMethodsÚdetect_compilerÚstrip_system_includedirsÚstrip_system_libdirsÚSystemDependencyÚExternalDependencyÚDependencyTypeName)ÚCMakeDependency)ÚConfigToolDependency)Úpackages)ÚDependencyFactory)Úthreads_factory)ÚPkgConfigDependency)ÚMachineInfo)ÚEnvironment)ÚMachineChoice)Ú	TypedDictc                   @  s   e Zd ZU ded< ded< dS )ÚJNISystemDependencyKWúT.List[str]ÚmodulesúT.Optional[str]ÚversionN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r)   r)   ú@/usr/lib/python3.10/site-packages/mesonbuild/dependencies/dev.pyr    0   s   
 r    Úenvironmentú'Environment'Úfor_machiner   ÚreturnÚstrc                 C  s&   | j | }| ¡ rdS | ¡ rdS dS )z™This is only guaranteed to work for languages that compile to machine
    code, not for languages like C# that use a bytecode and always end in .dll
    z.dllz.dylibú.so)ÚmachinesÚ
is_windowsÚ	is_darwin)r+   r-   Úmr)   r)   r*   Úget_shared_library_suffix7   s   
r5   c                      s<   e Zd Zd‡ fd	d
„Zddd„Zddd„Zddd„Z‡  ZS )ÚGTestDependencySystemÚnamer/   r+   r,   ÚkwargsúT.Dict[str, T.Any]r.   ÚNonec                   sV   t ƒ j|||dd | dd¡| _ddg| _|  t|| ji ƒ¡s%d| _d S |  	¡  d S )NÚcpp©ÚlanguageÚmainFz/usr/src/gtest/srcz"/usr/src/googletest/googletest/src)
ÚsuperÚ__init__Úgetr>   Úsrc_dirsÚ_add_sub_dependencyr   r-   Úis_foundÚdetect©Úselfr7   r+   r8   ©Ú	__class__r)   r*   r@   D   s   
zGTestDependencySystem.__init__c                 C  sÂ   | j  d| jg ¡}| j  d| jg ¡}|r4| jr|r4d| _g | _|| _| jr,|  j|7  _g | _d| _d S |  	¡ r\d| _dd„ | j
D ƒ| _g | _| jrR| j| jg| _n| jg| _d| _d S d| _d S )NÚgtestÚ
gtest_mainTc                 S  ó   g | ]}d | ‘qS ©ú-Ir)   )Ú.0Údr)   r)   r*   Ú
<listcomp>Z   ó    z0GTestDependencySystem.detect.<locals>.<listcomp>F)Úclib_compilerÚfind_libraryÚenvr>   rD   Úcompile_argsÚ	link_argsÚsourcesÚprebuiltÚdetect_srcdirÚsrc_include_dirsÚall_srcÚmain_src)rG   Zgtest_detectZgtest_main_detectr)   r)   r*   rE   M   s&   



zGTestDependencySystem.detectÚboolc                 C  sŽ   | j D ]A}tj |¡rD|| _tj tj | jd¡¡| _	tj tj | jd¡¡| _
tj tj | jd¡¡tj tj | jd¡¡g| _ dS qdS )Nzgtest-all.cczgtest_main.ccú..z
../includeTF)rB   ÚosÚpathÚexistsÚsrc_dirr   ÚFileÚfrom_absolute_fileÚjoinr\   r]   Únormpathr[   )rG   Úsr)   r)   r*   rZ   d   s   
ÿÿÿ÷
z#GTestDependencySystem.detect_srcdirc                 C  ó   | j rdS dS ©NrY   zbuilding self©rY   ©rG   r)   r)   r*   Úlog_infor   ó   zGTestDependencySystem.log_info©r7   r/   r+   r,   r8   r9   r.   r:   ©r.   r:   )r.   r^   ©r.   r/   )r%   r&   r'   r@   rE   rZ   rm   Ú__classcell__r)   r)   rH   r*   r6   C   s
    
	
r6   c                      ó   e Zd Zd	‡ fdd„Z‡  ZS )
ÚGTestDependencyPCr7   r/   r+   r,   r8   r9   c                   ó.   |dksJ ‚|  d¡rd}tƒ  |||¡ d S )NrJ   r>   rK   ©rA   r?   r@   rF   rH   r)   r*   r@   {   ó   
zGTestDependencyPC.__init__©r7   r/   r+   r,   r8   r9   ©r%   r&   r'   r@   rr   r)   r)   rH   r*   rt   y   ó    rt   c                      s(   e Zd Zd‡ fd	d
„Zddd„Z‡  ZS )ÚGMockDependencySystemr7   r/   r+   r,   r8   r9   r.   r:   c              
     s¤  t ƒ j|||dd | dd¡| _|  t|| ji ƒ¡s d| _d S | ¡ }| jr+d|d< |  t	|| j|ƒ¡}|s<d| _d S | j
 d| jg ¡}| j
 d| jg ¡}|rn| jrU|rnd| _|  j|7  _| jri|  j|7  _d| _d S dD ]\}tj |¡rÌd| _tj tj |d	¡¡}	|  jd
| d
|	 d
tj |	d¡ g7  _tj tj |d¡¡}
tj tj |d¡¡}| jr¾|  j|
|g7  _n|  j|
g7  _d| _ d S qpd| _d S )Nr;   r<   r>   FÚgmockÚ
gmock_mainT)z"/usr/src/googletest/googlemock/srcz/usr/src/gmock/srcz/usr/src/gmockr_   rN   Úincludezgmock-all.cczgmock_main.cc)r?   r@   rA   r>   rC   r   r-   rD   ÚcopyÚgtest_factoryrS   rT   rU   rW   rY   r`   ra   rb   rg   rf   rV   r   rd   re   rX   )rG   r7   r+   r8   Zgtest_kwargsÚfoundZgmock_detectZgmock_main_detectrP   Úd2r\   r]   rH   r)   r*   r@   ƒ   sF   *ó
zGMockDependencySystem.__init__c                 C  ri   rj   rk   rl   r)   r)   r*   rm   ¶   rn   zGMockDependencySystem.log_inforo   rq   )r%   r&   r'   r@   rm   rr   r)   r)   rH   r*   r{   ‚   s    3r{   c                      rs   )
ÚGMockDependencyPCr7   r/   r+   r,   r8   r9   c                   ru   )Nr|   r>   r}   rv   rF   rH   r)   r*   r@   ¿   rw   zGMockDependencyPC.__init__rx   ry   r)   r)   rH   r*   rƒ   ½   rz   rƒ   c                      sj   e Zd ZdZdZdhZd!‡ fd
d„Zd"dd„Zd#dd„Zd$dd„Z	d%dd„Z
d&d'dd„Zd(dd „Z‡  ZS ))ÚLLVMDependencyConfigToolz…
    LLVM uses a special tool, llvm-config, which has arguments for getting
    c args, cxx args, and ldargs as well as version.
    úllvm-configz-DNDEBUGr7   r/   r+   r,   r8   r9   c                   sH  t dƒ| _|j|  |¡ jr| j d¡ n| j d¡ tƒ j|||dd g | _t	 
¡ | _g | _| js5d S |  dgd¡| _tt|dƒƒ}|  |¡ tt|dƒƒ}| j|d	d
 t	 
|  dgd¡¡}t| | j¡ƒ| _t|| j| jƒ| _t| jdƒr|  |¡ n|  ¡  t|| j| jƒ| _|  | j¡| _|  t || ji ƒ¡s¢d	| _d S d S )Nr…   zllvm-config-64zllvm-config-32r;   r<   z--componentsr"   Úoptional_modulesF)Úrequiredz
--cppflagsrV   z>= 3.9)!r   Útoolsr1   Úget_for_machine_from_kwargsÚ	is_64_bitÚappendr?   r@   Úprovided_modulesr   Ú
OrderedSetÚrequired_modulesÚmodule_detailsrD   Úget_config_valuer   r   Úcheck_componentsÚlistÚ
differenceÚ(_LLVMDependencyConfigTool__cpp_blacklistrV   r   r-   r   r$   Ú_set_new_link_argsÚ_set_old_link_argsr   rW   Ú._LLVMDependencyConfigTool__fix_bogus_link_argsrC   r   )rG   r7   r+   r8   r"   Zopt_modulesÚcargsrH   r)   r*   r@   Î   s6   


þz!LLVMDependencyConfigTool.__init__Úargsr!   r.   c                 C  sx   g }|D ]5}|  d¡r| d¡r| | d¡¡ q|  d¡r4| jjj| j d }| | 	| d¡¡¡ q| |¡ q|S )aî  This function attempts to fix bogus link arguments that llvm-config
        generates.

        Currently it works around the following:
            - FreeBSD: when statically linking -l/usr/lib/libexecinfo.so will
              be generated, strip the -l in cases like this.
            - Windows: We may get -LIBPATH:... which is later interpreted as
              "-L IBPATH:...", if we're using an msvc like compilers convert
              that to "/LIBPATH", otherwise to "-L ..."
        ú-lr0   z	-LIBPATH:r;   )
Ú
startswithÚendswithr‹   ÚlstriprU   ÚcoredataÚ	compilersr-   ÚextendÚget_linker_search_args)rG   r™   Únew_argsÚargr;   r)   r)   r*   Z__fix_bogus_link_args÷   s   
z.LLVMDependencyConfigTool.__fix_bogus_link_argsÚsharedr^   r:   c                 C  s@   |rdnd}| j }d| _ z|  d|gd¡| _W || _ dS || _ w )z9Use llvm-config's --libfiles to check if libraries exist.ú--link-sharedú--link-staticTz
--libfilesÚ N)r‡   r   rW   )rG   r¤   ÚmodeÚrestorer)   r)   r*   Z__check_libfiles  s   z)LLVMDependencyConfigTool.__check_libfilesc                 C  sx  z|   dgd¡d }W n ty   t d¡ d| _Y dS w | js€|dkr€z|  d¡ W ns ty   t|| j	ƒ}|   d	gd¡d }t
t tj |d
|› ¡¡ƒ}|s]| jrW‚ d| _Y dS |   dgd¡| _tj |d ¡ |¡ d¡}| j d|› ¡ Y dS w | jr |dkr z|  d¡ W n tyŸ   | jr™‚ d| _Y dS w | jr§ddgndg}|   ddg| t| jƒ d¡| _dS )z/How to set linker args for LLVM versions >= 3.9z--shared-moderW   r   z+llvm-config --shared-mode returned an errorFNÚstaticTú--libdirzlibLLVM*ú	--ldflagsÚlibrš   r¤   r¦   ú--system-libsr¥   ú--libs)r   Ú
IndexErrorr   ÚdebugrD   rª   Ú)_LLVMDependencyConfigTool__check_libfilesr   r5   r-   ÚsortedÚglobÚiglobr`   ra   rf   r‡   rW   ÚbasenameÚrstripr   r‹   r’   rŽ   )rG   r+   r¨   Zlib_extÚlibdirÚmatchesÚlibnamerW   r)   r)   r*   r•     sL   
ýòü
þz+LLVMDependencyConfigTool._set_new_link_argsc              	   C  s¤   | j r|  g d¢t| jƒ d¡| _dS |  dgd¡d }d| j› }t |› d¡}t 	|¡D ]}| 
|¡rMd|› d tj | d	¡¡d ¡g| _ dS q/td
ƒ‚)a:  Setting linker args for older versions of llvm.

        Old versions of LLVM bring an extra level of insanity with them.
        llvm-config will provide the correct arguments for static linking, but
        not for shared-linnking, we have to figure those out ourselves, because
        of course we do.
        )r¯   r¬   r®   rW   r«   r   zlibLLVM-z.(so|dll|dylib)$z-Lz-l{}r­   z7Could not find a dynamically linkable library for LLVM.N)rª   r   r’   rŽ   rW   r$   ÚreÚcompiler`   ÚlistdirÚmatchÚformatra   Úsplitextr   r   )rG   r¸   Zexpected_nameZre_nameÚfile_r)   r)   r*   r–   U  s$   
þ
ÿýÿz+LLVMDependencyConfigTool._set_old_link_argsTr"   r‡   c                 C  sj   t t|ƒƒD ],}d}|| jvr$|r!d| _| jrtd|› ƒ‚d}n	d}n| j |¡ | j 	|| ¡ qdS )z¢Check for llvm components (modules in meson terms).

        The required option is whether the module is required, not whether LLVM
        is required.
        r§   Fz(Could not find required LLVM Component: z	(missing)z(missing but optional)N)
r³   ÚsetrŒ   rD   r‡   r   rŽ   Úaddr   r‹   )rG   r"   r‡   ÚmodÚstatusr)   r)   r*   r‘   t  s   
ÿñz)LLVMDependencyConfigTool.check_componentsc                 C  s   | j rdd | j ¡ S dS )Nz	modules: z, r§   )r   rf   rl   r)   r)   r*   Úlog_details‹  s   z$LLVMDependencyConfigTool.log_detailsrx   )r™   r!   r.   r!   )r¤   r^   r.   r:   )r+   r,   r.   r:   rp   )T)r"   r!   r‡   r^   r.   r:   rq   )r%   r&   r'   Ú__doc__Ú	tool_namer”   r@   r—   r²   r•   r–   r‘   rÆ   rr   r)   r)   rH   r*   r„   Æ   s    
)


7r„   c                      sP   e Zd Zd‡ fd	d
„Zddd„Zddd„Zddd„Zddd„Zddd„Z‡  Z	S )ÚLLVMDependencyCMaker7   r/   rU   r,   r8   r9   r.   r:   c                   sv  t t|dƒƒˆ_t t|dƒƒˆ_d ‰ | dd¡r|jjj‰ n|jjj‰ ˆ r0t	‡ fdd„dD ƒƒsGt
 ˆtdƒ||¡ g ˆ_|ˆ_t d	¡ d S tƒ j|||d
dd ˆjd u rYd S ˆjs^d S ˆjsqtˆjdƒrqˆjrqt d¡ d S ˆj d¡}ˆj d¡}t|ƒdkrŠ|d  d¡}dd„ |D ƒ| }ˆ j‡fdd„|D ƒ7  _t|ˆjˆjƒˆ_ˆ t|ˆji ƒ¡s¹dˆ_d S d S )Nr"   r†   ÚnativeFc                 3  s    | ]}|ˆ v V  qd S ©Nr)   ©rO   Úx)rŸ   r)   r*   Ú	<genexpr>š  s   € z/LLVMDependencyCMake.__init__.<locals>.<genexpr>)Úcr;   ÚcmakezYThe LLVM dependency was not found via CMake since both a C and C++ compiler are required.r;   T)r=   Úforce_use_global_compilersz< 7.0zcBefore version 7.0 cmake does not export modules for dynamic linking, cannot check required modulesÚPACKAGE_INCLUDE_DIRSÚPACKAGE_DEFINITIONSr   r   ú c                 S  rL   rM   r)   rÌ   r)   r)   r*   rQ   ¹  rR   z0LLVMDependencyCMake.__init__.<locals>.<listcomp>c                   s   g | ]	}|ˆ j vr|‘qS r)   )rV   rÌ   rl   r)   r*   rQ   º  s    )r   r   Úllvm_modulesÚllvm_opt_modulesrA   rž   rŸ   ÚbuildÚhostÚallr   r@   r   Úfound_modulesr7   r   Úwarningr?   ÚtraceparserrD   rª   r   r$   Úget_cmake_varÚlenÚsplitrV   r   r-   rC   r   )rG   r7   rU   r8   Zinc_dirsÚdefsÚtemprH   )rŸ   rG   r*   r@   ‘  s>   



þzLLVMDependencyCMake.__init__c                 C  s   dS )NzCMakeListsLLVM.txtr)   rl   r)   r)   r*   Ú_main_cmake_fileÀ  s   z$LLVMDependencyCMake._main_cmake_filer!   c                   sZ   ddd„‰dd	d
„}‡fdd„t dƒD ƒ}ˆ jr$‡ ‡fdd„t dƒD ƒ}t|t |¡dS )NÚreqr/   r.   c                 S  s   t |  d¡d ƒS )Nú-z.0)r
   Ústrip)rã   r)   r)   r*   Úver_from_sufÈ  s   z=LLVMDependencyCMake.llvm_cmake_versions.<locals>.ver_from_sufÚaÚbÚintc                 S  s(   t | d| ƒr	dS t | d| ƒrdS dS )Nú=r   ú<r   éÿÿÿÿ©r   )rç   rè   r)   r)   r*   Úversion_sorterË  s
   z?LLVMDependencyCMake.llvm_cmake_versions.<locals>.version_sorterc                   s"   g | ]}t ˆ |ƒd ƒrˆ |ƒ‘qS )z>=0rí   rÌ   )ræ   r)   r*   rQ   Ò  s   " z;LLVMDependencyCMake.llvm_cmake_versions.<locals>.<listcomp>r§   c                   s$   g | ]}t ˆ|ƒˆ jƒrˆ|ƒ‘qS r)   )r	   Úversion_reqsrÌ   ©rG   ræ   r)   r*   rQ   Ô  s   $ )Úkey)rã   r/   r.   r/   )rç   r/   rè   r/   r.   ré   )r   rï   r³   Ú	functoolsÚ
cmp_to_key)rG   rî   Zllvm_requested_versionsr)   rð   r*   Úllvm_cmake_versionsÆ  s   

z'LLVMDependencyCMake.llvm_cmake_versionsc              	   C  s`   d  d | j¡¡d  d | j¡¡d  d t| jƒ¡¡d  d |  ¡ ¡¡d  | jr,d¡gS d¡gS )	Nz -DLLVM_MESON_REQUIRED_MODULES={}ú;z -DLLVM_MESON_OPTIONAL_MODULES={}z-DLLVM_MESON_PACKAGE_NAMES={}z-DLLVM_MESON_VERSIONS={}z-DLLVM_MESON_DYLIB={}ÚOFFÚON)r¿   rf   rÕ   rÖ   r   r7   rô   rª   rl   r)   r)   r*   Ú_extra_cmake_optsÙ  s   üüz%LLVMDependencyCMake._extra_cmake_optsr"   úT.List[T.Tuple[str, bool]]Ú
componentsc                 C  st   g }|D ]3\}}| j  d|› ¡}|s+|r|  d|› d¡‚tjdt |¡ddd q|D ]	}|||fg7 }q-q|S )NZMESON_LLVM_TARGETS_zLLVM module z was not foundzOptional LLVM modulezwas not foundF)Úfatal)rÜ   rÝ   Ú_gen_exceptionr   rÛ   Úbold)rG   r"   rú   ÚresrÄ   r‡   Z
cm_targetsÚir)   r)   r*   Ú_map_module_listà  s   ÿz$LLVMDependencyCMake._map_module_listÚmodulec                 C  s"   | j  d|› ¡}|r|d S |S )NZMESON_TARGET_TO_LLVM_r   )rÜ   rÝ   )rG   r  Z	orig_namer)   r)   r*   Ú_original_module_nameî  s   z)LLVMDependencyCMake._original_module_name)r7   r/   rU   r,   r8   r9   r.   r:   rq   )r.   r!   )r"   rù   rú   rù   r.   rù   )r  r/   r.   r/   )
r%   r&   r'   r@   râ   rô   rø   r   r  rr   r)   r)   rH   r*   rÉ     s    
/


rÉ   c                      s.   e Zd ZdZd‡ fdd„Zdddd„Z‡  ZS )ÚValgrindDependencyzy
    Consumers of Valgrind usually only need the compile args and do not want to
    link to its (static) libraries.
    rU   r,   r8   r9   c                   s   t ƒ  d||¡ d S )NÚvalgrind)r?   r@   )rG   rU   r8   rH   r)   r*   r@   ú  s   zValgrindDependency.__init__NFr=   r#   Úrawr^   r.   r!   c                 C  s   g S rË   r)   )rG   r=   r  r)   r)   r*   Úget_link_argsý  s   z ValgrindDependency.get_link_args)rU   r,   r8   r9   )NF)r=   r#   r  r^   r.   r!   )r%   r&   r'   rÇ   r@   r  rr   r)   r)   rH   r*   r  õ  s    r  r  c                      rs   )
ÚZlibSystemDependencyr7   r/   r+   r,   r8   r9   c                   s  t ƒ  |||¡ ddlm} ddlm} | jj| j }| 	¡ r't
| j||fƒs3| ¡ s3| ¡ s3| ¡ r;d| _dg| _n9| j ¡ dkrGddg}nd	g}|D ]%}| j ||g | j¡}	| jjd
d|| gd}
|	rq|
d rqd| _|	| _ nqLd S | j dd| jg | g¡\}}| d¡| _d S )Nr   )ÚAppleClangCCompiler)ÚAppleClangCPPCompilerTz-lzÚmsvcZzlib1ÚzlibÚzzzlib.hr§   )Údependenciesr   ÚZLIB_VERSIONz#include <zlib.h>ú")r?   r@   Úcompilers.cr  Zcompilers.cppr	  rU   r1   r-   r3   Ú
isinstancerS   Ú
is_freebsdÚis_dragonflybsdÚ
is_androidrD   rW   Úget_argument_syntaxrT   ÚlibtypeÚ
has_headerÚ
get_definerå   r$   )rG   r7   r+   r8   r  r	  r4   Úlibsr­   ÚlÚhÚvÚ_rH   r)   r*   r@     s6   ÿÿÿ

€zZlibSystemDependency.__init__rx   ry   r)   r)   rH   r*   r    rz   r  c                      s:   e Zd Zd‡ fdd„Zedd
d„ƒZeddd„ƒZ‡  ZS )ÚJNISystemDependencyr+   r,   r8   r    c                   s  t ƒ  d|t d|¡¡ d| _| jj| j }d|jj	| j vr(t
| j|| jdƒ |jj	| j d | _| jj| _t | dg ¡¡}|D ] }|dvrbd|› d}| jrWt |¡ nt |¡ d	| _ d S qBd
|v r‚t| j|d
 ƒs‚t d| j› d|d
 › ¡ d	| _d S |j| j  ¡ | _| jsát t | jjd ¡¡ ¡ j d | _| !¡ rát d¡}|| jj v rát"j#ddd|j$gt"j%d}|j&dkrÖd}| jrÌt |¡ nt |¡ d	| _d S t |j' (¡  )¡ ¡| _|  *|¡}	|	d u rôt d¡ d	| _d S | jd }
| j+ ,d|
› ¡ | j+ ,d|
|	 › ¡ |r…| -¡ r| jd }|}nt| jdƒr2| jd d |  .|j$¡ }n| jd }|d }d|v r`| j/j0d|t1|ƒgd}|d u rZt d¡ d	| _n| j2 3|¡ d|v r…| j/j0d |t1|ƒgd}|d u rt d!¡ d	| _n| j2 3|¡ d"| _d S )#NÚjnir9   )ú0.62.0r§   Újavar"   >   ÚawtÚjvmzUnknown JNI module (ú)Fr$   zIncorrect JDK version found (z
), wanted r   r   z4/System/Library/Frameworks/JavaVM.framework/Versionsz/usr/libexec/java_homez
--failfastz--arch)ÚstdoutzJJAVA_HOME could not be discovered on the system. Please set it explicitly.zlCould not find a JDK platform include directory for your OS, please open an issue or provide a pull request.r~   rN   r­   z<= 1.8.0ZjreÚserverr#  )Ú
extra_dirszjvm library not found.r"  Újawtzjawt library not found.T)4r?   r@   ÚTÚcastÚfeature_sincerU   r1   r-   rž   rŸ   r   r7   Újavacr$   r   ÚlistifyrA   r‡   r   Úerrorr±   rD   r   Ú
propertiesÚget_java_homeÚ	java_homeÚpathlibÚPathÚshutilÚwhichÚexelistÚresolveÚparentsr3   Ú
subprocessÚrunÚ
cpu_familyÚPIPEÚ
returncoder%  Údecoderå   Ú:_JNISystemDependency__machine_info_to_platform_include_dirrV   r‹   r2   Ú#_JNISystemDependency__cpu_translaterS   rT   r/   rW   r    )rG   r+   r8   r4   r"   r  ÚmsgZproblem_java_prefixrþ   Zplatform_include_dirZjava_home_includeZjava_home_libZjava_home_lib_serverr#  r(  rH   r)   r*   r@   *  s†   

ù	$
ÿ














zJNISystemDependency.__init__Úcpur/   r.   c                 C  s   ddi}|  | | ¡S )z¢
        The JDK and Meson have a disagreement here, so translate it over. In the event more
        translation needs to be done, add to following dict.
        Úx86_64Úamd64)rA   )rB  Z	java_cpusr)   r)   r*   Z__cpu_translate  s   ÿz#JNISystemDependency.__cpu_translater4   ú'MachineInfo'r#   c                 C  sd   |   ¡ rdS |  ¡ rdS |  ¡ rdS |  ¡ rdS |  ¡ rdS |  ¡ r$dS |  ¡ r*dS |  ¡ r0dS d	S )
aA  Translates the machine information to the platform-dependent include directory

        When inspecting a JDK release tarball or $JAVA_HOME, inside the `include/` directory is a
        platform-dependent directory that must be on the target's include path in addition to the
        parent `include/` directory.
        ÚlinuxÚwin32ÚdarwinÚsolarisÚfreebsdÚnetbsdÚopenbsdÚ	dragonflyN)Úis_linuxr2   r3   Úis_sunosr  Ú	is_netbsdÚ
is_openbsdr  )r4   r)   r)   r*   Z&__machine_info_to_platform_include_dir‹  s"   z:JNISystemDependency.__machine_info_to_platform_include_dir©r+   r,   r8   r    )rB  r/   r.   r/   )r4   rE  r.   r#   )r%   r&   r'   r@   Ústaticmethodr@  r?  rr   r)   r)   rH   r*   r  )  s    Ur  r  c                      s   e Zd Zd‡ fdd„Z‡  ZS )ÚJDKSystemDependencyr+   r,   r8   r    c                   s,   t ƒ  ||¡ d| _| j tdddƒ¡ d S )N)z0.59.0r§   zjdk system dependencyr   z%Use the jni system dependency instead)r?   r@   r+  Úfeaturechecksr‹   r   )rG   r+   r8   rH   r)   r*   r@   ª  s   
ýzJDKSystemDependency.__init__rR  ry   r)   r)   rH   r*   rT  ©  s    rT  ÚjdkÚLLVM)Úcmake_classÚconfigtool_classÚllvmrJ   )Úpkgconfig_classÚsystem_classr|   r  ZZLIB)Ú
cmake_namer\  )r+   r,   r-   r   r.   r/   )GÚ
__future__r   r´   r`   r»   r2  r4  r9  Útypingr)  rò   Z%mesonbuild.interpreterbase.decoratorsr   r§   r   r   r+   r   r   r	   r
   r   r   Úbaser   r   r   r   r   r   r   r   rÐ   r   Ú
configtoolr   rE   r   Úfactoryr   Úmiscr   Ú	pkgconfigr   ÚTYPE_CHECKINGÚ	envconfigr   r   r   Ztyping_extensionsr   r    r5   r6   rt   r{   rƒ   r„   rÉ   r  r  r  rT  ÚCMAKEÚCONFIG_TOOLZllvm_factoryÚ	PKGCONFIGÚSYSTEMr€   Zgmock_factoryZzlib_factoryr)   r)   r)   r*   Ú<module>   s‚   (
6	;	 Ke&}
ü
ü
üü