
    -PhR                        U d dl m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mZ ddl	mZ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mZ dd	lmZ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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddlm5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ej;        rddl	m<Z< ddlm=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlDmFZG ddlHmIZImJZJ ddl3mKZK ddl8mLZL ddlmMZM d dlNmOZOmPZP  ejQ        d          ZR G d deGjS        ejT        eR                   ZUeUeGjV                 ZWeUeX         ZY G d deO          ZZ e.d e,e[eX          d g d!"           e.d#e\d$%          gZ]d&e^d'<   d2d,Z_ G d- d.e
          Z`d3d1ZadS )4    )annotationsN)
FeatureNew   )ExtensionModuleModuleReturnValue
ModuleInfo   )mesonlibmlog)BothLibrariesBuildTargetCustomTargetIndex
ExecutableExtractedObjectsGeneratedListCustomTargetInvalidArgumentsJarStructuredSourcesSharedLibraryStaticLibrary)#are_asserts_disabled_for_subprojectlang_suffixes)DEPENDENCIES_KWLINK_WITH_KWLINK_WHOLE_KWSHARED_LIB_KWSTEST_KWSTEST_KWS_NO_ARGS	OUTPUT_KWINCLUDE_DIRECTORIESSOURCES_VARARGSNoneTypein_set_validator)ContainerTypeInfoInterpreterException	KwargInfotyped_kwargstyped_pos_args	noPosargspermittedKwargs)Doctest)FileMesonException
PerMachine)ExternalProgramNonExistingExternalProgram)ModuleState)IncludeDirsLibTypes)RustCompiler)
DependencyExternalLibrary)Interpreter)kwargs)SourceInputsSourceOutputs)Test)OverrideProgram)SourcesVarargsType)	TypedDictLiteralArgsTypec                  L    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 )FuncRustTestzT.List[ArgsType]args,T.List[T.Union[Dependency, ExternalLibrary]]dependenciesboolis_parallelzT.List[LibTypes]	link_with
link_wholeT.List[str]	rust_argsN__name__
__module____qualname____annotations__     W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mesonbuild/modules/rust.pyrC   rC   *   sZ         BBBB####$$$$rS   rC   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
<   ded<   ded<   ded<   dS )FuncBindgenrK   rD   c_argszT.List[IncludeDirs]include_directorieszT.List[SourceInputs]inputstroutputoutput_inline_wrapperrE   rF   zT.Optional[Literal['c', 'cpp']]languagebindgen_versionNrM   rR   rS   rT   rV   rV   5   s{         0000####""""BBBB1111$$$$$$rS   rV   rL   T1.2.0)listifydefaultsincerH   F)ra   zT.List[KwargInfo]RUST_TEST_KWSarg T.Optional[T.Union[str, T.List]]returnT.Optional[str]c                <    t          d | D                       rdS d S )Nc              3  Z   K   | ]&}t          t          j        d |                    V  'dS )z\sN)rG   research.0xs     rT   	<genexpr>z&no_spaces_validator.<locals>.<genexpr>N   s6      
2
24	%##$$
2
2
2
2
2
2rS   z5must not contain spaces due to limitations of rustdoc)any)rd   s    rT   no_spaces_validatorrq   M   s-    

2
2c
2
2
222 GFF4rS   c                      e Zd ZU dZ eddd          Zded<    edd          Zd	ed
<   dE fdZ	dFdZ
 edee           edgee ej        d           ej        d          eR  dGd                         Z ed!d           ed!ee           ed!geeeee ed eee          d"g e#          R  dHd&                                    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d.ee$fd/ e%d0d1h          2           ed3 eee          g d"d/4           e&j         eee          di5          e' ed6ed7d/8           ej        d          
  
        dId;                        Z( ed<d=           e)h d>           ed<ee*?           ed<ge+R d@d"idJdD                                                Z, xZ-S )K
RustModulez.A module that holds helper functions for rust.rustz0.57.0z1.0.0)
stabilizedrg   _bindgen_rust_targetNz'PerMachine[T.Optional[ExternalProgram]]rustdocinterpreterr8   rf   Nonec                l   t                                          |           d | _        d|j        j        v r;t          j        d|j        j        d                   }|j        rdn|j        | _	        nd | _	        d| _
        | j                            | j        | j        | j        | j        d           d S )Nrt   r5   nightlyF)testdoctestbindgen
proc_macro)super__init___bindgen_bin	compilershostTcast
is_nightlyversionrv   _bindgen_set_stdmethodsupdater|   r}   r~   r   )selfrx   rustc	__class__s      rT   r   zRustModule.__init__[   s    %%%_c[*///F>;+@+Ef+MNNE5:5E(X		5=D%%(,D% %I||/	
 
 	 	 	 	 	rS   funcnamerZ   stater2   rD   T.Tuple[str, BuildTarget]r9   rC   %T.Tuple[Executable, _kwargs.FuncTest]c                   t          d |                    dg           D                       rt          d          t          d |                    dg           D                       rt          d          |d         }|d         }|                                st	          d| d	          |d
         }d|v r-t          j        d| d           |                    d           d|v r6t          j        d| d           |                    d          }||dz   = ||= t          |          D ]4\  }}	t          |	t                    r|	                    d          r||=  n5t          j        d|                                          }
|g dz   |
d
<   d|
d<   |j                                        }d|d<   |                    dg           |d         z   |d<   |                    dg           |d         z   |d<   |                    dg           |d         z   |d<   |d= dD ]	}||v r||= 
|j                                        }|j        d         |d         z   dgz   |d<   ||d<   t          j        d|j                                                  }|                    |j                   t+          ||j        |j        |j        ||j        |j        |j        |j        |
  
        }||
fS )a  Generate a rust test target from a given rust target.

        Rust puts its unitests inside its 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                    V  d S N
isinstancer   rm   ts     rT   ro   z)RustModule.test_common.<locals>.<genexpr>   s,      GGaz!S!!GGGGGGrS   rI   z'Rust tests cannot link with Jar targetsc              3  @   K   | ]}t          |t                    V  d S r   r   r   s     rT   ro   z)RustModule.test_common.<locals>.<genexpr>   s,      HHaz!S!!HHHHHHrS   rJ   r   r   z&Second positional argument to rustmod.z() must be a rust based targetrD   --testzDo not add --test to rustmod.z() arguments--formatzDo not add --format to rustmod.z	--format=z_kwargs.FuncTest)r   r   prettyrt   protocolFinstallrF   rust_crate_type)picprelinkrust_abir   	soversiondarwin_versionsrL   language_argszT.List[SourceOutputs])rp   getr   	uses_rustr&   r   warningremoveindex	enumerater   rZ   
startswithr   r   copyoriginal_kwargs
extra_argssourcesextend	generatedr   subdir
subprojectfor_machinestructured_sourcesobjectsenvironmentr   )r   r   r   rD   r9   namebase_targetr   iatkwargsnew_target_kwargskw	lang_argsr   
new_targets                   rT   test_commonzRustModule.test_commonk   sd   T GG6::k2+F+FGGGGG 	N"#LMMMHH6::lB+G+GHHHHH 	N"#LMMMAw#'7$$&& 	z&'xPX'x'x'xyyyF^
 z!!LOOOOPPPh'''##LQ8QQQRRR  ,,A1q5!1j)) 	 	DAq!S!! all;&?&? qM &+V[[]];;$'G'G'GG$
'7<<>> (-)$,=,A,A.RT,U,UX^_mXn,n.)):)>)>{B)O)ORXYdRe)e+&*;*?*?b*Q*QTZ[gTh*h,'/0[ 	* 	*B&&&%b)*//11	'26:VK=PPT\S]]	&-6/*&0+2E2J2J2L2LMM{,---+$e&68O[3!8+:O	
 

 7""rS   z	rust.testr_   )rb   z1.8.0FuncTestr   c                    |\  }}|                      d|||          \  }}| j                            | j        j        ||f|          }t	          d ||g          S )Nr|   )r   rx   	make_testcurrent_noder   )	r   r   rD   r9   r   _r   r   r|   s	            rT   r|   zRustModule.test   sn     a"..vudFKK
G%//)D*+=wH H !
D'9:::rS   zrust.doctestT)r`   ra   	validator3T.Tuple[str, T.Union[SharedLibrary, StaticLibrary]]FuncDoctestc                   |\  }}|j                                         rE|j                             |j                  r&t	          j        dd           t          d g           S |d                             |           |d                             |           |d         }d |d<   |                     d|||          \  }}|d         	                    d	           |d         r5d
d
                    t          j        d|d                             z   g|d<   |r|d                             d|z              | j        |j                 t          j        d|j        d                   }	|	                    |j                   }
|
r/t!          |
                                          | j        |j        <   nt%                      | j        |j        <   | j        |j                 }|                                st)          d|j         d          | j                            | j        j        ||f|t0                    }||_        ||_        t          d |g          S )Nz/skipping Rust doctests due to cross compilationT)oncerI   dependsworkdirr}   rD   r   z--test-args= zT.Sequence[str]z--test-run-directory=r5   rt   zcould not find rustdoc for z machine)r   is_cross_buildneed_exe_wrapperr   r   noticer   appendr   r   joinr   r   rw   r   get_rustdocr0   get_exer1   foundr.   rx   r   r   r,   targetdoctests)r   r   rD   r9   r   r   r   r   r   r   rw   rustdoc_progr   s                rT   r}   zRustModule.doctest   sb   $ !k++-- 	/%2C2T2TU`Ul2m2m 	/KIPTUUUU$T2... 	{"";///y  ---# y"..y%vNN
G 	x((( 6? 	f-@QSZ[aSb9c9c0d0ddeGFO 	FFO""#:W#DEEE</08F>;+@+HIIE''(9::G U8GHYHY8Z8Z[4558R8T8T[45|K$;<!!## 	b !`{?V!`!`!`aaa ,66)D,+?'S S
 %' z222rS   zrust.bindgenrW   )ra   r`   rY   F)allow_empty)ra   r`   requiredr]   z1.4.0ccpp)rb   r   r^   )ra   r`   rb   )since_valuesr\    )ra   rb   T.ListrV   c                   | j                             |d                   ^}}g }g }|D ]B}t          |t                    r|                    |           -|                    |           C|j        j        j                                        	                                }	|
                    |d                   D ]c}
|	                    d |
                    |j                                        |j                                                  D                        dt          |j        |j                  r|	                    d           |d         D ]}|                                D ]c}
|	                    d |
                    |j                                        |j                                                  D                        d|	                    |                                           |                                D ]W}t          |t                    r|                    |           -t          |t(                    r|                    |           X| j        |                    d|d	         
          | _        | j        [t1          j        t5          j        d| j                                                  d| j        gz             \  }}}d|v sd|v rd| _        t          | j        t:                    r1t1          j        | j                                        d          | _         t          |t                    r|j!        }nQt          |tD          tF          tH          tJ          f          rtM          d          |'                                d         }|d         }|ZtP          j)        *                    |          d         dd         }|tV          d         v rd}n|dk    rd}ntM          d|           |,                    | d|j                  }t          |tZ                    s
J d            t]          j/        |j0        1                    |g           |j2        1                    |g           |          D ],}|3                    d          r|	                    |           -|dk    r|	                    ddg           |,                    | d          }t          |th                    s
J d            |3                    d          rO|5                    d          rtm          j7        d d!d"d#$           d%}ntm          j8        d&d'           |dd         }|d(k    r|	                    d)|            g }|d*         g}|d+         rt          | j        t:                    r;t1          j        | j                                        d,          rtM          d-          |                    |d+                    d.d/d0tP          j)        9                    |j        j:        d1          g}| j                                        d2d3tP          j)        9                    |j        j:        d4          gz   |d5         z   |z   }| j        r d|vr|                    d| j        g           | j         rdd6|vr`|j        j;        j<        =                    d7          }t          |th                    s
J d            |d(k    r|                    d6|g           |                    d8           |                    |d9                    |                    |	           |                    g d:           t)          d;| >                    d<d=          |j?        |j        |j        ||g|d>|||j@        d?@          }t          ||g          S )AzWrapper around bindgen to simplify its use.

        The main thing this simplifies is the use of `include_directory`
        objects, instead of having to pass a plethora of `-I` arguments.
        rY   rX   c                    g | ]}d | S -IrR   rl   s     rT   
<listcomp>z&RustModule.bindgen.<locals>.<listcomp>R  s0     X X XAxAxx X X XrS   z-DNDEBUGrF   c                    g | ]}d | S r   rR   rl   s     rT   r   z&RustModule.bindgen.<locals>.<listcomp>Y  s0     #\ #\ #\888 #\ #\ #\rS   Nr~   r^   )wantedrK   z--rust-targetzGot an invalidzis not a valid Rust targetz>= 0.71zEbindgen source file must be a C header, not an object or build targetr   r]   r   r   hr   z!Unknown file type extension for: _argszfor mypy)r   z/Iz-Dz/Dz-Uz/Uz-xzc++_stdzvc++latestzCAttempting to translate vc++latest into a clang compatible version.z%Currently this is hardcoded for c++20TF)r   fatalzc++20z>The current C++ standard is a Visual Studio extension version.z3bindgen will use a the nearest C++ standard insteadnonez-std=r[   r\   z< 0.65zP'output_inline_wrapper' parameter of rust.bindgen requires bindgen-0.65 or newerz--experimentalz--wrap-static-fnsz--wrap-static-fns-pathz	@OUTPUT1@@INPUT@z--outputz	@OUTPUT0@rD   z--rust-editionrust_stdz--rW   )z-MDz-MQr   z-MFz	@DEPFILE@zrustmod-bindgen-/r   z@PLAINNAME@.dzGenerating bindings for Rust {})depfileextra_dependsdepend_filesbackenddescription)Brx   source_strings_to_filesr   r-   r   r   
propertiesr   get_bindgen_clang_argsr   process_include_dirsr   to_string_listget_source_dirget_build_dirr   r   get_include_dirsget_all_compile_argsget_sourcesr   r   find_programrv   r
   
Popen_safer   r   get_commandr0   version_compareget_versionr   fnamer   r   r   r   r&   get_outputsospathsplitextr   
get_optionlist	itertoolschainglobal_argsr   project_argsr   rZ   endswithr   r   debugr   	build_dircoredataoptstore	get_valuereplacer   r   r   )r   r   rD   r9   header_depsr   r   d
clang_argsr   desr   errr   r]   extcargsr   stdinline_wrapper_argsoutputscmdr   r   s                             rT   r~   zRustModule.bindgen#  sv   < )AA&/RR *,%' 	" 	"A!T"" "##A&&&&q!!!! &16MMOOTTVV
++F3H,IJJ 	Y 	YA X X1A1A!0022E4E4S4S4U4U2W 2W X X X Y Y Y Y.u/?ARSS 	*j)))( 		& 		&B((** ] ]!! #\ #\Q5E5E%44668I8W8W8Y8Y6[ 6[ #\ #\ #\ ] ] ] ]b5577888^^%% & &a&& & ''****<00 &NN1%%%	& $ % 2 29VL]E^ 2 _ _D(4$/F=$*;*G*G*I*IJJ$d&?@AB B	1c $s**.Jc.Q.Q04D- $+_== m(0(@ARA^A^A`A`bk(l(l% fd## 	+<DDm=MO` abb 	+&'nooo%%''*D *%'""4((+ABB/CmE*** *+Ut+U+UVVV   H!3!3!3U5EFF%&&22
222!2!6!6x!D!DeFXF\F\]egiFjFjlqrr 	% 	%A||@AA %!!!$$$utUm,,, (00011#s##//Z///>>&!! 	||H%% bD4W\^ ^ ^ ^
[PR R R!""g&==mcmm,,,+-(#$)* 
	$+_== E+D,=,I,I,K,KXVV E.  0D  E  E  ENN6"9:;;; "5("',,u7H7RT_*`*`#
 ++--:U.8+FF
 6N
 11 $ 	E)C)CJJ)BCDDD  	9%5S%@%@(1:DDZPPHh,,88j8886!!

,h7888

4

6(#$$$

:

@@@AAA%t%%--c377LH#!%M9
 
 
 !&222rS   zrust.proc_macroz1.3.0>	   r   	link_argsrI   rL   extra_filesrF   link_dependsoverride_optionsrust_dependency_map)varargsallow_unknown T.Tuple[str, SourcesVarargsType]_kwargs.SharedLibraryr   c                    d|d<   d|d<   |d         ddgz   |d<   |j                             |j        ||t                    }|S )NTnativez
proc-macror   rL   z--externr   )_interpreterbuild_targetr   r   )r   r   rD   r9   r   s        rT   r   zRustModule.proc_macro  sW      x$0 !$[1Z4NN{#001CT6S`aarS   )rx   r8   rf   ry   )
r   rZ   r   r2   rD   r   r9   rC   rf   r   )r   r2   rD   r   r9   r   rf   r   )r   r2   rD   r   r9   r   rf   r   )r   r2   rD   r   r9   rV   rf   r   )r   r2   rD   r-  r9   r.  rf   r   ).rN   rO   rP   __doc__r   INFOrQ   r/   rw   r   r   r)   rZ   r   r(   r   r   r   evolver   rc   r|   r   r   r'   r%   r  rq   r}   r*   r-   r   r   r   r   r   r#   r$   r!   r    r~   r+   r"   r   r   __classcell__)r   s   @rT   rs   rs   S   sQ        88:fh7;;;D))))7Az$7M7MGMMMM      c# c# c# c#J ^Kk22\	 	 	'***	
 	7+++ 
  ; ; ;  32; Z((^NC55\	 	 		
 	 
 		dC(()	
 	
 	
  /3 /3 /3  65 )("/3b \	(--dC88"dSSS	&++D#66DQQQ	dT=+}Vfhy  |H  JM  %N  \a  b  b  b	
 	
 	
 		*sHoWHXHXZ]_dYeHfHfggg	#%6%6tS%A%A2W[cjkkk""1B1B41M1Mw0WXXX	#		
 	
 	
 	W---+ .W3 W3 W3/  Y0W3v Z!7++_ T T T U U^%sODDD\#InIIIDII   JI EDU U ,+
    rS   rs   interpr8   c                     t          |           S r   )rs   )r7  s    rT   
initializer9    s    frS   )rd   re   rf   rg   )r7  r8   rf   rs   )b
__future__r   r  r	  rj   typingr   %mesonbuild.interpreterbase.decoratorsr   r   r   r   r   r
   r   buildr   r   r   r   r   r   r   r   r   r   r   r   compilers.compilersr   r   interpreter.type_checkingr   r   r   r   r   r   r    r!   r"   r#   r$   interpreterbaser%   r&   r'   r(   r)   r*   r+   interpreter.interpreterobjectsr,   r-   r.   r/   programsr0   r1   TYPE_CHECKINGr2   r3   r4   compilers.rustr5   rF   r6   r7   rx   r8   r9   _kwargsinterpreter.interpreterr:   r;   r<   r=   r>   typing_extensionsr?   r@   TypeVarrA   BaseTestGenericrC   TestArgsr   rZ   r   rV   r  rG   rc   rQ   rq   rs   r9  rR   rS   rT   <module>rL     s   # " " " " " "     				 				     < < < < < < < < < < < < < < < <        k k k k k k k k k k k k k k k k k k k k k k k k k k k k T T T T T T T T                          K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K  K 4 4 4 4 4 4 7 7 7 7 7 7 7 7 7 7 B B B B B B B B? %%--------------::::::::))))))//////EEEEEEEE555555******>>>>>>44444444qy$$H    w'8)<    G,-Hs#K
% 
% 
% 
% 
%i 
% 
% 
% Y			4	%	%   Y}dE222	$ 	 	 	 	   M M M M M M M M`     rS   