
    e0                       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jZ                  r^d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e7j                        ZB G d de@      ZC G d de	      ZDddZEy)    )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                  6    e Zd ZU ded<   ded<   ded<   ded<   y	)
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__     9/usr/lib/python3/dist-packages/mesonbuild/modules/rust.pyr4   r4   *   s    BB##rB   r4   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded	<   d
ed<   y)FuncBindgenr:   argsc_argszT.List[IncludeDirs]include_directorieszT.List[SourceInputs]inputstroutputr5   r6   Nr<   rA   rB   rC   rE   rE   1   s%    00##BBrB   rE   c                  V    e Zd ZdZ eddd      Zd  fdZ edee	       e
dgee ej                  d	       ed
 eee      dg d       eded       d!d              Ze e
d ed eee      g d       ed eee      g d       ed eeeee	eeeeefd      g dd       ej                   eee      di      e ej                  d	            d"d              Z edd       eh d       edee        e
dge!ddid#d                            Z" xZ#S )$
RustModulez.A module that holds helper functions for rust.rustz0.57.0z1.0.0)
stabilizedc                    t         |   |       d | _        | j                  j	                  | j
                  | j                  | j                  d       y )N)testbindgen
proc_macro)super__init___bindgen_binmethodsupdaterQ   rR   rS   )selfinterpreter	__class__s     rC   rU   zRustModule.__init__A   sD    %_cII||//
 	rB   z	rust.testz1.2.0)sincer;   T)listifydefaultr\   r8   F)r^   rF   c                2   t        d |j                  dg       D              rt        d      |d   }|d   }|j                         st	        d      |d   }d|v r&t        j                  d	       |j                  d       d
|v r/t        j                  d       |j                  d
      }||dz   = ||= t        |      D ],  \  }}t        |t              s|j                  d      s)||=  n t        j                  d|j                               }	|g dz   |	d<   d|	d<   |j                   j                         }
d|
d<   |
j                  dg       |d   z   |
d<   |
j                  dg       |d   z   |
d<   |
d= |j"                  j                         }|j"                  d   |d   z   dgz   |d<   ||
d<   t        j                  d|j$                  j                               }|j'                  |j(                         t+        ||j,                  |j.                  |j0                  ||j2                  |j4                  |j6                  |j8                  |

      }| j:                  j=                  | j:                  j>                  ||f|	      }tA        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              3  <   K   | ]  }t        |t                y wN)
isinstancer   ).0ts     rC   	<genexpr>z"RustModule.test.<locals>.<genexpr>   s     Gaz!S!Gs   r9   z'Rust tests cannot link with Jar targetsr   r   zHSecond positional argument to rustmod.test() must be a rust based targetrF   --testz+Do not add --test to rustmod.test arguments--formatz-Do not add --format to rustmod.test argumentsz	--format=z_kwargs.FuncTest)rf   rg   prettyrN   protocolFinstallr6   rust_crate_typer;   language_argszT.List[SourceOutputs]N)!anygetr   	uses_rustr   r
   warningremoveindex	enumeraterb   rJ   
startswithTcastcopyoriginal_kwargs
extra_argssourcesextend	generatedr   subdir
subprojectfor_machinestructured_sourcesobjectsenvironment	compilersrZ   	make_testcurrent_noder   )rY   staterF   r,   namebase_targetry   iatkwargsnew_target_kwargs	lang_argsrz   
new_targetrQ   s                  rC   rQ   zRustModule.testJ   s   r G6::k2+FGG"#LMMAw#'7$$&&'qrrF^
 z!LLFGh'#LLHI  ,A1q5!1j) 	DAq!S!all;&?qM	 &&+V[[];$'GG$
'77<<> (-)$,=,A,A.RT,UX^_mXn,n.)):)>)>{B)ORXYdRe)e+&/0**//1	'226:VK=PPT\S]]	&-6/*&&0+2E2E2J2J2LM{,,-+$$e&6&68O8O[33!8!8+:O:O	

 ))))D*+=wH !
D'9::rB   zrust.bindgenrG   )r^   r]   rI   )allow_empty)r^   r]   required)since_valuesc                   | j                   j                  |d         ^}}g }g }|D ]5  }t        |t              r|j	                  |       %|j	                  |       7 |j
                  j                  j                  j                         j                         }	|j                  |d         D ]d  }
|	j                  |
j                  |j
                  j                         |j
                  j                               D cg c]  }d| 	 c}       f t        |j
                  j                   j"                        r|	j	                  d       |d   D ]  }|j%                         D ]d  }
|	j                  |
j                  |j
                  j                         |j
                  j                               D cg c]  }d| 	 c}       f |	j                  |j'                                |j)                         D ]F  }t        |t              r|j	                  |       %t        |t*              s6|j	                  |       H  |j-                  d|j.                  d      }t        |t0              sJ d	       t3        j4                  |j6                  j9                  dg       |j:                  j9                  dg       |      D ]%  }|j=                  d
      s|	j	                  |       ' | j>                  |jA                  d      | _        t        |t              r|jB                  }n>t        |tD        tF        tH        tJ        f      rtM        d      |jO                         d   }| j>                  jQ                         ddtR        jT                  jW                  |j
                  jX                  d      gz   |d   z   dgz   |d   z   |	z   g dz   }t+        d| j[                  dd      |j\                  |j.                  |j
                  ||g|d   gd|||j^                  d      }ta        |g|g      S c c}w c c}w )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.
        rI   rH   -Iz-DNDEBUGr6   rF   c)langzfor mypy)r   z/Iz-Dz/Dz-Uz/UrR   zEbindgen source file must be a C header, not an object or build targetr   @INPUT@z--outputz@OUTPUT@z--rG   )z-MDz-MQr   z-MFz	@DEPFILE@zrustmod-bindgen-/_rK   z@PLAINNAME@.dzGenerating bindings for Rust {})depfileextra_dependsdepend_filesbackenddescription)1rZ   source_strings_to_filesrb   r%   appendr   
propertieshostget_bindgen_clang_argsrw   process_include_dirsr{   to_string_listget_source_dirget_build_dirr   coredataoptionsget_include_dirsget_all_compile_argsget_sourcesr   
get_optionr~   list	itertoolschainglobal_argsrn   project_argsrt   rV   find_programfnamer   r   r   r   r   get_outputsget_commandospathjoin	build_dirreplacer}   r   r   )rY   r   rF   r,   header_depsdependsr   d
clang_argsr   xdescargsr   r   cmdtargets                      rC   rR   zRustModule.bindgen   s   , ))AA&/R *,%' 	"A!T"##A&q!		" &&1166MMOTTV
++F3H,IJ 	YA1A1A!!002E4E4E4S4S4U2W XAA3x X Y	Y   1 1 : : B BCj)( 		&B((* ]!!Q5E5E%%4468I8I8W8W8Y6[ #\Rs8 #\ ]] b5578^^% &a& ''*<0NN1%	&		&   )9)9 D%&2
2&!2!2!6!6sB!?ASASAWAWX[]_A`bgh 	%A||@A!!!$	% $ % 2 29 =D fd#<<Dm=MO` ab&'noo%%'*D++-:U..88*E
 6N
 #V$
 '-X&67
 :DD :: tf%--c37LLHH#!%MM9
 !&F844sX#\s   P=
:Qzrust.proc_macroz1.3.0>	   rz   	link_argsr9   r;   extra_filesr6   link_dependsoverride_optionsrust_dependency_map)varargsallow_unknownc                    d|d<   d|d<   |d   ddgz   |d<   |j                   j                  |j                  ||t              }|S )NTnativez
proc-macrork   r;   z--externrS   )_interpreterbuild_targetr   r   )rY   r   rF   r,   r   s        rC   rS   zRustModule.proc_macro   sZ      x$0 !$[1Z4NN{##001C1CT6S`arB   )rZ   r+   returnNone)r   r&   rF   zT.Tuple[str, BuildTarget]r,   r4   r   r   )r   r&   rF   zT.Listr,   rE   r   r   )r   r&   rF   z T.Tuple[str, SourcesVarargsType]r,   z_kwargs.SharedLibraryr   r   )$r=   r>   r?   __doc__r   INFOrU   r"   rJ   r   r!   r   r   r   evolver    r   r   r7   rQ   r#   r%   r   r   r   r   r   r   r   rR   r   r$   r   r   rS   __classcell__)r[   s   @rC   rM   rM   ;   s   8fh7;D Kk2	 	 	'*	
 	dC(	
 	-u5a; 3a;F (-dC8"dS&+D#6DQdT=+}Vfhy  |H  JM  %N  \a  b	
 	#""1B41Mw0WXW-P5  P5h !7+ T U%sOD#InIDI J EU ,
rB   rM   c                    t        |       S ra   )rM   )interps    rC   
initializer   -  s    frB   )r   r+   r   rM   )F
__future__r   r   r   typingru   %mesonbuild.interpreterbase.decoratorsr    r   r   r   r
   buildr   r   r   r   r   r   r   r   r   r   r   compilers.compilersr   interpreter.type_checkingr   r   r   r   r   r   r   interpreterbaser   r   r    r!   r"   r#   r$   mesonlibr%   TYPE_CHECKINGr&   r'   r(   r6   r)   r*   rZ   r+   r,   _kwargsinterpreter.interpreterr-   r.   programsr/   r0   r1   typing_extensionsr2   BaseTestr4   rE   rM   r   rA   rB   rC   <module>r      s    #  	  < < < \ \ \ \ 6 Q  Q  Q K  K  K ??-:)/E;>+7## Ci Co odrB   