o
    e/                     @  s  d dl m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
mZ ddlmZ ddlmZmZmZ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mZ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* ddl+m,Z, ej-rddlm.Z. ddlm/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl4m6Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z= ddlm>Z> d dl?m@Z@ G dd de7jAZBG dd de@ZCG dd de	ZDd!dd ZEdS )"    )annotationsN)
FeatureNew   )ExtensionModuleModuleReturnValue
ModuleInfo   )mlog)BothLibrariesBuildTargetCustomTargetIndex
ExecutableExtractedObjectsGeneratedListCustomTargetInvalidArgumentsJarStructuredSourcesSharedLibrary)are_asserts_disabled)DEPENDENCIES_KWLINK_WITH_KWSHARED_LIB_KWSTEST_KWS	OUTPUT_KWINCLUDE_DIRECTORIESSOURCES_VARARGS)ContainerTypeInfoInterpreterException	KwargInfotyped_kwargstyped_pos_args	noPosargspermittedKwargs)File)ModuleState)IncludeDirsLibTypes)
DependencyExternalLibrary)Interpreter)kwargs)SourceInputsSourceOutputs)ExternalProgramOverrideProgram)SourcesVarargsType)	TypedDictc                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
FuncTest,T.List[T.Union[Dependency, ExternalLibrary]]dependenciesboolis_parallelzT.List[LibTypes]	link_withT.List[str]	rust_argsN__name__
__module____qualname____annotations__ r?   r?   </usr/lib/python3.10/site-packages/mesonbuild/modules/rust.pyr2   *   s
   
 r2   c                   @  s>   e Zd ZU ded< ded< ded< ded< ded	< d
ed< dS )FuncBindgenr8   argsc_argszT.List[IncludeDirs]include_directorieszT.List[SourceInputs]inputstroutputr3   r4   Nr:   r?   r?   r?   r@   rA   1   s   
 rA   c                      sX  e Zd ZdZeddddZd3 fd
dZedee	e
dgeeejddedeeedg ddededdR  d4ddZee
dedeeeg dd edeeeg dd ed!eeeee	eeeeefdd"g ddd#ejeeedid$eejddd5d'd(Zed)d*eh d+ed)ee d,e
d)ge!R d-did6d1d2Z"  Z#S )7
RustModulez.A module that holds helper functions for rust.rustz0.57.0z1.0.0)Z
stabilizedinterpreterr*   returnNonec                   s0   t  | d | _| j| j| j| jd d S )N)testbindgen
proc_macro)super__init___bindgen_binmethodsupdaterM   rN   rO   )selfrJ   	__class__r?   r@   rQ   A   s   zRustModule.__init__z	rust.testz1.2.0)sincer9   T)listifydefaultrX   r6   F)rZ   stater%   rB   T.Tuple[str, BuildTarget]r+   r2   r   c                 C  s  t dd |dg D rtd|d }|d }| s!td|d }d	|v r3td
 |d	 d|v rItd |d}||d = ||= t	|D ]\}}t
|tr`|dr`||=  nqMtd| }	|g d |	d< d|	d< |j }
d|
d< |
dg |d  |
d< |
dg |d  |
d< |
d= |j }|jd |d  d	g |d< ||
d< td|j }||j t||j|j|j||j|j|j|j|

}| j| jj||f|	}t d||gS )a  Generate a rust test target from a given rust target.

        Rust puts it's unitests inside it's main source files, unlike most
        languages that put them in external files. This means that normally
        you have to define two separate targets with basically the same
        arguments to get tests:

        ```meson
        rust_lib_sources = [...]
        rust_lib = static_library(
            'rust_lib',
            rust_lib_sources,
        )

        rust_lib_test = executable(
            'rust_lib_test',
            rust_lib_sources,
            rust_args : ['--test'],
        )

        test(
            'rust_lib_test',
            rust_lib_test,
            protocol : 'rust',
        )
        ```

        This is all fine, but not very DRY. This method makes it much easier
        to define rust tests:

        ```meson
        rust = import('unstable-rust')

        rust_lib = static_library(
            'rust_lib',
            [sources],
        )

        rust.test('rust_lib_test', rust_lib)
        ```
        c                 s  s    | ]}t |tV  qd S N)
isinstancer   ).0tr?   r?   r@   	<genexpr>   s    z"RustModule.test.<locals>.<genexpr>r7   z'Rust tests cannot link with Jar targetsr   r   zHSecond positional argument to rustmod.test() must be a rust based targetrB   --testz+Do not add --test to rustmod.test arguments--formatz-Do not add --format to rustmod.test argumentsz	--format=z_kwargs.FuncTest)rb   rc   ZprettyrI   ZprotocolFinstallr4   rust_crate_typer9   Zlanguage_argszT.List[SourceOutputs]N)!anygetr   Z	uses_rustr   r	   warningremoveindex	enumerater^   rF   
startswithTcastcopyZoriginal_kwargs
extra_argssourcesextendZ	generatedr   subdir
subprojectZfor_machineZstructured_sourcesobjectsenvironment	compilersrJ   Z	make_testcurrent_noder   )rU   r[   rB   r+   nameZbase_targetrp   iaZtkwargsZnew_target_kwargsZ	lang_argsrq   
new_targetrM   r?   r?   r@   rM   J   sV   9






zRustModule.testzrust.bindgenrC   )rZ   rY   rE   )Zallow_empty)rZ   rY   required)Zsince_valuesT.ListrA   c                 C  st  | j |d ^}}g }g }|D ]}t|tr|| q|| q|jjj 	 }	|
|d D ]}
|	dd |
|j |j D  q3t|jjjrV|	d |d D ]@}| D ]}
|	dd |
|j |j D  q`|	|  | D ]}t|tr|| qt|tr|| qqZ|jd|jd	d
}t|tsJ dt|jd	g |jd	g |D ]}|dr|	| q| jdu r| d| _t|tr|j!}nt|t"t#t$t%frt&d|' d }| j( ddt)j*+|jj,dg |d  dg |d  |	 g d }td| -dd|j.|j|j||g|d gd|||j/dd}t0|g|gS )zWrapper around bindgen to simplify it's use.

        The main thing this simplifies is the use of `include_directory`
        objects, instead of having to pass a plethora of `-I` arguments.
        rE   rD   c                 S     g | ]}d | qS -Ir?   r_   xr?   r?   r@   
<listcomp>       z&RustModule.bindgen.<locals>.<listcomp>z-DNDEBUGr4   c                 S  r   r   r?   r   r?   r?   r@   r      r   rB   c)langzfor mypy)r   z/Iz-Dz/Dz-Uz/UNrN   zEbindgen source file must be a C header, not an object or build targetr   @INPUT@z--outputz@OUTPUT@z--rC   )z-MDz-MQr   z-MFz	@DEPFILE@zrustmod-bindgen-/_rG   z@PLAINNAME@.dzGenerating bindings for Rust {})ZdepfileZextra_dependsdepend_filesbackenddescription)1rJ   Zsource_strings_to_filesr^   r$   appendrv   Z
propertieshostZget_bindgen_clang_argsro   Zprocess_include_dirsrr   Zto_string_listZget_source_dirZget_build_dirr   ZcoredataoptionsZget_include_dirsZget_all_compile_argsZget_sourcesr   Z
get_optionrt   list	itertoolschainZglobal_argsrg   Zproject_argsrl   rR   Zfind_programfnamer   r
   r   r   r   get_outputsZget_commandospathjoin	build_dirreplacers   r   r   )rU   r[   rB   r+   headerZ_depsdependsr   dZ
clang_argsrz   desZcargsr{   ry   cmdtargetr?   r?   r@   rN      s   




&



zRustModule.bindgenzrust.proc_macroz1.3.0>	   Z	link_argsr7   r9   Zlink_dependsZoverride_optionsrq   Zrust_dependency_mapr4   Zextra_files)varargsZallow_unknown T.Tuple[str, SourcesVarargsType]_kwargs.SharedLibraryr   c                 C  s(   d|d< d|d< |j |j||t}|S )NTZnativez
proc-macrore   )_interpreterZbuild_targetrx   r   )rU   r[   rB   r+   r   r?   r?   r@   rO      s   zRustModule.proc_macro)rJ   r*   rK   rL   )r[   r%   rB   r\   r+   r2   rK   r   )r[   r%   rB   r~   r+   rA   rK   r   )r[   r%   rB   r   r+   r   rK   r   )$r;   r<   r=   __doc__r   INFOrQ   r!   rF   r   r    r   r   r   Zevolver   r   r   r5   rM   r"   r$   r   r
   r   r   r   r   r   rN   r   r#   r   r   rO   __classcell__r?   r?   rV   r@   rH   ;   s^    
	
c
T
rH   interpr*   rK   c                 C  s   t | S r]   )rH   )r   r?   r?   r@   
initialize,  s   r   )r   r*   rK   rH   )F
__future__r   r   r   typingrm   Z%mesonbuild.interpreterbase.decoratorsr    r   r   r   r	   buildr
   r   r   r   r   r   r   r   r   r   r   Zcompilers.compilersr   Zinterpreter.type_checkingr   r   r   r   r   r   r   Zinterpreterbaser   r   r   r    r!   r"   r#   Zmesonlibr$   TYPE_CHECKINGr%   r&   r'   r4   r(   r)   rJ   r*   r+   _kwargsZinterpreter.interpreterr,   r-   Zprogramsr.   r/   r0   typing_extensionsr1   ZBaseTestr2   rA   rH   r   r?   r?   r?   r@   <module>   s6   4$$
 r