o
    uJAfs'                     @  s   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
 ddlmZ d d	lZd d	lZd d
lmZ d dlmZ ejrUddlmZ ddlmZ ddlmZ ddlmZ G dd deZG dd dZd	S )    )annotations)Path   )CMakeTraceParser   )CMakeSkipCompilerTest)language_mapcmake_get_generator_args)mlogN)Enum)dedent)CMakeExecutor)Environment)Compiler)MachineChoicec                   @  s   e Zd ZdZdZdS )CMakeExecScope
subproject
dependencyN)__name__
__module____qualname__
SUBPROJECT
DEPENDENCY r   r   ?/usr/lib/python3.10/site-packages/mesonbuild/cmake/toolchain.pyr   !   s    r   c                   @  sp   e Zd Zd*d+ddZd,ddZd-ddZed.ddZd/ddZd/ddZ	d0d d!Z
ed1d&d'Zd2d(d)ZdS )3CMakeToolchainNcmakebin'CMakeExecutor'env'Environment'for_machiner   
exec_scoper   	build_dirr   preload_fileT.Optional[Path]returnNonec                 C  s  || _ || _|| _|| _|| _|| _| j | _|d | _|d | _| j j	| j | _
| j j| j | _| j jj| j | _| j j| j | _| j jj| j | _|  | _| j| j  | j }|tjk| _|tjkrs| jtjkrsd| _| j s{d| _| j sJ d S )NzCMakeMesonToolchainFile.cmakezCMakeCache.txtTF)r   r   r    r!   r#   r"   resolvetoolchain_filecmcache_filemachinesminfo
propertiescoredata	compilers	cmakevarscmake_cache
cmakestateget_defaults	variablesupdateget_variablesget_cmake_skip_compiler_testr   ALWAYS
skip_checkDEP_ONLYr   r   get_cmake_defaultsis_absolute)selfr   r   r    r!   r"   r#   Zskip_statusr   r   r   __init__&   s.   




zCMakeToolchain.__init__c                 C  sZ   | j j s| j jjdd | j j|  dd | jj|  dd t	| j 
  | j S )NT)parentsutf-8encoding)r(   parentexistsmkdir
write_textgenerater)   generate_cacher
   cmd_ci_includeas_posix)r<   r   r   r   writeC   s   zCMakeToolchain.writeT.List[str]c                 C  s2   d| j   g}| jd ur|d| j  g7 }|S )N-DCMAKE_TOOLCHAIN_FILE=z-DMESON_PRELOAD_FILE=)r(   rI   r#   )r<   argsr   r   r   get_cmake_argsK   s   
zCMakeToolchain.get_cmake_argsvarsT.Dict[str, T.List[str]]strc                 C  sH   d}|   D ]\}}|d| 7 }|D ]
}|d| d7 }q|d7 }q|S )N zset(z ""z)
)items)rO   reskeyvalueir   r   r   _print_varsQ   s   
zCMakeToolchain._print_varsc                 C  s   t d}| j D ]\}}dd |D | j|< q	| jrB|   |d7 }| jD ]\}}|d| d7 }|| |7 }|d7 }q&|d7 }|d7 }|| | j7 }|d7 }| j }|d urf|t d	|
 7 }|S )	Na              ######################################
            ###  AUTOMATICALLY GENERATED FILE  ###
            ######################################

            # This file was generated from the configuration in the
            # relevant meson machine file. See the meson documentation
            # https://mesonbuild.com/Machine-files.html for more information

            if(DEFINED MESON_PRELOAD_FILE)
                include("${MESON_PRELOAD_FILE}")
            endif()

        c                 S  s   g | ]}| d dqS )\/)replace.0xr   r   r   
<listcomp>m       z+CMakeToolchain.generate.<locals>.<listcomp>z!# CMake compiler state variables
z# -- Variables for language 
z# Variables from meson
zr
                # Load the CMake toolchain file specified by the user
                include("{}")

            )r   r3   rT   r8   update_cmake_compiler_stater1   rY   r,   get_cmake_toolchain_fileformatrI   )r<   rU   rV   rW   langrO   Z	user_filer   r   r   rF   [   s(   


zCMakeToolchain.generatec              	   C  sL   | j sdS d}| jj D ]\}}|| d|j dd|j d7 }q|S )NrR   :=;rb   )r8   r1   r0   rT   typejoinrW   )r<   rU   namevr   r   r   rG      s   &zCMakeToolchain.generate_cachec           	      C  s@  i }| j  s	|S dddddd}| jj| jdr-|| jj| jjg|d< | jjg|d	< | jj	r3d
ndg|d< | j 
 }|rD|g|d< ddd}| j D ]O\}}dt|| }| }|sdqNt|dkr| ||d s||d g||d < |dd  }||d |d< |||d < | dkr| |d< qN|S )NZAndroidLinuxWindowsZFreeBSDDarwin)androidlinuxwindowsfreebsddarwin)when_building_forCMAKE_SYSTEM_NAMECMAKE_SYSTEM_PROCESSOR84ZCMAKE_SIZEOF_VOID_PZCMAKE_SYSROOTexerQ   r%   c                 S  s*   t |  r| S t| }|d u r| S |S N)r   r;   shutilwhich)r{   pr   r   r   make_abs   s   
z-CMakeToolchain.get_defaults.<locals>.make_absz	CMAKE_{}_r   r   r   ZCOMPILER_LAUNCHERCOMPILERzclang-clZCMAKE_LINKER)r{   rQ   r%   rQ   )r,   r:   r   is_cross_buildr    getr+   system
cpu_family	is_64_bitget_sys_rootr.   rT   re   r   upperget_exelistlenis_cmdline_optionget_idget_linker_exelist)	r<   defaultsZ
SYSTEM_MAPsys_rootr   rf   Zcomp_objprefixZexe_listr   r   r   r2      s>   





zCMakeToolchain.get_defaultscompiler
'Compiler'argboolc                 C  s    |   dkr|dS |dS )Nmsvcr[   -)get_argument_syntax
startswith)r   r   r   r   r   r      s   

z CMakeToolchain.is_cmdline_optionc                 C  s  | j j| j rd S td t| j }dd |D }tdd	| d}t
| jjd }|jddd	 |d
 }|j|dd |d }|jt| jdd t| j || j}| jjd| d g }|| 7 }|t| j7 }|d|  dg7 }| jj||dd\}	}
}|	dkrtd d S || i |j| j _dd |j  D }|D ]&}t!"||# }d| d}|$|i }dg|d| d< | j %|| qd S )NzBCMake Toolchain: Calling CMake once to generate the compiler statec                 S  s   g | ]
}t || qS r   )r   r   r   r]   r   r   r   r`      s    z>CMakeToolchain.update_cmake_compiler_state.<locals>.<listcomp>zN
            cmake_minimum_required(VERSION 3.7)
            project(CompInfo  z
)
        Z__CMake_compiler_info__T)r>   exist_okzCMakeLists.txtr?   r@   z!CMakeMesonTempToolchainFile.cmakeF)print_cmoutalways_capture_stderrrL   .)r"   disable_cacher   z:CMake Toolchain: Failed to determine CMake compilers statec                 S  s   i | ]\}}|j |qS r   )rl   )r^   krm   r   r   r   
<dictcomp>   ra   z>CMakeToolchain.update_cmake_compiler_state.<locals>.<dictcomp>CMakezCompiler.cmake1ZCMAKE_Z_COMPILER_FORCED)&r1   	languages
issupersetr.   keysr
   debuglistr   rk   r   r   scratch_dirrD   rE   r   rY   r3   r   r   versionset_exec_moderequires_stderr
trace_argsr	   rI   callwarningparsecacher0   vars_by_filerT   r   r   r   
setdefaultr4   )r<   r   Zlang_idsZcmake_contentr"   
cmake_fileZtemp_toolchain_filetrace
cmake_argsrc_	raw_tracer   rf   Z
lang_cmake	file_namerO   r   r   r   rc      sD   



z*CMakeToolchain.update_cmake_compiler_stater|   )r   r   r   r   r    r   r!   r   r"   r   r#   r$   r%   r&   )r%   r   )r%   rK   )rO   rP   r%   rQ   )r%   rQ   )r%   rP   )r   r   r   rQ   r%   r   )r%   r&   )r   r   r   r=   rJ   rN   staticmethodrY   rF   rG   r2   r   rc   r   r   r   r   r   %   s    


	
.
	:r   )
__future__r   pathlibr   traceparserr   	envconfigr   commonr   r	   rR   r
   r}   typingTenumr   textwrapr   TYPE_CHECKINGexecutorr   environmentr   r.   r   mesonlibr   r   r   r   r   r   r   <module>   s"   