
    e                       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	m
Z
 ddl	mZ ddl	mZ ddl	mZ ddl	mZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' ejP                  rddl)m*Z* ddlm+Z+m,Z, ddlm-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddlm4Z4 d dl5m6Z6m7Z7  G d de6      Z8 G d de6      Z9 G d de6      Z: G d de:      Z; G d  d!e:      Z< G d" d#e<      Z= G d$ d%e<e0      Z> G d& d'e<e0      Z? G d( d)e0      Z@ G d* d+e0e1      ZA G d, d-e6      ZB G d. d/ej                        ZD G d0 d1ed2         ZE ed3 eeFeG      d4g 5      ZHd6eId7<    ed8 eeFej                        d4g 5      ZKd9eId:<    ed; eeFe
j                        g d4<      ZMd=eId><    ed?eG eeFeG      fd@eFdAidB C      ZNdDeIdE<    edFeOdGH      ZP edIeGd@H      ZQ edJeOdGdKL      ZReHeKeMeNePgZSdMeIdN<   eQeHeKeMePeRgZTdMeIdO<    e%j                  dPdGQ      geSZVdMeIdR<    e%j                  dKdGQ      ZW G dS dTedU         ZXy)V    )annotationsN   )build)coredata)dependencies)mesonlib)mlog)SUFFIX_TO_LANG)CompileCheckMode)ObjectHolder	noPosargsnoKwargs
FeatureNewFeatureNewKwargsdisablerIfNotFoundInterpreterException)ContainerTypeInfotyped_kwargs	KwargInfotyped_pos_args)	OptionKey   )extract_required_kwargextract_search_dirs)REQUIRED_KWin_set_validatorNoneType)Interpreter)Compiler	RunResult)TYPE_varTYPE_kwargs)ExtractRequiredExtractSearchDirs)SourceOutputs)TV_LoggableList)	TypedDictLiteralc                      e Zd ZU ded<   y)GetSupportedArgumentKwz!Literal['warn', 'require', 'off']checkedN__name__
__module____qualname____annotations__     A/usr/lib/python3/dist-packages/mesonbuild/interpreter/compiler.pyr*   r*   &   s    22r2   r*   c                  ,    e Zd ZU ded<   ded<   ded<   y)AlignmentKwstrprefixT.List[str]argsT.List[dependencies.Dependency]r   Nr,   r1   r2   r3   r5   r5   *   s    55r2   r5   c                  ,    e Zd ZU ded<   ded<   ded<   y)BaseCompileKWboolno_builtin_argsT.List[build.IncludeDirs]include_directoriesr8   r9   Nr,   r1   r2   r3   r<   r<   0   s    66r2   r<   c                  ,    e Zd ZU ded<   ded<   ded<   y)	CompileKWr6   namer:   r   r=   werrorNr,   r1   r2   r3   rB   rB   5   s    	55r2   rB   c                  "    e Zd ZU ded<   ded<   y)CommonKWr6   r7   r:   r   Nr,   r1   r2   r3   rF   rF   ;   s    55r2   rF   c                  ,    e Zd ZU ded<   ded<   ded<   y)ComputeIntKWzT.Optional[int]guesshighlowNr,   r1   r2   r3   rH   rH   @   s    r2   rH   c                      e Zd Zy)HeaderKWNr-   r.   r/   r1   r2   r3   rM   rM   F       r2   rM   c                      e Zd Zy)HasKWNrN   r1   r2   r3   rQ   rQ   I   rO   r2   rQ   c                      e Zd Zy)HasArgumentKWNrN   r1   r2   r3   rS   rS   L   rO   r2   rS   c                  h    e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   y)FindLibraryKWr=   disablerr8   has_headersstaticheader_argsr:   header_dependenciesr?   header_include_directoriesheader_no_builtin_argsr6   header_prefixz)T.Union[bool, coredata.UserFeatureOption]header_requiredNr,   r1   r2   r3   rU   rU   O   s8       ! <<$== $$BBr2   rU   c                  6    e Zd ZU ded<   ded<   ded<   ded<   y	)
PreprocessKWr6   outputr8   compile_argsr?   r@   r:   r   Nr,   r1   r2   r3   r`   r`   ^   s    !!6655r2   r`   c                      e Zd ZdZdZdZy)	_TestModez/Whether we're doing a compiler or linker check.r   r   N)r-   r.   r/   __doc__COMPILERLINKERr1   r2   r3   rd   rd   e   s    9HFr2   rd   c                       e Zd Zd fdZeedd              Zeedd              Zeed	d              Zeed	d              Z	 xZ
S )
TryRunResultHolderc                    t         |   ||       | j                  j                  | j                  | j
                  | j                  | j                  d       y )N)
returncodecompiledstdoutstderr)super__init__methodsupdatereturncode_methodcompiled_methodstdout_methodstderr_method)selfresinterpreter	__class__s      r3   rp   zTryRunResultHolder.__init__n   sL    k*4+A+A)-)=)='+'9'9'+'9'9 	 r2   c                .    | j                   j                  S N)held_objectrk   rw   r9   kwargss      r3   rs   z$TryRunResultHolder.returncode_methodv   s     ***r2   c                .    | j                   j                  S r|   )r}   rl   r~   s      r3   rt   z"TryRunResultHolder.compiled_method{   s     (((r2   c                .    | j                   j                  S r|   )r}   rm   r~   s      r3   ru   z TryRunResultHolder.stdout_method        &&&r2   c                .    | j                   j                  S r|   )r}   rn   r~   s      r3   rv   z TryRunResultHolder.stderr_method   r   r2   )rx   'RunResult'ry   'Interpreter')r9   T.List['TYPE_var']r   'TYPE_kwargs'returnintr9   r   r   r   r   r=   r9   r   r   r   r   r6   )r-   r.   r/   rp   r   r   rs   rt   ru   rv   __classcell__rz   s   @r3   ri   ri   m   sx      +  + )  ) '  ' '  'r2   ri   r    r9   TlistifydefaultzKwargInfo[T.List[str]]_ARGS_KWr   z,KwargInfo[T.List['dependencies.Dependency']]_DEPENDENCIES_KWr@   )r   r   z$KwargInfo[T.List[build.IncludeDirs]]_INCLUDE_DIRS_KWr7    z1.0.0c                H    t        | t              rdj                  |       S | S )N
)
isinstancelistjoin)xs    r3   <lambda>r      s    
1d(;		!  r2   )r   since_values	convertorzKwargInfo[str]
_PREFIX_KWr>   Fr   rC   rD   1.3.0r   sincezT.List[KwargInfo]_COMMON_KWS_COMPILES_KWS0.50.0)r   r   _HEADER_KWSc                      e Zd ZU  ej                  ej                        Zded<   dw fdZ	e
dxd       ZdydZeedzd              Zeed{d              Zej$                  f	 	 	 d|dZd}d~d
Z ede       edeee      dd              Z edeej:                  f       edge dd              Zeedzd              Z ee e!dd      dzd                     Z"eedd              Z# edee       ede$ge% dd              Z& edeed       ede$ge% dd              Z' ede       ede$ge% dd              Z( ede       ede$ge% dd              Z) e!dd       ede       ed e*d e+e,f       e*d!e+e,f       e*d"e+e,f      ge% dd#                     Z- ed$e       ed$ge% dd%              Z. e!d&d       ed&e       ed&ge% dd'                     Z/ e!d(d)       ed(e       ed(ge% dd*                     Z0 ed+eej:                  f       ed+ge dd,              Z1 ed-eej:                  f       ed-ge dd.              Z2 e!d/d0       ed/e       ed/ge3 dd1                     Z4dd2Z5 ed3e       ed3ge3 dd4              Z6 ed5ee       ed5ge3 dd6              Z7dd7Z8e9 ed8e       ed8 e*d9e:e;jx                  fd:;       e*d< e=e>e      d:g d=>       e*d?e:e,fd@A       e*dBe:d	dCD       e*dE e=e>e      d:g F      gdG e3D         ddH                     Z?e@j                  dIf	 	 	 	 	 ddJZB edKe       edKe$      ddL              ZC edMeN       edMe$       e!dMdO      ddP                     ZD e!dQdR       edQeN       edQ e*dSedTdU eEh dV      W            ddX                     ZFe edYeN      ddZ              ZG e!d[d\       ed[e       ed[e$      dd]                     ZH e!d^d\       ed^eN       ed^e$      dd_                     ZI e!d`d\      e ed`eN      dda                     ZJ e!dbd\      e edceN      ddd                     ZKdddeZL e!dfdg       edfe       edfe$      ddh                     ZM e!didg      e edieN      ddj                     ZN e!dkdC      eedzdl                     ZO e!dmdn       ePdmdodpgdqr       edmeej:                  eQj                  eQj                  eQj                  fd       edm e*dsedt;       e*dp e=e>e      d:g F      eUej                  duA            ddv                            ZW xZXS )CompilerHolderzT.Dict[str, itertools.count]preprocess_uidc                   t         |   ||       | j                  | _        | j                  j                  i d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d	| j                  d
| j                  d| j                   d| j"                  d| j$                  d| j&                  d| j(                  d| j*                  d| j,                  i d| j.                  d| j0                  d| j2                  d| j4                  d| j6                  d| j8                  d| j:                  d| j<                  d| j>                  d| j@                  d| jB                  d| jD                  d| jF                  d| jH                  d | jJ                  d!| jL                         y )"Ncompileslinksget_idget_linker_idcompute_intsizeof
get_define
has_definecheck_header
has_headerhas_header_symbolrunhas_function
has_memberhas_membershas_type	alignmentversion	cmd_arrayfind_libraryhas_argumenthas_function_attribute!get_supported_function_attributeshas_multi_argumentsget_supported_argumentsfirst_supported_argumenthas_link_argumenthas_multi_link_argumentsget_supported_link_argumentsfirst_supported_link_argumentsymbols_have_underscore_prefixget_argument_syntax
preprocess)'ro   rp   envenvironmentrq   rr   compiles_methodlinks_methodget_id_methodget_linker_id_methodcompute_int_methodsizeof_methodget_define_methodhas_define_methodcheck_header_methodhas_header_methodhas_header_symbol_method
run_methodhas_function_methodhas_member_methodhas_members_methodhas_type_methodalignment_methodversion_methodcmd_array_methodfind_library_methodhas_argument_methodhas_func_attribute_method(get_supported_function_attributes_methodhas_multi_arguments_methodget_supported_arguments_methodfirst_supported_argument_methodhas_link_argument_methodhas_multi_link_arguments_method#get_supported_link_arguments_method$first_supported_link_argument_method%symbols_have_underscore_prefix_methodget_argument_syntax_methodpreprocess_method)rw   compilerry   rz   s      r3   rp   zCompilerHolder.__init__   s   ;/88 !Z)=)= !$d&7&7!%t'9'9! -d.G.G! +D,C,C	!
 &t'9'9! *4+A+A! *4+A+A! ,T-E-E! *4+A+A! 1$2O2O! #DOO! ,T-E-E! *4+A+A! +D,C,C! ()=)=!  )$*?*?!!" '(;(;#!$ )$*?*?%!& ,T-E-E'!( ,T-E-E)!* 6t7U7U+!, A$BoBo-!. 3D4S4S/!0 78[8[1!2 89]9]3!4 1$2O2O5!6 89]9]7!8 <T=e=e9!: =d>g>g;!< >t?i?i=!> 3D4S4S?!@ *4+A+AA! !	 r2   c                    | j                   S r|   )r}   )rw   s    r3   r   zCompilerHolder.compiler   s    r2   c                   d}d}g }|D ]  }t        |t        j                        r.t        j                  dd| j
                  | j                         Kt        |t        j                        r|rhd|j                  z   }n|j                  }|j                  |        |s|S t        |      dkD  r|n|}	|d}|	j                  d	j                  |            |z   S )
Nzwith dependency {}zwith dependencies {}z6compiler method "dependencies" kwarg with internal depz0.57.0locationz-lr   r   , )r   r   InternalDependencyr   
single_use
subprojectcurrent_nodeExternalLibraryrC   appendlenformatr   )
rw   depscompile_onlyendl
msg_singlemsg_manynamesdrC   tpls
             r3   _dep_msgzCompilerHolder._dep_msg   s    )
) 	A!\<<=%%&^`hjnjyjy/3/@/@B!\99:aff}vvLL	 Ke*q.hj<Dzz$))E*+d22r2   c                .    | j                   j                  S r|   )r   r   r~   s      r3   r   zCompilerHolder.version_method        }}$$$r2   c                .    | j                   j                  S r|   )r   exelistr~   s      r3   r   zCompilerHolder.cmd_array_method   r  r2   c                   g }|d   D ]t  }|j                  | j                  j                         | j                  j                               D ]-  }|j	                  | j
                  j                  |d             / v |d   st        j                  | j                  j                  j                  | j                        }|| j
                  j                  |      z  }|t        j                  u r*|j	                  | j
                  j                  |             |j                  dd      r)|j	                  | j
                  j!                                |j	                  |d          |S )Nr@   Fr>   rD   r9   )to_string_listr   get_source_dirget_build_dirextendr   get_include_argsr   OptionsViewoptionsr   get_option_compile_argsr   LINKget_option_link_argsgetget_werror_args)rw   r   moder9   iidiroptss          r3   _determine_argszCompilerHolder._determine_args  s)   -. 	IA(()9)9)H)H)JDL\L\LjLjLlm IDMM::4GHI	I '(''(8(8(A(A(I(I4??[DDMM99$??D',,,DMM>>tDE::h&KK5578F6N#r2   Fc                V    t        j                  |      }|| j                  |||      fS r|   )r   get_leaf_external_dependenciesr  )rw   r   r   r   s       r3   _determine_dependenciesz&CompilerHolder._determine_dependencies  s*    ::4@T]]4t<<<r2   zcompiler.alignmentc           
        |d   }| j                  |d   | j                  j                        \  }}| j                  j                  ||d   | j                  |d   |      \  }}|rt        j                  d      nd}t        j                  d	t        j                  |d
      |t        j                  t        |            |       |S )Nr   r   r   r7   r9   
extra_argsr   (cached)r   zChecking for alignment ofT)
r  r   is_crossr   r   r	   bluelogboldr6   )	rw   r9   r   typenamer   msgresultcached
cached_msgs	            r3   r   zCompilerHolder.alignment_method  s     7001GVZVcVcVlVl0m	c006(;KTM]M]<B6N>B 1 D /5TYYz*"
,8T*C3v;1G	Ur2   zcompiler.runc                    |d   }t        |t        j                        r]| j                  j	                  |       t        j                  j                  |j                  | j                  j                              }|d   }t        j                  | j                  |      }| j                  |d   dd       \  }}| j                  j                  || j                  ||      }|r|j                  st!        j"                  d      }	nH|j$                  dk(  rt!        j&                  d      }	n#t!        j"                  d	|j$                   d
      }	t!        j(                  dt!        j*                  |d      |d|	       |S )Nr   rC   r   F)r   r   r!  zDID NOT COMPILEYESzNO ()Checking ifTzruns:)r   r   Filery   add_build_def_filefrom_absolute_filerel_to_builddirr   
source_dir	functoolspartialr  r  r   r   rl   r	   redrk   greenr&  r'  )
rw   r9   r   codetestnamer"  r   r)  r*  hs
             r3   r   zCompilerHolder.run_method'  s@    AwdHMM*//5==33$$T%5%5%@%@ACD&>&&t';';VD
001GV[bf0g	c""4)9)9j04 # 6??HH./""a'JJu%HHtF$5$5#6a89HH]DIIh$=sGQOr2   c                6    | j                   j                         S r|   )r   r   r~   s      r3   r   zCompilerHolder.get_id_method>  s     }}##%%r2   zcompiler.get_linker_idz0.53.0c                6    | j                   j                         S r|   )r   r   r~   s      r3   r   z#CompilerHolder.get_linker_id_methodC  s     }}**,,r2   c                L    | j                   j                  | j                        S )z
        Check if the compiler prefixes _ (underscore) to global C symbols
        See: https://en.wikipedia.org/wiki/Name_mangling#C
        )r   r   r   r~   s      r3   r   z4CompilerHolder.symbols_have_underscore_prefix_methodI  s     }};;D<L<LMMr2   zcompiler.has_memberc           
     >   |\  }}t        || j                  d      \  }}}|rWt        j                  dt        j                  |d      dt        j                  |d      dt        j                  |      d       yt        j                  | j                  |      }| j                  |d         \  }	}
| j                  j                  ||g|d	   | j                  ||	
      \  }}|rt        j                  d      nd}|r.|s,t        | j                  j                          d|d|d      |rt        j                  d      }nt        j                   d      }t        j                  dt        j                  |d      dt        j                  |d      |
||       |S )NFr   TypeTz
has memberskipped: featuredisabledr   r7   r!  r#  r   z member 	 of type  not usabler.  NOChecking whether type)r   r   r	   r&  r'  r6  r7  r  r  r   r   r   r%  r   get_display_languager9  r8  )rw   r9   r   r(  
membernamerC  requiredfeaturer"  r   r)  hadr+  r,  hadtxts                  r3   r   z CompilerHolder.has_member_methodR  s     $*&<VT__^c&d#(GHHVTYYx6diiPZ\`Facuw{  xA  xA  BI  xJ  LV  W&&t';';VD
001GH	cmm//:,xHX040@0@;E=A 0 CV /5TYYz*"
C&$--*L*L*N)OxXbWeenownz  {F  (G  H  HZZ&FXXd^F($))Hd*CtyyT:C	U
r2   zcompiler.has_membersr   )varargsmin_varargsc           
     b   |\  }}t        j                  dj                  |D cg c]  }d| d
 c}            }t        || j                  d      \  }}}	|rCt        j
                  dt        j                  |d      d|dt        j                  |	      d	       yt        j                  | j                  |      }
| j                  |d
         \  }}| j                  j                  |||d   | j                  |
|      \  }}|rt        j                  d      nd}|r.|s,t        | j                  j                          d|d|d      |rt        j                   d      }nt        j"                  d      }t        j
                  dt        j                  |d      d||||       |S c c}w )Nr   "Fr   rA  Tzhas membersrB  rC  r   r7   r!  r#  r   z	 members rD  rE  r.  rF  rG  )r	   r'  r   r   r   r&  r6  r7  r  r  r   r   r   r%  r   rH  r9  r8  )rw   r9   r   r(  membernamesmmembersrC  rJ  rK  r"  r   r)  rL  r+  r,  rM  s                    r3   r   z!CompilerHolder.has_members_methodk  s    !%+))DII&EA1#Qx&EFG&<VT__^c&d#(GHHVTYYx6wPbdhdmdmnudv  yC  D&&t';';VD
001GH	cmm//+vhGW040@0@;E=A 0 CV /5TYYz*"
C&$--*L*L*N)OyYdXggpqyp|  }H  (I  J  JZZ&FXXd^F($))Hd*Cfj	B
+ 'Fs   F,zcompiler.has_functionc                   |d   }t        || j                  d      \  }}}|rAt        j                  dt        j                  |d      dt        j                  |      d       y| j                  |      }| j                  |d   d	      \  }}	| j                  j                  ||d
   | j                  ||      \  }
}|rt        j                  d      nd}|r+|
s)t        | j                  j                          d|d      |
rt        j                  d      }nt        j                  d      }t        j                  dt        j                  |d      |	||       |
S )Nr   Fr   zHas functionTrB  rC  r   r   r7   r!  r#  r   z
 function rE  r.  rF  zChecking for function)r   r   r	   r&  r'  r  r  r   r   r   r%  r   rH  r9  r8  )rw   r9   r   funcnamerC  rJ  rK  r"  r   r)  rL  r+  r,  rM  s                 r3   r   z"CompilerHolder.has_function_method  sE    7&<VT__^c&d#(GHH^TYYx%>@RTXT]T]^eTfhrs))&1
001GV[0\	cmm006(;KTM]M]<F>B 1 DV /5TYYz*"
C&$--*L*L*N)OzZbYeep'qrrZZ&FXXd^F($))Hd*CS&R\]
r2   zcompiler.has_typec                   |d   }t        || j                  d      \  }}}|rAt        j                  dt        j                  |d      dt        j                  |      d       yt        j                  | j                  |      }| j                  |d         \  }}	| j                  j                  ||d	   | j                  ||
      \  }
}|rt        j                  d      nd}|r+|
s)t        | j                  j                          d|d      |
rt        j                  d      }nt        j                   d      }t        j                  dt        j                  |d      |	||       |
S )Nr   Fr   zHas typeTrB  rC  r   r7   r!  r#  r   z type rE  r.  rF  zChecking for type)r   r   r	   r&  r'  r6  r7  r  r  r   r   r   r%  r   rH  r9  r8  )rw   r9   r   r(  rC  rJ  rK  r"  r   r)  rL  r+  r,  rM  s                 r3   r   zCompilerHolder.has_type_method  sD    7&<VT__^c&d#(GHHZ8T!:<NPTPYPYZaPbdno&&t';';VD
001GH	cmm,,Xvh7GIYIY8BQU - WV.4TYYz*"
C&$--*L*L*N)OvV^Uaal'mnnZZ&FXXd^F$dii$&?fjY
r2   zcompiler.compute_intz0.40.0rK   rJ   rI   c           
     t   |d   }t        j                  | j                  |      }| j                  |d   | j                  j
                        \  }}| j                  j                  ||d   |d   |d   |d   | j                  ||      }t        j                  d	t        j                  |d
      ||       |S )Nr   r   r   rK   rJ   rI   r7   r!  zComputing int ofT)r6  r7  r  r  r   r$  r   r   r	   r&  r'  )rw   r9   r   
expressionr"  r   r)  rx   s           r3   r   z!CompilerHolder.compute_int_method  s     !W
&&t';';VD
001GVZVcVcVlVl0m	cmm''
F5M6&>(.w9I(,(8(8Z59 ( ; 	#TYYz4%@#sK
r2   zcompiler.sizeofc           
        |d   }t        j                  | j                  |      }| j                  |d   | j                  j
                        \  }}| j                  j                  ||d   | j                  ||      \  }}|rt        j                  d      nd}	t        j                  dt        j                  |d	      |t        j                  t        |            |	       |S )
Nr   r   r   r7   r!  r#  r   zChecking for size ofT)r6  r7  r  r  r   r$  r   r   r	   r%  r&  r'  r6   )
rw   r9   r   elementr"  r   r)  esizer+  r,  s
             r3   r   zCompilerHolder.sizeof_method  s     q'&&t';';VD
001GVZVcVcVlVl0m	c,,WfX6FHXHX8BQU - Wv.4TYYz*"
'7D)3		#e*0Ez	Sr2   zcompiler.get_definec                ~   |d   }t        j                  | j                  |      }| j                  |d         \  }}| j                  j                  ||d   | j                  ||      \  }}|rt        j                  d      nd}	|dn|}
t        j                  dt        j                  |d	      ||
|	       ||S dS )
Nr   r   r7   r!  r#  r   z(undefined)zFetching value of defineT)r6  r7  r  r  r   r   r   r	   r%  r&  r'  )rw   r9   r   r[  r"  r   r)  valuer+  r,  	value_msgs              r3   r   z CompilerHolder.get_define_method  s     q'&&t';';VD
001GH	c00&:JDL\L\<F>B 1 Dv /5TYYz*"
%*]M	+TYYw-EsIWab)u1r1r2   zcompiler.has_definer   c                   |d   }t        j                  | j                  |      }| j                  |d   d       \  }}| j                  j                  ||d   | j                  ||      \  }}|rt        j                  d      nd}	|t        j                  d      nt        j                  d	      }
t        j                  d
t        j                  |d      |d|
|	       |d uS )Nr   r   r   r7   r!  r#  r   r.  rF  zChecking if defineTzexists:)r6  r7  r  r  r   r   r   r	   r%  r9  r8  r&  r'  )rw   r9   r   define_namer"  r   r)  r^  r+  r,  r<  s              r3   r   z CompilerHolder.has_define_method  s     1g&&t';';VD
001Gd0S	c00fX>NPTP`P`<F>B 1 Dv /5TYYz*"
!&!2DJJu%tyyd'CS)UVXbcD  r2   zcompiler.compilesc                Z   |d   }t        |t        j                        r|j                  r-t	        j
                  dd| j                  d| j                         | j                  j                  |       t        j                  j                  |j                  | j                  j                  | j                  j                              }|d   }t        j                   | j"                  |      }| j%                  |d   d       \  }}| j&                  j)                  || j                  ||      \  }}	|rt|rt+        j,                  d	      }
nt+        j.                  d
      }
|	rt+        j0                  d      nd}t+        j2                  dt+        j4                  |d      |d|
|       |S )Nr   z1compiler.compiles with file created at setup time1.2.03It was broken and either errored or returned false.rC   r   ra  r!  r.  rF  r#  r   r0  Tz	compiles:)r   r   r1  is_builtr   r   r   r   ry   r2  r3  absolute_pathr   r5  	build_dirr6  r7  r  r  r   r   r	   r9  r8  r%  r&  r'  )rw   r9   r   r:  r;  r"  r   r)  r*  r+  r<  r,  s               r3   r   zCompilerHolder.compiles_method  sg    AwdHMM*}}%%&Y[bdhdsds&[]a]n]np//5==33""4#3#3#>#>@P@P@Z@Z[]D&>&&t';';VD
001Gd0S	c//d6F6F;E=A 0 C JJu%HHTN28:.bJHH]DIIh$=sKQRT^_r2   zcompiler.linksc                   |d   }d }t        |t        j                        rr|j                  r-t	        j
                  dd| j                  d| j                         | j                  j                  |       t        j                  j                  |j                  | j                  j                  | j                  j                              }|j                  }|| j                   j"                  vr| j                   j$                  }| j                  j&                  j(                  |   }|t*        vrt-        j.                  d|        nIt*        |   |vr2t-        j.                  dt*        |    d|j1                          d       n|t*        |      }|d	   }t3        j4                  | j6                  |      }	| j9                  |d
   d      \  }
}| j                   j;                  || j                  ||	|
      \  }}|rt-        j<                  d      nd}|r[|rt-        j>                  d      }nt-        j@                  d      }t-        jB                  dt-        jD                  |d      |d||       |S )Nr   z.compiler.links with file created at setup timerd  re  zUnknown suffix for test file zPassed z+ source to links method, not specified for z	 machine.rC   r   Fr   )r   r"  r   r#  r   r.  rF  r0  Tzlinks:)#r   r   r1  rf  r   r   r   r   ry   r2  r3  rg  r   r5  rh  suffixr   file_suffixesfor_machiner   	compilersr
   r	   warningget_lower_case_namer6  r7  r  r  r   r%  r9  r8  r&  r'  )rw   r9   r   r:  r   rj  rl  clistr;  r"  r   r)  r*  r+  r,  r<  s                   r3   r   zCompilerHolder.links_method  s5    AwdHMM*}}%%&VX_aeapap&[]a]n]np//5==33""4#3#3#>#>@P@P@Z@Z[]D[[FT]]888"mm77((11;;KH/LL#@!GH#F+58LL7>&+A*BBmny  oN  oN  oP  nQ  QZ  "[  \$^F%;<H&>&&t';';VD
001GV[0\	c,,T43C3C6>8B:> - @ /5TYYz*"
JJu%HHTNHH]DIIh$=sHaQ[\r2   zcompiler.check_headerz0.47.0c                   |d   }t        || j                  d      \  }}}|rAt        j                  dt        j                  |d      dt        j                  |      d       yt        j                  | j                  |      }| j                  |d         \  }}	| j                  j                  ||d	   | j                  ||
      \  }
}|rt        j                  d      nd}|r+|
s)t        | j                  j                          d|d      |
rt        j                  d      }nt        j                   d      }t        j                  dt        j                  |d      |	||       |
S )Nr   Fr   zCheck usable headerTrB  rC  r   r7   r!  r#  r    header rE  r.  rF  )r   r   r	   r&  r'  r6  r7  r  r  r   r   r   r%  r   rH  r9  r8  )rw   r9   r   hnamerC  rJ  rK  r"  r   r)  hazr+  r,  r<  s                 r3   r   z"CompilerHolder.check_header_method5  sG    Q&<VT__^c&d#(GHH*DIIeT,BDVX\XaXabiXjlvw&&t';';VD
001GH	cmm00x8H$JZJZ<F>B 1 DV /5TYYz*"
C&$--*L*L*N)OxX]W``k'lmm

5!AA&		%(>Q
S
r2   c                   t        || j                  d      \  }}}|rAt        j                  dt        j                  |d      dt        j                  |      d       yt        j                  | j                  |      }| j                  |d         \  }}| j                  j                  ||d   | j                  ||	      \  }	}
|
rt        j                  d
      nd}|r+|	s)t        | j                  j                          d|d      |	rt        j                  d      }nt        j                   d      }t        j                  dt        j                  |d      |||       |	S )NFr   z
Has headerTrB  rC  r   r7   r!  r#  r   rr  z
 not foundr.  rF  )r   r   r	   r&  r'  r6  r7  r  r  r   r   r   r%  r   rH  r9  r8  )rw   rs  r   rC  rJ  rK  r"  r   r)  rt  r+  r,  r<  s                r3   _has_header_implzCompilerHolder._has_header_implM  s5   &<VT__^c&d#(GHH\499UD#9;MtyyY`Oacmn&&t';';VD
001GH	cmm..ufX6FHXHX:DSW / YV.4TYYz*"
C&$--*L*L*N)OxX]W``j'kll

5!AAtyy5sAzJ
r2   zcompiler.has_headerc                ,    | j                  |d   |      S Nr   )rv  r~   s      r3   r   z CompilerHolder.has_header_method`  s     $$T!Wf55r2   zcompiler.has_header_symbolc           
     :   |\  }}t        || j                  d      \  }}}|rWt        j                  dt        j                  |d      dt        j                  |d      dt        j                  |      d       yt        j                  | j                  |      }| j                  |d         \  }	}
| j                  j                  |||d	   | j                  ||	
      \  }}|r-|s+t        | j                  j                          d| d|       |rt        j                  d      }nt        j                  d      }|rt        j                   d      nd}t        j                  dt        j                  |d      dt        j                  |d      |
||       |S )NFr   HeaderTz
has symbolrB  rC  r   r7   r!  z symbol z not found in header r.  rF  r#  r   )r   r   r	   r&  r'  r6  r7  r  r  r   r   r   r   rH  r9  r8  r%  )rw   r9   r   rs  symbolrC  rJ  rK  r"  r   r)  rt  r+  r<  r,  s                  r3   r   z'CompilerHolder.has_header_symbol_methode  s    v&<VT__^c&d#(GHHXtyy5|TYYvW[E\^prvr{r{  }D  sE  GQ  R&&t';';VD
001GH	cmm55eVVHEUW[WgWgAKCG 6 IV C&$--*L*L*N)OxX^W__tuzt{'|}}

5!AA.4TYYz*"
499UD1<6SWAXZ]_`blm
r2   c                v    t        j                  |d | j                  | j                  j                  d      }|S )NT)silent)r   r   r   r   language)rw   libnamelibs      r3   notfound_libraryzCompilerHolder.notfound_library|  s6    **7D+/+;+;+/==+A+A268 
r2   zcompiler.find_libraryrJ  Tr   rW   r   )r   r   r   rX   z0.51.0)r   rV   z0.49.0r   dirsr   c              #  Z   K   | ]#  }|j                  d |j                          % yw)header_)rC   N)evolverC   ).0ks     r3   	<genexpr>zCompilerHolder.<genexpr>  s&     	A!(('!&&*(
+	As   )+c                ~   |d   }t        || j                        \  }}}|rPt        j                  dt        j                  |      dt        j                  |      d       | j                  |      S ||d   |d   |d   |d   |d	   d
}|d   D ]'  }| j                  ||      r| j                  |      c S  t        |      }	| j                  j                  j                  t        d            }
|d   du rt        j                  j                  }nY|d   du rt        j                  j                  }n7|
rt        j                  j                   }nt        j                  j"                  }| j$                  j'                  || j                  |	|      }|rp|sn|t        j                  j"                  k(  rd}n|j(                  j+                         }t-        dj/                  | j$                  j1                         ||            t3        j4                  ||| j                  | j$                  j6                        }|S )Nr   LibraryrB  rC  rY   rZ   r[   r]   r\   )rJ  r9   r   r@   r7   r>   rW   prefer_staticrX   TFzshared or staticz{} {} library {!r} not found)r   r   r	   r&  r'  r  rv  r   r   r   
get_optionr   r   LibTypeSTATICSHAREDPREFER_STATICPREFER_SHAREDr   r   rC   lowerr   r   rH  r   r   r~  )rw   r9   r   r  rC  rJ  rK  has_header_kwargsr<  search_dirsr  libtypelinkargs	libtype_sr  s                  r3   r   z"CompilerHolder.find_library_method  s    q'&<VT__&U#(GHHY		' 24F		RYHZ\fg((11
 !=)"#89#)*F#G_-%&>?)
 & 	6A((,=>,,W55	6 *&1((11<<Y=WX(t#&&--GH&&&--G&&44G&&44G==--gt7G7GV]^H(**888.	#LL..0	&'E(.t}}/Q/Q/S/8')CD D **7Hd>N>N+/==+A+AC
r2   Nc                   t        |t              r|g}d| j                  j                         dj	                  |t
        j                  u rdnd      dj	                  dj                  |            g}|xs ddi}t        || j                  d	      \  }}}|r.|d
t        j                  |      dgz  }t        j                  |  y|t
        j                  u r| j                  j                  n| j                  j                  } ||| j                        \  }	}
|r|	s|dgz  }t!        | ||	rt        j"                  d      nt        j$                  d      |
rt        j&                  d      ndgz  }t        j                  |  |	S )zIShared implementation for methods checking compiler and linker arguments.zCompiler forz
supports{}z linkr   zarguments {}: rJ  Fr   rB  rC  
not usabler.  rF  r#  )r   r6   r   rH  r   rd   rg   r   r   r   r	   r'  r&  r   r   r   r   r9  r8  r%  )rw   	argumentsr  r   logargsrC  rJ  rK  testr*  r+  s              r3   _has_argument_implz!CompilerHolder._has_argument_impl  sb   
 i%"IMM..0493C3C+CL""388I#67	$
 .J.&<VT__^c&d#(G*DIIg,>
KKGHHg9=AQAQ9Qt}}55W[WdWdWxWxi)9)9:F~%G&00!'DJJuTXXd^%+DIIj!
 	
 	'r2   zcompiler.has_argumentc                0    | j                  |d   g|      S Nr   )r   r  r~   s      r3   r   z"CompilerHolder.has_argument_method  s      &&Qy&@@r2   zcompiler.has_multi_arguments)rN  z0.37.0c                .    | j                  |d   |      S r  r  r~   s      r3   r   z)CompilerHolder.has_multi_arguments_method  s     &&tAwv&>>r2   z compiler.get_supported_argumentsz0.43.0r+   offz0.59.0>   r  warnrequire)r   r   	validatorc                   g }|d   }|d   D ]|  }| j                  |g      sWd| j                  j                          d| d}|dk(  rt        j                  |       Q|dk(  sWt        j                  |      |j                  |       ~ |S )Nr+   r   Compiler for z does not support "rQ  r  r  )r  r   rH  r	   rn  r   MesonExceptionr   )rw   r9   r   supported_argsr+   argr)  s          r3   r   z-CompilerHolder.get_supported_arguments_method  s     ')#7 	+C**C51%dmm&H&H&J%KK^_b^ccdef$LL%	)"11#66%%c*	+ r2   z!compiler.first_supported_argumentc                    |d   D ]B  }| j                  |g      st        j                  dt        j                  |             |gc S  t        j                  dt        j                  d             g S )Nr   zFirst supported argument:None)r  r	   r&  r'  r8  rw   r9   r   r  s       r3   r   z.CompilerHolder.first_supported_argument_method  sd     7 	C&&u-4diinEu	 	,dhhv.>?	r2   zcompiler.has_link_argumentz0.46.0c                N    | j                  |d   gt        j                  |      S Nr   )r  r   r  rd   rg   r~   s      r3   r   z'CompilerHolder.has_link_argument_method  s)     &&Qyy7G7GPV&WWr2   z compiler.has_multi_link_argumentc                L    | j                  |d   t        j                  |      S r  r  r~   s      r3   r   z.CompilerHolder.has_multi_link_arguments_method  s&     &&tAwY5E5Ef&UUr2   z%compiler.get_supported_link_argumentsc                    g }|d   D ]6  }| j                  |gt        j                        s&|j                  |       8 |S )Nr   r  )r  rd   rg   r   )rw   r9   r   r  r  s        r3   r   z2CompilerHolder.get_supported_link_arguments_method  sM     ')7 	+C&&u93C3C&D%%c*	+ r2   z-compiler.first_supported_link_argument_methodz&compiler.first_supported_link_argumentc                   |d   D ]R  }| j                  |gt        j                        s&t        j                  dt        j
                  |             |gc S  t        j                  dt        j                  d             g S )Nr   r  zFirst supported link argument:r  )r  rd   rg   r	   r&  r'  r8  r  s       r3   r   z3CompilerHolder.first_supported_link_argument_method  so     7 	C&&u93C3C&D9499S>Ju	 	1488F3CD	r2   c                   d| j                   j                          d| dg}|xs ddi}t        || j                  d      \  }}}|r.|dt	        j
                  |      dgz  }t	        j                  |  y| j                   j                  || j                        \  }}|r|s|d	gz  }t        | ||rt	        j                  d
      nt	        j                  d      |rt	        j                  d      ndgz  }t	        j                  |  |S )z-Common helper for function attribute testing.r  z supports function attribute :rJ  Fr   rB  rC  r  r.  rF  r#  r   )r   rH  r   r   r	   r'  r&  has_func_attributer   r   r9  r8  r%  )	rw   attrr   r  rC  rJ  rK  rL  r+  s	            r3   _has_function_attribute_implz+CompilerHolder._has_function_attribute_impl(  s    DMM>>@AA^_c^ddef$
 .J.&<VT__^c&d#(G*DIIg,>
KKGHHgmm66tT=M=MNVC~%G&00!$DJJu$((4.%+DIIj!
 	
 	'
r2   zcompiler.has_function_attributez0.48.0c                ,    | j                  |d   |      S rx  r  r~   s      r3   r   z(CompilerHolder.has_func_attribute_method>  s     00a&AAr2   z*compiler.get_supported_function_attributesc                V    |d   D cg c]  }| j                  |      s| c}S c c}w rx  r  )rw   r9   r   as       r3   r   z7CompilerHolder.get_supported_function_attributes_methodD  s)      7Kad&G&G&JKKKs   &&z#compiler.get_argument_syntax_methodc                6    | j                   j                         S r|   )r   r   r~   s      r3   r   z)CompilerHolder.get_argument_syntax_methodJ  s     }}0022r2   zcompiler.preprocessz0.64.0z1.3.2rb   z-compile_args were ignored before this version)extra_messagera   z@PLAINNAME@.i1.1.0c                    | j                   j                         }| j                  j                  |d         }t	        d |D              r-t        j                  dd| j                  | j                         t        | j                  | j                  j                           }|dkD  r-t        j                  dd| j                  | j                         d| }t        j                  || j                  j                  | j                  | j                  ||d   || j                  j                  |d	   |d
   |d         }| j                  j!                  |j"                  |       t$        j&                  j)                  | j                  j                  j+                  |      | j                  j                        }|j,                  D 	cg c]6  }	t        j.                  |t$        j&                  j1                  ||	            8 c}	S c c}	w )Nr   c              3     K   | ]=  }t        |t        j                  t        j                  t        j                  f       ? y wr|   )r   r   CustomTargetCustomTargetIndexGeneratedList)r  ss     r3   r  z3CompilerHolder.preprocess_method.<locals>.<genexpr>]  s1     refz!e00%2I2I5K^K^_`rs   AAz*compiler.preprocess with generated sourcesr  r   z'compiler.preprocess used multiple timespreprocessor_ra   rb   r@   r   )r   get_preprocessorry   source_strings_to_filesanyr   r   r   r   nextr   subdirr   CompileTargetr   backend
add_targetrC   ospathrelpathget_target_private_diroutputsr  r   )
rw   r9   r   r   sources
tg_countertg_nametgprivate_diros
             r3   r   z CompilerHolder.preprocess_methodP  s    ==113#'#3#3#K#KDQRG#Trjqrr!!"NPWY]YhYh+/+<+<> $--d.>.>.E.EFG
>!!"KWVZVeVe+/+<+<>!*.  ##OO8$$>"()>"$ 	##BGGR0 ggood&6&6&>&>&U&UVX&Y[_[k[k[r[rsSUS]S]^a''BGGLLa,HI^^^s   ;H)r   
'Compiler'ry   r   )r   r  )r   !T.List['dependencies.Dependency']r   r=   r   r6   r   r6   r   )r9   r   r   r   r   r8   )r   r<   r  r   r   r8   )Fr  )r   r  r   r=   r   r6   r   z/T.Tuple[T.List['dependencies.Dependency'], str])r9   T.Tuple[str]r   z'AlignmentKw'r   r   )r9    T.Tuple['mesonlib.FileOrString']r   'CompileKW'r   r   r   )r9   T.Tuple[str, str]r   'HasKW'r   r=   )r9   zT.Tuple[str, T.List[str]]r   r  r   r=   )r9   r  r   r  r   r=   )r9   r  r   z'ComputeIntKW'r   r   )r9   r  r   
'CommonKW'r   r   )r9   r  r   r  r   r6   )r9   r  r   r  r   r=   )r9   r  r   r  r   r=   )r9   r  r   
'HeaderKW'r   r=   )rs  r6   r   r  r   r=   )r9   r  r   r  r   r=   )r  r6   r   'dependencies.ExternalLibrary')r9   r  r   z'FindLibraryKW'r   r  )r  zT.Union[str, T.List[str]]r  rd   r   T.Optional['ExtractRequired']r   r=   )r9   r  r   'HasArgumentKW'r   r=   )r9   T.Tuple[T.List[str]]r   r  r   r=   )r9   r  r   z'GetSupportedArgumentKw'r   r8   )r9   r  r   r   r   r8   r|   )r  r6   r   r  r   r=   )r9   z(T.Tuple[T.List['mesonlib.FileOrString']]r   z'PreprocessKW'r   zT.List[build.CustomTargetIndex])Yr-   r.   r/   collectionsdefaultdict	itertoolscountr   r0   rp   propertyr   r  r   r   r   r   r   r  r  r  r   r6   r   r   r   r   r   r   r1  r   r   r   r   r   r   _HAS_REQUIRED_KWr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv  r   r   r  r   r=   r   UserFeatureOptionr   r   r   rd   rf   r  r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r  r  r  r   r  r   r   r   s   @r3   r   r      s   3J;3J3J9??3[N0[$ L    3. %  % %  % 2B1F1F.KV = (#.		 /	 NS(--$89.1=1 2 :* &  & ((3- 4  - N  N )34')9HKH I 5. *C!L(*:I[I J M2 +S1)+;JkJ K 2* '-%'7F+F G .( &1*C0%#x)&3/*'C?+	
 
	 1 2	 %s+#2k2	 3 ,	 %x0)3/'6+6
2 7 0 1
2 %w/)3/'6+6! 7 0 0! '#x}})=>%66 7 ?0 $sHMM&:;"3]3$ 4 <$L '2+S1)8K8 9 2 3*& )3/'6+66 7 06 0#s;.== > <* +S1*tX%?%?@$O-!24!=tUW_gh(T8,H=*dEB&+D#6bQ 
B[	A- 2 -` .7-?-?CG!*#@LP> +S1)+;<A = 2A 2C@02BC.9? : D A? 2H=6D*)S%x,-GH	J
 E > 7E F  ,h70#6.0@AX B 7 8X 2H=6D46FGV H E >V 7B;SI J  C ?J<cJ K  K, 18<5s;35EFB G < =B <hG@#NL O  HL 5x@3   A3 %x0+W~6F  WF  G)CHZHZ\a\s\suz  vI  vI  4J  XY  Z(C9."3D#">VXYg._ Z G 1_r2   r   r   )Y
__future__r   r  enumr6  r  r  typingTr   r   r   r   r   r	   rm  r
   compilers.compilersr   interpreterbaser   r   r   r   r   r   r   interpreterbase.decoratorsr   r   r   r   r   interpreterobjectsr   r   type_checkingr   r   r   TYPE_CHECKINGry   r   r   r    r!   r"   r   r#   r$   interpreter.interpreterr%   r&   typing_extensionsr'   r(   r*   r5   r<   rB   rF   rH   rM   rQ   rS   rU   r`   Enumrd   ri   r   r6   r   r0   
Dependencyr   IncludeDirsr   r   r=   _NO_BUILTIN_ARGS_KW_NAME_KW
_WERROR_KWr   r   r  r   r  r   r1   r2   r3   <module>r     s   #    	        & 25 5 5 d c   M B B??)/7:6&43 36i 6	 
M 6= 6
x 8_ /  C): C6y 6		 'k2 '< $-
dC 	$
   BKdL334	B >  :CdE--.	: 6  '
D#
&'BD
N D   14G VS"-xuGD
 #+,<>NPZ\o!p p %-h8HJZ\o$.$0  0 #5+"4"48U"S!bVa!b b%;%%GUC C_\*- C_r2   