o
    uJAf                      @  s   U d dl mZ 	 d dlZd dlZd dlZddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ d	d
lmZ ejrIddlmZ ddlmZ dgdgdgdZded< g dgdgdgdgdgdgdZded< G dd deZdS )    )annotationsN   )mesonlib)AppleDynamicLinkerClangClDynamicLinkerLLVMDynamicLinkerGnuGoldDynamicLinkerMoldDynamicLinker)	OptionKey   )CompileCheckMode   )GnuLikeCompiler)Environment)
Dependencyz-fdiagnostics-color=autoz-fdiagnostics-color=alwaysz-fdiagnostics-color=never)autoalwaysneverzT.Dict[str, T.List[str]]clang_color_argsz-O0z-Ogz-O1z-O2z-O3z-Oz)plain0g123sclang_optimization_argsc                      s   e Zd ZdZdC fddZdDd
dZdEddZdFddZdGddZdHddZ	dIddZ
dJ fddZd d d!dK fd+d,ZdLd-d.ZedM fd1d2ZdNd4d5ZdLd6d7Zd8d9d:dO fd=d>Zd8d9d d?dPdAdBZ  ZS )QClangCompilerclangdefinesT.Optional[T.Dict[str, str]]c                   sj   t    |pi | _| jtdtdtdtdtdh t| jtr-| j	td | j
	d d S )N
b_coloroutb_lto_threads
b_lto_modeb_thinlto_cacheb_thinlto_cache_dir	b_bitcodell)super__init__r   base_optionsupdater
   
isinstancelinkerr   addcan_compile_suffixes)selfr   	__class__ F/usr/lib/python3.10/site-packages/mesonbuild/compilers/mixins/clang.pyr)   5   s   

zClangCompiler.__init__	colortypestrreturnT.List[str]c                 C  s   t | d d  S N)r   )r0   r5   r3   r3   r4   get_colorout_argsC   s   zClangCompiler.get_colorout_argsdefineboolc                 C  s
   || j v S r9   )r   r0   r;   r3   r3   r4   has_builtin_defineF   s   
z ClangCompiler.has_builtin_defineT.Optional[str]c                 C  s   | j |S r9   )r   getr=   r3   r3   r4   get_builtin_defineI   s   z ClangCompiler.get_builtin_defineoptimization_levelc                 C  s   t | S r9   )r   )r0   rB   r3   r3   r4   get_optimization_argsL   s   z#ClangCompiler.get_optimization_argsc                 C  s   dS )Npchr3   r0   r3   r3   r4   get_pch_suffixO   s   zClangCompiler.get_pch_suffixpch_dirheaderc                 C  s   dt j|| |gS )Nz-include-pch)ospathjoinget_pch_name)r0   rG   rH   r3   r3   r4   get_pch_use_argsR   s   zClangCompiler.get_pch_use_argsmoder   c                   sF   dg}|t ju r|ddg t| jdr|d t || S )Nz%-Werror=implicit-function-declarationz-Werror=unknown-warning-optionz$-Werror=unused-command-line-argumentz>=3.6.0z%-Werror=ignored-optimization-argument)	r   COMPILEextendr   version_compareversionappendr(   get_compiler_check_args)r0   rN   Zmyargsr1   r3   r4   rT   X   s   

z%ClangCompiler.get_compiler_check_argsN
extra_argsdependenciesfuncnameprefixenv'Environment'rV   T.Optional[T.List[str]]rW    T.Optional[T.List['Dependency']]T.Tuple[bool, bool]c                  sF   |d u rg }t | jtrt| jdr|d t j|||||dS )Nz>=8.0z-Wl,-no_weak_importsrU   )	r,   r-   r   r   rQ   rR   rS   r(   has_function)r0   rX   rY   rZ   rV   rW   r1   r3   r4   r_   d   s   
zClangCompiler.has_functionc                 C  s,   t | jdr
dgS t | jdrdgS g S )Nz>=3.8.0z-fopenmpz>=3.7.0z-fopenmp=libomp)r   rQ   rR   rE   r3   r3   r4   openmp_flagss   s
   zClangCompiler.openmp_flagsr-   rR   c                   s\   |dkrdgS |dkrdgS t |r't |s!td| dd| gS t ||S )NZqcldz-fuse-ld=qcldmoldz-fuse-ld=moldzCannot find linker .z	-fuse-ld=)shutilwhichr   MesonExceptionr(   use_linker_args)clsr-   rR   r1   r3   r4   rf   |   s   


zClangCompiler.use_linker_argsnamec                 C     dgS )Nz-Werror=attributesr3   )r0   rh   r3   r3   r4   !get_has_func_attribute_extra_args   s   z/ClangCompiler.get_has_func_attribute_extra_argsc                 C  ri   )Nz
--coverager3   rE   r3   r3   r4   get_coverage_link_args   s   z$ClangCompiler.get_coverage_link_argsr   defaultthreadsrN   rn   intc                  s   g }|dkr8t | jtrt| jjdstdnt | jttt	t
fs.td| jj |d|  |S |dks@J d|t j|d |S )	Nthinz>=1.1z!LLVM's ThinLTO requires mold 1.1+zFLLVM's ThinLTO only works with gold, lld, lld-link, ld64 or mold, not z-flto=rl   z#someone forgot to wire something up)rn   )r,   r-   r	   r   rQ   rR   re   r   r   r   r   idrS   rP   r(   get_lto_compile_args)r0   rn   rN   argsr1   r3   r4   rr      s   
z"ClangCompiler.get_lto_compile_args)rn   rN   thinlto_cache_dirrt   c                C  sd   | j ||d}|dkr|d ur|| j| |dkr0t| jds(td|d|  |S )Nrm   rp   r   z>=4.0.0z2clang support for LTO threads requires clang >=4.0z-flto-jobs=)	rr   rP   r-   get_thinlto_cache_argsr   rQ   rR   re   rS   )r0   rn   rN   rt   rs   r3   r3   r4   get_lto_link_args   s   
zClangCompiler.get_lto_link_args)r   r    )r5   r6   r7   r8   )r;   r6   r7   r<   )r;   r6   r7   r?   )rB   r6   r7   r8   )r7   r6   )rG   r6   rH   r6   r7   r8   )rN   r   r7   r8   )rX   r6   rY   r6   rZ   r[   rV   r\   rW   r]   r7   r^   )r7   r8   )r-   r6   rR   r6   r7   r8   )rh   r6   r7   r8   )rn   ro   rN   r6   r7   r8   )rn   ro   rN   r6   rt   r?   r7   r8   )__name__
__module____qualname__rq   r)   r:   r>   rA   rC   rF   rM   rT   r_   r`   classmethodrf   rj   rk   rr   rv   __classcell__r3   r3   r1   r4   r   1   s,    






	

r   )
__future__r   rI   rc   typingT r   linkers.linkersr   r   r   r   r	   r
   	compilersr   gnur   TYPE_CHECKINGenvironmentr   rW   r   r   __annotations__r   r   r3   r3   r3   r4   <module>   s4   
