
    e\                    b   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
 ddlmZmZmZ ddlmZmZmZmZ 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mZ ddl m!Z!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl2m4Z4m5Z5 ejl                  r/ddl	m7Z7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlmAZA ddlBmCZC eZDneEZDg dZFeFeFD  cg c]
  } d| dd   c} z  ZFeFg d z  ZFdTd!ZG G d" d#ee      ZH G d$ d%eD      ZI G d& d'eIe+eH      ZJ G d( d)eJ      ZK G d* d+eJ      ZL G d, d-e1eJ      ZM G d. d/eeH      ZN G d0 d1eIe$eH      ZO G d2 d3e/eH      ZP G d4 d5e/eH      ZQ G d6 d7e-eH      ZR G d8 d9e(eH      ZS G d: d;eJ      ZT G d< d=eD      ZU G d> d?eD      ZV G d@ dAeVeUe!eH      ZW G dB dCeVeUe"eH      ZX G dD dEeUe)eH      ZY G dF dGeY      ZZ G dH dIeeH      Z[ G dJ dKeeH      Z\ G dL dMeeH      Z] G dN dOe]      Z^ G dP dQe3eH      Z_ G dR dSe3eH      Z`yc c} w )U    )annotationsN   )coredata)mlog)MesonExceptionversion_compare	OptionKey   )gnu_winlibsmsvc_winlibsCompilerCompileCheckMode)CXX_FUNC_ATTRIBUTESC_FUNC_ATTRIBUTES)CLikeCompiler)CcrxCompiler)
TICompiler)ArmCompilerArmclangCompiler)MSVCCompilerClangClCompiler)GnuCompilergnu_common_warning_argsgnu_cpp_warning_args)IntelGnuLikeCompilerIntelVisualStudioLikeCompiler)ClangCompiler)ElbrusCompiler)PGICompiler)EmscriptenMixin)MetrowerksCompiler)mwccarm_instruction_set_argsmwcceppc_instruction_set_args)MutableKeyedOptionDictTypeKeyedOptionDictType)
Dependency)MachineInfo)Environment)DynamicLinker)MachineChoice)ExternalProgram)c++98c++0xc++03c++1yc++1zc++11c++14c++17c++2ac++20c++23c++26gnu)vc++11vc++14vc++17vc++20
vc++latest	c++latestc                r    | dk(  r|j                  d       y | dv rt        j                  d|  dd       y y )Nnone-fno-exceptions>   csz"non-MSVC compilers do not support z9 exception handling. You may want to set eh to 'default'.Ffatal)appendr   warning)ehargss     :/usr/lib/python3/dist-packages/mesonbuild/compilers/cpp.pynon_msvc_eh_optionsrK   ?   sD    	V|%&	z	9" >> >EJ	L 
    c                       e Zd ZddZdZ	 	 	 d	 	 	 	 	 	 	 ddZedd       ZddZddZ	ddZ
d fd	Zddd
	 	 	 	 	 	 	 d fdZddZ ej                         dd       Zd fdZ xZS )CPPCompilerc                v    	 t        j                  |t        |         S # t        $ r t	        d| d      w xY w)NzUnknown function attribute "")r   getr   KeyErrorr   )selfnames     rJ   attribute_check_funcz CPPCompiler.attribute_check_funcG   sG    	I&**41B41HII 	I #?vQ!GHH	Is    8cppNc
                l    t        j                  | ||||||||		       t        j                  | |       y )N)is_crosslinkerfull_version)r   __init__r   
rS   ccacheexelistversionfor_machinerX   infoexe_wrapperrY   rZ   s
             rJ   r[   zCPPCompiler.__init__O   s8    
 	$+t#+F'3	5 	t[1rL   c                     y)NC++ )clss    rJ   get_display_languagez CPPCompiler.get_display_languageY   s    rL   c                    dgS )Nz-nostdinc++re   rS   s    rJ   get_no_stdinc_argszCPPCompiler.get_no_stdinc_args]   
    rL   c                    dgS )Nz-nostdlib++re   ri   s    rJ   get_no_stdlib_link_argsz#CPPCompiler.get_no_stdlib_link_args`   rk   rL   c                .    d}| j                  ||d|      S )Nz2class breakCCompiler;int main(void) { return 0; }
zsanitycheckcpp.cc)_sanity_check_impl)rS   work_direnvironmentcodes       rJ   sanity_checkzCPPCompiler.sanity_checkc   s     D&&x>QSWXXrL   c                *    t         |   |      dgz   S )Nz-fpermissive)superget_compiler_check_args)rS   mode	__class__s     rJ   rv   z#CPPCompiler.get_compiler_check_argsg   s     w.t47GGGrL   
extra_argsdependenciesc                   t         
|   ||||||      \  }}|rd|fS |g }| d| d| d}	| j                  |	|||      S )Nry   Tz
        #include <z>
        using z&;
        int main(void) { return 0; })ru   has_header_symbolcompiles)rS   hnamesymbolprefixenvrz   r{   foundcachedtrx   s             rJ   r}   zCPPCompiler.has_header_symbolm   s    
 1%=G?K 2 Mv <J ' h '* }}Q
*6  8 	8rL   c                :   |j                  d      sJ d}| j                  ||gt        j                        5 }|j                  dk(  r$t        j                  d| dd       	 d d d        yt        j                  d| dd	       	 d d d        y
# 1 sw Y   y xY w)N-std=zint i = static_cast<int>(0);)rz   rw   r   zCompiler accepts :YESTNOF)
startswithcompiler   COMPILE
returncoder   debug)rS   cpp_std_valueCPP_TESTps       rJ   _test_cpp_std_argzCPPCompiler._test_cpp_std_arg   s    ''000 2\\(EUE]E]\^ 	bc||q 

.}oQ?G	 	
 

.}oQ?F	 	 	s   +B-BBc                    ddddddddd	d
ddd}| j                   t        g d      v sJ ||vrd|z   S |||   fD ]  }d|z   }| j                  |      s|c S  t        d|       )Nr-   zgnu++0xr/   zgnu++1yr0   zgnu++1zr4   gnu++2azc++2bzgnu++2bzc++2czgnu++2c)r1   gnu++11r2   gnu++14r3   zgnu++17r5   zgnu++20r6   zgnu++23r7   zgnu++26)clanglccgcc
emscriptenarmltdclang
intel-llvmr   z#C++ Compiler does not support -std=)id	frozensetr   r   )rS   cpp_stdCPP_FALLBACKSir   s        rJ   _find_best_cpp_stdzCPPCompiler._find_best_cpp_std   s           
  ww)$fgggg-'W$$=12 	%A#aKM%%m4$$	%
 B7)LMMrL   c                    t         |          }t        d| j                  | j                        }|j                  |t        j                  dt              i       |S )Nstdmachinelangrd   )	ru   get_optionsr	   r`   languageupdater   UserStdOption	_ALL_STDS)rS   optskeyrx   s      rJ   r   zCPPCompiler.get_options   sR    w"$t'7'7dmmL''y9
 	 rL   )rT   strreturnr   NNNr]   T.List[str]r^   r   r_   r   r`   r*   rX   boolra   'MachineInfo'rb   T.Optional['ExternalProgram']rY   T.Optional['DynamicLinker']rZ   T.Optional[str])r   r   r   r   )rp   r   rq   'Environment'r   Nonerw   r   r   r   )r   r   r   r   r   r   r   r   rz   zGT.Union[None, T.List[str], T.Callable[[CompileCheckMode], T.List[str]]]r{    T.Optional[T.List['Dependency']]r   T.Tuple[bool, bool])r   r   r   r   )r   r   r   r   r   'MutableKeyedOptionDictType')__name__
__module____qualname__rU   r   r[   classmethodrg   rj   rm   rs   rv   r}   r   	functools	lru_cacher   r   __classcell__rx   s   @rJ   rN   rN   F   s    I H TX7;152$23P242  /2  YH quKO8,8&m8 )I8 Uh8($ Y"N "NH rL   rN   c                  B    e Zd ZdZ ej
                  d      dd       Zy)_StdCPPLibMixinz*Detect whether to use libc++ or libstdc++.Nc                &   | j                  |d      D cg c]  }d| 	 }}|j                  | j                     }|J d       g }|j                  dv rddg}nddg}|D ]   }| j	                  ||g       |d| gz   c S  t        d      c c}w )	a  Detect the C++ stdlib and default search dirs

        As an optimization, this method will cache the value, to avoid building the same values over and over

        :param env: An Environment object
        :raises MesonException: If a stdlib cannot be determined
        	librariesz-Lfor mypy>   darwinnetbsdandroidfreebsdopenbsd	dragonflyzc++zstdc++z-lzNCould not detect either libc++ or libstdc++ as your C++ stdlib implementation.)get_compiler_dirsmachinesr`   systemfind_libraryr   )rS   r   dsearch_dirsr   search_orderlibs          rJ   language_stdlib_only_link_flagsz/_StdCPPLibMixin.language_stdlib_only_link_flags   s     *.)?)?[)QRAA3xRR,,t//0".J."
 %'>>__!8,L$e,L 	2C  c2.:"3%j\11	2 mnn# Ss   B)r   r(   r   r   )r   r   r   __doc__r   r   r   re   rL   rJ   r   r      s&    4Yo orL   r   c                  P    e Zd ZdZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 d	dZd
dZddZddZy)ClangCPPCompilerz>=12.0.0>=17.0.0Nc                    t         j                  | |||||||||

       t        j                  | |	       ddg}g ||dgz   |ddgz   dgd| _        y NrY   rZ   -Wall-Winvalid-pch-Wextra
-Wpedanticz-Weverything0123
everything)rN   r[   r   	warn_argsrS   r]   r^   r_   r`   rX   ra   rb   rY   definesrZ   default_warn_argss               rJ   r[   zClangCPPCompiler.__init__   st    
 	T67G[(!;vL 	 	ZtW-$o6!00I;>0I|3LL)7(8	:rL   c           	     h   t         j                  |       }t        d| j                  | j                        }|j                  |j                  d      t        j                  dg dd      |j                  d      t        j                  dd	      i       g d
}t        | j                  | j                        r|j                  d       t        | j                  | j                        r|j                  d       ||j                  d         }t        |t        j                         sJ d       |j#                  |d	       | j$                  j'                         s| j$                  j)                         r:|j                  |j                  d      t        j*                  dt,              i       |S )Nr   r   rH   C++ exception handling type.r@   defaultarC   scr   rttiEnable RTTITr,   r.   r1   r2   r3   r0   r4   r5   r6   r7   r   r   r8   winlibs&Standard Win libraries to link against)rN   r   r	   r`   r   r   evolver   UserComboOptionUserBooleanOptionr   r_   _CPP23_VERSIONrF   _CPP26_VERSION
isinstancer   set_versionsra   
is_windows	is_cygwinUserArrayOptionr   )rS   r   r   cppstd_choicesstd_opts        rJ   r   zClangCPPCompiler.get_options   s^   &&t,t'7'7dmmLJJth66.3
 JJv : :=$ O
 	
 4<<)<)<=!!'*4<<)<)<=!!'*szz%()'8#9#9:FJF:^699!TYY%8%8%:KK

9%x'?'?<(  rL   c                x   g }t        d| j                  | j                        }||   }|j                  dk7  r*|j	                  | j                  |j                               t        ||j                  d         j                  |       ||j                  d         j                  s|j	                  d       |S )Nr   r   r@   rH   r   	-fno-rttir	   r`   r   valuerF   r   rK   r   rS   optionsrI   r   r   s        rJ   get_option_compile_argsz(ClangCPPCompiler.get_option_compile_args  s    t'7'7dmmLcl99KK//		:;GCJJt$45;;TBszz&)*00KK$rL   c                F   | j                   j                         s| j                   j                         rlt        d| j                  | j
                        }||   j                  j                         }t        |t              sJ |D ]  }t        |t              rJ  |S g S Nr   r   ra   r  r  r	   r`   r   r  copyr  listr   rS   r  r   libsls        rJ   get_option_link_argsz%ClangCPPCompiler.get_option_link_args'      99!TYY%8%8%:It/?/?dmmTC3<%%**,DdD))) *!!S)))*K	rL   NNNNr]   r   r^   r   r_   r   r`   r*   rX   r   ra   r   rb   r   rY   r   r   zT.Optional[T.Dict[str, str]]rZ   r   r   r  z'KeyedOptionDictType'r   r   )	r   r   r   r  r  r[   r   r  r  re   rL   rJ   r   r      s\    NN TX7;9=15	:$:3P:4: 7:  /	:<	rL   r   c                      e Zd ZdZy)ArmLtdClangCPPCompilerr   Nr   r   r   r   re   rL   rJ   r   r   3  s    	BrL   r   c                      e Zd ZdZdZy)AppleClangCPPCompilerz>=13.0.0z>=99.0.0N)r   r   r   r  r  re   rL   rJ   r#  r#  8  s    N  NrL   r#  c                  <    e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZddZy)EmscriptenCPPCompilerr   Nc                    |st        d      t        |d      st        d      t        j                  | |||||||||	|
       y )Nz;Emscripten compiler can only be used for cross compilation.z	>=1.39.19z$Meson requires Emscripten >= 1.39.19)rb   rY   r   rZ   )r   r   r   r[   rS   r]   r^   r_   r`   rX   ra   rb   rY   r   rZ   s              rJ   r[   zEmscriptenCPPCompiler.__init__D  sU    
  !^__w4 !GHH!!$+x"&K*1 	" 	NrL   c                    g }t        d| j                  | j                        }||   }|j                  dk7  r*|j	                  | j                  |j                               |S Nr   r   r@   )r	   r`   r   r  rF   r   r  s        rJ   r  z-EmscriptenCPPCompiler.get_option_compile_argsQ  sT    t'7'7dmmLcl99KK//		:;rL   r  r  r  )r   r   r   r   r[   r  re   rL   rJ   r%  r%  @  sS    	B TX7;9=15	N$N3PN4N 7N  /	NrL   r%  c                  F    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 ddZd	dZd
dZd
dZy)ArmclangCPPCompilerz
    Keil armclang
    Nc
                    t         j                  | |||||||||	
       t        j                  |        ddg}
g |
|
dgz   |
ddgz   dgd| _        y r   )rN   r[   r   r   rS   r]   r^   r_   r`   rX   ra   rb   rY   rZ   r   s              rJ   r[   zArmclangCPPCompiler.__init___  sr     	T67G[(!;vL 	 	Z!!$'$o6!00I;>0I|3LL)7(8	:rL   c                \   t         j                  |       }t        d| j                  | j                        }|j                  |j                  d      t        j                  dg dd      i       ||   }t        |t        j                        sJ d       |j                  g dd	
       |S )Nr   r   rH   r   r   r   r   )r,   r.   r1   r2   r3   Tr   )rN   r   r	   r`   r   r   r   r   r   r  r   r  )rS   r   r   r
  s       rJ   r   zArmclangCPPCompiler.get_optionsm  s    &&t,t'7'7dmmLJJth66.3
 	 s)'8#9#9:FJF:JPTUrL   c                   g }t        d| j                  | j                        }||   }|j                  dk7  r|j	                  d|j                  z          t        ||j                  d         j                  |       |S )Nr   r   r@   r   rH   )r	   r`   r   r  rF   rK   r   r  s        rJ   r  z+ArmclangCPPCompiler.get_option_compile_args|  sl    t'7'7dmmLcl99KK#))+,GCJJt$45;;TBrL   c                    g S Nre   rS   r  s     rJ   r  z(ArmclangCPPCompiler.get_option_link_args      	rL   r   r   r   r  )r   r   r   r   r[   r   r  r  re   rL   rJ   r+  r+  Z  sJ    
 TX7;15:$:3P:4:  /:	rL   r+  c                  P    e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZd	dZd
dZd
dZddZy)GnuCPPCompilerNc                   t         j                  | |||||||||

       t        j                  | |	       ddg}g ||dgz   |ddgz   |ddgz   | j                  t              z   | j                  t
              z   d| _        y )Nr   r   r   r   r   r   )rN   r[   r   supported_warn_argsr   r   r   r   s               rJ   r[   zGnuCPPCompiler.__init__  s    
 	T67G[(!;vL 	 	ZT7+$o6!00I;>0I|3LL):i=V)V)-)A)ABY)Z*[)-)A)ABV)W*X	ZrL   c                l   t        d| j                  | j                        }t        j	                  |       }|j                  |j                  d      t        j                  dg dd      |j                  d      t        j                  dd	      |j                  d
      t        j                  dd      i       g d}t        | j                  d      r|j                  d       t        | j                  d      r|j                  d       ||   }t        |t        j                        sJ d       |j                  |d	       | j                   j#                         s| j                   j%                         r:|j                  |j                  d      t        j&                  dt(              i       |S )Nr   r   rH   r   r   r   r   r   TdebugstlSTL debug modeFr   z>=11.0.0r6   z>=14.0.0r7   r   r   r   r   )r	   r`   r   rN   r   r   r   r   r   r  r   r_   rF   r  r   r  ra   r  r  r  r   )rS   r   r   r	  r
  s        rJ   r   zGnuCPPCompiler.get_options  sg   t'7'7dmmL&&t,JJth66.3
 JJv : :=$ OJJz"H$>$> %
 	
 4<<4!!'*4<<4!!'*s)'8#9#9:FJF:^699!TYY%8%8%:KK

9%x'?'?<(  rL   c                   g }t        d| j                  | j                        }||   }|j                  dk7  r*|j	                  | j                  |j                               t        ||j                  d         j                  |       ||j                  d         j                  s|j	                  d       ||j                  d         j                  r|j	                  d       |S )	Nr   r   r@   rH   r   r  r9  -D_GLIBCXX_DEBUG=1r  r  s        rJ   r  z&GnuCPPCompiler.get_option_compile_args  s    t'7'7dmmLcl99KK//		:;GCJJt$45;;TBszz&)*00KK$3::j)*00KK,-rL   c                F   | j                   j                         s| j                   j                         rlt        d| j                  | j
                        }||   j                  j                         }t        |t              sJ |D ]  }t        |t              rJ  |S g S r  r  r  s        rJ   r  z#GnuCPPCompiler.get_option_link_args  r  rL   c                F    ddt         j                  j                  |      gS )Nz-fpch-preprocessz-include)ospathbasename)rS   pch_dirheaders      rJ   get_pch_use_argszGnuCPPCompiler.get_pch_use_args  s    "J0@0@0HIIrL   r  r  r   r  )rB  r   rC  r   r   r   )r   r   r   r[   r   r  r  rD  re   rL   rJ   r5  r5    s[    SW7;9=15	Z$Z3PZ4Z 7Z  /	Z"!F 	JrL   r5  c                  *    e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZy)PGICPPCompilerNc
                l    t         j                  | |||||||||	
       t        j                  |        y Nr   rN   r[   r   r\   s
             rJ   r[   zPGICPPCompiler.__init__  ;     	T67G[(!;vL 	 	ZT"rL   r   r   )r   r   r   r[   re   rL   rJ   rF  rF    s2    SW7;15#$#3P#4#  /#rL   rF  c                  .    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 ddZy)NvidiaHPC_CPPCompiler
nvidia_hpcNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  rI  r\   s
             rJ   r[   zNvidiaHPC_CPPCompiler.__init__  rJ  rL   r   r   )r   r   r   r   r[   re   rL   rJ   rL  rL    s;    	B TX7;15#$#3P#4#  /#rL   rL  c                  f     e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZd	dZddd	 	 	 	 	 d
 fdZddZ xZS )ElbrusCPPCompilerNc                l    t         j                  | |||||||||

       t        j                  |        y rH  )rN   r[   r   r'  s              rJ   r[   zElbrusCPPCompiler.__init__  s;    
 	T67G[(!;vL 	 	Z%rL   c           	     b   t         j                  |       }dg}t        | j                  d      r|g dz  }t        | j                  d      rt        | j                  d      r|ddgz  }t        | j                  d      r|dgz  }t        | j                  d	      r|dgz  }t        | j                  d
      r|ddgz  }t        | j                  d      r|dgz  }t        | j                  d      r|dgz  }t	        d| j
                  | j                        }|j                  |j                  d      t        j                  dg dd      |j                  d      t        j                  dd      i       ||   }t        |t        j                        sJ d       |j                  |d       |S )Nr,   z	>=1.20.00)r.   r-   r1   z	>=1.21.00z<1.22.00r2   r/   z	>=1.22.00z	>=1.23.00z	>=1.24.00r0   r3   z	>=1.25.00r4   z	>=1.26.00r5   r   r   rH   r   r   r   r9  r:  Fr   Tr   rN   r   r   r_   r	   r`   r   r   r   r   r   r  r  r   r  rS   r   cpp_stdsr   r
  s        rJ   r   zElbrusCPPCompiler.get_options   s   &&t,94<<533H4<<5/$,,Xb:c'**H4<<5	!H4<<5	!H4<<5'**H4<<5	!H4<<5	!Ht'7'7dmmLJJth66.3
 JJz"H$>$> %

 
	 s)'8#9#9:FJF:X40rL   ry   c               8    |dk(  ryt         |   |||||      S )Nlchmod)FFry   )ru   has_function)rS   funcnamer   r   rz   r{   rx   s         rJ   rX  zElbrusCPPCompiler.has_function&  s5     x7'&#3=5A ( C CrL   c                x   g }t        d| j                  | j                        }||   }|j                  dk7  r*|j	                  | j                  |j                               t        ||j                  d         j                  |       ||j                  d         j                  r|j	                  d       |S )Nr   r   r@   rH   r9  r<  r  r  s        rJ   r  z)ElbrusCPPCompiler.get_option_compile_args1  s    t'7'7dmmLcl99KK//		:;GCJJt$45;;TB3::j)*00KK,-rL   r  r  r   )rY  r   r   r   r   r   rz   T.Optional[T.List[str]]r{   r   r   r   r  )r   r   r   r[   r   rX  r  r   r   s   @rJ   rP  rP    su    SW7;9=15	&$&3P&4& 7&  /	&"N <@FJC!8C#CCObCrL   rP  c                  B    e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZddZd	dZd	dZy)
IntelCPPCompilerNc
                    t         j                  | |||||||||	
       t        j                  |        d| _        g d}
g |
dgz   |
ddgz   |
ddgz   |
dgz   d| _        y )Nr   z
c++-header)r   z-w3z-Wpch-messagesz-diag-disable:remarkr   r   )rN   r[   r   lang_headerr   r-  s              rJ   r[   zIntelCPPCompiler.__init__@  s     	T67G[(!;vL 	 	Z%%d+'>!04J3KK0I?U3VV0I?U3VV(9YK(G	IrL   c                   t         j                  |       }ddg}ddg}t        | j                  d      r|ddgz  }|dgz  }t        | j                  d	      r|d
gz  }t        | j                  d      r|dgz  }t        | j                  d      r|dgz  }|dgz  }t	        d| j
                  | j                        }|j                  |j                  d      t        j                  dg dd      |j                  d      t        j                  dd      |j                  d      t        j                  dd      i       ||   }t        |t        j                        sJ d       |j                  ||z          |S )Nr,   r.   gnu++98gnu++03z>=15.0.0r1   r2   r   z>=16.0.0r3   r   r   z>=19.1.0r4   r   r   r   rH   r   r   r   r   r   Tr9  r:  Fr   rS  )rS   r   c_stdsg_stdsr   r
  s         rJ   r   zIntelCPPCompiler.get_optionsO  sm   &&t, 7#Y'4<<4w((Fyk!F4<<4wiF4<<4yk!F4<<4wiFyk!Ft'7'7dmmLJJth66.3
 JJv : :=$ OJJz"H$>$>?OQV$W
 	 s)'8#9#9:FJF:Vf_-rL   c                   g }t        d| j                  | j                        }||   }|j                  dk7  r=ddd}|j	                  d|j                  |j                  |j                        z          ||j                  d         j                  dk(  r|j	                  d	       ||j                  d
         j                  s|j	                  d       ||j                  d         j                  r|j	                  d       |S )Nr   r   r@   r,   ra  )r.   rb  r   rH   rA   r   r  r9  r<  )r	   r`   r   r  rF   rQ   r   )rS   r  rI   r   r   remap_cpp03s         rJ   r  z(IntelCPPCompiler.get_option_compile_argsp  s    t'7'7dmmLcl99 $K KK+//#))SYY"GGH3::d#$**f4KK)*szz&)*00KK$3::j)*00KK,-rL   c                    g S r1  re   r2  s     rJ   r  z%IntelCPPCompiler.get_option_link_args  r3  rL   r   r   r   r  )r   r   r   r[   r   r  r  re   rL   rJ   r]  r]  ?  sG    SW7;15I$I3PI4I  /IB$rL   r]  c                      e Zd ZdZy)IntelLLVMCPPCompilerr   Nr!  re   rL   rJ   ri  ri    s    	BrL   ri  c                  L    e Zd ZdZdddddddd	d
dddZddZddZddZddZy) VisualStudioLikeCPPCompilerMixinz?Mixin for C++ specific method overrides in MSVC-like compilers.)TN)T   )T   )T   )T   )Tlatest)Frl  )Frm  )Frn  )Fro  )Frp  )r@   r9   r:   r;   r<   r=   r1   r2   r3   r5   r>   c                    t        d| j                  | j                        }t        j                  d||   j
                  d d        S )Nr   r   r   )r	   r`   r   Tcastr  )rS   r  r   s      rJ   r  z5VisualStudioLikeCPPCompilerMixin.get_option_link_args  s:    	4+;+;$--PvvmWS\%7%7%:;;rL   c                   t        d| j                  | j                        }|j                  |j	                  d      t        j                  dg dd      |j	                  d      t        j                  dd	      |j	                  d
      t        j                  dt              i       ||   }t        |t
        j                        sJ d       |j                  |       |S )Nr   r   rH   r   r   r   r   r   Tr   zWindows libs to link against.r   )r	   r`   r   r   r   r   r   r  r  r   r  r   r  rT  s        rJ   _get_options_implz2VisualStudioLikeCPPCompilerMixin._get_options_impl  s    t'7'7dmmLJJth66.3
 JJv : :=$ OJJy!8#;#;/$
 	 s)'8#9#9:FJF:X&rL   c                $   g }t        d| j                  | j                        }||j                  d         }|j                  dk(  r|j                  d       n?|j                  dk(  r|j                  d       n|j                  d|j                  z          ||j                  d	         j                  s|j                  d
       | j                  ||   j                     \  }}||j                  d|        |s|j                  d       |S )Nr   r   rH   r   z/EHscr@   z/EHs-c-z/EHr   z/GR-z/std:c++/permissive-)r	   r`   r   r   r  rF   VC_VERSION_MAP)rS   r  rI   r   rH   
permissivevers          rJ   r  z8VisualStudioLikeCPPCompilerMixin.get_option_compile_args  s    t'7'7dmmLSZZ%&88y KK XXKK	"KK()szz&)*00KK--gcl.@.@A
C?KK(3%()KK'rL   c                .    t        j                  | |      S r1  )r   rv   rS   rw   s     rJ   rv   z8VisualStudioLikeCPPCompilerMixin.get_compiler_check_args  s    //d;;rL   Nr  )r   r   rU  r   r   r   r   )	r   r   r   r   rx  r  ru  r  rv   re   rL   rJ   rk  rk    sC    I &&N<
&2<rL   rk  c                  $     e Zd ZdZd fdZ xZS )CPP11AsCPP14MixinzMixin class for VisualStudio and ClangCl to replace C++11 std with C++14.

    This is a limitation of Clang and MSVC that ICL doesn't share.
    c                H   t        d| j                  | j                        }||   j                  dv r`t	        j
                  | j                  dddd       t        j                  |      }||   j                  d	k(  rd
||   _        n
d||   _        t        | )  |      S )Nr   r   >   r1   r9   zdoes not support C++11;z5attempting best effort; setting the standard to C++14TF)oncerE   r9   r:   r2   )r	   r`   r   r  r   rG   r   r  deepcopyru   r  )rS   r  r   rx   s      rJ   r  z)CPP11AsCPP14Mixin.get_option_compile_args  s    
 t'7'7dmmL3<!44LL";P"%1 mmG,Gs|!!X-%-"%,"w.w77rL   r  )r   r   r   r   r  r   r   s   @rJ   r~  r~    s    
8 8rL   r~  c                  V     e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZd fdZd fdZ xZS )	VisualStudioCPPCompilermsvcc                    t         j                  | ||||||||	|

       t        j                  | |       t        | j                  d      r| j
                  dgz   | _        y y )Nr   z>= 19.14.26428z/Zc:__cplusplus)rN   r[   r   r   r_   always_args)rS   r]   r^   r_   r`   rX   ra   targetrb   rY   rZ   s              rJ   r[   z VisualStudioCPPCompiler.__init__  sj    
 	T67G[(!;vL 	 	ZdF+
 4<<)9:#//3D2EED ;rL   c                >   g d}t        | j                  d      r|j                  g d       t        | j                  d      r|j                  g d       t        | j                  d      r|j                  ddg       | j                  t        |          |      S )	N)r@   r1   r9   z>=19)r2   r>   r=   z>=19.11)r:   r3   r;   z>=19.29r5   r<   )r   r_   extendru  ru   r   rS   rU  rx   s     rJ   r   z#VisualStudioCPPCompiler.get_options  sx    .4<<0OO@A4<<3OO9:4<<3OOWh/0%%eg&9&;XFFrL   c                   t        d| j                  | j                        }||   j                  dk7  rLt	        | j
                  d      r6t        j                  dd       t        j                  |      }d||   _        t        | )  |      }t	        | j
                  d      r	 |j                  d	      }||= |S # t        $ r |cY S w xY w)
Nr   r   r@   z<19.00.24210z7This version of MSVC does not support cpp_std argumentsFrD   z<19.11rw  )r	   r`   r   r  r   r_   r   rG   r  ru   r  index
ValueError)rS   r  r   rI   r   rx   s        rJ   r  z/VisualStudioCPPCompiler.get_option_compile_args  s    t'7'7dmmL3<'ODLL.,YLLRZ_`ii(G!'GCLw.w74<<2JJ~. Q  s   (B> >CCr   )r]   r   r^   r   r_   r   r`   r*   rX   r   ra   r   r  r   rb   r   rY   r   rZ   r   r   r  )r   r   r   r   r[   r   r  r   r   s   @rJ   r  r    sd    	B ?C7;15	FF'4F>AF;F 5F  /	F
G rL   r  c                  J     e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZd fdZ xZS )ClangClCPPCompilerzclang-clc
                n    t         j                  | g ||||||||	
       t        j                  | |       y rH  )rN   r[   r   
rS   r^   r_   r`   rX   ra   r  rb   rY   rZ   s
             rJ   r[   zClangClCPPCompiler.__init__#  s=    
 	T2wh!;vL 	 	Z  v.rL   c                H    g d}| j                  t        | 	         |      S )N)
r@   r1   r9   r2   r:   r3   r;   r5   r<   r>   ru  ru   r   r  s     rJ   r   zClangClCPPCompiler.get_options,  s#    t%%eg&9&;XFFrL   r   r^   r   r_   r   r`   r*   rX   r   ra   r   r  r   rb   r   rY   r   rZ   r   r   )r   r   r   r   r[   r   r   r   s   @rJ   r  r    sY    	B ?C7;15	//'4/>A/;/ 5/  /	/G GrL   r  c                  N     e Zd Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZd fdZddZ xZS )IntelClCPPCompilerc
                n    t         j                  | g ||||||||	
       t        j                  | |       y rH  )rN   r[   r   r  s
             rJ   r[   zIntelClCPPCompiler.__init__3  s=    
 	T2wh!;vL 	 	Z%..tV<rL   c                H    g d}| j                  t        | 	         |      S )N)r@   r1   r9   r2   r:   r3   r;   r>   r  r  s     rJ   r   zIntelClCPPCompiler.get_options<  s#    a%%eg&9&;XFFrL   c                .    t        j                  | |      S r1  )r   rv   r|  s     rJ   rv   z*IntelClCPPCompiler.get_compiler_check_argsA  s    ,DDT4PPrL   r   r  r   r   )r   r   r   r[   r   rv   r   r   s   @rJ   r  r  1  sT     ?C7;15	=='4=>A=;= 5=  /	=G
QrL   r  c                      e Zd ZdZy)IntelLLVMClCPPCompilerzintel-llvm-clNr!  re   rL   rJ   r  r  F  s    	BrL   r  c                  J    e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZd	dZd
dZd
dZddZy)ArmCPPCompilerNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  )rN   r[   r   r\   s
             rJ   r[   zArmCPPCompiler.__init__L  rJ  rL   c                    t         j                  |       }|t        d| j                  | j                           }t        |t        j                        sJ d       |j                  ddg       |S )Nr   r   r   r.   r1   	rN   r   r	   r`   r   r  r   r   r  rS   r   r
  s      rJ   r   zArmCPPCompiler.get_optionsT  sb    &&t,y0@0@t}}UV'8#9#9:FJF:gw/0rL   c                    g }t        d| j                  | j                        }||   }|j                  dk(  r|j	                  d       |S |j                  dk(  r|j	                  d       |S )Nr   r   r1   z--cpp11r.   z--cppr	   r`   r   r  rF   r  s        rJ   r  z&ArmCPPCompiler.get_option_compile_args[  sf    t'7'7dmmLcl99KK	"  YY'!KK rL   c                    g S r1  re   r2  s     rJ   r  z#ArmCPPCompiler.get_option_link_argse  r3  rL   c                    g S r1  re   r|  s     rJ   rv   z&ArmCPPCompiler.get_compiler_check_argsh  r3  rL   r   r   r   r  r   )r   r   r   r[   r   r  r  rv   re   rL   rJ   r  r  K  sF    SW7;15#$#3P#4#  /#rL   r  c                  Z    e Zd Z	 	 	 d		 	 	 	 	 	 	 d
dZddZddZddZddZddZddZ	y)CcrxCPPCompilerNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  )rN   r[   r   r\   s
             rJ   r[   zCcrxCPPCompiler.__init__m  s;     	T67G[(!;vL 	 	Zd#rL   c                
    ddgS )Nz-nologoz	-lang=cppre   ri   s    rJ   get_always_argszCcrxCPPCompiler.get_always_argsv  s    ;''rL   c                    g S r1  re   r2  s     rJ   r  z'CcrxCPPCompiler.get_option_compile_argsy  r3  rL   c                    g S r1  re   ri   s    rJ   get_compile_only_argsz%CcrxCPPCompiler.get_compile_only_args|  r3  rL   c                    d| gS )Nz-output=obj=re   )rS   
outputnames     rJ   get_output_argszCcrxCPPCompiler.get_output_args  s    zl+,,rL   c                    g S r1  re   r2  s     rJ   r  z$CcrxCPPCompiler.get_option_link_args  r3  rL   c                    g S r1  re   r|  s     rJ   rv   z'CcrxCPPCompiler.get_compiler_check_args  r3  rL   r   r   r   r  )r  r   r   r   r   )
r   r   r   r[   r  r  r  r  r  rv   re   rL   rJ   r  r  l  sP    SW7;15$$$3P$4$  /$(-rL   r  c                  J    e Zd Z	 	 	 d	 	 	 	 	 	 	 ddZd	dZd
dZddZd
dZy)TICPPCompilerNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  )rN   r[   r   r\   s
             rJ   r[   zTICPPCompiler.__init__  s;     	T67G[(!;vL 	 	ZD!rL   c                    t         j                  |       }|t        d| j                  | j                           }t        |t        j                        sJ d       |j                  dg       |S )Nr   r   r   r.   r  r  s      rJ   r   zTICPPCompiler.get_options  s_    &&t,y0@0@t}}UV'8#9#9:FJF:gY'rL   c                    g }t        d| j                  | j                        }||   }|j                  dk7  r|j	                  d|j                  z          |S )Nr   r   r@   z--r  r  s        rJ   r  z%TICPPCompiler.get_option_compile_args  sN    t'7'7dmmLcl99KKsyy()rL   c                    g S r1  re   ri   s    rJ   r  zTICPPCompiler.get_always_args  r3  rL   c                    g S r1  re   r2  s     rJ   r  z"TICPPCompiler.get_option_link_args  r3  rL   r   r   r   r  r   )r   r   r   r[   r   r  r  r  re   rL   rJ   r  r    sF    SW7;15"$"3P"4"  /"rL   r  c                      e Zd ZdZy)C2000CPPCompilerc2000Nr!  re   rL   rJ   r  r    s    	BrL   r  c                  J    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZd	dZd
dZddZy)MetrowerksCPPCompilerARMmwccarmNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  rN   r[   r!   r\   s
             rJ   r[   z!MetrowerksCPPCompilerARM.__init__  ;    
 	T67G[(!;vL 	 	Z##D)rL   c                .    t        j                  |d       S r1  )r"   rQ   rS   instruction_sets     rJ   get_instruction_set_argsz1MetrowerksCPPCompilerARM.get_instruction_set_args  s    +//FFrL   c                    t         j                  |       }t        d| j                  | j                        }dg||   _        |S r)  rN   r   r	   r`   r   choicesrS   r   r   s      rJ   r   z$MetrowerksCPPCompilerARM.get_options  =    &&t,t'7'7dmmL#HS	rL   c                    g }|t        d| j                  | j                           }|j                  dk7  r,|j	                  d       |j	                  |j                         |S )Nr   r   r@   z-langr  rS   r  rI   r   s       rJ   r  z0MetrowerksCPPCompilerARM.get_option_compile_args  sQ    it/?/?dmmTU99KK KK		"rL   r   r   r  r   r   r[  r   r  r   r   r   r   r[   r  r   r  re   rL   rJ   r  r    sT    	B ?C7;15	**'4*;* 5*  /	*GrL   r  c                  J    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 ddZd	dZd
dZddZy)$MetrowerksCPPCompilerEmbeddedPowerPCmwcceppcNc
                l    t         j                  | |||||||||	
       t        j                  |        y rH  r  r\   s
             rJ   r[   z-MetrowerksCPPCompilerEmbeddedPowerPC.__init__  r  rL   c                .    t        j                  |d       S r1  )r#   rQ   r  s     rJ   r  z=MetrowerksCPPCompilerEmbeddedPowerPC.get_instruction_set_args  s    ,00$GGrL   c                    t         j                  |       }t        d| j                  | j                        }dg||   _        |S r)  r  r  s      rJ   r   z0MetrowerksCPPCompilerEmbeddedPowerPC.get_options  r  rL   c                    g }|t        d| j                  | j                           }|j                  dk7  r|j	                  d|j                  z          |S )Nr   r   r@   z-lang r  r  s       rJ   r  z<MetrowerksCPPCompilerEmbeddedPowerPC.get_option_compile_args  sJ    it/?/?dmmTU99KK399,-rL   r   r   r  r   r  r  re   rL   rJ   r  r    sT    	B ?C7;15	**'4*;* 5*  /	*HrL   r  )rH   r   rI   r   r   r   )a
__future__r   r  r   os.pathr?  typingrr   r   r   mesonlibr   r   r	   	compilersr   r   r   r   c_function_attributesr   r   mixins.cliker   mixins.ccrxr   	mixins.tir   
mixins.armr   r   mixins.visualstudior   r   
mixins.gnur   r   r   mixins.intelr   r   mixins.clangr   mixins.elbrusr   
mixins.pgir   mixins.emscriptenr    mixins.metrowerksr!   r"   r#   TYPE_CHECKINGr$   r%   r{   r&   	envconfigr'   rq   r(   linkers.linkersr)   r*   programsr+   CompilerMixinBaseobjectr   rK   rN   r   r   r   r#  r%  r+  r5  rF  rL  rP  r]  ri  rk  r~  r  r  r  r  r  r  r  r  r  r  )r   s   0rJ   <module>r     sQ   #       A A  J ' % ! 5 > R R M ' ) # . 1 Z??J)')/(*%x	 	3#CG9o3 3	 	P P	Lx- xv#o' #oLI{ IX- 
 ,  O-= 4.*K .bQJ_k; QJh#[+ #
#K 
#F FRD+[ DN+ 
E<'8 E<P8) 88./1QS_al .`G*,Lo_j G$Q9;XZe Q*/ 
[+ BlK 8J <} 1; :+={ Y 4s   !H,