o
    uJAf\                     @  s  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j6rd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ZFeFdd  eFD 7 ZFeFg d!7 ZFd\d(d)ZGG d*d+ d+eeZHG d,d- d-eDZIG d.d/ d/eIe+eHZJG d0d1 d1eJZKG d2d3 d3eJZLG d4d5 d5e1eJZMG d6d7 d7eeHZNG d8d9 d9eIe$eHZOG d:d; d;e/eHZPG d<d= d=e/eHZQG d>d? d?e-eHZRG d@dA dAe(eHZSG dBdC dCeJZTG dDdE dEeDZUG dFdG dGeDZVG dHdI dIeVeUe!eHZWG dJdK dKeVeUe"eHZXG dLdM dMeUe)eHZYG dNdO dOeYZZG dPdQ dQeeHZ[G dRdS dSeeHZ\G dTdU dUeeHZ]G dVdW dWe]Z^G dXdY dYe3eHZ_G dZd[ d[e3eHZ`dS )]    )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++26c                 C  s   g | ]}d |dd  qS )gnur	   N ).0stdr8   r8   =/usr/lib/python3.10/site-packages/mesonbuild/compilers/cpp.py
<listcomp>;   s    r<   )vc++11vc++14vc++17vc++20
vc++latest	c++latestehstrargsT.List[str]returnNonec                 C  s<   | dkr| d d S | dv rtjd|  ddd d S d S )Nnone-fno-exceptions>   scz"non-MSVC compilers do not support z9 exception handling. You may want to set eh to 'default'.Ffatal)appendr   warning)rC   rE   r8   r8   r;   non_msvc_eh_options?   s   
rQ   c                      s   e Zd Zd?ddZdZ			d@dAddZedBddZdCddZdCddZ	dDd$d%Z
dE fd(d)Zddd*dF fd4d5ZdGd7d8Ze dHd:d;ZdI fd=d>Z  ZS )JCPPCompilernamerD   rG   c                 C  s2   z	t |t| W S  ty   td| dw )NzUnknown function attribute "")r   getr   KeyErrorr   )selfrS   r8   r8   r;   attribute_check_funcG   s
   z CPPCompiler.attribute_check_funccppNccacherF   exelistversionfor_machiner)   is_crossboolinfo'MachineInfo'exe_wrapperT.Optional['ExternalProgram']linkerT.Optional['DynamicLinker']full_versionT.Optional[str]c
           
      C  s,   t j| ||||||||	d	 t| | d S )N)r^   rd   rf   )r   __init__r   
rW   rZ   r[   r\   r]   r^   r`   rb   rd   rf   r8   r8   r;   rh   O   s
   zCPPCompiler.__init__c                 C  s   dS )NC++r8   )clsr8   r8   r;   get_display_languageY   s   z CPPCompiler.get_display_languagec                 C     dgS )Nz-nostdinc++r8   rW   r8   r8   r;   get_no_stdinc_args]      zCPPCompiler.get_no_stdinc_argsc                 C  rm   )Nz-nostdlib++r8   rn   r8   r8   r;   get_no_stdlib_link_args`   rp   z#CPPCompiler.get_no_stdlib_link_argswork_direnvironment'Environment'rH   c                 C  s   d}|  ||d|S )Nz2class breakCCompiler;int main(void) { return 0; }
zsanitycheckcpp.cc)_sanity_check_impl)rW   rr   rs   coder8   r8   r;   sanity_checkc   s   zCPPCompiler.sanity_checkmoder   c                   s   t  |dg S )Nz-fpermissive)superget_compiler_check_argsrW   rx   	__class__r8   r;   rz   g   s   z#CPPCompiler.get_compiler_check_args
extra_argsdependencieshnamesymbolprefixenvr   GT.Union[None, T.List[str], T.Callable[[CompileCheckMode], T.List[str]]]r    T.Optional[T.List['Dependency']]T.Tuple[bool, bool]c          
        s\   t  j||||||d\}}|rd|fS |d u rg }| d| d| d}	| j|	|||dS )Nr~   Tz
        #include <z>
        using z&;
        int main(void) { return 0; })ry   has_header_symbolcompiles)
rW   r   r   r   r   r   r   foundcachedtr|   r8   r;   r   m   s    

zCPPCompiler.has_header_symbolcpp_std_valuec                 C  s   | dsJ d}| j||gtjd,}|jdkr,td| dd 	 W d    dS td| dd	 	 W d    d
S 1 sBw   Y  d S )N-std=zint i = static_cast<int>(0);)r   rx   r   zCompiler accepts :YESTNOF)
startswithcompiler   COMPILE
returncoder   debug)rW   r   ZCPP_TESTpr8   r8   r;   _test_cpp_std_arg   s   
$zCPPCompiler._test_cpp_std_argcpp_stdc                 C  s~   ddddddddd	d
ddd}| j tg dv sJ ||vr"d| S ||| fD ]}d| }| |r7|  S q(td| )Nr,   zgnu++0xr.   zgnu++1yr/   zgnu++1zr3   gnu++2azc++2bzgnu++2bzc++2czgnu++2c)r0   gnu++11r1   gnu++14r2   zgnu++17r4   zgnu++20r5   zgnu++23r6   zgnu++26)clanglccgcc
emscriptenarmltdclang
intel-llvmr   z#C++ Compiler does not support -std=)id	frozensetr   r   )rW   r   ZCPP_FALLBACKSir   r8   r8   r;   _find_best_cpp_std   s,   	
zCPPCompiler._find_best_cpp_std'MutableKeyedOptionDictType'c                   s6   t   }td| j| jd}||tdti |S )Nr:   machinelangrj   )	ry   get_optionsr   r]   languageupdater   UserStdOption	_ALL_STDSrW   optskeyr|   r8   r;   r      s   
zCPPCompiler.get_options)rS   rD   rG   rD   NNNrZ   rF   r[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   )rG   rD   rG   rF   )rr   rD   rs   rt   rG   rH   rx   r   rG   rF   )r   rD   r   rD   r   rD   r   rt   r   r   r   r   rG   r   )r   rD   rG   r_   )r   rD   rG   rD   rG   r   )__name__
__module____qualname__rX   r   rh   classmethodrl   ro   rq   rw   rz   r   r   	functools	lru_cacher   r   __classcell__r8   r8   r|   r;   rR   F   s(    





$rR   c                   @  s$   e Zd ZdZedd	ddZdS )
_StdCPPLibMixinz*Detect whether to use libc++ or libstdc++.Nr   r'   rG   rF   c                 C  s   dd |  |dD }|j| j }|dusJ dg }|jdv r%ddg}nddg}|D ]}| ||g dur@|d	| g   S q+td
)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
        c                 S  s   g | ]}d | qS )z-Lr8   )r9   dr8   r8   r;   r<      s    zC_StdCPPLibMixin.language_stdlib_only_link_flags.<locals>.<listcomp>	librariesNfor mypy>   freebsd	dragonflynetbsddarwinopenbsdandroidzc++zstdc++z-lzNCould not detect either libc++ or libstdc++ as your C++ stdlib implementation.)get_compiler_dirsmachinesr]   systemfind_libraryr   )rW   r   search_dirsr   Zsearch_orderlibr8   r8   r;   language_stdlib_only_link_flags   s   

z/_StdCPPLibMixin.language_stdlib_only_link_flags)r   r'   rG   rF   )r   r   r   __doc__r   r   r   r8   r8   r8   r;   r      s    r   c                   @  sF   e Zd ZdZdZ				d#d$ddZd%ddZd&dd Zd&d!d"ZdS )'ClangCPPCompilerz>=12.0.0>=17.0.0NrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   definesT.Optional[T.Dict[str, str]]rf   rg   c                 C  sX   t j| |||||||||
d
 t| |	 ddg}g ||dg |ddg dgd| _d S Nrd   rf   -Wall-Winvalid-pch-Wextra
-Wpedanticz-Weverything0123
everything)rR   rh   r   	warn_argsrW   rZ   r[   r\   r]   r^   r`   rb   rd   r   rf   default_warn_argsr8   r8   r;   rh      s   
zClangCPPCompiler.__init__rG   r   c              	   C  s   t | }td| j| jd}||dtdg dd|dt	dd	i g d
}t
| j| jr8|d t
| j| jrD|d ||d }t|tjsUJ d|j|d	d | j sf| j rt||dtdti |S )Nr   r   rC   C++ exception handling type.rI   defaultarK   Zscr   rttiEnable RTTITr+   r-   r0   r1   r2   r/   r3   r4   r5   r6   r:   r   r7   winlibs&Standard Win libraries to link against)rR   r   r   r]   r   r   evolver   UserComboOptionUserBooleanOptionr   r\   _CPP23_VERSIONrO   _CPP26_VERSION
isinstancer   set_versionsr`   
is_windows	is_cygwinUserArrayOptionr
   )rW   r   r   cppstd_choicesstd_optr8   r8   r;   r      s4   


zClangCPPCompiler.get_optionsoptions'KeyedOptionDictType'c                 C  sn   g }t d| j| jd}|| }|jdkr|| |j t||d j| ||d js5|d |S )Nr:   r   rI   rC   r   	-fno-rttir   r]   r   valuerO   r   rQ   r   rW   r   rE   r   r:   r8   r8   r;   get_option_compile_args  s   

z(ClangCPPCompiler.get_option_compile_argsc                 C  b   | j  s
| j  r/td| j| jd}|| j }t|t	s!J |D ]	}t|t
s,J q#|S g S Nr   r   r`   r   r   r   r]   r   r   copyr   listrD   rW   r   r   libslr8   r8   r;   get_option_link_args'     z%ClangCPPCompiler.get_option_link_argsNNNNrZ   rF   r[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   r   r   rf   rg   r   r   r   rG   rF   )	r   r   r   r   r   rh   r   r   r	  r8   r8   r8   r;   r      s    

r   c                   @     e Zd ZdZdS )ArmLtdClangCPPCompilerr   Nr   r   r   r   r8   r8   r8   r;   r  3      r  c                   @  s   e Zd ZdZdZdS )AppleClangCPPCompilerz>=13.0.0z>=99.0.0N)r   r   r   r   r   r8   r8   r8   r;   r  8  s    r  c                   @  s.   e Zd ZdZ				ddddZdddZdS ) EmscriptenCPPCompilerr   NrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   r   r   rf   rg   c                 C  sB   |st dt|dst dtj| |||||||||	|
d d S )Nz;Emscripten compiler can only be used for cross compilation.z	>=1.39.19z$Meson requires Emscripten >= 1.39.19)rb   rd   r   rf   )r   r   r   rh   rW   rZ   r[   r\   r]   r^   r`   rb   rd   r   rf   r8   r8   r;   rh   D  s   

zEmscriptenCPPCompiler.__init__r   r   rG   c                 C  s>   g }t d| j| jd}|| }|jdkr|| |j |S Nr:   r   rI   )r   r]   r   r   rO   r   r   r8   r8   r;   r   Q  s   
z-EmscriptenCPPCompiler.get_option_compile_argsr  r  r  )r   r   r   r   rh   r   r8   r8   r8   r;   r  @  s    r  c                   @  s@   e Zd ZdZ			d d!ddZd"ddZd#ddZd#ddZdS )$ArmclangCPPCompilerz
    Keil armclang
    NrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
                 C  sV   t j| |||||||||	d
 t|  ddg}
g |
|
dg |
ddg dgd| _d S r   )rR   rh   r   r   rW   rZ   r[   r\   r]   r^   r`   rb   rd   rf   r   r8   r8   r;   rh   _  s   

zArmclangCPPCompiler.__init__rG   r   c                 C  sp   t | }td| j| jd}||dtdg ddi || }t	|tj
s-J d|jg dd	d
 |S )Nr:   r   rC   r   r   r   r   )r+   r-   r0   r1   r2   Tr   )rR   r   r   r]   r   r   r   r   r   r   r   r   )rW   r   r   r   r8   r8   r;   r   m  s   
zArmclangCPPCompiler.get_optionsr   r   c                 C  sR   g }t d| j| jd}|| }|jdkr|d|j  t||d j| |S )Nr:   r   rI   r   rC   )r   r]   r   r   rO   rQ   r   r   r8   r8   r;   r   |  s   
z+ArmclangCPPCompiler.get_option_compile_argsc                 C     g S Nr8   rW   r   r8   r8   r;   r	       z(ArmclangCPPCompiler.get_option_link_argsr   r   r   r  )r   r   r   r   rh   r   r   r	  r8   r8   r8   r;   r  Z  s    

r  c                   @  sH   e Zd Z				d%d&ddZd'ddZd(ddZd(dd Zd)d#d$ZdS )*GnuCPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   r   r   rf   rg   c                 C  sr   t j| |||||||||
d
 t| |	 ddg}g ||dg |ddg |ddg | t | t d| _d S )Nr   r   r   r   r   r   )rR   rh   r   supported_warn_argsr   r   r   r   r8   r8   r;   rh     s   

zGnuCPPCompiler.__init__rG   r   c                 C  s   t d| j| jd}t| }||dtdg dd|dt	dd	|d
t	ddi g d}t
| jdr@|d t
| jdrK|d || }t|tjsYJ d|j|d	d | j sj| j rx||dtdti |S )Nr:   r   rC   r   r   r   r   r   TdebugstlSTL debug modeFr   z>=11.0.0r5   z>=14.0.0r6   r   r   r   r   )r   r]   r   rR   r   r   r   r   r   r   r   r\   rO   r   r   r   r`   r   r   r   r
   )rW   r   r   r   r   r8   r8   r;   r     s<   


zGnuCPPCompiler.get_optionsr   r   c                 C  s   g }t d| j| jd}|| }|jdkr|| |j t||d j| ||d js5|d ||d jrB|d |S )	Nr:   r   rI   rC   r   r   r  -D_GLIBCXX_DEBUG=1r   r   r8   r8   r;   r     s   


z&GnuCPPCompiler.get_option_compile_argsc                 C  r  r  r  r  r8   r8   r;   r	    r
  z#GnuCPPCompiler.get_option_link_argspch_dirheaderc                 C  s   ddt j|gS )Nz-fpch-preprocessz-include)ospathbasename)rW   r!  r"  r8   r8   r;   get_pch_use_args  s   zGnuCPPCompiler.get_pch_use_argsr  r  r   r  )r!  rD   r"  rD   rG   rF   )r   r   r   rh   r   r   r	  r&  r8   r8   r8   r;   r    s    

#
r  c                   @  s   e Zd Z			ddddZdS )PGICPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  ,   t j| |||||||||	d
 t|  d S Nr   rR   rh   r   ri   r8   r8   r;   rh        zPGICPPCompiler.__init__r   r   )r   r   r   rh   r8   r8   r8   r;   r'    s
    r'  c                   @  s"   e Zd ZdZ			ddddZdS )NvidiaHPC_CPPCompiler
nvidia_hpcNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  r*  ri   r8   r8   r;   rh     r+  zNvidiaHPC_CPPCompiler.__init__r   r   )r   r   r   r   rh   r8   r8   r8   r;   r,    s    r,  c                      sN   e Zd Z				d+d,ddZd-ddZdddd. fd%d&Zd/d)d*Z  ZS )0ElbrusCPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   r   r   rf   rg   c                 C  s,   t j| |||||||||
d
 t|  d S r)  )rR   rh   r   r  r8   r8   r;   rh        zElbrusCPPCompiler.__init__rG   r   c              	   C  s0  t | }dg}t| jdr|g d7 }t| jdr&t| jdr&|ddg7 }t| jdr1|dg7 }t| jd	r<|dg7 }t| jd
rH|ddg7 }t| jdrS|dg7 }t| jdr^|dg7 }td| j| jd}||dt	
dg dd|dt	ddi || }t|t	jsJ d|j|dd |S )Nr+   z	>=1.20.00)r-   r,   r0   z	>=1.21.00z<1.22.00r1   r.   z	>=1.22.00z	>=1.23.00z	>=1.24.00r/   r2   z	>=1.25.00r3   z	>=1.26.00r4   r:   r   rC   r   r   r   r  r  Fr   Tr   rR   r   r   r\   r   r]   r   r   r   r   r   r   r   r   r   rW   r   cpp_stdsr   r   r8   r8   r;   r      s@   




zElbrusCPPCompiler.get_optionsr~   funcnamer   r   rt   r   T.Optional[T.List[str]]r   r   r   c                  s"   |dkrdS t  j|||||dS )Nlchmod)FFr~   )ry   has_function)rW   r3  r   r   r   r   r|   r8   r;   r6  &  s   zElbrusCPPCompiler.has_functionr   r   c                 C  sn   g }t d| j| jd}|| }|jdkr|| |j t||d j| ||d jr5|d |S )Nr:   r   rI   rC   r  r   r   r   r8   r8   r;   r   1  s   

z)ElbrusCPPCompiler.get_option_compile_argsr  r  r   )r3  rD   r   rD   r   rt   r   r4  r   r   rG   r   r  )r   r   r   rh   r   r6  r   r   r8   r8   r|   r;   r.    s    
	'r.  c                   @  s<   e Zd Z			dd ddZd!ddZd"ddZd"ddZdS )#IntelCPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
                 C  sh   t j| |||||||||	d
 t|  d| _g d}
g |
dg |
ddg |
ddg |
dg d| _d S )Nr   z
c++-header)r   z-w3z-Wpch-messagesz-diag-disable:remarkr   r   )rR   rh   r   lang_headerr   r  r8   r8   r;   rh   @  s   


zIntelCPPCompiler.__init__rG   r   c                 C  s  t | }ddg}ddg}t| jdr|ddg7 }|dg7 }t| jd	r)|d
g7 }t| jdr4|dg7 }t| jdrD|dg7 }|dg7 }td| j| jd}||dt	
dg dd|dt	dd|dt	ddi || }t|t	js~J d|||  |S )Nr+   r-   gnu++98gnu++03z>=15.0.0r0   r1   r   z>=16.0.0r2   r   r   z>=19.1.0r3   r   r:   r   rC   r   r   r   r   r   Tr  r  Fr   r0  )rW   r   c_stdsZg_stdsr   r   r8   r8   r;   r   O  s6   





	zIntelCPPCompiler.get_optionsr   r   c                 C  s   g }t d| j| jd}|| }|jdkr&ddd}|d||j|j  ||d jdkr5|d	 ||d
 jsB|d ||d jrO|d |S )Nr:   r   rI   r+   r9  )r-   r:  r   rC   rJ   r   r   r  r   )r   r]   r   r   rO   rU   r   )rW   r   rE   r   r:   Zremap_cpp03r8   r8   r;   r   p  s   



z(IntelCPPCompiler.get_option_compile_argsc                 C  r  r  r8   r  r8   r8   r;   r	    r  z%IntelCPPCompiler.get_option_link_argsr   r   r   r  )r   r   r   rh   r   r   r	  r8   r8   r8   r;   r7  ?  s    

!r7  c                   @  r  )IntelLLVMCPPCompilerr   Nr  r8   r8   r8   r;   r<    r  r<  c                   @  sT   e Zd ZdZdddddddd	d
dddZd ddZd!ddZd ddZd"ddZdS )# VisualStudioLikeCPPCompilerMixinz?Mixin for C++ specific method overrides in MSVC-like compilers.)TN)T   )T   )T   )T   )Tlatest)Fr>  )Fr?  )Fr@  )FrA  )FrB  )rI   r=   r>   r?   r@   rA   r0   r1   r2   r4   rB   r   r   rG   rF   c                 C  s,   t d| j| jd}td|| jd d  S )Nr   r   rF   )r   r]   r   Tcastr   rW   r   r   r8   r8   r;   r	    s   z5VisualStudioLikeCPPCompilerMixin.get_option_link_argsr   r   r2  c                 C  s   t d| j| jd}||dtdg dd|dtdd	|d
tdt	i || }t
|tjs:J d|| |S )Nr:   r   rC   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   r1  r8   r8   r;   _get_options_impl  s"   
z2VisualStudioLikeCPPCompilerMixin._get_options_implc                 C  s   g }t d| j| jd}||d }|jdkr|d n|jdkr(|d n|d|j  ||d	 js=|d
 | j|| j \}}|d urS|d|  |sZ|d |S )Nr:   r   rC   r   z/EHscrI   z/EHs-c-z/EHr   z/GR-z/std:c++/permissive-)r   r]   r   r   r   rO   VC_VERSION_MAP)rW   r   rE   r   rC   
permissiveverr8   r8   r;   r     s    



z8VisualStudioLikeCPPCompilerMixin.get_option_compile_argsrx   r   c                 C     t | |S r  )r   rz   r{   r8   r8   r;   rz        z8VisualStudioLikeCPPCompilerMixin.get_compiler_check_argsNr  )r   r   r2  rF   rG   r   r   )	r   r   r   r   rH  r	  rF  r   rz   r8   r8   r8   r;   r=    s$    


r=  c                      s"   e Zd ZdZd fddZ  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.
    r   r   rG   rF   c                   sp   t d| j| jd}|| jdv r2tj| jddddd t|}|| jd	kr-d
|| _nd|| _t	 
|S )Nr:   r   >   r=   r0   zdoes not support C++11;z5attempting best effort; setting the standard to C++14TF)oncerN   r=   r>   r1   )r   r]   r   r   r   rP   r   r  deepcopyry   r   rE  r|   r8   r;   r     s   


z)CPP11AsCPP14Mixin.get_option_compile_argsr  )r   r   r   r   r   r   r8   r8   r|   r;   rM    s    rM  c                      sB   e Zd ZdZ			dd ddZd! fddZd" fddZ  ZS )#VisualStudioCPPCompilermsvcNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   targetrb   rc   rd   re   rf   rg   c                 C  sL   t j| ||||||||	|
d
 t| | t| jdr$| jdg | _d S d S )Nr   z>= 19.14.26428z/Zc:__cplusplus)rR   rh   r   r   r\   always_args)rW   rZ   r[   r\   r]   r^   r`   rR  rb   rd   rf   r8   r8   r;   rh     s   z VisualStudioCPPCompiler.__init__rG   r   c                   sh   g d}t | jdr|g d t | jdr|g d t | jdr+|ddg | t  |S )	N)rI   r0   r=   z>=19)r1   rB   rA   z>=19.11)r>   r2   r?   z>=19.29r4   r@   )r   r\   extendrF  ry   r   rW   r2  r|   r8   r;   r     s   z#VisualStudioCPPCompiler.get_optionsr   r   c                   s   t d| j| jd}|| jdkr't| jdr'tjddd t|}d|| _t	 
|}t| jdrIz|d	}W n tyE   | Y S w ||= |S )
Nr:   r   rI   z<19.00.24210z7This version of MSVC does not support cpp_std argumentsFrM   z<19.11rG  )r   r]   r   r   r   r\   r   rP   r  ry   r   index
ValueError)rW   r   r   rE   r   r|   r8   r;   r     s   

z/VisualStudioCPPCompiler.get_option_compile_argsr   )rZ   rF   r[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rR  rD   rb   rc   rd   re   rf   rg   r   r  )r   r   r   r   rh   r   r   r   r8   r8   r|   r;   rP    s    rP  c                      s4   e Zd ZdZ			ddddZd fddZ  ZS )ClangClCPPCompilerzclang-clNr[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rR  rb   rc   rd   re   rf   rg   c
           
      C  .   t j| g ||||||||	d
 t| | d S r)  )rR   rh   r   
rW   r[   r\   r]   r^   r`   rR  rb   rd   rf   r8   r8   r;   rh   #     zClangClCPPCompiler.__init__rG   r   c                      g d}|  t  |S )N)
rI   r0   r=   r1   r>   r2   r?   r4   r@   rB   rF  ry   r   rU  r|   r8   r;   r   ,  s   zClangClCPPCompiler.get_optionsr   r[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rR  rD   rb   rc   rd   re   rf   rg   r   )r   r   r   r   rh   r   r   r8   r8   r|   r;   rX    s    	rX  c                      s:   e Zd Z			ddddZd fddZd ddZ  ZS )!IntelClCPPCompilerNr[   rF   r\   rD   r]   r)   r^   r_   r`   ra   rR  rb   rc   rd   re   rf   rg   c
           
      C  rY  r)  )rR   rh   r   rZ  r8   r8   r;   rh   3  r[  zIntelClCPPCompiler.__init__rG   r   c                   r\  )N)rI   r0   r=   r1   r>   r2   r?   rB   r]  rU  r|   r8   r;   r   <  s   zIntelClCPPCompiler.get_optionsrx   r   c                 C  rK  r  )r   rz   r{   r8   r8   r;   rz   A  rL  z*IntelClCPPCompiler.get_compiler_check_argsr   r^  r   r   )r   r   r   rh   r   rz   r   r8   r8   r|   r;   r_  1  s    	r_  c                   @  r  )IntelLLVMClCPPCompilerzintel-llvm-clNr  r8   r8   r8   r;   r`  F  r  r`  c                   @  sF   e Zd Z			d#d$ddZd%ddZd&ddZd&ddZd'd!d"ZdS )(ArmCPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  )rR   rh   r   ri   r8   r8   r;   rh   L  r+  zArmCPPCompiler.__init__rG   r   c                 C  sF   t | }|td| j| jd }t|tjsJ d|ddg |S )Nr:   r   r   r-   r0   	rR   r   r   r]   r   r   r   r   r   rW   r   r   r8   r8   r;   r   T  s
   
zArmCPPCompiler.get_optionsr   r   c                 C  sN   g }t d| j| jd}|| }|jdkr|d |S |jdkr%|d |S )Nr:   r   r0   z--cpp11r-   z--cppr   r]   r   r   rO   r   r8   r8   r;   r   [  s   



z&ArmCPPCompiler.get_option_compile_argsc                 C  r  r  r8   r  r8   r8   r;   r	  e  r  z#ArmCPPCompiler.get_option_link_argsrx   r   c                 C  r  r  r8   r{   r8   r8   r;   rz   h  r  z&ArmCPPCompiler.get_compiler_check_argsr   r   r   r  r   )r   r   r   rh   r   r   r	  rz   r8   r8   r8   r;   ra  K  s    



ra  c                   @  sZ   e Zd Z			d'd(ddZd)ddZd*ddZd)ddZd+dd Zd*d!d"Zd,d%d&Z	dS )-CcrxCPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  )rR   rh   r   ri   r8   r8   r;   rh   m  r+  zCcrxCPPCompiler.__init__rG   c                 C  s   ddgS )Nz-nologoz	-lang=cppr8   rn   r8   r8   r;   get_always_argsv  s   zCcrxCPPCompiler.get_always_argsr   r   c                 C  r  r  r8   r  r8   r8   r;   r   y  r  z'CcrxCPPCompiler.get_option_compile_argsc                 C  r  r  r8   rn   r8   r8   r;   get_compile_only_args|  r  z%CcrxCPPCompiler.get_compile_only_args
outputnamec                 C  s   d| gS )Nz-output=obj=r8   )rW   rh  r8   r8   r;   get_output_args     zCcrxCPPCompiler.get_output_argsc                 C  r  r  r8   r  r8   r8   r;   r	    r  z$CcrxCPPCompiler.get_option_link_argsrx   r   c                 C  r  r  r8   r{   r8   r8   r;   rz     r  z'CcrxCPPCompiler.get_compiler_check_argsr   r   r   r  )rh  rD   rG   rF   r   )
r   r   r   rh   rf  r   rg  ri  r	  rz   r8   r8   r8   r;   re  l  s    
	



re  c                   @  sF   e Zd Z			d!d"ddZd#ddZd$ddZd%ddZd$dd ZdS )&TICPPCompilerNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  )rR   rh   r   ri   r8   r8   r;   rh     r+  zTICPPCompiler.__init__rG   r   c                 C  sD   t | }|td| j| jd }t|tjsJ d|dg |S )Nr:   r   r   r-   rb  rc  r8   r8   r;   r     s
   
zTICPPCompiler.get_optionsr   r   c                 C  s<   g }t d| j| jd}|| }|jdkr|d|j  |S )Nr:   r   rI   z--rd  r   r8   r8   r;   r     s   
z%TICPPCompiler.get_option_compile_argsc                 C  r  r  r8   rn   r8   r8   r;   rf    r  zTICPPCompiler.get_always_argsc                 C  r  r  r8   r  r8   r8   r;   r	    r  z"TICPPCompiler.get_option_link_argsr   r   r   r  r   )r   r   r   rh   r   r   rf  r	  r8   r8   r8   r;   rk    s    


rk  c                   @  r  )C2000CPPCompilerc2000Nr  r8   r8   r8   r;   rl    r  rl  c                   @  @   e Zd ZdZ			d"d#ddZd$ddZd%ddZd&d d!ZdS )'MetrowerksCPPCompilerARMmwccarmNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  rR   rh   r    ri   r8   r8   r;   rh     r/  z!MetrowerksCPPCompilerARM.__init__instruction_setrG   r4  c                 C     t |d S r  )r!   rU   rW   rr  r8   r8   r;   get_instruction_set_args  rj  z1MetrowerksCPPCompilerARM.get_instruction_set_argsr   c                 C  ,   t | }td| j| jd}dg|| _|S r  rR   r   r   r]   r   choicesr   r8   r8   r;   r        
z$MetrowerksCPPCompilerARM.get_optionsr   r   c                 C  s>   g }|t d| j| jd }|jdkr|d ||j |S )Nr:   r   rI   z-langrd  rW   r   rE   r:   r8   r8   r;   r     s   

z0MetrowerksCPPCompilerARM.get_option_compile_argsr   r   rr  rD   rG   r4  r   r  r   r   r   r   rh   ru  r   r   r8   r8   r8   r;   ro        
	
ro  c                   @  rn  )'$MetrowerksCPPCompilerEmbeddedPowerPCmwcceppcNrZ   rF   r[   r\   rD   r]   r)   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   c
           
      C  r(  r)  rq  ri   r8   r8   r;   rh     r/  z-MetrowerksCPPCompilerEmbeddedPowerPC.__init__rr  rG   r4  c                 C  rs  r  )r"   rU   rt  r8   r8   r;   ru    rj  z=MetrowerksCPPCompilerEmbeddedPowerPC.get_instruction_set_argsr   c                 C  rv  r  rw  r   r8   r8   r;   r     ry  z0MetrowerksCPPCompilerEmbeddedPowerPC.get_optionsr   r   c                 C  s8   g }|t d| j| jd }|jdkr|d|j  |S )Nr:   r   rI   z-lang rd  rz  r8   r8   r;   r     s
   
z<MetrowerksCPPCompilerEmbeddedPowerPC.get_option_compile_argsr   r   r{  r   r  r|  r8   r8   r8   r;   r~    r}  r~  )rC   rD   rE   rF   rG   rH   )a
__future__r   r  r   Zos.pathr#  typingrC   r   r   mesonlibr   r   r   	compilersr
   r   r   r   c_function_attributesr   r   Zmixins.cliker   Zmixins.ccrxr   Z	mixins.tir   Z
mixins.armr   r   Zmixins.visualstudior   r   Z
mixins.gnur   r   r   Zmixins.intelr   r   Zmixins.clangr   Zmixins.elbrusr   Z
mixins.pgir   Zmixins.emscriptenr   Zmixins.metrowerksr    r!   r"   TYPE_CHECKINGr#   r$   r   r%   	envconfigr&   rs   r'   linkers.linkersr(   r)   programsr*   CompilerMixinBaseobjectr   rQ   rR   r   r   r  r  r  r  r  r'  r,  r.  r7  r<  r=  rM  rP  rX  r_  r`  ra  re  rk  rl  ro  r~  r8   r8   r8   r;   <module>   s|   
{&L1T
IGH0!