o
    ld:                     @  sh  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dSd
dZdTddZG dd dZdUddZdVddZdWd d!Zd"d#d$d%Zd&d"d$d'ZdXd*d+ZdYd0d1ZdZd4d5Zd[d8d9Zd\d]d>d?Zd\d^d@dAZd\d_dBdCZ d`dDdEZ!dZdFdGZ"dadIdJZ#dWdKdLZ$dWdMdNZ%dZdOdPZ&dbdQdRZ'dS )c    )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   {home/ych/rk3568/buildroot/output/rockchip_rk3568_recovery/host/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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--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"   s6   



r"   c                   @  s   e Zd ZdddZdS )MachineInfor   r   c                 C  s@   i | _ i | _i | _i | _i | _i | _d | _d | _d | _d | _	d S N)
r   binaries
propertiescompile_args	link_argscmakesystemcpu
cpu_familyendian)selfr   r   r   __init__7   s   
zMachineInfo.__init__N)r   r   )__name__
__module____qualname__r/   r   r   r   r   r#   6   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)r3   dfr   r   r   locate_pathO   s   
r?   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>_   s    z"write_args_line.<locals>.<genexpr>z]
)len
isinstancer4   r9   write)r@   rB   rC   Zostrr   r   r   write_args_lineX   s   
rM   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   CFLAGSZCXXFLAGSZ	OBJCFLAGSZOBJCXXFLAGSLDFLAGSccppobjcobjcpp)shlexsplitr   r   r   r'   r(   )rN   cppflags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_envvarsc   s>   






r[   mips64x86ppc64)mips64eli686powerpc64leZarm7hlf)Zarmhfr_   ra   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kFreeBSDZGNU)linuxZkfreebsdZhurdarmv7lr\   ppc64le)armr_   ra   rR   ZCMAKE_C_COMPILERrS   ZCMAKE_CXX_COMPILERDEB_HOST_ARCH_OSZCMAKE_SYSTEM_NAMEDEB_HOST_GNU_CPUZCMAKE_SYSTEM_PROCESSOR)r   r)   KeyErrorr   )rN   rb   Zsystem_name_mapZsystem_processor_mapr   r   r   deb_detect_cmake   s   
rl   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-)r?   r   r<   )rN   rm   ro   rp   langnamestemZcompilernamepr   r   r   deb_compiler_lookup   s   ru   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 }t|d |d }	t|d |d }
|d }g d}t	 }t
|||| j t|jdkrrt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_TYPEri   rj   ZDEB_HOST_ARCHZDEB_HOST_ARCH_ENDIAN))rR   Zgcc)rS   zg++)rT   Zgobjc)rU   zgobjc++r   z$Warning: no compilers were detected.z%s-ararz%s-stripstripz
%s-objcopyZobjcopyz%s-ldldr)   z%s-pkg-configZ	pkgconfigzcups-config)debarch
subprocesscheck_outputDEVNULLrW   r   deb_cpu_family_mapr   deb_cpu_mapr#   ru   rp   rJ   r   printr?   r%   rl   r<   r*   r,   r+   r-   r[   )rv   cmdoutputrb   linekvro   Zhost_osZhost_cpu_familyZhost_cpuZhost_endianrm   rN   r   r   r   detect_cross_debianlike   sj   



r   	ofilenamewrite_system_infoc                 C  s  |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|
  qk| 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 W d    n1 sw   Y  t|| d S )N~wzutf-8)encodingz[binaries]
z# Compilers
r{   z# Other binaries
z[properties]
_argsZ
_link_argsz	[cmake]

z[host_machine]
zcpu = 'rE   zcpu_family = 'z
endian = 'z
system = ')openrL   sortedr   keysrM   r%   listsetr'   unionr(   sortr&   itemsr)   r+   r,   r-   r*   r   replace)rN   r   r   Ztmpfilenamer@   rr   compilerZexenameexeZ	all_langslangr   r   r   r   r   write_machine_file   sN   







"





&r   r   rr   envvar_suffix!T.Tuple[T.List[str], T.List[str]]c                 C  s   t ttjd| d}ttjtj|  | d}| tjv r7t ttjd| d}t	|| }n|}t	|| }||fS )NrQ   r   rO   )
tuplerV   rW   r   r   r   r   ZCFLAGS_MAPPINGZLANGUAGES_USING_CPPFLAGSr   )rr   r   rZ   r'   rX   lang_compile_argslang_link_argsr   r   r   !detect_language_args_from_envvars	  s   
r   c                 C  sr   t  }tj D ].\}}tj||  }|sqt|}||j	|< t
|| \}}|r/||j|< |r6||j|< q|S r$   )r#   r   r   r   r   r   r   rV   rW   r   r   r'   r(   )r   rN   rr   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   rV   rW   r%   )rN   r   ZbinnameZenvvar_baseZenvvarZbinstrr   r   r   detect_binaries_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-   zCross property "z" missing, set it with --_rq   .r}   )getattrr   errorr   sysexitsetattr)rN   rv   optnamer   r   r   r   detect_cross_system*  s   
 
r   c                 C  s6   | j rtd t| }|S td t }t||  |S )Nz1Detecting cross environment via dpkg-reconfigure.z6Detecting cross environment via environment variables.)r   r   r   r   r   )rv   rN   r   r   r   detect_cross_env2  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(   )rN   rr   r   Z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   )rN   rr   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   )rN   Ztoolnamer   r   r   r   detect_missing_native_binariesR  s   

r   c                 C  sN   t  }|rtd d}ntd d}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   )rv   Zuse_for_buildZesuffixrN   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)
ZcrossZnativer   r   r   Znoticer   r   r   r   )rv   Zdetect_crossrN   r   r   r   r   runi  s   


r   )r   r	   )r   r   r   r   )r3   r4   r   r5   )r@   rA   rB   r4   rC   rD   r   r   )rN   r#   r   r   )rN   r#   rb   rc   r   r   )
rN   r#   rm   rn   ro   r4   rp   r4   r   r   )rv   rw   r   r#   )rN   r#   r   r4   r   r	   r   r   )r   )rr   r4   r   r4   r   r   )r   r4   r   r#   )rN   r#   r   r4   r   r   )rN   r#   rv   rw   r   r   )rN   r#   rr   r4   r   r5   r   r   )rv   rw   r   r   )(
__future__r   r   r   r   r   rV   typingTr   r   r   r   Zcompilers.detectr   r   TYPE_CHECKINGargparser   r"   r#   r?   rM   r[   r   r   rl   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sL    



	
$


	
7*






	