
    e?                       U d Z 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 ddlmZmZ ej$                  rdd	lmZ dd
lmZ ddlmZ ddlmZ dZded<   dZded<   dD ]  Z	  ej:                  e      Z n  e	j>                  d      Zd2dZ d3dZ!ejD                  d4d       Z#ejD                  d5d       Z#ejD                  d6d       Z#	 	 d7dZ#ejH                   G d d             Z%ejH                   G d d             Z&ejH                   G d d             Z'ejH                   G d de'             Z(ejH                   G d  d!e'             Z)ejH                   G d" d#e'             Z*ejH                   G d$ d%e'             Z+ejH                   G d& d'e'             Z,ejH                   G d( d)             Z-d8d9d*Z.d:d+Z/d;d,Z0d;d-Z1d<d.Z2d=d/Z3d>d0Z4d?d1Z5y# e$ r Y w xY w)@aA  Interpreter for converting Cargo Toml definitions to Meson AST

There are some notable limits here. We don't even try to convert something with
a build.rs: there's so few limits on what Cargo allows a build.rs (basically
none), and no good way for us to convert them. In that case, an actual meson
port will be required.
    )annotationsN   )builder)version   )MesonException
Popen_safe)
ModuleType)manifest)mparser)EnvironmentzT.Optional[ModuleType]tomllibT.Optional[str]	toml2json)r   tomlic                b   t         r+t        | d      5 }t         j                  |      }d d d        nVt        t	        d      t        t        | g      \  }}}|j                  dk7  rt	        d|      t        j                  |      }t        t              st	        d      |S # 1 sw Y   &xY w)Nrbz:Could not find an implementation of tomllib, nor toml2jsonr   z"toml2json failed to decode output
z3Cargo.toml isn't a dictionary? How did that happen?)r   openloadr   r   r	   
returncodejsonloads
isinstancedict)filenamefrawpouterrs         >/usr/lib/python3/dist-packages/mesonbuild/cargo/interpreter.py	load_tomlr"   4   s    (D! 	"Q,,q/C	" 	"  !]^^ )X!673<<1 !FLLjjoc4 RSSJ	" 	"s   B%%B.c                &    | j                  dd      S )z^Fixup a meson variable name

    :param name: The name to fix
    :return: the fixed name
    -_)replace)names    r!   fixup_meson_varnamer(   H   s     <<S!!    c                     y N ds    r!   _fixup_raw_mappingsr/   R   s    ORr)   c                     y r+   r,   r-   s    r!   r/   r/   U   s    KNr)   c                     y r+   r,   r-   s    r!   r/   r/   X   s    MPr)   c                   | j                         D ci c]  \  }}t        |      | }}}d|v r5t        |d   t              sJ d       t	        j
                  |d         |d<   t        j                  d|      S c c}}w )a  Fixup raw cargo mappings to ones more suitable for python to consume.

    This does the following:
    * replaces any `-` with `_`, cargo likes the former, but python dicts make
      keys with `-` in them awkward to work with
    * Convert Dependndency versions from the cargo format to something meson
      understands

    :param d: The mapping to fix
    :return: the fixed string
    r   zfor mypyUT.Union[manifest.FixedBuildTarget, manifest.FixedLibTarget, manifest.FixedDependency])itemsr(   r   strr   convertTcast)r.   kvr   s       r!   r/   r/   [   s{     23
;Aq!1$
;C
;C#i.#.:
:. Y8I66iknoo	 <s   A<c                  P   e Zd ZU dZded<   ded<   dZded<   dZded<    ej                  e		      Z
d
ed<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    ej                  e		      Zd
ed<    ej                  e		      Zd
ed<   dZded<   dZded<   dZded<    ej                  e		      Zd
ed<    ej                  e		      Zd
ed<   dZded<    ej                  e	      Zd ed!<   dZded"<   dZded#<   dZded$<   dZ ded%<   dZ!ded&<   y)'PackagezARepresentation of a Cargo Package entry, with defaults filled in.r5   r'   r   Nr   descriptionresolverdefault_factoryT.List[str]authors2015manifest.EDITIONeditionrust_versiondocumentationreadmehomepage
repositorylicenselicense_filekeywords
categories	workspacebuildlinksexcludeincludeTboolpublishzT.Dict[str, T.Dict[str, str]]metadatadefault_runautobinsautoexamples	autotestsautobenches)"__name__
__module____qualname____doc____annotations__r=   r>   dataclassesfieldlistrB   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rU   r   rV   rW   rX   rY   rZ   r[   r,   r)   r!   r<   r<   p   s]    L
IL#'K' $Ho$,;,,TBG[B &G&$(L/(%)M?)"FO" $Ho$"&J&#G_#$(L/(-K--dCHkC/k//EJE!%I%!E?!!E?!,;,,TBG[B,;,,TBG[BGT.?k.?.?PT.UH+U#'K'HdL$ItKr)   r<   c                      e Zd ZU dZded<   dZded<   dZded<   dZded<   dZded	<   dZ	ded
<   dZ
ded<   dZded<   dZded<    ej                  e      Zded<   edd       Zy)
Dependencyz+Representation of a Cargo Dependency Entry.rA   r   Nr   registrygitbranchrevpathFrT   optionalpackagedefault_featuresr?   featuresc                z    t        |t              r | t        j                  |            S  | di t	        |      S )z/Create a dependency from a raw cargo dictionaryr,   )r   r5   r   r6   r/   )clsr   s     r!   from_rawzDependency.from_raw   s6     c3ws+,,.(-..r)   )r   zmanifest.DependencyVreturnre   )r\   r]   r^   r_   r`   rf   rg   rh   ri   rj   rk   rl   rm   ra   rb   rc   rn   classmethodrq   r,   r)   r!   re   re      s     6 $Ho$C"FO"C D/ Hd#G_#"d"-K--dCHkC/ /r)   re   c                      e Zd ZU ded<    ej
                  d       Zded<   dZded	<   d
Zded<   dZ	ded<   d
Z
ded<   dZded<   d
Zded<   dZded<    ej
                  e      Zded<   dZded<   y)BuildTargetr5   r'   c                     dgS Nlibr,   r,   r)   r!   <lambda>zBuildTarget.<lambda>   
    Y^X_ r)   r?   T.List[manifest.CRATE_TYPE]
crate_typeNz$dataclasses.InitVar[T.Optional[str]]rj   TrT   testFdoctestbenchdocharnessrC   rD   rE   rA   required_featuresplugin)r\   r]   r^   r`   ra   rb   r|   rj   r}   r~   r   r   r   rE   rc   r   r   r,   r)   r!   ru   ru      s     I.?k.?.?P_.`J+`15D
.5 D$ GT E4 CGT &G&%6[%6%6t%L{LFDr)   ru   c                  |    e Zd ZU dZdZded<   dZded<   dZded<    ej                  d 	      Z
d
ed<   dZded<   y)Libraryz(Representation of a Cargo Library Entry.TrT   r~   r   F
proc_macroc                     dgS rw   r,   r,   r)   r!   ry   zLibrary.<lambda>   rz   r)   r?   r{   r|   doc_scrape_examplesN)r\   r]   r^   r_   r~   r`   r   r   ra   rb   r|   r   r,   r)   r!   r   r      sI     3GTCJ.?k.?.?P_.`J+` $$r)   r   c                       e Zd ZU dZdZded<   y)Binaryz$Representation of a Cargo Bin Entry.TrT   r   N)r\   r]   r^   r_   r   r`   r,   r)   r!   r   r      s     /Cr)   r   c                       e Zd ZU dZdZded<   y)Testz%Representation of a Cargo Test Entry.TrT   r   N)r\   r]   r^   r_   r   r`   r,   r)   r!   r   r      s     0E4r)   r   c                       e Zd ZU dZdZded<   y)	Benchmarkz*Representation of a Cargo Benchmark Entry.TrT   r}   N)r\   r]   r^   r_   r}   r`   r,   r)   r!   r   r      s     5D$r)   r   c                  D    e Zd ZU dZ ej
                  d       Zded<   y)Examplez(Representation of a Cargo Example Entry.c                     dgS )Nbinr,   r,   r)   r!   ry   zExample.<lambda>   rz   r)   r?   r{   r|   N)r\   r]   r^   r_   ra   rb   r|   r`   r,   r)   r!   r   r      s      3.?k.?.?P_.`J+`r)   r   c                      e Zd ZU dZ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ed<   ded<   ded<   dZded<   y)Manifestai  Cargo Manifest definition.

    Most of these values map up to the Cargo Manifest, but with default values
    if not provided.

    Cargo subprojects can contain what Meson wants to treat as multiple,
    interdependent, subprojects.

    :param subdir: the subdirectory that this cargo project is in
    :param path: the path within the cargo subproject.
    r<   rl   zT.Dict[str, Dependency]dependenciesdev_dependenciesbuild_dependenciesr   rx   zT.List[Binary]r   zT.List[Test]r}   zT.List[Benchmark]r   zT.List[Example]examplezT.Dict[str, T.List[str]]rn   z$T.Dict[str, T.Dict[str, Dependency]]targetr5   subdir rj   N)r\   r]   r^   r_   r`   rj   r,   r)   r!   r   r      sX    
 ))--//	L	
&&00KD#Nr)   r   c                   t        | j                  di             }|j                  d| d   d          t        j                  d| d   j                         D ci c]  \  }}t        |      | c}}      }t        t        di || j                  di       j                         D ci c]  \  }}|t        j                  |       c}}| j                  di       j                         D ci c]  \  }}|t        j                  |       c}}| j                  di       j                         D ci c]  \  }}|t        j                  |       c}}t        di || j                  di       D cg c]  }t        di t        |       c}| j                  d	i       D cg c]  }t        di t        |       c}| j                  d
i       D cg c]  }t        di t        |       c}| j                  di       D cg c]  }t        di t        |       c}| j                  di       | j                  di       j                         D 	ci c]M  \  }}||j                  di       j                         D 	ci c]  \  }}	|t        j                  |	       c}	}O c}	}}}||      S c c}}w c c}}w c c}}w c c}}w c c}w c c}w c c}w c c}w c c}	}w c c}	}}}w )Nrx   r'   rl   zmanifest.FixedPackager   zdev-dependencieszbuild-dependenciesr   r}   r   r   rn   r   r,   )r/   get
setdefaultr7   r8   r4   r(   r   r<   re   rq   r   r   r   r   r   )
raw_manifestr   rj   rx   r9   r:   pkgbk2v2s
             r!   _convert_manifestr     s   
l..ub9
:C NN6<	26:;
&&(8DY8O8U8U8WX1%a(!+XZC #/;/?/?PR/S/Y/Y/[\tq!J"	"\/;/?/?@RTV/W/]/]/_`tq!J"	"`/;/?/?@TVX/Y/_/_/abtq!J"	"b#3?3C3CE23NOa	)%a(	)O1=1A1A&"1MNA	'#A&	'N6B6F6FwPR6ST	,(+	,T4@4D4DYPR4STq	*&q)	*TR(!%%h399;	= 	=Q 
quu^R7P7V7V7XYVRR$$R((Y	Y 	=  Y 	]`bONTTY 	=sH   J;* K0 K6 K7K(KK
K",K-"	 K',)K-"'K-"c                "  	 t         j                  j                  | d      }t        |      }i }d|v r<t	        j
                  d|      	t        	|       }|||j                  j                  <   nt	        j
                  d|      	d	v rt        j                         }t        j                  |        	 t        j                  j                  d 	d   d   D              }t        j                  |       d	d   v r	fd	|D        }|D ]j  }t         j                  j                  | |d      }t        |      }t	        j
                  d|      	t        	| |      }|||j                  j                  <   l |S # t        j                  |       w xY w)
N
Cargo.tomlrl   manifest.Manifestzmanifest.VirtualManifestrO   c              3  F   K   | ]  }t        j                   |        y wr+   )glob).0ms     r!   	<genexpr>z"_load_manifests.<locals>.<genexpr>E  s      4L!"		!4Ls   !membersrR   c              3  8   K   | ]  }|d    d   vs|  yw)rO   rR   Nr,   )r   xr   s     r!   r   z"_load_manifests.<locals>.<genexpr>J  s#     [QQl;6OPY6Z-Zq[s   )osrj   joinr"   r7   r8   r   rl   r'   getcwdchdir	itertoolschainfrom_iterable)
r   r   r   	manifests	manifest_pwdr   r   manr   s
            @r!   _load_manifestsr   .  se   ww||FL1H
H
C')I Cvv137%lF;	,5	)##(()vv8#>l"
 iik
	oo33 4L&2;&?	&J4L LG HHSM[11['[G 	.Aww||FA|<HH%C66"5s;L#L&!<C*-Ickk&&'	.  HHSMs   3,E7 7Fc                2    | j                  d      r| S |  dS )N-rs)endswithpackage_names    r!   _dependency_namer   W  s!    '007<Q~S=QQr)   c                    t        |        dS )N_dep)r(   r   s    r!   _dependency_varnamer   [  s    !,/055r)   c                   g }|j                  |j                  | j                  j                        |j                  d      g       |j                  | j                  j                        |j                  d|j
                  j                         |j                  |j                  d| j                  j                         g      d}| j                  j                  r)|j                  | j                  j                        |d<   n>| j                  j                  r(|j                  | j                  j                        |d<   |j                  d||      gS )zCreate a function call

    :param cargo: The Manifest to generate from
    :param build: The AST builder
    :param env: Meson environment
    :return: a list nodes
    rustz>= z	rust_std=)r   meson_versiondefault_optionsrK   license_filesproject)extendstringrl   r'   r   coredataarrayrE   rK   rL   function)cargorP   envargskwargss        r!   _create_projectr   _  s    &(DKKU]]''(V 
 << 5 56 CLL,@,@+A&BC ;;yAVAV@W5X(Y'Z[-F }}!LL)>)>?y		#	#"',,u}}/I/I"JNN9dF344r)   c                   g }| j                   j                         D ]  \  }}|j                  xs |}d|j                  |j                  D cg c]  }|j                  |       c}      i}|j                  |j                  |j                  d|j                  t        |            g|      t        |            g        |S c c}w )Nr   
dependency)r   r4   rl   r   r   r   r   assignr   r   r   )r   rP   astr'   depr   skws           r!   _create_dependenciesr   |  s    $&C''--/ 	c{{*du{{S[[#IELLO#IJ
 	

LL \\"2<"@AB
 $L1	
 		 J $Js   Cc                x   g }i }| j                   j                         D ]p  \  }}|j                  xs |}|j                  |j	                  t        |                   ||k7  sE|j                  |      ||j                  t        |            <   r |j                  t        | j                  j                              |j                  t        j                  j                  dd            g}|j                  |      |j                  |      d}	| j                  j                  s|dk(  r$|j!                  d|j	                  d      ||	      }
nG|dv rd}n|d	v rd
}nt#        d|       |dv r|j                  d      |	d<   |j%                  |||	      }
|j'                  |
d      |j'                  |j%                  dd|j	                  d      i      d      |j!                  d|j	                  d      |j                  t)        | j                  j                              |j	                  d      g      gS )Nsrclib.rs)r   rust_dependency_mapz
proc-macror   r   >   rx   rlib	staticlibstatic_library>   dylibcdylibshared_libraryzUnsupported crate type >   r   r   crust_abirx   declare_dependency	link_with)r   r   override_dependencymeson)r   r4   rl   append
identifierr   r   r(   r'   r   rj   r   r   r   rx   r   methodr   r   r   r   )r   rP   r|   r   dependency_mapr'   r   r   posargsr   rx   target_types               r!   _create_libr     s   -/LACN''--/ a	c{{*dE,,-@-NOP<NSll[_N`N5<<(;L(IJK	a 	(););<=RWW\\%23)G L1$zz.9-F yyz\9ll<)9)9&)A7FS55*K..*K #::,!GHH00!&c!2F:nn['6: 	S% NN$!1!1%!8   	
 	!W%-emm.@.@AB  '	
 r)   c           	     d   | j                  d      r| d d n| }t        t        j                  j	                  |j
                  |            }|j                  |      }|st        d|d|       t        j                  j	                  |j                  |j                  d      }t        j                  |      }t        |||      }||j                  |j                  d|j                  d      g      d      gz  }|t        ||      z  }t        j                  j!                  t        j                  j	                  |j
                  |j                  |j                  dd	            r7|j"                  j$                  D ]  }	|j'                  t)        |||	               |j+                  |      S )
Nr   zCargo package z not found in r   importr   r   r   )r   r   r   rj   r   
source_dirr   r   r   r   Builderr   r   r   r   r   existsrx   r|   r   r   block)
	subp_namer   r   r   r   r   r   rP   r   r|   s
             r!   	interpretr     sQ   %.%7%7%>9Sb>ILS^^V DEIMM,'E~l-=^F8TUUww||ELL%**lCHOOH%E
%
,CELL5<<3G2HI6RSSCu--C 
ww~~bggll3>>5<<UT\]^)).. 	>JJJ{5%<=	> ;;sr)   )r   r5   rr   zT.Dict[object, object])r'   r5   rr   r5   )r.   zmanifest.BuildTargetrr   zmanifest.FixedBuildTarget)r.   zmanifest.LibTargetrr   zmanifest.FixedLibTarget)r.   zmanifest.Dependencyrr   zmanifest.FixedDependency)r.   zFT.Union[manifest.BuildTarget, manifest.LibTarget, manifest.Dependency]rr   r3   )r   )r   r   r   r5   rj   r5   rr   r   )r   r5   rr   zT.Dict[str, Manifest])r   r5   rr   r5   )r   r   rP   builder.Builderr   r   rr   T.List[mparser.BaseNode])r   r   rP   r   rr   r   )r   r   rP   r   r|   zmanifest.CRATE_TYPErr   r   )r   r5   r   r5   r   r   rr   zmparser.CodeBlockNode)6r_   
__future__r   ra   r   	importlibr   r   r   shutiltypingr7   r   r   r   mesonlibr   r	   TYPE_CHECKINGtypesr
   r   r   environmentr   r   r`   r   timport_moduleImportErrorwhichr"   r(   overloadr/   	dataclassr<   re   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r)   r!   <module>r     sM   #      	     1?? )
 #'	 &!	? !	 *A))))!,* [)I("  R  R N  N P  Pp?p*   B / / /.   8 %k % % [   ;      ak a a   ::&RR65:(4n{  s   6G,,G54G5