o
    nc                      @  s   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rHddlmZ ddlmZ dgdgdgdZg dgdgdgdgdgdgdZG dd deZdS )    )annotationsN   )mesonlib)AppleDynamicLinkerClangClDynamicLinkerLLVMDynamicLinkerGnuGoldDynamicLinkerMoldDynamicLinker)	OptionKey   )CompileCheckMode   )GnuLikeCompiler)Environment)
Dependencyz-fcolor-diagnosticsz-fno-color-diagnostics)autoalwaysneverz-O0z-Ogz-O1z-O2z-O3z-Oz)plain0g123sc                      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ClangCompilerZ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 )NZ
b_coloroutZb_lto_threadsZ
b_lto_modeZb_thinlto_cacheZb_thinlto_cache_dirZ	b_bitcodell)super__init__r   Zbase_optionsupdater
   
isinstancelinkerr   addZcan_compile_suffixes)selfr   	__class__ home/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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)clang_color_args)r%   r*   r(   r(   r)   get_colorout_argsC   s   zClangCompiler.get_colorout_argsdefineboolc                 C  s
   || j v S r.   )r   r%   r1   r(   r(   r)   has_builtin_defineF   s   
z ClangCompiler.has_builtin_defineT.Optional[str]c                 C  s   | j |S r.   )r   getr3   r(   r(   r)   get_builtin_defineI   s   z ClangCompiler.get_builtin_defineoptimization_levelc                 C  s   t | S r.   )clang_optimization_args)r%   r8   r(   r(   r)   get_optimization_argsL   s   z#ClangCompiler.get_optimization_argsc                 C  s   dS )NZpchr(   r%   r(   r(   r)   get_pch_suffixO   s   zClangCompiler.get_pch_suffixpch_dirheaderc                 C  s   dt j|| |gS )Nz-include-pch)ospathjoinZget_pch_name)r%   r=   r>   r(   r(   r)   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   ZCOMPILEextendr   version_compareversionappendr   get_compiler_check_args)r%   rC   Zmyargsr&   r(   r)   rH   X   s   

z%ClangCompiler.get_compiler_check_argsN
extra_argsdependenciesfuncnameprefixenv'Environment'rJ   T.Optional[T.List[str]]rK    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_importsrI   )	r"   r#   r   r   rE   rF   rG   r   has_function)r%   rL   rM   rN   rJ   rK   r&   r(   r)   rS   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   rE   rF   r;   r(   r(   r)   openmp_flagss   s
   zClangCompiler.openmp_flagsr#   rF   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=qcldZmoldz-fuse-ld=moldzCannot find linker .z	-fuse-ld=)shutilwhichr   MesonExceptionr   use_linker_args)clsr#   rF   r&   r(   r)   rY   |   s   


zClangCompiler.use_linker_argsnamec                 C     dgS )Nz-Werror=attributesr(   )r%   r[   r(   r(   r)   !get_has_func_attribute_extra_args   s   z/ClangCompiler.get_has_func_attribute_extra_argsc                 C  r\   )Nz
--coverager(   r;   r(   r(   r)   get_coverage_link_args   s   z$ClangCompiler.get_coverage_link_argsr   defaultthreadsrC   ra   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=r_   z#someone forgot to wire something up)ra   )r"   r#   r	   r   rE   rF   rX   r   r   r   r   idrG   rD   r   get_lto_compile_args)r%   ra   rC   argsr&   r(   r)   re      s   
z"ClangCompiler.get_lto_compile_args)ra   rC   thinlto_cache_dirrg   c                C  sd   | j ||d}|dkr|d ur|| j| |dkr0t| jds(td|d|  |S )Nr`   rc   r   z>=4.0.0z2clang support for LTO threads requires clang >=4.0z-flto-jobs=)	re   rD   r#   Zget_thinlto_cache_argsr   rE   rF   rX   rG   )r%   ra   rC   rg   rf   r(   r(   r)   get_lto_link_args   s   
zClangCompiler.get_lto_link_args)r   r   )r*   r+   r,   r-   )r1   r+   r,   r2   )r1   r+   r,   r5   )r8   r+   r,   r-   )r,   r+   )r=   r+   r>   r+   r,   r-   )rC   r   r,   r-   )rL   r+   rM   r+   rN   rO   rJ   rP   rK   rQ   r,   rR   )r,   r-   )r#   r+   rF   r+   r,   r-   )r[   r+   r,   r-   )ra   rb   rC   r+   r,   r-   )ra   rb   rC   r+   rg   r5   r,   r-   )__name__
__module____qualname__rd   r    r0   r4   r7   r:   r<   rB   rH   rS   rT   classmethodrY   r]   r^   re   rh   __classcell__r(   r(   r&   r)   r   1   s,    






	

r   )
__future__r   r?   rV   typingT r   Zlinkersr   r   r   r   r	   r
   	compilersr   Zgnur   TYPE_CHECKINGenvironmentr   rK   r   r/   r9   r   r(   r(   r(   r)   <module>   s4   
