o
    uJAfS                     @  s  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Zd dl	Z
ddlmZ ddlmZ ddlmZ d dlmZ e
jrVddlmZ dd	lmZ d
dlmZ neZg dgdZded< g g g g g g dZded< g dgdgdgdgdgdgdZded< dgdgdgdgdgd gd!gd"gd#gd$gd%
Zded&< g d'gd(gd)gd*gd)d+gd,Zded-< d.gd/gd0gd1Zded2< i d3g d4d5g d6d7g d8d9d:gd;d<d=gd>d?gd@g dAdBg dCdDdEgdFdGgdHdIgdJdKdLgdMg dNdOg dPdQdRgdSg dTdUdVgdWdXgg dYdZZ ded[< g d\d]d^gd_gd`gdaZ!dedb< g dcddgdegdfgdgdhgdigg djg dkg dldmdngdodpgg dqg drdsZ"dedt< dugdvgdwdxgdyZ#dedz< d{d|d}d~dZ$ej%dddddZ&G dd deej'dZ(G dd de(Z)dS )    )annotationsN   )mesonlib)mlog	OptionKey)CompileCheckMode)ImmutableListProtocol)Environment   )Compilerz-g)FTzT.Dict[bool, T.List[str]]clike_debug_args)plaindebugdebugoptimizedreleaseminsizecustomT.Dict[str, T.List[str]]gnulike_buildtype_argsz-O0z-Ogz-O1z-O2z-O3z-Os)r   0g123sgnu_optimization_argsz-mmmxz-mssez-msse2z-msse3z-mssse3z-msse4.1z-msse4.2z-mavxz-mavx2z
-mfpu=neon)
mmxssesse2sse3ssse3sse41sse42avxavx2neongnulike_instruction_set_argsz-fvisibility=defaultz-fvisibility=internalz-fvisibility=hiddenz-fvisibility=protectedz-fvisibility-inlines-hidden) defaultinternalhidden	protectedinlineshiddengnu_symbol_visibility_argsz-fdiagnostics-color=autoz-fdiagnostics-color=alwaysz-fdiagnostics-color=never)autoalwaysnevergnu_color_args0.0.0)z-Wcast-qualz-Wconversionz-Wfloat-equalz
-Wformat=2z-Winlinez-Wmissing-declarationsz-Wredundant-declsz-Wshadowz-Wundefz-Wuninitializedz-Wwrite-stringsz3.0.0)z-Wdisabled-optimizationz-Wpackedz-Wpaddedz3.3.0)z-Wmulticharz-Wswitch-defaultz-Wswitch-enumz-Wunused-macrosz4.0.0z-Wmissing-include-dirs4.1.0z-Wunsafe-loop-optimizationsz-Wstack-protectorz4.2.0z-Wstrict-overflow=5z4.3.0)z-Warray-bounds=2z-Wlogical-opz-Wstrict-aliasing=3z-Wvla4.6.0)z-Wdouble-promotionz-Wsuggest-attribute=constz-Wsuggest-attribute=noreturnz-Wsuggest-attribute=purez-Wtrampolines4.7.0z-Wvector-operation-performance4.8.0z-Wsuggest-attribute=format4.9.0z-Wdate-time5.1.0z-Wformat-signednessz-Wnormalized=nfc6.1.0)z-Wduplicated-condz-Wnull-dereferencez-Wshift-negative-valuez-Wshift-overflow=2z-Wunused-const-variable=27.1.0)z-Wallocaz-Walloc-zeroz-Wformat-overflow=2z-Wformat-truncation=2z-Wstringop-overflow=3z7.2.0z-Wduplicated-branches8.1.0)z-Wcast-align=strictz-Wsuggest-attribute=coldz-Wsuggest-attribute=malloc9.1.0z-Wattribute-alias=2z-Wanalyzer-too-complexz-Warith-conversion)z-Wbidi-chars=ucnz-Wopenacc-parallelismz-Wtrivial-auto-var-init)10.1.0z12.1.0gnu_common_warning_args)z-Wbad-function-castz-Wmissing-prototypesz-Wnested-externsz-Wstrict-prototypesz-Wold-style-definitionz-Winit-selfz-Wc++-compatz-Wunsuffixed-float-constants)r3   z3.4.0r4   z4.5.0gnu_c_warning_args)z-Wctor-dtor-privacyz-Weffc++z-Wnon-virtual-dtorz-Wold-style-castz-Woverloaded-virtualz-Wsign-promoz-Wstrict-null-sentinelz
-Wnoexceptz-Wzero-as-null-pointer-constantz	-Wabi-tagz-Wuseless-castz-Wconditionally-supported)z-Wsuggest-final-methodsz-Wsuggest-final-typesz-Wsuggest-override)z-Wmultiple-inheritancez-Wplacement-new=2z-Wvirtual-inheritance)z-Waligned-new=allz-Wnoexcept-typez
-Wregisterz-Wcatch-value=3z-Wextra-semiz-Wdeprecated-copy-dtorz-Wredundant-move)z-Wcomma-subscriptz-Wmismatched-tagsz-Wredundant-tagsz
-Wvolatile)z!-Wdeprecated-enum-enum-conversionz"-Wdeprecated-enum-float-conversionz-Winvalid-imported-macros)r3   z4.0.1r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   z11.1.0gnu_cpp_warning_argsz
-Wselectorz-Wundeclared-selectorz-Wassign-interceptz-Wstrict-selector-match)r3   z3.3r4   gnu_objc_warning_argsczc++zobjective-czobjective-c++)rC   cppobjcobjcpp)maxsizecompilerT.Tuple[str, ...]langstrreturn'ImmutableListProtocol[str]'c           	      C  s  |t vrg S t | }tj }d|d< t| d| dddg }tj|tj|d\}}}d}g }|	d	D ]2}|
d
}|dkrG|dkrFd}q5|dkrX|dkrRd}q5|| q5|dkrg|dkrb n|| q5|svtdjd|d |dd |D 7 }|S )NCLC_ALL-xz-Ez-v-)stderrenvr   
z 
	z"#include "..." search starts here:   z"#include <...> search starts here:r   zEnd of search list.z1No include directory found parsing "{cmd}" output )cmdc                 S  s   g | ]}t j|qS  )ospathnormpath).0xrX   rX   D/usr/lib/python3.10/site-packages/mesonbuild/compilers/mixins/gnu.py
<listcomp>o  s    z0gnulike_default_include_dirs.<locals>.<listcomp>)	_LANG_MAPrY   environcopylistr   
Popen_safe
subprocessSTDOUTsplitstripappendr   warningformatjoin)	rH   rJ   rS   rW   _stdoutZparse_statepathslinerX   rX   r^   gnulike_default_include_dirsR  s8   


rq   c                   @  s\  e Zd ZdZdZd`ddZdadd	Zdad
dZdbddZe	j
dcddZddddZe	j
deddZdfddZdgdd Zdad!d"Ze	j
dad#d$Zdhd&d'Zdid)d*Zded+d,Zdad-d.Zdad/d0Zdjd3d4Ze dkd7d8Zdld:d;Zdmd=d>Zd?d@dAdndEdFZdodHdIZdpdKdLZdqdOdPZ dadQdRZ!drdUdVZ"e#dsdYdZZ$dad[d\Z%dad]d^Z&d_S )tGnuLikeCompilera   
    GnuLikeCompiler is a common interface to all compilers implementing
    the GNU-style commandline interface. This includes GCC, Clang
    and ICC. Certain functionality between them is different and requires
    that the actual concrete subclass define their own implementation.
    z-Wl,rL   Nonec                 C  s   dd dD | _ | j s| j s| j s| j td | j r)| j r1| j td | j s>| j td | jd | jd d S )	Nc                 S  s   h | ]}t |qS rX   r   )r\   orX   rX   r^   	<setcomp>~  s    z+GnuLikeCompiler.__init__.<locals>.<setcomp>)b_pchb_ltob_pgo
b_coverageb_ndebugb_staticpicb_pieb_lundef
b_asneeded
b_sanitizer   sx)	base_optionsinfo
is_windows	is_cygwin
is_openbsdaddr   is_hurdcan_compile_suffixesselfrX   rX   r^   __init__}  s   
zGnuLikeCompiler.__init__T.List[str]c                 C  s(   | j  s| j  s| j  rg S dgS )Nz-fPIC)r   r   r   	is_darwinr   rX   rX   r^   get_pic_args  s   zGnuLikeCompiler.get_pic_argsc                 C     dgS )Nz-fPIErX   r   rX   rX   r^   get_pie_args     zGnuLikeCompiler.get_pie_args	buildtyperK   c                 C     t | S N)r   )r   r   rX   rX   r^   get_buildtype_args     z"GnuLikeCompiler.get_buildtype_argsoptimization_levelc                 C     d S r   rX   r   r   rX   rX   r^   get_optimization_args     z%GnuLikeCompiler.get_optimization_argsis_debugboolc                 C  r   r   )r   )r   r   rX   rX   r^   get_debug_args  r   zGnuLikeCompiler.get_debug_argsc                 C  r   r   rX   r   rX   rX   r^   get_pch_suffix  r   zGnuLikeCompiler.get_pch_suffixfnameT.Tuple[str, str]c                 C  s   t j||fS r   )rY   rZ   dirname)r   r   rX   rX   r^   split_shlib_to_parts     z$GnuLikeCompiler.split_shlib_to_partsinstruction_setT.Optional[T.List[str]]c                 C  s   t |d S r   )r'   get)r   r   rX   rX   r^   get_instruction_set_args  s   z(GnuLikeCompiler.get_instruction_set_argsc                 C  s   t t| jdd| j S )NF)ccache)rq   tupleget_exelistlanguagerb   r   rX   rX   r^   get_default_include_dirs  s   z(GnuLikeCompiler.get_default_include_dirsc                 C  r   r   rX   r   rX   rX   r^   openmp_flags  r   zGnuLikeCompiler.openmp_flagsvistypec                 C  s   |dkr| j dvrd}t| S )Nr-   >   rD   rF   r+   )r   r.   )r   r   rX   rX   r^   r.     s   z*GnuLikeCompiler.gnu_symbol_visibility_argsdefsfilec                 C  s0   t |ts	td| j s| j r|gS g S )Nz%Module definitions file should be str)
isinstancerK   RuntimeErrorr   r   r   )r   r   rX   rX   r^   gen_vs_module_defs_args  s
   
z'GnuLikeCompiler.gen_vs_module_defs_argsc                 C     dS )NgccrX   r   rX   rX   r^   get_argument_syntax     z#GnuLikeCompiler.get_argument_syntaxc                 C  r   )Nz-fprofile-generaterX   r   rX   rX   r^   get_profile_generate_args  r   z)GnuLikeCompiler.get_profile_generate_argsc                 C  r   )Nz-fprofile-userX   r   rX   rX   r^   get_profile_use_args  r   z$GnuLikeCompiler.get_profile_use_argsparameter_list	build_dirc              
   C  sd   t |D ]+\}}|d d dks|d d dkr/|d d tjtj||dd   ||< q|S )Nr   -Iz-L)	enumeraterY   rZ   r[   rl   )r   r   r   idxirX   rX   r^   &compute_parameters_with_absolute_paths  s
    .z6GnuLikeCompiler.compute_parameters_with_absolute_pathsrS   'Environment'c                 C  sH   dg}| j d||d tjdd}|jW  d    S 1 sw   Y  d S )Nz--print-search-dirsr(   T)
extra_argsdependenciesmodewant_output)_build_wrapperr   COMPILErn   )r   rS   r   prX   rX   r^   _get_search_dirs  s   
$z GnuLikeCompiler._get_search_dirspathstrc           	   	   C  s   t j}|dkrtdd|}dd ||D }g }|D ]6}t|}| }| rR||vr4|	| zt|
  }||vrG|	| W q tyQ   Y qw q|S )N;z	:([^/\\])z;\1c                 S  s   g | ]}|r|qS rX   rX   )r\   r   rX   rX   r^   r_     s    z:GnuLikeCompiler._split_fetch_real_dirs.<locals>.<listcomp>)rY   pathsepresubrg   pathlibPathas_posixexistsri   resolveFileNotFoundError)	r   r   r   ro   resultr   ZpobjZ
unresolvedresolvedrX   rX   r^   _split_fetch_real_dirs  s*   
	

	z&GnuLikeCompiler._split_fetch_real_dirsnamec                 C  sF   |  |}|dD ]}||d r | |ddd   S q
g S )zP
        Get dirs from the compiler, either `libraries:` or `programs:`
        rT   :=rU   )r   rg   
startswithr   )r   rS   r   stdorp   rX   rX   r^   get_compiler_dirs  s   
z!GnuLikeCompiler.get_compiler_dirsr   r)   threadsr   r   intr   c                C  r   )Nz-fltorX   r   r   r   rX   rX   r^   get_lto_compile_args     z$GnuLikeCompiler.get_lto_compile_argsvaluec                 C  s,   |dkrg S d| g}d|v r| d |S )Nnonez-fsanitize=addressz-fno-omit-frame-pointer)ri   )r   r   argsrX   rX   r^   sanitizer_compile_args	  s   

z&GnuLikeCompiler.sanitizer_compile_args
outputnamec                 C  s   d|gS )N-orX   )r   r   rX   rX   r^   get_output_args  r   zGnuLikeCompiler.get_output_args	outtargetoutfilec                 C  s   dd|d|gS )Nz-MDz-MQz-MFrX   )r   r   r   rX   rX   r^   get_dependency_gen_args     z'GnuLikeCompiler.get_dependency_gen_argsc                 C  r   )Nz-crX   r   rX   rX   r^   get_compile_only_args  r   z%GnuLikeCompiler.get_compile_only_argsrZ   	is_systemc                 C  s    |sd}|rd| gS d| gS )N.z-isystemr   rX   )r   rZ   r   rX   rX   r^   get_include_args  s
   

z GnuLikeCompiler.get_include_argslinkerversionc                 C  s&   |dvrt d| dd| gS )N>   ZbfdZlldZgoldz?Unsupported linker, only bfd, gold, and lld are supported, not r   z	-fuse-ld=)r   MesonExceptionclsr   r   rX   rX   r^   use_linker_args!  s
   
zGnuLikeCompiler.use_linker_argsc                 C  r   )Nz
--coveragerX   r   rX   rX   r^   get_coverage_args(  r   z!GnuLikeCompiler.get_coverage_argsc                 C  s"   t | jd}|  d| g S )Nzassembler-with-cpprP   )r`   r   r   get_preprocess_only_args)r   rJ   rX   rX   r^   get_preprocess_to_file_args+  s   z+GnuLikeCompiler.get_preprocess_to_file_argsN)rL   rs   rL   r   )r   rK   rL   r   r   rK   rL   r   )r   r   rL   r   rL   rK   )r   rK   rL   r   )r   rK   rL   r   )r   rK   rL   r   )r   rK   rL   r   )r   r   r   rK   rL   r   )rS   r   rL   rK   )r   rK   rL   r   )rS   r   r   rK   rL   r   r   r   r   rK   rL   r   )r   rK   rL   r   )r   rK   rL   r   )r   rK   r   rK   rL   r   )rZ   rK   r   r   rL   r   r   rK   r   rK   rL   r   )'__name__
__module____qualname____doc__LINKER_PREFIXr   r   r   r   abcabstractmethodr   r   r   r   r   r   r   r.   r   r   r   r   r   	functools	lru_cacher   r   r   r   r   r   r   r   r   classmethodr   r   r   rX   rX   rX   r^   rr   s  sJ    
















%






rr   )	metaclassc                      s   e Zd ZdZdZd? fddZd@ddZdA fddZdBddZdCddZ	dDddZ
dEddZdFddZdGd d!ZdHd)d*ZdId,d-ZdJd0d1Zd2d3d4dK fd7d8ZedL fd;d<ZdG fd=d>Z  ZS )MGnuCompilerz
    GnuCompiler represents an actual GCC in its many incarnations.
    Compilers imitating GCC (Clang/Intel) should use the GnuLikeCompiler ABC.
    r   definesT.Optional[T.Dict[str, str]]c                   s0   t    |pi | _| jtdtdh d S )N
b_coloroutb_lto_threads)superr   r  r   updater   )r   r  	__class__rX   r^   r   :  s   

zGnuCompiler.__init__	colortyperK   rL   r   c                 C  s"   t | jdrt| d d  S g S )Nz>=4.9.0)r   version_comparer   r2   )r   r  rX   rX   r^   get_colorout_args?  s   zGnuCompiler.get_colorout_argslevelc                   s4   t  |}t| jdrd|v rd||d< |S )Nz<4.8.0z
-Wpedanticz	-pedantic)r  get_warn_argsr   r  r   index)r   r  r   r  rX   r^   r  D  s   zGnuCompiler.get_warn_argswarn_args_by_versionr   c                 C  s4   g }|  D ]\}}t| jd| r||7 }q|S )Nz>=)itemsr   r  r   )r   r  r   r   	warn_argsrX   rX   r^   supported_warn_argsM  s   zGnuCompiler.supported_warn_argsdefiner   c                 C  s
   || j v S r   r  r   r   rX   rX   r^   has_builtin_defineT  s   
zGnuCompiler.has_builtin_defineT.Optional[str]c                 C  s   || j v r
| j | S d S r   r!  r"  rX   rX   r^   get_builtin_defineW  s   

zGnuCompiler.get_builtin_definer   c                 C  r   r   )r   r   rX   rX   r^   r   \  r   z!GnuCompiler.get_optimization_argsc                 C  r   )NgchrX   r   rX   rX   r^   r   _  r   zGnuCompiler.get_pch_suffixc                 C  r   )Nz-fopenmprX   r   rX   rX   r^   r   b  r   zGnuCompiler.openmp_flagsr   rS   r   coder   r   T.Tuple[bool, bool]c                 C  sv   |  |||d |%}|jdk}| jdv rd|jv rd}| jdv r'd|jv r'd}W d    n1 s1w   Y  ||jfS )Nr   >   rD   rF   zis valid for C/ObjCF>   rE   rC   zis valid for C++/ObjC++)r   
returncoder   rR   cached)r   r   rS   r'  r   r   r   rX   rX   r^   has_argumentse  s   

zGnuCompiler.has_argumentsr   c                 C  r   )Nz-Werror=attributesrX   )r   r   rX   rX   r^   !get_has_func_attribute_extra_argsr  r   z-GnuCompiler.get_has_func_attribute_extra_argsprelink_nameobj_listc                 C  s   dd|g| S )Nz-rr   rX   )r   r-  r.  rX   rX   r^   get_prelink_argsw  r   zGnuCompiler.get_prelink_argsr   r)   r   r   r   c                  sN   |dkrt | jdrdgS dt  gS |dkr d| gS t j|dS )Nr   z>= 10.0z
-flto=autoz-flto=)r   )r   r  r   multiprocessing	cpu_countr  r   r   r  rX   r^   r   z  s   z GnuCompiler.get_lto_compile_argsr   r   c                   s(   |dkrt |drdgS t ||S )Nmoldz>=12.0.1z-fuse-ld=mold)r   r  r  r   r   r  rX   r^   r     s   zGnuCompiler.use_linker_argsc                   s   t   dg S )Nz-fprofile-correction)r  r   r   r  rX   r^   r     r   z GnuCompiler.get_profile_use_args)r  r  )r  rK   rL   r   )r  rK   rL   r   )r  r   rL   r   )r   rK   rL   r   )r   rK   rL   r$  r   r   r   )
r   r   rS   r   r'  rK   r   r   rL   r(  )r   rK   rL   r   )r-  rK   r.  r   rL   r   r   r  )r  r  r  r  idr   r  r  r  r#  r%  r   r   r   r+  r,  r/  r   r  r   r   __classcell__rX   rX   r  r^   r  3  s&    

	








r  )rH   rI   rJ   rK   rL   rM   )*
__future__r   r  r	  rY   r0  r   r   re   typingTr(   r   r   r   Zmesonbuild.compilers.compilersr   TYPE_CHECKINGZ_typingr	   environmentr
   	compilersr   objectr   __annotations__r   r   r'   r.   r2   r?   r@   rA   rB   r`   r
  rq   ABCMetarr   r  rX   rX   rX   r^   <module>   sT  

 #)0369=DKNSWj	C
  A