o
    uJAf?                     @  st  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dUd
dZdVddZG dd dZdWddZdXddZdYd d!Zd"d#d$d%Zd&d"d$d'ZdZd*d+Zd[d0d1Zd\d4d5Zd]d8d9Zd^d_d>d?Zd^d`d@dAZd^dadBdCZ d^dadDdEZ!dbdFdGZ"d\dHdIZ#dcdKdLZ$dYdMdNZ%dYdOdPZ&d\dQdRZ'dddSdTZ(dS )e    )annotationsN   )	envconfig)mlog)	compilers)defaultsreturnboolc                  C  s*   t j D ]} tj| d r dS qdS )N
_FOR_BUILDTF)r   ENV_VAR_COMPILER_MAPvaluesosenvironget)Zcenv r   A/usr/lib/python3.10/site-packages/mesonbuild/scripts/env2mfile.pyhas_for_build   s
   r   parser'argparse.ArgumentParser'Nonec                 C  s   | j dd dd | j dddd | j ddd	d
d | j ddddd | j ddddd | j dd dd | j dd dd | j dd dd | j dd dd | j dd dd | j ddddgd d! d S )"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)r   r   r   r   add_arguments$   sB   



r"   c                   @  s   e Zd ZdddZdS )MachineInfor   r   c                 C  sL   i | _ i | _i | _i | _i | _i | _d | _d | _d | _d | _	d | _
d | _d S N)r   binaries
propertiescompile_args	link_argscmakesystem	subsystemkernelcpu
cpu_familyendian)selfr   r   r   __init__=   s   
zMachineInfo.__init__N)r   r   )__name__
__module____qualname__r1   r   r   r   r   r#   <   s    r#   programstrT.List[str]c                 C  sR   t j| r	| gS t  D ]}t j|| }t |t jr"|g  S qtd|  )Nz%s not found on $PATH)r   pathisabsget_exec_pathjoinaccessX_OK
ValueError)r5   dfr   r   r   locate_pathW   s   
rA   ofileT.TextIOnameargsT.Union[str, T.List[str]]c                 C  sb   t |dkrd S t|tr|d | d }n|d }|ddd |D 7 }|d7 }| | d S )	Nr   z= ''
z = [z, c                 s  s    | ]	}d | d  V  qdS )'Nr   ).0ir   r   r   	<genexpr>g   s    z"write_args_line.<locals>.<genexpr>z]
)len
isinstancer6   r;   write)rB   rD   rE   Zostrr   r   r   write_args_line`   s   
rO   infosc                 C  s0  t tjdd}t tjdd}t tjdd}t tjdd}t tjdd}t tjdd}|| }|| }|| }	|| }
|| }|| }|| }|| }|rc|| jd< |	rj|	| jd< |rq|| jd	< |
rx|
| jd	< |r|| jd
< |r|| jd
< |r|| jd< |r|| jd< d S d S )NCPPFLAGSr   CFLAGSCXXFLAGS	OBJCFLAGSOBJCXXFLAGSLDFLAGSccppobjcobjcpp)shlexsplitr   r   r   r'   r(   )rP   cppflagsZcflagsZcxxflagsZ	objcflagsZobjcxxflagsldflagsZc_argsZcpp_argsZc_link_argsZcpp_link_argsZ	objc_argsZobjcpp_argsZobjc_link_argsZobjcpp_link_argsr   r   r   get_args_from_envvarsk   s>   






r_   mips64x86ppc64)mips64eli686powerpc64leZarm7hlf)Zarmhfrc   re   dataT.Dict[str, str]c                 C  s   dddd}dddd}| j d	 | jd
< z
| j d | jd< W n	 ty'   Y nw ||d  | jd< ||d |d | jd< d S )NLinuxZkFreeBSDGNU)linuxZkfreebsdZhurdZarmv7lr`   Zppc64le)armrc   re   rW   ZCMAKE_C_COMPILERrX   ZCMAKE_CXX_COMPILERDEB_HOST_ARCH_OSZCMAKE_SYSTEM_NAMEDEB_HOST_GNU_CPUZCMAKE_SYSTEM_PROCESSOR)r   r)   KeyErrorr   )rP   rf   Zsystem_name_mapZsystem_processor_mapr   r   r   deb_detect_cmake   s   
ro   compilerstemsT.List[T.Tuple[str, str]]	host_arch	gccsuffixc              	   C  sL   |D ]!\}}| d| | }zt |}|| j|< W q ty#   Y qw d S )N-)rA   r   r>   )rP   rp   rr   rs   langnamestemZcompilernamepr   r   r   deb_compiler_lookup   s   rx   optionsT.Anyc                 C  s  | j dkr	dg}ndd| j  g}tj|dtjd}i }|dD ]}| }|dkr+q |dd	\}}|||< q |d
 }|d }|}	d}
t|d |d }t|d |d }|d }g d}t	 }t
|||| j t|jdkrvtd td| |jd< td| |jd< td| |jd< td| |jd< ztd|jd< t|| W n	 ty   Y nw ztd| |jd< W n	 ty   Y nw z	td|jd< W n	 ty   Y nw ||_|	|_|
|_||_||_||_t| |S )Nautozdpkg-architecturez-aT)universal_newlinesstderr
r   =   ZDEB_HOST_GNU_TYPErl   rj   rm   ZDEB_HOST_ARCHZDEB_HOST_ARCH_ENDIAN))rW   gcc)rX   zg++)rY   Zgobjc)rZ   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DEVNULLr\   r   deb_cpu_family_mapr   deb_cpu_mapr#   rx   rs   rL   r   printrA   r%   ro   r>   r*   r+   r,   r.   r-   r/   r_   )ry   cmdoutputrf   linekvrr   Zhost_osZhost_subsystemZhost_kernelZhost_cpu_familyZhost_cpuZhost_endianrp   rP   r   r   r   detect_cross_debianlike   sr   



r   	ofilenamewrite_system_infoc                 C  sH  |d }t |ddd}|d |d t| j D ]}| j| }t||| q|d |d t| j D ]}| j| }t||| q=|d |d	 tt| j	 
t| j }	|	  |	D ]"}
|
| j	v r~t||
d
 | j	|
  |
| jv rt||
d | j|
  ql| j D ]
\}}t||| q|d | jr|d | j D ]
\}}t||| q|d |r|d |d| j d |d| j d |d| j d |d| j d | jr|d| j d | jr|d| j d W d    n	1 sw   Y  t|| d S )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 = ')openrN   sortedr   keysrO   r%   listsetr'   unionr(   sortr&   itemsr)   r-   r.   r/   r*   r+   r,   r   replace)rP   r   r   ZtmpfilenamerB   ru   compilerexenameexe	all_langslangr   r   r   r   r   write_machine_file   sV   







"





+r   r   ru   envvar_suffix!T.Tuple[T.List[str], T.List[str]]c                 C  s   t ttjd| d}g }| tjv r$ttjtj|  | d}| tjv r>t ttjd| d}t	|| }n|}t	|| }||fS )NrV   r   rQ   )
tupler[   r\   r   r   r   r   CFLAGS_MAPPINGLANGUAGES_USING_CPPFLAGSr   )ru   r   r^   r'   r]   lang_compile_argslang_link_argsr   r   r   !detect_language_args_from_envvars  s   

r   c                 C  s   t  }tj D ]8\}}tj||  }|sqtj|r!|g}nt	
|}||j|< t|| \}}|r9||j|< |r@||j|< q|S r$   )r#   r   r   r   r   r   r   r8   existsr[   r\   r   r   r'   r(   )r   rP   ru   Z
envvarnameZcompilerstrr   r   r   r   r   r   detect_compilers_from_envvars'  s    



r   c                 C  s@   t j D ]\}}|| }tj|}|rt|| j|< qd S r$   )	r   ENV_VAR_TOOL_MAPr   r   r   r   r[   r\   r%   )rP   r   ZbinnameZenvvar_baseZenvvarZbinstrr   r   r   detect_binaries_from_envvars9  s   r   c                 C  sL   t jd| }|d ur|| jd< t jd| }|d ur$|| jd< d S d S )NZPKG_CONFIG_LIBDIRpkg_config_libdirZPKG_CONFIG_SYSROOT_DIRsys_root)r   r   r   r&   )rP   r   varr   r   r   detect_properties_from_envvars@  s   
r   c              
   C  sR   dD ]$}t ||}|s td| d|dd d td t| || qd S )N)r*   r+   r,   r-   r.   r/   zCross property "z" missing, set it with --_rt   .r   )getattrr   errorr   sysexitsetattr)rP   ry   optnamer   r   r   r   detect_cross_systemH  s   
 
r   c                 C  sD   | 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   )ry   rP   r   r   r   detect_cross_envP  s   

r   	exe_namesc                 C  sd   || j v rd S |D ]&}t|}|sq	t|\}}|g| j |< |r&|| j|< |r-|| j|<  d S d S r$   )r   shutilwhichr   r'   r(   )rP   ru   r   exe_namelookupZ	compflagsZ	linkflagsr   r   r   add_compiler_if_missing\  s   



r   c                 C  s.   t  D ]\}}|tjvrqt| || qd S r$   )compiler_namesr   r   r   r   )rP   ru   Zexesr   r   r   detect_missing_native_compilersk  s
   
r   c                 C  s>   t tj D ]}|| jv rqt|}|r|g| j|< qd S r$   )r   r   r   r   r%   r   r   )rP   Ztoolnamer   r   r   r   detect_missing_native_binariesr  s   

r   c                 C  sX   t  }|rtd d}nt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   )ry   Zuse_for_buildZesuffixrP   r   r   r   detect_native_env{  s   



r   c                 C  sl   | j r| jrtd | j s| jstd td | j }|r't| }d}nt| }d}t|| j	| d S )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   )ry   Zdetect_crossrP   r   r   r   r   run  s   


r   )r   r	   )r   r   r   r   )r5   r6   r   r7   )rB   rC   rD   r6   rE   rF   r   r   )rP   r#   r   r   )rP   r#   rf   rg   r   r   )
rP   r#   rp   rq   rr   r6   rs   r6   r   r   )ry   rz   r   r#   )rP   r#   r   r6   r   r	   r   r   )r   )ru   r6   r   r6   r   r   )r   r6   r   r#   )rP   r#   r   r6   r   r   )rP   r#   ry   rz   r   r   )rP   r#   ru   r6   r   r7   r   r   )ry   rz   r   r   ))
__future__r   r   r   r   r   r[   typingTr   r   r   r   Zcompilers.detectr   r   TYPE_CHECKINGargparser   r"   r#   rA   rO   r_   r   r   ro   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sN    



	
$


	
;/





	