
    es'                        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(                  rddlmZ ddlmZ ddlmZ ddlmZ  G d de      Z G d d      Zy	)    )annotations)Path   )CMakeTraceParser   )CMakeSkipCompilerTest)language_mapcmake_get_generator_args)mlogN)Enum)dedent)CMakeExecutor)Environment)Compiler)MachineChoicec                      e Zd ZdZdZy)CMakeExecScope
subproject
dependencyN)__name__
__module____qualname__
SUBPROJECT
DEPENDENCY     </usr/lib/python3/dist-packages/mesonbuild/cmake/toolchain.pyr   r   !   s    JJr   r   c                  j    e Zd ZdddZddZddZedd       ZddZddZ	ddZ
edd	       Zdd
Zy)CMakeToolchainNc                R   || _         || _        || _        || _        || _        || _        | j
                  j                         | _        |dz  | _        |dz  | _        | j                   j                  | j                     | _
        | j                   j                  | j                     | _        | j                   j                  j                  | j                     | _        | j                   j                  | j                     | _        | j                   j                  j                  | j                     | _        | j#                         | _        | j$                  j'                  | j                  j)                                | j                  j+                         }|t,        j.                  k(  | _        |t,        j2                  k(  r$| j                  t4        j6                  k(  rd| _        | j                  j9                         sd| _        | j                  j;                         sJ y )NzCMakeMesonToolchainFile.cmakezCMakeCache.txtTF)envcmakebinfor_machine
exec_scopepreload_file	build_dir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%   skip_statuss           r   __init__zCMakeToolchain.__init__&   s    &$("//1'*II%(88XX&&t'7'78
((--d.>.>?**44T5E5EF++D,<,<=((++778H8HI**,dnn::<= ooBBD%)>)E)EE/888T__P^PiPi=i"DO113#DO""..000r   c                   | j                   j                  j                         s&| j                   j                  j                  d       | j                   j	                  | j                         d       | j                  j	                  | j                         d       t        j                  | j                   j                                | j                   S )NT)parentsutf-8encoding)r(   parentexistsmkdir
write_textgenerater)   generate_cacher   cmd_ci_includeas_posix)r<   s    r   writezCMakeToolchain.writeC   s    ""))002&&,,T,:&&t}}&I$$T%8%8%:W$MD//88:;"""r   c                    d| j                   j                         z   g}| j                  !|d| j                  j                         z   gz  }|S )N-DCMAKE_TOOLCHAIN_FILE=z-DMESON_PRELOAD_FILE=)r(   rK   r%   )r<   argss     r   get_cmake_argszCMakeToolchain.get_cmake_argsK   sQ    )D,?,?,H,H,JJK(,t/@/@/I/I/KKLLDr   c                t    d}| j                         D ]"  \  }}|d|z   z  }|D ]  }|d| dz  } |dz  }$ |S )N zset(z ""z)
)items)varsreskeyvalueis        r   _print_varszCMakeToolchain._print_varsQ   s_    **, 	JC6C<C !A3ay !5LC		
 
r   c                Z   t        d      }| j                  j                         D ]2  \  }}|D cg c]  }|j                  dd       c}| j                  |<   4 | j                  rP| j                          |dz  }| j                  D ]'  \  }}|d| dz  }|| j                  |      z  }|dz  }) |dz  }|dz  }|| j                  | j                        z  }|dz  }| j                  j                         }|+|t        dj                  |j                                     z  }|S c c}w )	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()

        \/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   replacer8   update_cmake_compiler_stater1   rZ   r,   get_cmake_toolchain_fileformatrK   )r<   rV   rW   rX   xlangrU   	user_files           r   rH   zCMakeToolchain.generate[   sN       ....0 	HJCAF"GA199T3#7"GDNN3	H ??,,.77C"oo 
d5dV2>>t''--t 4KC 	))t//t OO<<>	 6  y))+,	. .C 
5 #Hs   D(c           	         | j                   syd}| j                  j                  j                         D ]6  \  }}|| d|j                   ddj                  |j                         dz  }8 |S )NrR   :=;r^   )r8   r1   r0   rT   typejoinrX   )r<   rV   namevs       r   rI   zCMakeToolchain.generate_cache   sk    2288: 	<GD!dV1QVVHAchhqww&7%8;;C	<
r   c                   i }| j                   j                         s|S dddddd}| j                  j                  | j                        rX|j                  | j                  j                  | j                  j                        g|d<   | j                  j                  g|d	<   | j                  j                  rd
ndg|d<   | j                   j                         }|r|g|d<   dd}| j                  j                         D ]  \  }}dj                  t        j
                  ||j                                     }|j!                         }|sLt#        |      dk\  r,| j%                  ||d         s ||d         g||dz   <   |dd  } ||d         |d<   |||dz   <   |j'                         dk(  s|j)                         |d<    |S )NAndroidLinuxWindowsFreeBSDDarwin)androidlinuxwindowsfreebsddarwin)when_building_forCMAKE_SYSTEM_NAMECMAKE_SYSTEM_PROCESSOR84CMAKE_SIZEOF_VOID_PCMAKE_SYSROOTc                n    t        |       j                         r| S t        j                  |       }|| S |S N)r   r;   shutilwhich)exeps     r   make_absz-CMakeToolchain.get_defaults.<locals>.make_abs   s4    Cy$$&
S!Ay
Hr   z	CMAKE_{}_r   r   r   COMPILER_LAUNCHERCOMPILERzclang-clCMAKE_LINKER)r   strreturnr   )r,   r:   r!   is_cross_buildr#   getr+   system
cpu_family	is_64_bitget_sys_rootr.   rT   rb   r	   upperget_exelistlenis_cmdline_optionget_idget_linker_exelist)	r<   defaults
SYSTEM_MAPsys_rootr   rd   comp_objprefixexe_lists	            r   r2   zCMakeToolchain.get_defaults   s   -/ 113O !  (

 88""T5E5E"F-7^^DJJ<M<MtzzO`O`-a,bH()26**2G2G1HH-.26**2F2F3C*P&'??//1)1
H_%	 #nn224 	IND( ''(8(8tzz|(LMF++-H8}!$*@*@8TU;*W:B8A;:O9P"556#AB<"8A;/HQK,4HVj() J.+3+F+F+H(	I  r   c                l    | j                         dk(  r|j                  d      S |j                  d      S )Nmsvcr]   -)get_argument_syntax
startswith)compilerargs     r   r   z CMakeToolchain.is_cmdline_option   s1    '')V3>>#&&>>#&&r   c                   | j                   j                  j                  | j                  j	                               ry t        j                  d       t        | j                  j	                               }|D cg c]&  }t        j                  ||j                               ( }}t        ddj                  |       d      }t        | j                  j                        dz  }|j!                  dd       |dz  }|j#                  |d	
       |dz  }|j#                  t$        j'                  | j(                        d	
       t+        | j,                  j/                         || j                        }| j,                  j1                  d|j3                                g }	|	|j5                         z  }	|	t7        | j                        z  }	|	d|j9                          dgz  }	| j,                  j;                  |	|d      \  }
}}|
dk7  rt        j<                  d       y |j?                  |       i |j@                  | j                   _!        |jD                  jG                         D ci c]  \  }}|jH                  | }}}|D ]d  }t        j                  ||j                               }d| d}|jK                  |i       }dg|d| d<   | j                   jM                  ||       f y c c}w c c}}w )NzBCMake Toolchain: Calling CMake once to generate the compiler statezN
            cmake_minimum_required(VERSION 3.7)
            project(CompInfo  z
)
        __CMake_compiler_info__T)r@   exist_okzCMakeLists.txtrA   rB   z!CMakeMesonTempToolchainFile.cmakeF)print_cmoutalways_capture_stderrrN   .)r&   disable_cacher   z:CMake Toolchain: Failed to determine CMake compilers stateCMakezCompiler.cmake1CMAKE__COMPILER_FORCED)'r1   	languages
issupersetr.   keysr   debuglistr	   r   r   r   rk   r   r!   scratch_dirrF   rG   r   rZ   r3   r   r"   versionset_exec_moderequires_stderr
trace_argsr
   rK   callwarningparsecacher0   vars_by_filerT   rl   
setdefaultr4   )r<   r   rc   lang_idscmake_contentr&   
cmake_filetemp_toolchain_filetrace
cmake_argsrc_	raw_tracekrm   r   rd   
lang_cmake	file_namerU   s                       r   r`   z*CMakeToolchain.update_cmake_compiler_state   s   ??$$//0C0C0EF 	

WX,,./	<EFqL$$Q	2FF $!hhx01 2	  
 --.1JJ	t4!11
mg> (*MM&&~'A'A$..'Q\c&d !!6!6!8)TXXN##UMbMbMd#e
e&&((
.txx88
01D1M1M1O0PQSVWW
==--jI]a-bAy7LLUV 	I&5o#050B0B0H0H0JKfq!	KK 	/D%))$

=J
|>:I**9b9D;>%D6*%567OO""4.	/E G@ Ls   ;+K3/K8r   )r"   z'CMakeExecutor'r!   z'Environment'r#   r   r$   r   r&   r   r%   zT.Optional[Path]r   None)r   r   )r   zT.List[str])rU   T.Dict[str, T.List[str]]r   r   )r   r   )r   r   )r   z
'Compiler'r   r   r   bool)r   r   )r   r   r   r>   rL   rP   staticmethodrZ   rH   rI   r2   r   r`   r   r   r   r   r   %   sO    1:#  ,\8t ' '//r   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   <module>r      sP    #  ) - :     ??')$(T ]/ ]/r   