
    e?                    d   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 ej                   rd dlZd$dZd%d	Z G d
 d      Zd&dZd'dZd(dZddddZddddZd)dZd*dZd+dZd,dZd-d.dZd-d/dZd-d0dZ d-d0dZ!d1dZ"d+dZ#d2dZ$d(d Z%d(d!Z&d+d"Z'd3d#Z(y)4    )annotationsN   )	envconfig)mlog)	compilers)defaultsc                     t         j                  j                         D ]&  } t        j                  j                  | dz         s& y y)N
_FOR_BUILDTF)r   ENV_VAR_COMPILER_MAPvaluesosenvironget)cenvs    >/usr/lib/python3/dist-packages/mesonbuild/scripts/env2mfile.pyhas_for_buildr      s=    ..557 ::>>$-.     c                   | j                  dd d       | j                  ddd       | j                  ddd	d
       | j                  dddd       | j                  dddd       | j                  dd d       | j                  dd d       | j                  dd d       | j                  dd d       | j                  dd d       | j                  ddddgd !       y )"Nz	--debarchz"The dpkg architecture to generate.)defaulthelpz--gccsuffix z-A particular gcc version suffix if necessary.z-oToutfilezThe output file.)requireddestr   z--crossF
store_truez"Generate a cross compilation file.)r   actionr   z--nativez#Generate a native compilation file.z--systemz$Define system for cross compilation.z--subsystemz'Define subsystem for cross compilation.z--kernelz$Define kernel for cross compilation.z--cpuz!Define cpu for cross compilation.z--cpu-familyz(Define cpu family for cross compilation.z--endianlittlebigz(Define endianness for cross compilation.)r   choicesr   )add_argument)parsers    r   add_argumentsr"   $   s7   
TA  C
rL  N
t)/  1
	5A  C

E,B  D

DC  E
tF  H

DC  E
@  B
G  I

Huh>OG  Ir   c                      e Zd ZddZy)MachineInfoc                    i | _         i | _        i | _        i | _        i | _        i | _        d | _        d | _        d | _        d | _	        d | _
        d | _        y N)r   binaries
propertiescompile_args	link_argscmakesystem	subsystemkernelcpu
cpu_familyendian)selfs    r   __init__zMachineInfo.__init__=   sW    3524BD6835=?
'+*.'+$(+/'+r   N)returnNone)__name__
__module____qualname__r3    r   r   r$   r$   <   s    ,r   r$   c                &   t         j                  j                  |       r| gS t        j                         D ]K  }t         j                  j	                  ||       }t        j
                  |t         j                        sH|gc S  t        d| z        )Nz%s not found on $PATH)r   pathisabsget_exec_pathjoinaccessX_OK
ValueError)programdfs      r   locate_pathrE   W   sr    	ww}}Wy GGLLG$99Q 3J ,w6
77r   c                    t        |      dk(  ry t        |t              r|dz   |z   dz   }n%|dz   }|dj                  d |D              z  }|dz  }| j	                  |       y )Nr   z= ''
z = [z, c              3  ,   K   | ]  }d |z   d z     yw)'Nr9   ).0is     r   	<genexpr>z"write_args_line.<locals>.<genexpr>g   s     6A#'C-6s   z]
)len
isinstancestrr>   write)ofilenameargsostrs       r   write_args_linerU   `   sd    
4yA~$e|d"U*f}		6666	KKr   c                   t        j                  t        j                  j	                  dd            }t        j                  t        j                  j	                  dd            }t        j                  t        j                  j	                  dd            }t        j                  t        j                  j	                  dd            }t        j                  t        j                  j	                  dd            }t        j                  t        j                  j	                  dd            }||z   }||z   }||z   }	||z   }
||z   }||z   }||z   }||z   }|r|| j
                  d<   |	r|	| j                  d<   |r|| j
                  d	<   |
r|
| j                  d	<   |r|| j
                  d
<   |r|| j                  d
<   |r|| j
                  d<   |r|| j                  d<   y y )NCPPFLAGSr   CFLAGSCXXFLAGS	OBJCFLAGSOBJCXXFLAGSLDFLAGSccppobjcobjcpp)shlexsplitr   r   r   r)   r*   )infoscppflagscflagscxxflags	objcflagsobjcxxflagsldflagsc_argscpp_argsc_link_argscpp_link_args	objc_argsobjcpp_argsobjc_link_argsobjcpp_link_argss                  r   get_args_from_envvarsrr   k   s   {{2::>>*b9:H[["56F{{2::>>*b9:HBJJNN;;<I++bjjnn]B?@Kkk"**..B78GF("H7"Kw&M9$I[(K(N"W,"(3*$,5!!.%.6""0'28$$4! r   mips64x86ppc64)mips64eli686powerpc64learm7hlf)armhfrv   rx   c                    dddd}dddd}| j                   d	   | j                  d
<   	 | j                   d   | j                  d<   ||d      | j                  d<   |j                  |d   |d         | j                  d<   y # t        $ r Y Fw xY w)NLinuxkFreeBSDGNU)linuxkfreebsdhurdarmv7lrs   ppc64le)armrv   rx   r]   CMAKE_C_COMPILERr^   CMAKE_CXX_COMPILERDEB_HOST_ARCH_OSCMAKE_SYSTEM_NAMEDEB_HOST_GNU_CPUCMAKE_SYSTEM_PROCESSOR)r   r+   KeyErrorr   )rc   datasystem_name_mapsystem_processor_maps       r   deb_detect_cmaker      s     'ZOO#+R[\&+ooc&:EKK"#,1OOE,B() (7t<N7O'PEKK#$,@,D,DTJ\E]EIJ\E]-_EKK()  s   B 	BBc                ~    |D ])  \  }}| d| | }	 t        |      }|| j                  |<   + y # t        $ r Y 8w xY w)N-)rE   r   rA   )rc   compilerstems	host_arch	gccsuffixlangnamestemcompilernameps           r   deb_compiler_lookupr      sZ    ' $#AdVI;7	L)A()EOOH%	
  		s   0	<<c                   | j                   dk(  rdg}ndd| j                   z   g}t        j                  |dt        j                        }i }|j	                  d      D ]2  }|j                         }|dk(  r|j	                  dd	      \  }}|||<   4 |d
   }|d   }|}	d}
t        j                  |d   |d         }t        j                  |d   |d         }|d   }g d}t               }t        |||| j                         t        |j                        dk(  rt        d       t        d|z        |j                   d<   t        d|z        |j                   d<   t        d|z        |j                   d<   t        d|z        |j                   d<   	 t        d      |j                   d<   t#        ||       	 t        d|z        |j                   d<   	 t        d      |j                   d<   ||_        |	|_        |
|_        ||_        ||_        ||_        t3        |       |S # t$        $ r Y ww xY w# t$        $ r Y jw xY w# t$        $ r Y `w xY w)Nautozdpkg-architecturez-aT)universal_newlinesstderr
r   =   DEB_HOST_GNU_TYPEr   r   r   DEB_HOST_ARCHDEB_HOST_ARCH_ENDIAN))r]   gcc)r^   zg++)r_   gobjc)r`   zgobjc++r   z$Warning: no compilers were detected.z%s-ararz%s-stripstripz
%s-objcopyobjcopyz%s-ldldr+   z%s-pkg-configz
pkg-configzcups-config)debarch
subprocesscheck_outputDEVNULLrb   r   deb_cpu_family_mapr   deb_cpu_mapr$   r   r   rM   r   printrE   r'   r   rA   r,   r-   r.   r0   r/   r1   rr   )optionscmdoutputr   linekvr   host_oshost_subsystemhost_kernelhost_cpu_familyhost_cpuhost_endianr   rc   s                   r   detect_cross_debianliker      sk   & "#"D7??$:;$$ST,6,>,>@FDT" zz|2:zz#q!1Q ()I%&GNK(,,T2D-E-12D-EGOtO4#O46H-.K,M ME}i9J9JK
5??q 45&w':;ENN4)*y*@AENN7 +L9,D EENN9&w':;ENN4"-g"6w%'2?Y3N'O|$(3M(B}% EL$EOEL&EEIEL% L%      s6   $H$ 9H3 I $	H0/H03	H?>H?	IIc           	        |dz   }t        |dd      5 }|j                  d       |j                  d       t        | j                  j	                               D ]  }| j                  |   }t        |||         |j                  d       |j                  d       t        | j                  j	                               D ]  }| j                  |   }t        |||         |j                  d       |j                  d	       t        t        | j                  j	                               j                  t        | j                  j	                                           }	|	j                          |	D ]Y  }
|
| j                  v rt        ||
d
z   | j                  |
          |
| j                  v s=t        ||
dz   | j                  |
          [ | j                  j                         D ]  \  }}t        |||        |j                  d       | j                  rQ|j                  d       | j                  j                         D ]  \  }}t        |||        |j                  d       |r|j                  d       |j                  d| j                    d       |j                  d| j"                   d       |j                  d| j$                   d       |j                  d| j&                   d       | j(                  r|j                  d| j(                   d       | j*                  r|j                  d| j*                   d       d d d        t-        j.                  ||       y # 1 sw Y    xY w)N~wzutf-8)encodingz[binaries]
z# Compilers
r   z# Other binaries
z[properties]
_args
_link_argsz	[cmake]

z[host_machine]
zcpu = 'rG   zcpu_family = 'z
endian = 'z
system = 'zsubsystem = 'z
kernel = ')openrP   sortedr   keysrU   r'   listsetr)   unionr*   sortr(   itemsr+   r/   r0   r1   r,   r-   r.   r   replace)rc   	ofilenamewrite_system_infotmpfilenamerQ   r   compilerexenameexe	all_langslangr   r   s                r   write_machine_filer      s   c/K	k3	1 )<UN#O$u3356 	7Hx0HE8X6	7 	D()enn1134 	1G..)CE7C0	1 	D$%U//4467==c%//BVBVBX>YZ[	 	SDu)))tg~u7I7I$7OPu&tl':EOOD<QR		S
 $$**, 	)DAqE1a(	)D;;KK&))+ -1q!,-KKKK*+KK'%))C01KK.)9)9(:#>?KK*U\\N#67KK*U\\N#67mEOO+<C@A||jc:;S)<V JJ{I&W)< )<s   FM..F!M..M7c                   t        t        j                  t        j                  j                  d|z   d                  }g }| t        j                  v rGt        j                  t        j                  j                  t        j                  |    |z   d            }| t        j                  v rNt        t        j                  t        j                  j                  d|z   d                  }t        |      |z   }n|}t        |      |z   }||fS )Nr\   r   rW   )
tuplera   rb   r   r   r   r   CFLAGS_MAPPINGLANGUAGES_USING_CPPFLAGSr   )r   envvar_suffixri   r)   rd   lang_compile_argslang_link_argss          r   !detect_language_args_from_envvarsr     s    EKK

y=/H" MNOGL9+++{{2::>>)2J2J82TWd2dfh#ij9555RZZ^^J4NPR%STU N\9(']\1N~..r   c                   t               }t        j                  j                         D ]  \  }}t        j
                  j                  || z         }|s+t        j                  j                  |      r|g}nt        j                  |      }||j                  |<   t        ||       \  }}|r||j                  |<   |s||j                  |<    |S r&   )r$   r   r   r   r   r   r   r;   existsra   rb   r   r   r)   r*   )r   rc   r   
envvarnamecompilerstrr   r   r   s           r   detect_compilers_from_envvarsr   '  s    ME ) > > D D F 7*jjnnZ-%?@77>>+&#}H{{;/H$,!,MhXe,f)>+<Ex((6EOOH%7 Lr   c                    t         j                  j                         D ]N  \  }}||z   }t        j                  j                  |      }|s-t        j                  |      | j                  |<   P y r&   )	r   ENV_VAR_TOOL_MAPr   r   r   r   ra   rb   r'   )rc   r   binnameenvvar_baseenvvarbinstrs         r   detect_binaries_from_envvarsr   9  s[     ) : : @ @ B :},'&+kk&&9ENN7#	:r   c                    t         j                  j                  d|z         }||| j                  d<   t         j                  j                  d|z         }||| j                  d<   y y )NPKG_CONFIG_LIBDIRpkg_config_libdirPKG_CONFIG_SYSROOT_DIRsys_root)r   r   r   r(   )rc   r   vars      r   detect_properties_from_envvarsr   @  sb    
**..,}<
=C
03,-
**..1MA
BC
'*$ r   c           
         dD ]^  }t        ||      }|sAt        j                  d| d|j                  dd       d       t	        j
                  d       t        | ||       ` y )N)r,   r-   r.   r/   r0   r1   zCross property "z" missing, set it with --_r   .r   )getattrr   errorr   sysexitsetattr)rc   r   optnamer   s       r   detect_cross_systemr   H  sc    S #GW%JJ)'2KGOO\_adLeKffghiHHQKw"#r   c                    | j                   rt        d       t        |       }n!t        d       t               }t	        ||        t        |       t        |       |S )Nz1Detecting cross environment via dpkg-reconfigure.z6Detecting cross environment via environment variables.)r   r   r   r   r   r   r   )r   rc   s     r   detect_cross_envr   P  sL    AB'0FG-/E7+ '"5)Lr   c                    || j                   v ry |D ][  }t        j                  |      }|st        |      \  }}|g| j                   |<   |r|| j                  |<   |r|| j
                  |<    y  y r&   )r   shutilwhichr   r)   r*   )rc   r   	exe_namesexe_namelookup	compflags	linkflagss          r   add_compiler_if_missingr  \  sz    5??" 
h'@J	9%+H!+4Ex((1EOOH%
r   c                |    t        j                         D ]%  \  }}|t        j                  vrt	        | ||       ' y r&   )compiler_namesr   r   r   r  )rc   r   exess      r   detect_missing_native_compilersr	  k  s;    (..0 7$9999x67r   c                    t        t        j                  j                               D ]9  }|| j                  v rt        j                  |      }|s*|g| j                  |<   ; y r&   )r   r   r   r   r'   r   r   )rc   toolnamer   s      r   detect_missing_native_binariesr  r  sU    955::<= -u~~%ll8$(+uENN8$-r   c                    t               }|rt        j                  d       d}nt        j                  d       d}t        |      }t	        |       t        ||       t        |       t        ||       |S )Nz%Using FOR_BUILD envvars for detectionr
   z$Using regular envvars for detection.r   )r   r   logr   r	  r   r  r   )r   use_for_buildesuffixrc   s       r   detect_native_envr  {  sc    !OM8978)'2E#E* 0"5)"5'2Lr   c                b   | j                   r!| j                  rt        j                  d       | j                   s!| j                  st        j                  d       t	        j
                  d       | j                   }|rt        |       }d}nt        |       }d}t        || j                  |       y )Nz:You can only specify either --cross or --native, not both.z%You must specify --cross or --native.z9This functionality is experimental and subject to change.TF)
crossnativer   r   r   noticer   r  r   r   )r   detect_crossrc   r   s       r   runr    s    }}MN==89KKKL==L ) !'*!ugoo/@Ar   )r4   bool)r!   z'argparse.ArgumentParser'r4   r5   )rB   rO   r4   T.List[str])rQ   zT.TextIOrR   rO   rS   zT.Union[str, T.List[str]]r4   r5   )rc   r$   r4   r5   )rc   r$   r   zT.Dict[str, str]r4   r5   )
rc   r$   r   zT.List[T.Tuple[str, str]]r   rO   r   rO   r4   r5   )r   T.Anyr4   r$   )rc   r$   r   rO   r   r  r4   r5   )r   )r   rO   r   rO   r4   z!T.Tuple[T.List[str], T.List[str]])r   rO   r4   r$   )rc   r$   r   rO   r4   r5   )rc   r$   r   r  r4   r5   )rc   r$   r   rO   r   r  r4   r5   )r   r  r4   r5   ))
__future__r   r   r   r   r   ra   typingTr   r   r   r   compilers.detectr   r  TYPE_CHECKINGargparser   r"   r$   rE   rU   rr   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r9   r   r   <module>r!     s    # " "     ! 9??I0, ,68	!5H   _9v-'^/$:+#
7-Br   