
    -Ph;                    t   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 ddlmZ ddlmZ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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<   d$dZ$ G d de          Z% G d  d!e%          Z& G d" d#e%          Z'dS )%    )annotationsN   )options)EnvironmentExceptionMesonExceptionPopen_safe_logged	OptionKey   )CompilerCompileCheckModeclike_debug_args)MutableKeyedOptionDictType)MachineInfo)Environment)DynamicLinker)MachineChoice)
Dependency)BuildTarget-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_argsexelistT.List[str]return-T.Optional[T.Tuple[T.List[str], T.List[str]]]c                   t          |           }	 t          j                            t	          |                    dk    rdS d}t	          |          }|                    d          r)|dz  }t	          |          }|                    d          )|dk    rdS t	          |           t	          |           | d|         t          |          fS # t          $ r Y dS w xY w)ap  Given the command for a rustc executable, check if it is invoked via
       "rustup run" and if so separate the "rustup [OPTIONS] run TOOLCHAIN"
       part from the arguments to rustc.  If the returned value is not None,
       other tools (for example clippy-driver or rustdoc) can be run by placing
       the name of the tool between the two elements of the tuple.rustupN   -r   run)iterospathbasenamenext
startswithlistStopIteration)r    enopts       Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mesonbuild/compilers/rust.pyget_rustup_run_and_argsr5   &   s     	WA7DGG$$0041gg nnS!! 	FAq''C nnS!! 	
 %<<4QQrr{DGG##   tts   0C AC 6C 
CCc                  :    e Zd ZU dZdZddgg g dd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<   	 	 dcdd fd Zded"Z	dfd'Z
dgd)Zdhd,Zdid.Z ej        d/          djd0            Z ej        d/          djd1            Z ej        d/          ded2            Zdkd4Zdld6Zdm fd@ZdndBZedodC            Zdp fdEZdqdHZdrdsdLZdtdOZdtdPZdudRZdv fdSZdvdTZ dwdVZ!dvdWZ"dvdXZ#dxdZZ$dyd\Z%dzd_Z&dzd`Z' ej        d/          d{db            Z( xZ)S )|RustCompilerrustrustcz--cap-lintsallowz-Wwarnings)r   r   r   r   
everythingr   _WARNING_LEVELSz-lzdylib=msvcrtdzdylib=libcmtzdylib=libcmtd)nonemdmddmtmtdzT.Mapping[str, T.List[str]]MSVCRT_ARGSNr    r!   versionstrfor_machiner   is_crossboolinfo'MachineInfo'full_versionT.Optional[str]linkerT.Optional['DynamicLinker']c           
     f   t                                          g |||||||           t          |          | _        | j                            d dD                        d| j        j        v r'| j                            t          d                     g | _
        d|v | _        d|v | _        d S )N)rG   rK   rM   c                ,    h | ]}t          |          S  r	   ).0os     r4   	<setcomp>z(RustCompiler.__init__.<locals>.<setcomp>d   s    !S!S!S1)A,,!S!S!S    )
b_coloroutb_ndebuglinkb_vscrtz-betaz-nightly)super__init__r5   rustup_run_and_argsbase_optionsupdaterM   idaddr
   native_static_libsis_beta
is_nightly)	selfr    rD   rF   rG   rI   rK   rM   	__class__s	           r4   r[   zRustCompiler.__init__\   s     	Wg{D"* & 	 	( 	( 	( SjjqRrRr   !S!S8R!S!S!STTTT[^##!!)I"6"6777/1,.$4rU   r"   c                    dS )NFrQ   rd   s    r4   needs_static_linkerz RustCompiler.needs_static_linkerk   s    urU   work_direnvironmentr   Nonec                T   t           j                            |d          }t           j                            |d          }| j                                        }t          |dd          5 }| j        j        dk    r(|                    t          j
        d                     nLd| j        j        v r|                    d	d
g           |                    t          j
        d                     d d d            n# 1 swxY w Y   |                    d||g           t          ||          \  }}}	|j        dk    r%t!          d|                                  d          |                     ||           | j        r4|                                sd S |j                                        |gz   }n|g}t/          j        |t.          j        t.          j                  }
|
                                 |
j        dk    r%t!          d|                                  d          d S )Nz	sanity.rszrusttest.exewzutf-8)encodingr>   z6fn main() {
                    }
                    zld.r   zlink-arg=-nostartfilesa;  #![no_std]
                    #![no_main]
                    #[no_mangle]
                    pub fn _start() {
                    }
                    #[panic_handler]
                    fn panic(_info: &core::panic::PanicInfo) -> ! {
                        loop {}
                    }
                    z-ocwdr   zRust compiler z cannot compile programs.)stdoutstderrz%Executables created by Rust compiler z are not runnable.)r*   r+   joinr    copyopenrI   kernelwritetextwrapdedentrM   r_   extendr   
returncoder   name_string_native_static_libsrG   has_exe_wrapperexe_wrapperget_command
subprocessPopenDEVNULLwait)rd   ri   rj   source_nameoutput_namecmdlistofilepcstdostdepes              r4   sanity_checkzRustCompiler.sanity_checkn   s`   gll8[99gll8^<<,##%%+sW555 	 y6))HO      DKN**NND*B#CDDDHO	
 
 
 
 
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	0 	k;7888*7AAAD$=A&'e8H8H8J8J'e'e'efff  ;777= 	$..00 !-99;;{mKGG"mGgj.@I[\\\
			=A&'utO_O_OaOa'u'u'uvvv s   ,BC==DDr   c                   | j         dddd|gz   }t          ||          \  }}}|j        dk    rt          d          t	          j        d|t          j                  }|s!| j        j        d	k    rd S t          d
          h dfd|	                    d          
                                D             | _        d S )Nz--crate-type	staticlib--printznative-static-libsro   r   z'Rust compiler cannot compile staticlib.znative-static-libs: (.*)$r>   z:Failed to find native-static-libs in Rust compiler output.>   -lc-lgcc_s
-ladvapi32
-lkernel32/defaultlib:msvcrtc                    g | ]}|v|	S rQ   rQ   )rR   iexcludes     r4   
<listcomp>z4RustCompiler._native_static_libs.<locals>.<listcomp>   s$    "Y"Y"YQXHXHX1HXHXHXrU   r   )r    r   r{   r   research	MULTILINErI   rv   groupsplitra   )	rd   ri   r   r   pr   r   matchr   s	           @r4   r}   z RustCompiler._native_static_libs   s    ,.+yJ^`k!ll)'x@@@4<1&'PQQQ	5tR\JJ 	ey6)) &'cddd
 WVV"Y"Y"Y"Yekk!nn.B.B.D.D"Y"Y"YrU   	outtargetoutfilec                    dd| gS )N--emitz	dep-info=rQ   rd   r   r   s      r4   get_dependency_gen_argsz$RustCompiler.get_dependency_gen_args   s    /g//00rU   
outputnamec                    dd| gS )Nr   zlink=rQ   rd   r   s     r4   get_output_argszRustCompiler.get_output_args   s    .*..//rU   )maxsizec                    |                      d          ddgz   }t          |          \  }}}|                    dd          d         S )	NFccacher   sysroot
r   maxsplitr   get_exelistr   r   rd   cmdr   r   r   s        r4   get_sysrootzRustCompiler.get_sysroot   sP    e,,	9/EE)#..4zz$z++A..rU   c                    |                      d          ddgz   }t          |          \  }}}|                    dd          d         S )	NFr   r   ztarget-libdirr   r   r   r   r   r   s        r4   get_target_libdirzRustCompiler.get_target_libdir   sP    e,,	?/KK)#..4zz$z++A..rU   c                    |                      d          ddgz   }t          |          \  }}}t          t          j        d|t          j                            S )NFr   r   cfgz^target_feature="crt-static"$)r   r   rH   r   r   r   r   s        r4   get_crt_staticzRustCompiler.get_crt_static   sT    e,,	5/AA)#..4BI=tR\RRSSSrU   is_debugc                    t           |         S N)r   rd   r   s     r4   get_debug_argszRustCompiler.get_debug_args   s    ))rU   optimization_levelc                    t           |         S r   )r   )rd   r   s     r4   get_optimization_argsz"RustCompiler.get_optimization_args   s    %&899rU   env'Environment'	build_dirfrom_dirrpath_pathsT.Tuple[str, ...]build_rpathinstall_rpath"T.Tuple[T.List[str], T.Set[bytes]]c                    t                                          ||||||          \  }}g }	|D ]D}
|	                    d           |	                    d|
 d|                                             E|	|fS )Nr   	link-arg=:)rZ   build_rpath_argsappendr   )rd   r   r   r   r   r   r   args	to_removerustc_rpath_argsargre   s              r4   r   zRustCompiler.build_rpath_args   s      ''223	8[3>O Oi
  	R 	RC##D)))##$P$P$Pd6L6L6N6N$P$PQQQQ**rU   parameter_listc                H   t          |          D ]\  }}|d d         dk    r~dD ]{}t          |          dz   }|d |         d| dk    rU|d |         t          j                            t          j                            |||d                              z   ||<    n||S )Nr   z-L)
dependencycratenative	frameworkallr&   =)	enumeratelenr*   r+   normpathrs   )rd   r   r   idxr   jcombined_lens          r4   &compute_parameters_with_absolute_pathsz3RustCompiler.compute_parameters_with_absolute_paths   s    // 	 	FC!u}}N  A#&q66A:L,'999944./.>AQAQRTRYR^R^_hjklxlylyjzR{R{A|A|.|s+ 5 rU   c                    dd| gS )Nr   zlinker=rQ   )clsrM   rD   s      r4   use_linker_argszRustCompiler.use_linker_args   s    ((())rU   r   c                    t                                                      }|                     d          }t          j        |                     |          ddg d          ||<   |S )NstdzRust edition to user>   )r>   2015201820212024)choices)rZ   get_optionsform_compileropt_keyr   UserComboOptionmake_option_name)rd   optskeyre   s      r4   r   zRustCompiler.get_options   sm    ww""$$''..+!!#&&!<<<	> > >S	 rU   dep'Dependency'c                    g S r   rQ   )rd   r   s     r4   get_dependency_compile_argsz(RustCompiler.get_dependency_compile_args   s	     	rU   targetr   
subprojectc                    g }|                      d|||          }t          |t                    sJ |dk    r|                    d|z              |S )Nr   r>   z
--edition=)get_compileropt_value
isinstancerE   r   )rd   r   r   r   r   r   s         r4   get_option_std_argsz RustCompiler.get_option_std_args  s[    ((VZHH#s#####&==KKs*+++rU   crt_val	buildtypec                    g S r   rQ   rd   r   r  s      r4   get_crt_compile_argsz!RustCompiler.get_crt_compile_args
      	rU   c                d    | j         j        dvrg S | j        |                     ||                   S )N>   lld-linkrX   )rM   r_   rC   get_crt_valr  s      r4   get_crt_link_argszRustCompiler.get_crt_link_args  s5    ;>!555I 0 0) D DEErU   	colortypec                :    |dv rd| gS t          d|           )N>   autoneveralwaysz--color=zInvalid color type for rust )r   )rd   r
  s     r4   get_colorout_argszRustCompiler.get_colorout_args  s6    333*y**++GIGGHHHrU   c                    g }t                                                      D ]}|                    dd| g           |S )Nr   r   )rZ   get_linker_always_argsrz   )rd   r   are   s      r4   r  z#RustCompiler.get_linker_always_args  sN     //11 	1 	1AKK1/0000rU   c                
    ddgS )Nz-Dr;   rQ   rg   s    r4   get_werror_argszRustCompiler.get_werror_args   s     j!!rU   levelc                    | j         |         S r   )r=   )rd   r  s     r4   get_warn_argszRustCompiler.get_warn_args%  s    #E**rU   c                    g S r   rQ   rg   s    r4   get_pic_argszRustCompiler.get_pic_args)  r  rU   c                    g S r   rQ   rg   s    r4   get_pie_argszRustCompiler.get_pie_args-  s	     	rU   disablec                     |rdnd}dd| ddgS )Nnoyesr   zdebug-assertions=zoverflow-checks=norQ   )rd   r  r   actions       r4   get_assert_argszRustCompiler.get_assert_args2  s)     +e2&22D:NOOrU   namec                    | j         r| j         \  }}||gz   }n|g}|                                 }ddlm}  ||| j        |d         |d         |d         gd          D ]}|j        |d<    ng S ||z   S )Nr   )find_external_programr   F)allow_default_for_cross)r\   get_exe_argsprogramsr$  rF   r+   )rd   r"  r   rustup_exelistr   r    r$  progs           r4   get_rust_toolzRustCompiler.get_rust_tool6  s    # 	'#'#; ND$v-GGfG$$&&D444444))#t/?WUVZ+21:,PUW W W 	 	DGAJEI~rU   r   T.Tuple[bool, bool]c                H    |                      d||t          j                  S Nz$fn main() { std::process::exit(0) }
)
extra_argsmode)compilesr   COMPILErd   r   r   s      r4   has_multi_argumentsz RustCompiler.has_multi_argumentsI  s"    }}DcVZaqay}zzzrU   c                    | j                                         |z   }|                     d||t          j                  S r-  )rM   fatal_warningsr0  r   LINKr2  s      r4   has_multi_link_argumentsz%RustCompiler.has_multi_link_argumentsL  s:    {))++d2}}DcVZaqav}wwwrU   T.Optional[RustdocTestCompiler]c           	         |                      d|          }|sd S t          || j        | j        | j        | j        | j        | j                  S )Nrustdoc)rK   rM   )r*  RustdocTestCompilerrD   rF   rG   rI   rK   rM   )rd   r   r    s      r4   get_rustdoczRustCompiler.get_rustdocP  sY    $$Y44 	4"7DL$:J#'=$)$J[*.+7 7 7 	7rU   )NN)r    r!   rD   rE   rF   r   rG   rH   rI   rJ   rK   rL   rM   rN   )r"   rH   )ri   rE   rj   r   r"   rk   )ri   rE   r   rE   r"   rk   r   rE   r   rE   r"   r!   r   rE   r"   r!   )r"   rE   r   rH   r"   r!   )r   rE   r"   r!   )r   r   r   rE   r   rE   r   r   r   rE   r   rE   r"   r   )r   r!   r   rE   r"   r!   )rM   rE   rD   rE   r"   r!   )r"   r   )r   r   r"   r!   r   )r   r   r   r   r   rL   r"   r!   )r   rE   r  rE   r"   r!   )r
  rE   r"   r!   )r"   r!   )r  rE   r"   r!   )r  rH   r   r   r"   r!   )r"  rE   r   r   r"   r!   )r   r!   r   r   r"   r+  )r   r   r"   r8  )*__name__
__module____qualname__languager_   r=   __annotations__rC   r[   rh   r   r}   r   r   	functools	lru_cacher   r   r   r   r   r   r   classmethodr   r   r   r   r  r	  r  r  r  r  r  r  r!  r*  r3  r7  r<  __classcell__)re   s   @r4   r7   r7   C   s         H	B W%JZ(1 1O     o&^$o&0 0K     267;5 5 5 5 5 5 5   ,w ,w ,w ,w\Z Z Z Z(1 1 1 10 0 0 0 Y&&&/ / / '&/
 Y&&&/ / / '&/
 Y&&&T T T '&T
* * * *: : : :+ + + + + +
 
 
 
 * * * [*
 
 
 
 
 
          F F F F
I I I I
     " " " "
+ + + +      
P P P P   &{ { { {x x x x Y&&&7 7 7 '&7 7 7 7 7rU   r7   c                      e Zd ZdZdZdS )ClippyRustCompilerzSClippy is a linter that wraps Rustc.

    This just provides us a different id
    zclippy-driver rustcN)r@  rA  rB  __doc__r_   rQ   rU   r4   rJ  rJ  Z  s         
 
BBBrU   rJ  c                  .    e Zd ZdZdZddZddZddZdS )r;  zWe invoke Rustdoc to run doctests.  Some of the flags
       are different from rustc and some (e.g. --emit link) are
       ignored.zrustdoc --testr   rH   r"   r!   c                    g S r   rQ   r   s     r4   r   z"RustdocTestCompiler.get_debug_argsl      	rU   r   rE   r   c                    g S r   rQ   r   s      r4   r   z+RustdocTestCompiler.get_dependency_gen_argso  rN  rU   r   c                    g S r   rQ   r   s     r4   r   z#RustdocTestCompiler.get_output_argsr  rN  rU   Nr?  r=  r>  )r@  rA  rB  rK  r_   r   r   r   rQ   rU   r4   r;  r;  d  sa          
B           rU   r;  )r    r!   r"   r#   )(
__future__r   rE  r   os.pathr*   rx   r   typingT r   mesonlibr   r   r   r
   	compilersr   r   r   TYPE_CHECKINGr   	envconfigr   rj   r   linkers.linkersr   r   dependenciesr   buildr   r   rD  r5   r7   rJ  r;  rQ   rU   r4   <module>r]     s<  
 # " " " " " "              				           N N N N N N N N N N       C C C C C C C C C C? $444444''''''))))))//////(((((())))))###### 	
	
	
	
	
	4 4        :U7 U7 U7 U7 U78 U7 U7 U7n           ,     rU   