
    e&                    H   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Zd dlZ	ddl
mZ ddlmZmZmZmZ ddlmZmZmZ e	j*                  r,ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" g g ddgddgddgddgddgdZ#de$d<    G d de      Z% G d de%      Z&y)    )annotationsN   )coredata)EnvironmentExceptionMesonExceptionPopen_safe_logged	OptionKey   )Compilerrust_buildtype_argsclike_debug_args)MutableKeyedOptionDictTypeKeyedOptionDictType)MachineInfo)Environment)DynamicLinker)MachineChoice)ExternalProgram)
Dependency-Czopt-level=0zopt-level=1zopt-level=2zopt-level=3zopt-level=s)plain0g123sT.Dict[str, T.List[str]]rust_optimization_argsc                      e Zd ZU dZdZddgg g ddgdZded<   g g d	d
gd	dgd	dgdZded<   	 	 	 d+	 	 	 	 	 	 	 	 	 d, fdZd-dZ	d.dZ
d/dZd0dZd1dZ ej                  d      d-d       Zd2dZd3dZ	 	 	 	 d4dZd5dZed6d       Zd7dZd8dZd9d Zd:d!Zd:d"Zd;d#Zd< fd$Zd<d%Zd=d&Zd<d'Z d<d(Z!d<d)Z"d>d*Z# xZ$S )?RustCompilerrustrustcz-Awarningsz-W)r   r   r   r   r   _WARNING_LEVELSz-lzdylib=msvcrtdzdylib=libcmtzdylib=libcmtd)nonemdmddmtmtdzT.Mapping[str, T.List[str]]MSVCRT_ARGSNc	           
     6   t         
|   g |||||||       || _        | j                  j	                  dD 	ch c]  }	t        |	       c}	       d| j                  j                  v r$| j                  j                  t        d             g | _	        y c c}	w )N)is_crossfull_versionlinker)
b_coloroutb_ndebuglinkb_vscrt)
super__init__exe_wrapperbase_optionsupdater	   r/   idaddnative_static_libs)selfexelistversionfor_machiner-   infor6   r.   r/   o	__class__s             ;/usr/lib/python3/dist-packages/mesonbuild/compilers/rust.pyr5   zRustCompiler.__init__F   s    
 	Wg{D"* & 	 	( '  8R!S1)A,!STT[[^^#!!)I"67/1 "Ts   Bc                     y)NF r<   s    rC   needs_static_linkerz RustCompiler.needs_static_linkerT   s        c                B   t         j                  j                  |d      }t         j                  j                  |d      }t        |dd      5 }|j	                  t        j                  d             d d d        | j                  d||gz   }t        ||      \  }}}	|j                  d	k7  rt        d
| j                          d      | j                  r,| j                  y | j                  j                         |gz   }n|g}t        j                   |t        j"                  t        j"                        }
|
j%                          |
j                  d	k7  rt        d| j                          d      | j                  dddd|gz   }t        ||      \  }}}	|j                  d	k(  rdt'        j(                  d|	t&        j*                        }|r<h d}|j-                  d      j/                         D cg c]	  }||vs| c}| _        y y y # 1 sw Y   xY wc c}w )Nz	sanity.rsrusttestwzutf-8)encodingz.fn main() {
                }
                -o)cwdr   zRust compiler z cannot compile programs.)stdoutstderrz%Executables created by Rust compiler z are not runnable.z--crate-type	staticlib--printznative-static-libsznative-static-libs: (.*)$>   -lc-lgcc_s
-ladvapi32
-lkernel32r
   )ospathjoinopenwritetextwrapdedentr=   r   
returncoder   name_stringr-   r6   get_command
subprocessPopenDEVNULLwaitresearch	MULTILINEgroupsplitr;   )r<   work_direnvironmentsource_nameoutput_nameofilecmdlistpcstdostdepepmatchexcludeis                  rC   sanity_checkzRustCompiler.sanity_checkW   s   ggll8[9ggll8Z8+sW5 	KK 	 ,,$[!AA*7AD$==A&8H8H8J7KKd'eff=='&&224}DG"mGgj.@.@I[I[\
	==A&)NtO_O_OaNbbt'uvv,,.+yJ^`k!ll)'x@4<<1II94NE
 I6;kk!n6J6J6L*aPQY`P`1*a'  1	 	@ +bs   %H6	H HHc                
    d|gS )Nz
--dep-inforE   )r<   	outtargetoutfiles      rC   get_dependency_gen_argsz$RustCompiler.get_dependency_gen_args|   s    g&&rH   c                    t         |   S N)r   )r<   	buildtypes     rC   get_buildtype_argszRustCompiler.get_buildtype_args   s    "9--rH   c                z    | j                  d      ddgz   }t        |      \  }}}|j                  dd      d   S )	NFccacherR   sysroot
r
   )maxsplitr   )get_exelistr   ri   r<   cmdrt   rq   rr   s        rC   get_sysrootzRustCompiler.get_sysroot   sG    e,	9/EE)#.4zz$z+A..rH   )maxsizec                    | j                  d      ddgz   }t        |      \  }}}t        t        j                  d|t        j
                              S )NFr   rR   cfgz^target_feature="crt-static"$)r   r   boolre   rf   rg   r   s        rC   get_crt_staticzRustCompiler.get_crt_static   sL    e,	5/AA)#.4BII=tR\\RSSrH   c                    t         |   S r~   )r   )r<   is_debugs     rC   get_debug_argszRustCompiler.get_debug_args   s    ))rH   c                    t         |   S r~   )r   )r<   optimization_levels     rC   get_optimization_argsz"RustCompiler.get_optimization_args   s    %&899rH   c                   t        |      D ]z  \  }}|d d dk(  sdD ]g  }t        |      dz   }|d | d| dk(  s|d | t        j                  j	                  t        j                  j                  |||d              z   ||<    z | |S )Nr   z-L)
dependencycratenative	frameworkall   =)	enumeratelenrW   rX   normpathrY   )r<   parameter_list	build_diridxrw   jcombined_lens          rC   &compute_parameters_with_absolute_pathsz3RustCompiler.compute_parameters_with_absolute_paths   s    / 	FC!u}N A#&q6A:L,'Rs!94./.>AQAQRTRYRYR^R^_hjklxlyjzR{A|.|s+		 rH   c                
    d|gS )NrM   rE   )r<   
outputnames     rC   get_output_argszRustCompiler.get_output_args   s    j!!rH   c                    dd| gS )Nr   zlinker=rE   )clsr/   r>   s      rC   use_linker_argszRustCompiler.use_linker_args   s    x())rH   c                |    t        d| j                  | j                        }|t        j                  dg dd      iS )NstdmachinelangzRust edition to use)r&   201520182021r&   )r	   r?   languager   UserComboOption)r<   keys     rC   get_optionszRustCompiler.get_options   s=    t'7'7dmmL))%0
 	
rH   c                    g S r~   rE   )r<   deps     rC   get_dependency_compile_argsz(RustCompiler.get_dependency_compile_args   s	     	rH   c                    g }t        d| j                  | j                        }||   }|j                  dk7  r|j	                  d|j                  z          |S )Nr   r   r&   z
--edition=)r	   r?   r   valueappend)r<   optionsargsr   r   s        rC   get_option_compile_argsz$RustCompiler.get_option_compile_args   sN    t'7'7dmmLcl99KKsyy01rH   c                    g S r~   rE   r<   crt_valr   s      rC   get_crt_compile_argsz!RustCompiler.get_crt_compile_args       	rH   c                t    | j                   j                  dvrg S | j                  | j                  ||         S )N>   lld-linkr2   )r/   r9   r+   get_crt_valr   s      rC   get_crt_link_argszRustCompiler.get_crt_link_args   s6    ;;>>!55I 0 0) DEErH   c                2    |dv rd| gS t        d|       )N>   autoneveralwaysz--color=zInvalid color type for rust )r   )r<   	colortypes     rC   get_colorout_argszRustCompiler.get_colorout_args   s.    33yk*++;I;GHHrH   c                ^    g }t         |          D ]  }|j                  dd| g        |S )Nr   z	link-arg=)r4   get_linker_always_argsextend)r<   r   arB   s      rC   r   z#RustCompiler.get_linker_always_args   s;    /1 	1AKK1#/0	1rH   c                
    ddgS )Nz-Dr$   rE   rF   s    rC   get_werror_argszRustCompiler.get_werror_args   s     j!!rH   c                     | j                   |   S r~   r%   )r<   levels     rC   get_warn_argszRustCompiler.get_warn_args   s    ##E**rH   c                     | j                   d   S )Nr   r   rF   s    rC   get_no_warn_argszRustCompiler.get_no_warn_args   s    ##C((rH   c                    g S r~   rE   rF   s    rC   get_pic_argszRustCompiler.get_pic_args   r   rH   c                    g S r~   rE   rF   s    rC   get_pie_argszRustCompiler.get_pie_args   s	     	rH   c                     |rdnd}dd| ddgS )Nnoyesr   zdebug-assertions=zoverflow-checks=norE   )r<   disableactions      rC   get_assert_argszRustCompiler.get_assert_args   s#     e)&2D:NOOrH   )NNN)r=   T.List[str]r>   strr?   r   r-   r   r@   z'MachineInfo'r6   zT.Optional['ExternalProgram']r.   zT.Optional[str]r/   zT.Optional['DynamicLinker'])returnr   )rj   r   rk   z'Environment'r   None)rz   r   r{   r   r   r   )r   r   r   r   )r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )r/   r   r>   r   r   r   )r   z'MutableKeyedOptionDictType')r   z'Dependency'r   r   )r   z'KeyedOptionDictType'r   r   )r   r   r   r   r   r   )r   r   r   r   )r   r   )r   r   r   r   )r   r   r   r   )%__name__
__module____qualname__r   r9   r%   __annotations__r+   r5   rG   rx   r|   r   r   	functools	lru_cacher   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rB   s   @rC   r!   r!   .   s\    H	B JJ	1O-  o&^$o&0K,  ?C157;	22'42;2  /2 5	2#bJ'./
 Y&T 'T
*:
:=
BM
" * *
F
I
"
+)
PrH   r!   c                      e Zd ZdZdZy)ClippyRustCompilerzSClippy is a linter that wraps Rustc.

    This just provides us a different id
    zclippy-driver rustcN)r   r   r   __doc__r9   rE   rH   rC   r   r      s    
 
BrH   r   )'
__future__r   r   ra   os.pathrW   r\   re   typingT r   mesonlibr   r   r   r	   	compilersr   r   r   TYPE_CHECKINGr   r   	envconfigr   rk   r   linkers.linkersr   r   programsr   dependenciesr   r   r   r!   r   rE   rH   rC   <module>r     s    #    	   Y Y F F??J')/(*) 	
	
	
	
	
	4 0 P8 PD rH   