o
    Wod$                     @  sR  d dl mZ d dlZd dl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 ddlmZmZ dd	lmZmZmZmZ dd
l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( ddl'm)Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 d dl1m2Z2 G dd de*j3Z4G dd de2Z5G dd deZ6dddZ7dS )    )annotationsN   )ExtensionModuleModuleReturnValue
ModuleInfo   )mlog)	BothLibrariesBuildTargetCustomTargetIndex
ExecutableExtractedObjectsGeneratedListIncludeDirsCustomTargetStructuredSources)
DependencyExternalLibrary)DEPENDENCIES_KWTEST_KWS	OUTPUT_KWINCLUDE_DIRECTORIES)ContainerTypeInfoInterpreterException	KwargInfotyped_kwargstyped_pos_args	noPosargs)File)ModuleState)Interpreter)kwargs)SourceInputsSourceOutputs)ExternalProgramOverrideProgram)	TypedDictc                   @  s   e Zd ZU ded< ded< dS )FuncTest,T.List[T.Union[Dependency, ExternalLibrary]]dependenciesboolis_parallelN__name__
__module____qualname____annotations__ r1   r1   vhome/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/lib/python3.10/site-packages/mesonbuild/modules/rust.pyr'   $   s   
 r'   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 )FuncBindgenzT.List[str]argsc_argszT.List[IncludeDirs]include_directorieszT.List[SourceInputs]inputstroutputr(   r)   Nr,   r1   r1   r1   r2   r3   )   s   
 r3   c                      s   e Zd ZdZeddddZd& fd
dZedee	e
dgeeededdR  d'd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!d(d$d%Z  ZS ))
RustModulez.A module that holds helper functions for rust.rustz0.57.0z1.0.0)Z
stabilizedinterpreterr    returnNonec                   s,   t  | d | _| j| j| jd d S )N)testbindgen)super__init___bindgen_binmethodsupdater?   r@   )selfr<   	__class__r1   r2   rB   9   s   zRustModule.__init__z	rust.testr+   F)defaultstater   r4   T.Tuple[str, BuildTarget]r!   r'   r   c                 C  st  |d }|d }|  std|d }d|v r"td |d d|v r8td |d}||d = ||= t|D ]\}}t|trO|	d	rO||=  nq<t
d
| }	|g d |	d< d|	d< |j }
|
dg dg |
d< 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)
        ```
        r   r   zHSecond positional argument to rustmod.test() must be a rust based targetr4   --testz+Do not add --test to rustmod.test arguments--formatz-Do not add --format to rustmod.test argumentsz	--format=z_kwargs.FuncTest)rL   rM   Zprettyr;   ZprotocolZ	rust_argsFinstallr)   zT.List[SourceOutputs]N)Z	uses_rustr   r   warningremoveindex	enumerate
isinstancer8   
startswithTcastcopyr!   getsourcesextendZ	generatedr   subdir
subprojectZfor_machineZstructured_sourcesobjectsenvironment	compilersr<   Z	make_testZcurrent_noder   )rF   rJ   r4   r!   nameZbase_target
extra_argsiaZtkwargsZnew_target_kwargsrY   
new_targetr?   r1   r1   r2   r?   A   sJ   1





zRustModule.testzrust.bindgenr5   T)rI   listifyr7   )Zallow_empty)rI   re   required)Zsince_values)ZsinceT.Listr3   c                 C  s  | j |d ^}}g }g }|D ]}t|tr|| q|| qg }	||d D ]}
|	dd |
|j	 |j
 D  q,|d D ]@}| D ]}
|	dd |
|j	 |j
 D  qM|	|  | D ]}t|tr||| qot|tr|| qoqG| 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}t!|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.
        r7   r6   c                 S     g | ]}d | qS z-Ir1   .0xr1   r1   r2   
<listcomp>       z&RustModule.bindgen.<locals>.<listcomp>r)   c                 S  rh   ri   r1   rj   r1   r1   r2   rm      rn   Nr@   zEbindgen source file must be a C header, not an object or build targetr   @INPUT@z--outputz@OUTPUT@r4   z--r5   )z-MDz-MQro   z-MFz	@DEPFILE@zrustmod-bindgen-/_r9   z@PLAINNAME@.d)ZdepfileZextra_dependsdepend_filesbackend)"r<   Zsource_strings_to_filesrS   r   appendZprocess_include_dirsrZ   Zto_string_listr^   Zget_source_dirZget_build_dirZget_include_dirsZget_all_compile_argsZget_sourcesr   rC   Zfind_programfnamer
   r	   r   r   r   get_outputsZget_commandospathjoin	build_dirreplacer[   r\   rs   r   )rF   rJ   r4   r!   headerZ_depsdependsrr   dZ
clang_argsrb   desr`   cmdtargetr1   r1   r2   r@      sz   





zRustModule.bindgen)r<   r    r=   r>   )rJ   r   r4   rK   r!   r'   r=   r   )rJ   r   r4   rg   r!   r3   r=   r   )r-   r.   r/   __doc__r   INFOrB   r   r8   r
   r   r   r   r   r*   r?   r   r   listr   r   r	   r   r   r   r   Zevolver   r@   __classcell__r1   r1   rG   r2   r:   3   s@    
[
r:   interpr    r=   c                 C  s   t | S )N)r:   )r   r1   r1   r2   
initialize   s   r   )r   r    r=   r:   )8
__future__r   rw   typingrU    r   r   r   r   buildr	   r
   r   r   r   r   r   r   r   r)   r   r   Zinterpreter.type_checkingr   r   r   r   Zinterpreterbaser   r   r   r   r   r   Zmesonlibr   TYPE_CHECKINGr   r<   r    r!   _kwargsZinterpreter.interpreterr"   r#   Zprogramsr$   r%   typing_extensionsr&   ZBaseTestr'   r3   r:   r   r1   r1   r1   r2   <module>   s,   , 
 G