o
    uJAf
M                    @  s6	  U d Z ddlmZ 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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ZddlmZmZmZ ddlmZ ddlmZ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"m#Z# d	d
l$m%Z%m&Z& ej'rddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 G dd de*Z7G dd de*Z8ej9dej:e7e8f dZ;ej:de<f Z=e9dZ>e9dZ?g dZ@eAe<ZBdeCd< ddlDmDZD eEed d!reFed"rejGd#gZHnejGgZHdaId$eCd%< G d&d' d'e%ZJG d(d) d)e%ZKeLd*ZMddd5d*ZNddd7d8ZOddd9d:ZPdd>d?ZQdd@dAZRddDdEZSddHdIZTG dJdK dKe&e
jUdLZVG dMdN dNZWdOZXG dPd de&ZYddVdWZZdd[d\Z[G d]d^ d^ej\Z]G d_d` d`ej^e> Z_G dadb dbe_e> Z`G dcdd dde_ejae>  ZbG dedf dfebejae>  e`ejae>  ZcddgdhZdddidjZeddkdlZfddmdnZgddodpZhddqdrZiddsdtZjddudvZkddwdxZlddydzZmdd{d|Zndd}d~ZodddZpdddZqdddZrdddZsdddZtdddZuedddddZvdddZwdddZxdddZyG dd dZzdddZ{dddZ|dddZ}dddZ~dddZdddZdddZdddZdddZdddZdddZdddZdddZdddZdddZddddǄZej rdZede dʝjZddd̈́ZdddτZnddd̈́ZdddτZdddՄZddd߄Z	ddddZddddZ	ddddZ	ddddZdZdZdddZdd dZdddZddd	d
ZddddZdddZdddZdddZdd#d$Zdejejejfdd+d,Zdejejejfdd-d.Zddd1d2Zdd5d6Zdd:d;ZdÐd<d=ZdĐd@dAZdŐdCdDZdƐdFdGZdǐdIdJZG dKdL dLeZ	M	dȐdɐdSdTZdʐdWdXZG dYdZ dZeje> Zdːd]d^Zdd̐dbdcZdd͐dddeZG dfdg dgej\ZG dhdi diZz	ddjlmZ W n ey-   eZdkeCdl< Y nw G dmdn dneZeZG dodp dpejZ	ddΐdtduZdϐdxdyZdАd|d}ZG d~d dej\Zh dZdѐddZeG dd dZĐddҐddZŐdӐddZdS (  z)A library of random helper functionality.    )annotations)PathN)	lru_cachewrapstotal_orderingtee)TemporaryDirectoryNamedTemporaryFile)mlog   )MesonExceptionHoldableObject)LiteralProtocol   )ImmutableListProtocol)ConfigurationData)StrOrBytesPath)Environment)Compiler)
SubProjectc                   @     e Zd ZU ded< dS )_EnvPickleLoadabler   environmentN__name__
__module____qualname____annotations__ r    r    ?/usr/lib/python3.10/site-packages/mesonbuild/utils/universal.pyr   1      
 r   c                   @  r   )_VerPickleLoadablestrversionNr   r    r    r    r!   r#   5   r"   r#   _PL)boundFile_T_U)eGITpython_commandproject_meson_versionsSecondLevelHolderr(   FileModeGitExceptionLibTypeMachineChoiceEnvironmentExceptionFileOrStringr0   	OptionKeydump_conf_header
OptionType
OrderedSet
PerMachinePerMachineDefaultablePerThreeMachinePerThreeMachineDefaultableProgressBarRealPathActionTemporaryDirectoryWinProofVersioncheck_direntry_issuesclassify_unity_sourcescurrent_vs_supports_modulesdarwin_get_object_archsdefault_libdirdefault_libexecdirdefault_prefixdefault_datadirdefault_includedirdefault_infodirdefault_localedirdefault_mandirdefault_sbindirdefault_sysconfdirdetect_subprojects
detect_vcsdo_conf_filedo_conf_strdo_replacement
exe_existsexpand_argumentsextract_as_listfirstgenerate_listget_compiler_for_sourceget_filenames_templates_dictget_variable_regexget_wine_shortpathgithas_path_sepis_aix
is_androidis_ascii_string	is_cygwinis_debianlikeis_dragonflybsd
is_freebsdis_haikuis_hurdis_irixis_linux	is_netbsd
is_openbsdis_osxis_qnxis_sunos
is_windowsis_wsliter_regexin_iter	join_argslistify	partitionpath_is_in_rootpickle_load
Popen_safePopen_safe_logged	quiet_git	quote_argrelative_to_if_possiblerelpathreplace_if_differentrun_onceget_meson_commandset_meson_command
split_argsstringlistifysubstitute_valuessubstring_is_in_listtypeslistifyverbose_gitversion_compare"version_compare_condition_with_minversion_compare_manysearch_versionwindows_detect_native_archwindows_proof_rmwindows_proof_rmtreezT.DefaultDict[str, str]r-   )globfrozenFZ_MEIPASS	runpython(T.Optional['ImmutableListProtocol[str]']_meson_commandc                   @  s   e Zd ZdZdS )r3   zEExceptions thrown while processing and creating the build environmentN)r   r   r   __doc__r    r    r    r!   r3      s    r3   c                      s    e Zd Zdd	 fddZ  ZS )
r0   Nmsgr$   outputT.Optional[str]c                   s(   t  | |r| | _d S d| _d S N )super__init__stripr   )selfr   r   	__class__r    r!   r      s   zGitException.__init__N)r   r$   r   r   r   r   r   r   __classcell__r    r    r   r!   r0      s    r0   r]   cmdT.List[str]
workingdirr   checkboolkwargsT.Anyreturn(T.Tuple[subprocess.Popen[str], str, str]c                 K  s^   t d usJ dt g| } t| fd|i|\}}}|r*|jdkr*tdt|  ||||fS )Nz"Callers should make sure it existscwdr   zGit command failed: )r+   rw   
returncoder0   r$   )r   r   r   r   poer    r    r!   r]      s   

T.Tuple[bool, str]c                 C  sH   t sd}|r
t|d|fS t| ||\}}}|jdkr d|fS d|fS )NGit program not found.Fr   Tr+   r0   r]   r   )r   r   r   mr   r   r   r    r    r!   ry      s   
ry   c                 C  s:   t sd}|r
t|dS t| ||d d d\}}}|jdkS )Nr   Fstdoutstderrr   r   )r   r   r   r   r   _r    r    r!   r      s   
r   mainfiler$   Nonec                 C  sb   |  ds	| gantj| r|  drtddg ant| g adtjv r/tdt d S d S )Nz.pyzmesonmain.pyz-mzmesonbuild.mesonmainZMESON_COMMAND_TESTSzmeson_command is )	endswithr   ospathisabsr,   environr   log)r   r    r    r!   r      s   


r   c                   C  s   t S r   )r   r    r    r    r!   r         r   astringT.Union[str, bytes]c                 C  sP   zt | tr| d W dS t | tr| d W dS W dS  ty'   Y dS w )NasciiFT)
isinstancer$   encodebytesdecodeUnicodeDecodeError)r   r    r    r!   ra      s   

ra   direntry_array4T.Union[T.Iterable[T.Union[str, bytes]], str, bytes]c              
   C  st   dd l }| }| dkr4t s6t| ttfr| g} | D ]}t|r$qt	t
d|d|d qd S d S d S )Nr   UTF-8z
                You are using zr which is not a Unicode-compatible
                locale but you are trying to access a file system entry called zS which is
                not pure ASCII. This may cause problems.
                )localegetpreferredencodingupperro   r   r$   r   ra   r   warningtextwrapdedent)r   r   r   der    r    r!   rA      s   
rA   c                   @  s    e Zd ZdZejdddZdS )r.   z A second level object holder. The primary purpose
        of such objects is to hold multiple objects with one
        default option. r   r   c                 C  s   d S r   r    r   r    r    r!   get_default_object  r   z$SecondLevelHolder.get_default_objectN)r   r   )r   r   r   r   abcabstractmethodr   r    r    r    r!   r.     s    r.   )	metaclassc                   @  s>   e Zd ZedZ		dddd	ZdddZedddZ	dS )r/   z*[r-][w-][xsS-][r-][w-][xsS-][r-][w-][xtT-]Npermsr   ownerT.Union[str, int, None]groupc                 C  s"   || _ | || _|| _|| _d S r   )perms_sperms_s_to_bitsr   r   r   )r   r   r   r   r    r    r!   r   5  s   
zFileMode.__init__r   r$   c                 C  s   d}| | j| j| jS )Nz!<FileMode: {!r} owner={} group={})formatr   r   r   r   retr    r    r!   __repr__<  s   zFileMode.__repr__r   intc                 C  s  |du rdS d}t |tstd|t|dks | j|s*td|d|d}|d d	kr7|tjO }|d
 dkrB|tjO }|d dkrN|tj	O }n|d dkrZ|tj
O }n|d dkrj|tj	O }|tj
O }|d d	kru|tjO }|d dkr|tjO }|d dkr|tjO }n|d dkr|tjO }n|d dkr|tjO }|tjO }|d d	kr|tjO }|d dkr|tjO }|d dkr|tjO }|S |d dkr|tjO }|S |d dkr|tjO }|tjO }|S )z
        Does the opposite of stat.filemode(), converts strings of the form
        'rwxr-xr-x' to st_mode enums which can be passed to os.chmod()
        Nz	rwxr-xr-xz-Install perms must be a string. For example, 	   zFile perms z' must be exactly 9 chars. For example, r   rr   wr   xSs                  Tt)r   r$   r   lensymbolic_perms_regexmatchstatS_IRUSRS_IWUSRS_IXUSRS_ISUIDS_IRGRPS_IWGRPS_IXGRPS_ISGIDS_IROTHS_IWOTHS_IXOTHS_ISVTX)clsr   Zegr   r    r    r!   r   @  sX   














zFileMode.perms_s_to_bits)NNN)r   r   r   r   r   r   r   r$   )r   r   r   r   )
r   r   r   recompiler   r   r   classmethodr   r    r    r    r!   r/     s    

r/   a  You are using .C or .H files in your project. This is deprecated.
         Currently, Meson treats this as C++ code, but they
            used to be treated as C code.
         Note that the situation is a bit more complex if you are using the
         Visual Studio compiler, as it treats .C files as C code, unless you add
         the /TP compiler flag, but this is unreliable.
         See https://github.com/mesonbuild/meson/pull/8747 for the discussions.c                   @  s   e Zd Zd8ddZd9d	d
Zd9ddZeeddd:ddZed;ddZ	ed<ddZ
ed=ddZeddd>ddZeddd?dd Zed9d!d"Zd@d%d&ZdAdBd,d-ZdAdBd.d/ZdCd2d3ZdDd4d5Zeddd9d6d7ZdS )Er(   is_builtr   subdirr$   fnamec                 C  sH   | ds
| drtjtdd || _|| _|| _t|||f| _d S )Nz.Cz.HT)once)r   r   r   dot_C_dot_H_warningr  r  r	  hash)r   r  r  r	  r    r    r!   r   }  s   zFile.__init__r   c                 C  s   |   S r   )relative_namer   r    r    r!   __str__     zFile.__str__c                 C  s(   d}| j s	|d7 }|d7 }||  S )Nz
<File: {0}z (not built)>)r  r   r  r   r    r    r!   r     s
   zFile.__repr__Nmaxsizesource_root'File'c                 C  s4   t jt j| ||std| dtd||S )NzFile z does not exist.F)r   r   isfilejoinr   r(   )r  r  r	  r    r    r!   from_source_file  s   zFile.from_source_filec                 C  s   t d| |S NTr(   )r  r	  r    r    r!   from_built_file     zFile.from_built_filerelativec                 C  s   t j| \}}td||S r  )r   r   splitr(   )r  ZdirpartZ	fnamepartr    r    r!   from_built_relative  s   zFile.from_built_relativec                 C  s   t dd| S )NFr   r  )r	  r    r    r!   from_absolute_file  r  zFile.from_absolute_filebuild_to_srcc                 C  s"   | j r|  S tj|| j| jS r   )r  r  r   r   r  r  r	  )r   r   r    r    r!   rel_to_builddir  s   zFile.rel_to_builddirsrcdirbuilddirc                 C  s    |}| j r|}tj||  S r   )r  r   r   r  r  )r   r"  r#  Zabsdirr    r    r!   absolute_path  s   zFile.absolute_pathc                 C  s   t j| jd dd   S )Nr   )r   r   splitextr	  lowerr   r    r    r!   suffix  s   zFile.suffixendingT.Union[str, T.Tuple[str, ...]]c                 C  s   | j |S r   )r	  r   )r   r(  r    r    r!   r        zFile.endswithr   r   maxsplitr   r   c                 C     | j j||dS N)r+  )r	  r  r   r   r+  r    r    r!   r       z
File.splitc                 C  r,  r-  )r	  rsplitr.  r    r    r!   r0    r/  zFile.rsplitotherobjectc                 C  s>   t |tstS | j|jkrdS | j| j| jf|j|j|jfkS )NF)r   r(   NotImplementedr  r	  r  r  r   r1  r    r    r!   __eq__  s
   
 zFile.__eq__c                 C     | j S r   )r  r   r    r    r!   __hash__     zFile.__hash__c                 C  s   t j| j| jS r   )r   r   r  r  r	  r   r    r    r!   r       zFile.relative_name)r  r   r  r$   r	  r$   r  )r  r$   r  r$   r	  r$   r   r  )r  r$   r	  r$   r   r  )r  r$   r   r  )r	  r$   r   r  )r   r$   r   r$   )r"  r$   r#  r$   r   r$   )r(  r)  r   r   )r   )r   r$   r+  r   r   r   r1  r2  r   r   r   r   )r   r   r   r   r  r   staticmethodr   r  r  r  r  r!  r$  propertyr'  r   r  r0  r5  r7  r  r    r    r    r!   r(   |  s4    





	compilersT.Iterable['Compiler']src'FileOrString'
'Compiler'c                 C  s*   | D ]}| |r|  S qtd|)zNGiven a set of compilers and a source, find the compiler for that source type.z&No specified compiler can handle file )Zcan_compiler   )r>  r@  compr    r    r!   rY     s
   
rY   sourcesT.Sequence['FileOrString']*T.Dict['Compiler', T.List['FileOrString']]c                 C  s>   i }|D ]}t | |}||vr|g||< q|| | q|S r   )rY   append)r>  rD  Zcompsrclistr@  rC  r    r    r!   rB     s   
rB   c                   @  s6   e Zd ZdZdZdZdddZddd	Zdd
dZdS )r2   zzEnum class representing one of the two abstract machine names used in
    most places: the build, and host, machines.
    r   r   r   r$   c                 C  s   |    dS )Nz machine)get_lower_case_namer   r    r    r!   r       zMachineChoice.__str__c                 C     t dd|  S )Nbuildhostr9   r   r    r    r!   rH    rI  z!MachineChoice.get_lower_case_namec                 C  rJ  )Nbuild.r   rM  r   r    r    r!   
get_prefix  rI  zMachineChoice.get_prefixNr  )	r   r   r   r   BUILDHOSTr  rH  rO  r    r    r    r!   r2     s    

r2   c                   @  sH   e Zd ZdddZdd
dZdddZdddZdddZdddZdS )r9   rK  r)   rL  r   r   c                 C     || _ || _d S r   rK  rL  r   rK  rL  r    r    r!   r        
zPerMachine.__init__machiner2   c                 C  s   t j| jt j| ji| S r   )r2   rP  rK  rQ  rL  r   rV  r    r    r!   __getitem__  s
   zPerMachine.__getitem__valc                 C  s   t | | | d S r   )setattrrH  )r   rV  rY  r    r    r!   __setitem__     zPerMachine.__setitem__''PerMachineDefaultable[T.Optional[_T]]'c                 C  s,   t  }| j|_| j|_|j|jkrd|_|S a  Unset definition duplicated from their previous to None

        This is the inverse of ''default_missing''. By removing defaulted
        machines, we can elaborate the original and then redefault them and thus
        avoid repeating the elaboration explicitly.
        N)r:   rK  rL  r   Zunfreezer    r    r!   miss_defaulting  s   zPerMachine.miss_defaultingc                 C  rR  r   rS  rT  r    r    r!   assign  rU  zPerMachine.assignr$   c                 C     d| j d| jdS )NzPerMachine(, )rS  r   r    r    r!   r        zPerMachine.__repr__N)rK  r)   rL  r)   r   r   )rV  r2   r   r)   )rV  r2   rY  r)   r   r   )r   r]  r  )	r   r   r   r   rX  r[  r`  ra  r   r    r    r    r!   r9     s    




r9   c                      s@   e Zd ZdZd fdd	ZdddZdddZdddZ  ZS )r;   zLike `PerMachine` but includes `target` too.

    It turns out just one thing do we need track the target machine. There's no
    need to computer the `target` field so we don't bother overriding the
    `__getitem__`/`__setitem__` methods.
    rK  r)   rL  targetr   r   c                   s   t  || || _d S r   )r   r   rf  )r   rK  rL  rf  r   r    r!   r     s   
zPerThreeMachine.__init__,'PerThreeMachineDefaultable[T.Optional[_T]]'c                 C  sF   t  }| j|_| j|_| j|_|j|jkrd|_|j|jkr!d|_|S r^  )r<   rK  rL  rf  r_  r    r    r!   r`  "  s   zPerThreeMachine.miss_defaultingrV  r2   r   c                 C  s   | j | | kS r   )rK  rW  r    r    r!   matches_build_machine3  rI  z%PerThreeMachine.matches_build_machiner$   c                 C     d| j d| jd| jdS )NzPerThreeMachine(rc  rd  rK  rL  rf  r   r    r    r!   r   6     zPerThreeMachine.__repr__)rK  r)   rL  r)   rf  r)   r   r   )r   rg  )rV  r2   r   r   r  )	r   r   r   r   r   r`  rh  r   r   r    r    r   r!   r;     s    

r;   c                      sF   e Zd ZdZdd fdd	ZdddZdddZedddZ  Z	S )r:   zCExtends `PerMachine` with the ability to default from `None`s.
    NrK  T.Optional[_T]rL  r   r   c                   s   t  || d S r   )r   r   rT  r   r    r!   r   =     zPerMachineDefaultable.__init__'PerMachine[_T]'c                 C  s$   t | j| j}|jdu r|j|_|S )zDefault host to build

        This allows just specifying nothing in the native case, and just host in the
        cross non-compiler case.
        N)r9   rK  rL  r   freezer    r    r!   default_missing@  s   
z%PerMachineDefaultable.default_missingr$   c                 C  rb  )NzPerMachineDefaultable(rc  rd  rS  r   r    r    r!   r   K  re  zPerMachineDefaultable.__repr__is_crossr   r)   PerMachine[_T]c                 C  s   | |}|r	||_ | S )a@  Easy way to get a defaulted value

        This allows simplifying the case where you can control whether host and
        build are separate or not with a boolean. If the is_cross value is set
        to true then the optional host value will be used, otherwise the host
        will be set to the build value.
        )rL  rq  )r  rr  rK  rL  r   r    r    r!   defaultN  s   	zPerMachineDefaultable.default)NN)rK  rl  rL  rl  r   r   )r   rn  r  )rr  r   rK  r)   rL  r)   r   rs  )
r   r   r   r   r   rq  r   r  rt  r   r    r    r   r!   r:   :  s    

r:   c                   @  s.   e Zd ZdZdddZdddZdd
dZdS )r<   zHExtends `PerThreeMachine` with the ability to default from `None`s.
    r   r   c                 C  s   t | d d d  d S r   )r;   r   r   r    r    r!   r   `  r\  z#PerThreeMachineDefaultable.__init__!'PerThreeMachine[T.Optional[_T]]'c                 C  s:   t | j| j| j}|jdu r|j|_|jdu r|j|_|S )zDefault host to build and target to host.

        This allows just specifying nothing in the native case, just host in the
        cross non-compiler case, and just target in the native-built
        cross-compiler case.
        N)r;   rK  rL  rf  ro  r    r    r!   rq  c  s   

z*PerThreeMachineDefaultable.default_missingr$   c                 C  ri  )NzPerThreeMachineDefaultable(rc  rd  rj  r   r    r    r!   r   q  rk  z#PerThreeMachineDefaultable.__repr__Nr   r   )r   ru  r  )r   r   r   r   r   rq  r   r    r    r    r!   r<   ]  s
    

r<   c                   C     t   dkS )NZsunosplatformsystemr&  r    r    r    r!   rn   u  r/  rn   c                   C  rw  )Ndarwinrx  r    r    r    r!   rl   y  r/  rl   c                   C  rw  )Nlinuxrx  r    r    r    r!   ri   }  r/  ri   c                   C  rw  )NZandroidrx  r    r    r    r!   r`     r/  r`   c                   C  rw  )NZhaikurx  r    r    r    r!   rf     r/  rf   c                   C  rw  )NZopenbsdrx  r    r    r    r!   rk     r/  rk   c                  C  s   t   } | dkS )Nwindowsrx  )platnamer    r    r!   ro     s   ro   c                   C  s   t  o
dt  v S )NZ	microsoft)ri   ry  releaser&  r    r    r    r!   rp     re  rp   c                   C  s
   t jdkS )Ncygwin)sysry  r    r    r    r!   rb        
rb   c                   C  s   t jdS )Nz/etc/debian_version)r   r   r  r    r    r    r!   rc     r*  rc   c                   C  rw  )NZ	dragonflyrx  r    r    r    r!   rd     r/  rd   c                   C  rw  )NZnetbsdrx  r    r    r    r!   rj     r/  rj   c                   C  rw  )NZfreebsdrx  r    r    r    r!   re     r/  re   c                   C  s   t  dS )NZirix)ry  rz  
startswithr    r    r    r!   rh     rI  rh   c                   C  rw  )NZgnurx  r    r    r    r!   rg     r/  rg   c                   C  rw  )NZqnxrx  r    r    r    r!   rm     r/  rm   c                   C  rw  )NZaixrx  r    r    r    r!   r_     r/  r_   arglistc              	   C  s<   zt j| ddjdkrW dS W dS  tt jfy   Y dS w )N
   )timeoutr   TF)
subprocessrunr   FileNotFoundErrorTimeoutExpired)r  r    r    r!   rT     s   rT   r  objpath'ImmutableListProtocol[str]'c                   s   t dd| g\}}}|std|  d|  dS |ddd }dddd	d	d
 | } fdd|D }d|v r?|d |S )z
    For a specific object (executable, static library, dylib, etc), run `lipo`
    to fetch the list of archs supported by it. Supports both thin objects and
    'fat' objects.
    Zlipoz-infozlipo : Nr   x86Zaarch64ppc)Zi386arm64Zarm64eZppc7400Zppc970c                   s   g | ]}  ||qS r    )get).0Z	lipo_archZmap_archr    r!   
<listcomp>  s    z+darwin_get_object_archs.<locals>.<listcomp>Zarmv7arm)rw   r   debugr0  r  rG  )r  r   stdor   Z
lipo_archsZmeson_archsr    r  r!   rD     s    
rD   c               	   C  s   t jdkrdS zFddl} |  }|  }| jj}| | }||| 	|| 	|rL|j
dkr4W dS |j
dkr<W dS |j
d	krDW d
S |j
dkrLW dS W n ttfyX   Y nw tjdd }|szz
tjd  }W |S  tyy   tdw |S )zA
    The architecture of Windows itself: x86, amd64 or arm64
    win32r   r   Nid  Zamd64iL  r  id  r  i  r  PROCESSOR_ARCHITEW6432PROCESSOR_ARCHITECTUREz'Unable to detect native OS architecture)r  ry  ctypesZc_ushortwindllkernel32Zc_void_pZGetCurrentProcessZIsWow64Process2byrefvalueOSErrorAttributeErrorr   r   r  r&  KeyErrorr3   )r  Zprocess_archZnative_archr  processZarchr    r    r!   r     s<   




r   
source_dirT.Union[str, Path]T.Optional[T.Dict[str, str]]c              
   C  s   dddddddddd	d
dddddddddddddddddg}t | tr+t| } t| j}||  |D ]$}|D ]}t||d r[t	
|d r[t||d< |    S q<q8d S )Nr]   z.gitzgit describe --dirty=+ --alwaysz(.*)z.git/logs/HEAD)namer   repo_dirZget_revZ	rev_regexZdepZ	mercurialZhgz.hgzhg id -iz.hg/dirstateZ
subversionsvnz.svnzsvn infozRevision: (.*)z
.svn/wc.dbZbazaarZbzrz.bzrz	bzr revnor  r   Zwc_dir)r   r$   r   collectionsdequeparents
appendleftis_dirjoinpathshutilwhich)r  Zvcs_systemsZparent_paths_and_selfcurdirZvcsr    r    r!   rP     sR   			
"
"rP   c                  C  s`   t jdd} | dd}t|d }|dkrdS |dkr't|d	 d
kr'dS | do/d| v S )NZ	VSCMD_VERr   .r   r      T   r   r  z16.9.0z-pre.)r   r   r  r  r   r  )ZvsverZnumsmajorr    r    r!   rC   0  s   rC   c                   @  sp   e Zd Zd ddZd!ddZd!d	d
Zd"ddZd"ddZd"ddZd"ddZ	d"ddZ
d"ddZd#ddZdS )$r@   r   r$   r   r   c                 C  s8   || _ td|}dd |D }dd |D }|| _d S )Nz(\d+|[a-zA-Z]+|[^a-zA-Z\d]+)c                 S  s"   g | ]}t d |ds|qS )z[^a-zA-Z\d]+r   )r  r   r   r  r   r    r    r!   r  C  s   " z$Version.__init__.<locals>.<listcomp>c                 S  s2   g | ]}| d  rt| d n| d qS )r   )r   isdigitr   r  r    r    r!   r  F  s   2 )_sr  finditer_v)r   r   Z
sequences1Z
sequences2Z
sequences3r    r    r!   r   <  s
   
zVersion.__init__c                 C  s   d | jt| jS )Nz	{} (V={}))r   r  r$   r  r   r    r    r!   r  J  r\  zVersion.__str__c                 C  s   d| j  dS )Nz
<Version: r  )r  r   r    r    r!   r   M  rI  zVersion.__repr__r1  r2  r   c                 C     t |tr| |tjS tS r   )r   r@   _Version__cmpoperatorltr3  r4  r    r    r!   __lt__P     
zVersion.__lt__c                 C  r  r   )r   r@   r  r  gtr3  r4  r    r    r!   __gt__U  r  zVersion.__gt__c                 C  r  r   )r   r@   r  r  ler3  r4  r    r    r!   __le__Z  r  zVersion.__le__c                 C  r  r   )r   r@   r  r  ger3  r4  r    r    r!   __ge___  r  zVersion.__ge__c                 C  s   t |tr| j|jkS tS r   r   r@   r  r3  r4  r    r    r!   r5  d     
zVersion.__eq__c                 C  s   t |tr| j|jkS tS r   r  r4  r    r    r!   __ne__i  r  zVersion.__ne__	'Version'
comparator T.Callable[[T.Any, T.Any], bool]c                 C  sn   t | j|jD ]$\}}t|t}t|t}||kr |||  S ||kr+|||  S q|t| jt|jS r   )zipr  r   r   r   )r   r1  r  ZoursZtheirsZours_is_intZtheirs_is_intr    r    r!   Z__cmpn  s   

zVersion.__cmpN)r   r$   r   r   r  r:  )r1  r  r  r  r   r   )r   r   r   r   r  r   r  r  r  r  r5  r  r  r    r    r    r!   r@   ;  s    








r@   vstr2.T.Tuple[T.Callable[[T.Any, T.Any], bool], str]c                 C  s
  |  drtj}| dd  } || fS |  dr$tj}| dd  } || fS |  dr6tj}| dd  } || fS |  drHtj}| dd  } || fS |  drZtj}| dd  } || fS |  drltj}| dd  } || fS |  d	r~tj}| dd  } || fS tj}|| fS )
N>=r   <=!====r   r  <)r  r  r  r  neeqr  r  )r  cmpopr    r    r!   _version_extract_cmpop  s<   







r  vstr1c                 C  s   t |\}}|t| t|S r   )r  r@   )r  r  r  r    r    r!   r     s   r   
conditionsT.Union[str, T.Iterable[str]]'T.Tuple[bool, T.List[str], T.List[str]]c                 C  sN   t |tr|g}g }g }|D ]}t| |s|| q|| q| ||fS r   )r   r$   r   rG  )r  r  foundZ	not_foundreqr    r    r!   r     s   

r   	conditionminimumc                 C  s   |  drtj}| dd  } nE|  drdS |  drdS |  dr,tj}| dd  } n(|  dr;tj}| dd  } n|  d	rJtj}| dd  } n
|  d
rQdS tj}|  } td| rb| d7 } td|t	|t	| S )Nr  r   r  Fr  r  r  r   r  r  z	^\d+.\d+$z.0r   )
r  r  r  r  r   r  r   r   castr@   )r  r  r  r    r    r!   r     s.   






r   textc                 C  sL   t dt j}|| }|r|dS t d}|| }|r$|dS dS )NaS  
    (?<!                # Zero-width negative lookbehind assertion
        (
            \d          # One digit
            | \.        # Or one period
        )               # One occurrence
    )
    # Following pattern must not follow a digit or period
    (
        \d{1,2}         # One or two digits
        (
            \.\d+       # Period and one or more digits
        )+              # One or more occurrences
        (
            -[a-zA-Z0-9]+   # Hyphen and one or more alphanumeric
        )?              # Zero or one occurrence
    )                   # One occurrence
    r   z(\d{1,4}\.\d{1,4}\.?\d{0,4})zunknown version)r  r  VERBOSEsearchr   )r  Zversion_regexr   r    r    r!   r     s   




r   c                  C  s   t  r1z$tjddgtjtjd} |  \}}| jdkr&|  }d| W S W n	 t	y0   Y nw t
 s7t r9dS tjdrGtjdsGdS dS )	Nzdpkg-architecturez-qDEB_HOST_MULTIARCHr   r   zlib/libz
/usr/lib64Zlib64)rc   r  PopenPIPEDEVNULLcommunicater   r   r   	Exceptionre   rh   r   r   isdirislink)Zpcr  r   Zarchpathr    r    r!   rE     s&   


rE   c                   C     t  rdS dS )Nr  Zlibexecrf   r    r    r    r!   rF     s   rF   c                   C  s   t  rdS t r
dS dS )Nzc:/z/boot/system/non-packagedz
/usr/local)ro   rf   r    r    r    r!   rG     s
   rG   c                   C  r  )Ndatasharer  r    r    r    r!   rH   #     rH   c                   C  r  )Nzdevelop/headersZincluder  r    r    r    r!   rI   )  r  rI   c                   C  r  )Nzdocumentation/infoz
share/infor  r    r    r    r!   rJ   /  r  rJ   c                   C  r  )Nzdata/localezshare/localer  r    r    r    r!   rK   5  r  rK   c                   C  r  )Nzdocumentation/manz	share/manr  r    r    r    r!   rL   ;  r  rL   c                   C  r  )NbinZsbinr  r    r    r    r!   rM   A  r  rM   c                   C  r  )NZsettingsZetcr  r    r    r    r!   rN   G  r  rN   /\r  sepc                 C  s   |D ]	}|| v r dS qdS )z@Checks if any of the specified @sep path separators are in @nameTFr    )r  r  eachr    r    r!   r^   M  s
   r^   z 	
[z"]argc                 C  st   | rt | s| S d}d}| D ]}|dkr|d7 }q|dkr#|d d }||d | 7 }d}q||d d d 7 }|S )N"r   \r   r   )_find_unsafe_char)r  resultnum_backslashescr    r    r!   rz   ^  s   
rz   c                 C  s   g }d}d}d}d}| D ]K}|dkr|d7 }q|dkr/|d s/||d d 7 }|d7 }| }n&|t v rC|sC|s9|rB|| d}d}n|dkrM|d d }||d | 7 }d}q|s\|ra|| |S )Nr   r   Fr  r   r  r   )_whitespacerG  )r   r  r  r  Z
num_quotesZ	in_quotesr  r    r    r!   r   t  s2   


r   c                 C  
   t | S r   )shlexquote)r  r    r    r!   rz     r  c                 C  r  r   )r  r  )r   r    r    r!   r     r  argsT.Iterable[str]c                 C  s   d dd | D S )N c                 S  s   g | ]}t |qS r    )rz   )r  r   r    r    r!   r    s    zjoin_args.<locals>.<listcomp>)r  )r  r    r    r!   rr     r\  rr   regexT.Pattern[str]linevariable_format#Literal['meson', 'cmake', 'cmake@']confdataHT.Union[T.Dict[str, T.Tuple[str, T.Optional[str]]], 'ConfigurationData']T.Tuple[str, T.Set[str]]c                   sH   t  dkrdd ndd d fd
d}t| ||fS )Ncmakez${z\${@z\@r   T.Match[str]r   r$   c                   s   |  ddr| d| d }d|d  S |  d kr!S |  d}d}|v re|\}}t|tr<|}|S drNt|trNtt	|}|S t|t	rYt|}|S d|d|}t
|| |S )	Nr   r  r   r   r   r  zTried to replace variable z2 value with something other than a string or int: )r   r   endstartr  r   r$   r  r   r   r   add)r   Znum_escapesvarnameZvar_strvarr   r   Zbackslash_tagr  missing_variablesZ	start_tagr
  r    r!   variable_replace  s0   

	

z(do_replacement.<locals>.variable_replace)r   r  r   r$   )setr  sub)r  r	  r
  r  r  r    r  r!   rS     s   rS   'ConfigurationData'
subprojectT.Optional[SubProject]c                   s^  d |dkr
d|v  d fd	d
}|  }t|dkr8|dkr'td|  |d ur8ddlm} |dd| |d }z	||\}	}
W n tyZ    rTd|  Y S d|  Y S w t	|	t
sd|dkr|dkrk|	}n ss|	ssd| S |||}d| d|  d }t| |||\}}
|S t	|	tr|	rd| S d| S t	|	trd||	f S td| )NFmesonZcmakedefine01r	  r$   r  r  r   c              	     s   |   } r||d \}}ttt|S g }|dd  D ] }z||\}}|t|g7 }W q ty?   ||g7 }Y qw d|S )Nr   r   r  )r  r  r$   r   r   r  r  )r	  r  arrvdescZdefine_valuetokenr   Zcmake_bool_definer    r!   get_cmake_define  s   
z#do_define.<locals>.get_cmake_definer   z4#mesondefine does not contain exactly two tokens: %s)
FeatureNewz&cmakedefine without exactly two tokensz0.54.1r   z#define %s 0
z/* #undef %s */
z#define r  
z#define %s
z
#undef %s
z#define %s %d
z.#mesondefine argument "%s" is of unknown type.)r	  r$   r  r  r   r$   )r  r   r   r   Zinterpreterbase.decoratorsr&  Z
single_user  r  r   r$   rS   r   r   )r  r	  r  r
  r  r%  r   r&  r  r!  r   r  r    r$  r!   	do_define  sF   


r(  r  c                 C  s$   | dv rt d}|S t d}|S )N>   zcmake@r  z((?:\\\\)+(?=\\?@)|\\@|@([-a-zA-Z0-9_]+)@z-(?:\\\\)+(?=\\?\$)|\\\${|\${([-a-zA-Z0-9_]+)})r  r  )r
  r  r    r    r!   r[     s
   

r[   r  &T.Tuple[T.List[str], T.Set[str], bool]c              	   C  s   ddd}t |}d}|d	krd
}g }t }	|  }
|D ]@}| |r1d}
t|||||}n'|||sFtd|  d|  d| dt||||\}}|		| |rXd}
|
| q||	|
fS )Nr	  r$   r
  r   r   c                 S  s(   |dkrd| v r
dS dS d| v rdS dS )Nr  #cmakedefineF#mesondefineTr    )r	  r
  r    r    r!   line_is_valid  s   z"do_conf_str.<locals>.line_is_validr+  r  r*  FzFormat error in z: saw "z" when format set to "r  )r	  r$   r
  r$   r   r   )r[   r  keyslstripr  r(  r   r   rS   updaterG  )r@  r  r  r
  r  r,  r  Zsearch_tokenr  r  confdata_uselessr	  missingr    r    r!   rR     s(   
	

 

rR   utf-8dstencodingT.Tuple[T.Set[str], bool]c              
   C  s  zt | |dd}| }W d    n1 sw   Y  W n ty3 } z
td|  d|d }~ww t| ||||\}	}
}|d }zt |d|dd}||	 W d    n1 s\w   Y  W n tyx } z
td| d|d }~ww t| | t|| |
|fS )Nr   )r4  newlinezCould not read input file r  ~r   zCould not write output file )	open	readlinesr  r   rR   
writelinesr  copymoder}   )r@  r3  r  r
  r4  r  fr  r   r  r  r0  dst_tmpr    r    r!   rQ   5  s.   

rQ   zc/*
 * Autogenerated by the Meson build system.
 * Do not edit, your changes will be lost.
 */

{}

zV; Autogenerated by the Meson build system.
; Do not edit, your changes will be lost.

ofileT.TextIOcdatar   output_formatLiteral['c', 'nasm']
macro_namer   c           
   	   C  s  |dkr|rt d|}nt d}d}dd }nt}d}dd }| | t| D ]L}||\}}	|	r@| ||	 t|tr_|rS| | d	| d
 q.| | d| d
 q.t|t	t
fru| | d	| d| d
 q.td| |dkr|r| d d S d S d S )Nr  z#ifndef {0}
#define {0}z#pragma once#c                 S  s   d|  dS )Nz/* z */
r    r"  r    r    r!   <lambda>b  s    z _dump_c_header.<locals>.<lambda>%c                 S  s   dd |   d S )Nz; z
; r'  )r  
splitlinesrE  r    r    r!   rF  f  s    zdefine z

zundef r  z/Unknown data type in configuration file entry: z#endif
)CONF_C_PRELUDEr   CONF_NASM_PRELUDEwritesortedr-  r  r   r   r   r$   r   )
r>  r@  rA  rC  ZpreludeprefixZformat_desckr!  r"  r    r    r!   _dump_c_headerW  s0   



rO  	ofilenameLiteral['c', 'nasm', 'json']c                 C  s   | d }t |ddd&}|dkr#dd |j D }tj||dd	 nt|||| W d    n1 s4w   Y  t| | d S )
Nr7  r   r2  r4  jsonc                 S  s   i | ]	\}}||d  qS )r   r    )r  rN  r!  r    r    r!   
<dictcomp>  s    z$dump_conf_header.<locals>.<dictcomp>T)	sort_keys)r8  valuesitemsrS  dumprO  r}   )rP  r@  rA  rC  Zofilename_tmpr>  r  r    r    r!   r6   z  s   r6   r=  c              	   C  s   d}z6t | d'}t |d}| | krd}W d    n1 s#w   Y  W d    n1 s2w   Y  W n	 tyA   Y nw |rLt||  d S t| d S )NTrbF)r8  readr  r   replaceunlink)r3  r=  Z	differentf1f2r    r    r!   r}     s     r}   TitemflattenT.List[T.Any]c                 C  sL   t | ts| gS g }| D ]}|rt |tr|t|dd7 }q|| q|S )z
    Returns a list with all args embedded in a list if they are not a list.
    This function preserves order.
    @flatten: Convert lists of lists to a flat list
    Tr`  )r   listrs   rG  )r_  r`  r  ir    r    r!   rs     s   
rs   dict_objectT.Dict[_T, _U]keypop
T.List[_U]c                 C  s$   | j }|r| j}t||pg ddS )zH
    Extracts all values from given dict_object and listifies them.
    Trb  )r  rh  rs   )re  rg  rh  Zfetchr    r    r!   rV     s   rV   'T.Union[_T, T.Sequence[_T]]'types*'T.Union[T.Type[_T], T.Tuple[T.Type[_T]]]'
T.List[_T]c                 C  sj   t | |rtd| g} t | tstd|t| | D ]}|dur2t ||s2td|t|q| S )zi
    Ensure that type(@item) is one of @types or a
    list of items all of which are of type @types
    rm  z,Item must be a list or one of {!r}, not {!r}Nz'List item must be one of {!r}, not {!r})r   r   r  rc  r   r   type)r_  rk  rd  r    r    r!   r     s   

r   !T.Union[T.Any, T.Sequence[T.Any]]c                 C  s
   t | tS r   )r   r$   )r_  r    r    r!   r     r  r   T.Optional[T.List[str]]c                 C  s   g }| D ]U}| ds|| q|dd  }z"t|dd}|  }W d    n1 s/w   Y  ||7 }W q tyY } ztd|d t| W Y d }~ d S d }~ww |S )Nr  r   r2  rR  z!Expanding command line arguments:z	not found)	r  rG  r8  rZ  r  r  r   error	exception)r  Zexpended_argsr  	args_filer<  Zextended_argsr   r    r    r!   rU     s$   


rU   predT.Callable[[_T], object]iterableT.Iterable[_T]'T.Tuple[T.Iterator[_T], T.Iterator[_T]]c                   s0   t |\}} fdd|D  fdd|D fS )zUse a predicate to partition entries into false entries and true
    entries.

    >>> x, y = partition(is_odd, range(10))
    >>> (list(x), list(y))
    ([0, 2, 4, 6, 8], [1, 3, 5, 7, 9])
    c                 3  s    | ]	} |s|V  qd S r   r    r  r   rt  r    r!   	<genexpr>      zpartition.<locals>.<genexpr>c                 3  s    | ]	} |r|V  qd S r   r    ry  rz  r    r!   r{    r|  r   )rt  rv  t1t2r    rz  r!   rt     s   $rt   rK  stdin"T.Union[T.TextIO, T.BinaryIO, int]r   r   *T.Tuple['subprocess.Popen[str]', str, str]c              
   K  s   dd l }| }|d urtj}z4tjjr| dkr+t| f||||d|\}}	}
ntj	| fd|d|||d|}|
|\}	}
W n ty` } z|jtjkr[td| d d d }~ww t  ||	|
fS )	Nr   r   )rK  r  r   r   TF)universal_newlinesr4  	close_fdsr  r   r   zFailed running ze, binary or interpreter not executable.
Possibly wrong architecture or the executable bit is not set.)r   r   r  r  r  r   r4  r   Popen_safe_legacyr  r  r  errnoZENOEXECr   r   setup_console)r  rK  r  r   r   r   r   r4  r   r   r   Zoserrr    r    r!   rw     s,   "
rw   c           
      K  s   t j| fdd|||d|}d }|d ur|d}||\}}	|d urCtjjd ur9|jtjjdddd}n
|jdddd}|	d urhtj	d ur^tj	jr^|	jtj	jdddd}	n
|	jdddd}	|||	fS )	NF)r  r  r  r   r   r2  r[  )r4  errorsz
r'  )r  )
r  r  r   r  r  r   r4  r   r[  r   )
r  rK  r  r   r   r   r   Zinput_r   r   r    r    r!   r    s$   

r  Calledr   c           
   
   K  s   zt | fi |\}}}W n! ty. } ztd t| dt|  d|   d}~ww |j| | }}}	td t| dt|  d|  |r[td| d |	rftd|	 d |||fS )zc
    Wrapper around Popen_safe that assumes standard piped o/e and logs this to the meson log.
    z-----------z: `z` -> Nzstdout:
z
-----------zstderr:
)rw   r  r   r  rr   r   r   )
r  r   r   r   r   r   Zexcprcouterrr    r    r!   rx     s    


rx   	regexiteriniterc                 C  sD   | D ]}|D ]}t |tsqt||}|r|     S qqdS )z
    Takes each regular expression in @regexiter and tries to search for it in
    every item in @initer. If there is a match, returns that match.
    Else returns False.
    N)r   r$   r  r  r   )r  r  r  iir   r    r    r!   rq   4  s   
rq   commandrV  &T.Dict[str, T.Union[str, T.List[str]]]c                 C  sH  g d}ddg}d|vrt || }|rtd|dnFt|d dkr7t |dd  | }|r7td|d| D ](}t|tsAq9t|d	 |}|ra| |vrad
}t|| t|d q9d|vrwt || }|rutd|dd S | D ](}t|tsqyt|d	 |}|r| |vrd}t|| t|d qyd S )N)z@INPUT([0-9]+)?@@PLAINNAME@
@BASENAME@z@OUTPUT([0-9]+)?@@OUTDIR@@INPUT@zCommand cannot have z%, since no input files were specifiedr   z' when there is more than one input filer   z9Command cannot have {!r} since there are only {!r} inputs@OUTPUT@z since there are no outputsz:Command cannot have {!r} since there are only {!r} outputs)	rq   r   r   r   r$   r  r  r   r   )r  rV  ZinregexZoutregexr   r  Zmatch2r   r    r    r!   _substitute_values_check_errorsD  sB   



r  c                   sV  d fdd}t |   g }dd  D }|rtd	|nd
}| D ]}d
}t|ts2|| nmd|v rY d }|dkrC||7 }n\t|dkrU||d|d  nJt	dd|v r d }	|dkrj||	7 }n5t|	dkr|||d|	d  n#t	d| v r | }
t|
tsJ d|
}n|r|
||}n|}|d
ur|| q#|S )a  
    Substitute the template strings in the @values dict into the list of
    strings @command and return a new list. For a full list of the templates,
    see get_filenames_templates_dict()

    If multiple inputs/outputs are given in the @values dictionary, we
    substitute @INPUT@ and @OUTPUT@ only if they are the entire string, not
    just a part of it, and in that case we substitute *all* of them.

    The typing of this function is difficult, as only @OUTPUT@ and @INPUT@ can
    be lists, everything else is a string. However, TypeDict cannot represent
    this, as you can have optional keys, but not extra keys. We end up just
    having to us asserts to convince type checkers that this is okay.

    https://github.com/python/mypy/issues/4617
    r   r  r   r$   c                   s$    |  d }t|tsJ d|S )Nr   for mypy)r   r   r$   )r   r!  rV  r    r!   r[  ~  s   z"substitute_values.<locals>.replacec                 S  s   g | ]}|d vrt |qS ))r  r  )r  escape)r  rg  r    r    r!   r    s    z%substitute_values.<locals>.<listcomp>|Nr  r   r   zFCommand has '@INPUT@' as part of a string and more than one input filer  zHCommand has '@OUTPUT@' as part of a string and more than one output filer  )r   r  r   r$   )r  r  r  r  r   r$   rG  r   r[  r   r  )r  rV  r[  ZoutcmdZrx_keysZvalue_rxvvZmoreinputsoutputsr   r    r  r!   r   l  sD   




r   r  r  c                 C  s   i }| r5| |d< t | D ]\}}||d| d< qt| dkr5tj| d  |d< }tj|d |d< |r`||d< t |D ]\}}||d	| d< q?tj|d |d
< |d
 dkr`d|d
< |S )a   
    Create a dictionary with template strings as keys and values as values for
    the following templates:

    @INPUT@  - the full path to one or more input files, from @inputs
    @OUTPUT@ - the full path to one or more output files, from @outputs
    @OUTDIR@ - the full path to the directory containing the output files

    If there is only one input file, the following keys are also created:

    @PLAINNAME@ - the filename of the input file
    @BASENAME@ - the filename of the input file with the extension removed

    If there is more than one input file, the following keys are also created:

    @INPUT0@, @INPUT1@, ... one for each input file

    If there is more than one output file, the following keys are also created:

    @OUTPUT0@, @OUTPUT1@, ... one for each output file
    r  z@INPUTr  r   r   r  r  r  z@OUTPUTr  r   r  )	enumerater   r   r   basenamer%  dirname)r  r  rV  r  r  plainr    r    r!   rZ     s    rZ   topdirc                 C  s~   t | D ]7\}}}t |t |jtjB tjB  |D ]}t j||}t j	|r;t |t |jtjB tjB  qqd S r   )
r   walkchmodr   st_modeS_IWRITES_IREADr   r  r  )r  dr   filesr	  fpathr    r    r!   _make_tree_writable  s     r  r<  c              	   C  s   g d}d}|D ]<}z
|st |  d}W n ty"   t| Y qw z	t|  W  d S  ty7   Y  d S  tyD   t| Y qw t|  d S )N皙?r  皙?r  r        ?r  r   r   r   r   r   FT)r  PermissionErrortimesleepr  rmtreer  r  )r<  delayswritabler  r    r    r!   r     s*   

r   r  c              	   C  s   t j| rt | t | jtjB tjB  g d}|D ]#}z	t |  W  dS  t	y2   Y  dS  t
y?   t| Y qw t |  dS )z1Like windows_proof_rmtree, but for a single file.r  N)r   r   r  r  r   r  r  r  r\  r  r  r  r  )r  r  r  r    r    r!   r     s    
r   c                      s0   e Zd ZdZd fdd	Zd fd
dZ  ZS )r?   zX
    Like TemporaryDirectory, but cleans things up using
    windows_proof_rmtree()
    excr   r  tbr   r   c                   s6   zt  ||| W d S  ty   t| j Y d S w r   )r   __exit__r  r   r  )r   r  r  r  r   r    r!   r    s
   z#TemporaryDirectoryWinProof.__exit__c                   s0   zt    W d S  ty   t| j Y d S w r   )r   cleanupr  r   r  r   r   r    r!   r  $  s
   z"TemporaryDirectoryWinProof.cleanup)r  r   r  r   r  r   r   r   rv  )r   r   r   r   r  r  r   r    r    r   r!   r?     s    r?   r   
spdir_namecurrent_dirr  $T.Optional[T.Dict[str, T.List[str]]]T.Dict[str, T.List[str]]c                 C  s   |d u ri }t j|| }t j|s|S tt j|dD ]E}t j|}|dkr+qd}t j|r:t| || n|drNt j	|rNt j
|d }nd}|rc||v r^|| | q|g||< q|S )N*ZpackagecacheTz.wrapr   F)r   r   r  existsr   r  r  rO   r   r  r%  rG  )r  r  r  ZspdirZtrialr  Zappend_thisr    r    r!   rO   +  s*   
rO   substrstrlistc                 C  s   |D ]	}| |v r dS qdS )NTFr    )r  r  r   r    r    r!   r   E  s
   r   c                   @  s   e Zd ZdZd-d.ddZd/ddZd0ddZd1ddZd2ddZd0ddZ	d3ddZ
d3ddZd4d5d d!Zd4d6d"d#Zd7d%d&Zd8d)d*Zd7d+d,ZdS )9r8   zUA set that preserves the order in which items are added, by first
    insertion.
    Nrv  T.Optional[T.Iterable[_T]]c                 C  s    t  | _|r| | d S d S r   )r  OrderedDict_OrderedSet__containerr/  )r   rv  r    r    r!   r   P  s   
zOrderedSet.__init__r  r2  r   r   c                 C  s
   || j v S r   r  r   r  r    r    r!   __contains__U  r  zOrderedSet.__contains__T.Iterator[_T]c                 C     t | j S r   )iterr  r-  r   r    r    r!   __iter__X  rI  zOrderedSet.__iter__r   c                 C  
   t | jS r   )r   r  r   r    r    r!   __len__[  r  zOrderedSet.__len__r$   c                 C  s*   | j rdddd | j  D S dS )NzOrderedSet([{}])rc  c                 s  s    | ]}t |V  qd S r   )reprr  r   r    r    r!   r{  b  s    z&OrderedSet.__repr__.<locals>.<genexpr>zOrderedSet())r  r   r  r-  r   r    r    r!   r   ^  s
   zOrderedSet.__repr__c                 C  r  r   )reversedr  r-  r   r    r    r!   __reversed__e  rI  zOrderedSet.__reversed__r)   r   c                 C  s   d | j |< d S r   r  r  r    r    r!   r  h  rI  zOrderedSet.addc                 C  s   || j v r| j |= d S d S r   r  r  r    r    r!   discardk  s   
zOrderedSet.discardTlastc                 C  s   | j || d S r   )r  move_to_end)r   r  r  r    r    r!   r  o  rm  zOrderedSet.move_to_endc                 C  s   | j |\}}|S r   )r  popitem)r   r  r_  r   r    r    r!   rh  r  s   zOrderedSet.poprw  c                 C  s   |D ]}d | j |< qd S r   r  r   rv  r_  r    r    r!   r/  v     zOrderedSet.updateset_'OrderedSet[_T]'c                   s   t |  fdd| D S )Nc                 3  s    | ]	}| vr|V  qd S r   r    r  r  r    r!   r{  {  r|  z(OrderedSet.difference.<locals>.<genexpr>)rn  )r   r  r    r  r!   
differencez  s   zOrderedSet.differencec                 C  s   |D ]}|  | qd S r   )r  r  r    r    r!   difference_update}  r  zOrderedSet.difference_updater   )rv  r  )r  r2  r   r   )r   r  r;  r  )r  r)   r   r   T)r  r)   r  r   r   r   )r  r   r   r)   )rv  rw  r   r   )r  rw  r   r  )r   r   r   r   r   r  r  r  r   r  r  r  r  rh  r/  r  r  r    r    r    r!   r8   L  s    








r8   r   r  c              	   C  s,   zt j| |W S  ttfy   |  Y S w r   )r   r   r|   	TypeError
ValueError)r   r  r    r    r!   r|     s
   r|   r   rootresolvec                 C  sB   z|r|   |   W dS | | W dS  ty    Y dS w )NFTr  relative_tor  r   r  r  r    r    r!   ru     s   ru   c                 C  s<   z|r|   |  W S | |W S  ty   |  Y S w r   r  r  r    r    r!   r{     s   r{   c                   @  s    e Zd ZdZdZdZdZdZdS )r1   zEnumeration for library types.r   r   r   r   N)r   r   r   r   ZSHAREDZSTATICZPREFER_SHAREDZPREFER_STATICr    r    r    r!   r1     s    r1   c                   @  sT   e Zd ZdZ			ddddZd ddZd!ddZd"ddZd#ddZd"ddZ	dS )$ProgressBarFallbackz
    Fallback progress bar implementation when tqdm is not found

    Since this class is not an actual iterator, but only provides a minimal
    fallback, it is safe to ignore the 'Iterator does not return self from
    __iter__ method' warning.
    Nrv  T.Optional[T.Iterable[str]]totalT.Optional[int]bar_typer   r"  disableT.Optional[bool]c                 C  s   |d urt || _d S || _d| _d| _|d u rt  n|| _| js=| jr0|dkr0td| j |r?t| ddd d S d S d S )Nr   downloadzDownload size:r  r   r  )	r  rv  r  doneprinted_dotsr   colorize_consoler  print)r   rv  r  r  r"  r  r    r    r!   r     s   
zProgressBarFallback.__init__r   T.Iterator[str]c                 C  r6  r   )rv  r   r    r    r!   r    r8  zProgressBarFallback.__iter__r$   c                 C  r  r   )nextrv  r   r    r    r!   __next__  r  zProgressBarFallback.__next__r   c                 C  s.   | j stddd tj  |  jd7  _d S )Nr  r   r  r   )r  r  r  r   flushr  r   r    r    r!   	print_dot  s   
zProgressBarFallback.print_dotprogressr   c                 C  sX   |  j |7  _ | js|   d S t| j | j d }| j|k r*|   | j|k sd S d S )Nr  )r  r  r  r   r  )r   r  Zratior    r    r!   r/    s   
zProgressBarFallback.updatec                 C  s   | j st  d S d S r   )r  r  r   r    r    r!   close  s   
zProgressBarFallback.close)NNNNN)
rv  r  r  r  r  r   r"  r   r  r  )r   r  r  rv  )r  r   r   r   )
r   r   r   r   r   r  r  r  r/  r  r    r    r    r!   r    s    




r  )tqdmz=T.Union[T.Type[ProgressBarFallback], T.Type[ProgressBarTqdm]]r=   c                      s$   e Zd Zddd fd
dZ  ZS )ProgressBarTqdmN)r  r  r   r  r   r   r   r   c                  sF   |dkr| dddddd n| ddd	 t j|i | d S )
Nr  BT   z<{l_bar}{bar}| {n_fmt}/{total_fmt} {rate_fmt} eta {remaining})ZunitZ
unit_scaleZunit_divisorleave
bar_formatFz1{l_bar}{bar}| {n_fmt}/{total_fmt} eta {remaining})r  r  )r/  r   r   )r   r  r  r   r   r    r!   r     s   
zProgressBarTqdm.__init__)r  r   r  r   r   r   r   r   r   r    r    r   r!   r    s    r  c                      s.   e Zd Zdd fd	d
Z	ddddZ  ZS )r>   r  option_stringsr   destr$   rt  r   r   c                   s4   t jt j|}t j||fd |d| d S )N)nargsrt  )r   r   abspathrealpathr   r   )r   r  r   rt  r   r   r    r!   r     s    zRealPathAction.__init__Nparserargparse.ArgumentParser	namespaceargparse.NamespacerV  %T.Union[str, T.Sequence[T.Any], None]option_stringr   r   r   c                 C  s0   t |tsJ t|| jtjtj| d S r   )r   r$   rZ  r   r   r   r  r  )r   r  r  rV  r	  r    r    r!   __call__  s   "zRealPathAction.__call__)r  )r  r   r   r$   rt  r$   r   r   r   )
r  r  r  r  rV  r  r	  r   r   r   )r   r   r   r   r
  r   r    r    r   r!   r>     s    r>   winecmd
wine_pathsworkdirc              
   C  s  t t|}d|}t|dkr|S ddlm} |d| dd}t| dr)|S g }|rTg }|D ] }zt|	|}	|
t|	 W q1 tyQ   |
| Y q1w |}|rtd	d
ddd}
|
d W d   n1 snw   Y  zKz%tj| dd|
jg | dtjd}|d}|r|d}ntd W n tjy } ztdt|  W Y d}~nd}~ww W t|
j nt|
j w d|| }t|dkrtd |S )a  
    WINEPATH size is limited to 1024 bytes which can easily be exceeded when
    adding the path to every dll inside build directory. See
    https://bugs.winehq.org/show_bug.cgi?id=45810.

    To shorten it as much as possible we use path relative to `workdir`
    where possible and convert absolute paths to Windows shortpath (e.g.
    "/usr/x86_64-w64-mingw32/lib" to "Z:\usr\X86_~FWL\lib").

    This limitation reportedly has been fixed with wine >= 6.4
    ;r  r   )ExternalProgramwineT)Zsilentz>=6.4r   z.batr2  F)r'  r4  deletezt
            @ECHO OFF
            for %%x in (%*) do (
                echo|set /p=;%~sx
            )
            Nr   z/C)r4  r   z(Could not shorten WINEPATH: empty stdoutzCould not shorten WINEPATH: z9WINEPATH exceeds 1024 characters which could cause issues)rc  r8   r  r   Zprogramsr  r   Zget_versionr   r  rG  r$   r  r
   rK  r  check_outputr  r  r   r  r   r   CalledProcessErrorr   r\  )r  r  r  Z	wine_pathr  r  Z	rel_paths	abs_pathsr   relbat_filer   r   r    r    r!   r\      sT   


 
r\   funcT.Callable[..., _T]c                   s    g t  d fdd}|S )	Nr  r   r   r   r)   c                    s(   rd S  | i |} | |S )Nr   )rG  )r  r   rY  r  r   r    r!   wrapperF  s
   
zrun_once.<locals>.wrapper)r  r   r   r   r   r)   r   r  r  r    r  r!   r~   C  s   r~   ,T.Callable[..., T.Generator[_T, None, None]]T.Callable[..., T.List[_T]]c                   s   t  d fdd}|S )	Nr  r   r   r   rm  c                    s   t  | i |S r   )rc  )r  r   r  r    r!   r  S  r9  zgenerate_list.<locals>.wrapper)r  r   r   r   r   rm  r  r  r    r  r!   rX   R  s   rX   c                   @  s$   e Zd ZdZdZdZdZdZdZdS )r7   z6Enum used to specify what kind of argument a thing is.r   r   r   r   r   N)	r   r   r   r   BUILTINBACKENDBASECOMPILERPROJECTr    r    r    r!   r7   Z  s    r7   >$   Z
includedirZvsenvZcmake_prefix_pathZmandirZauto_featuresZ	errorlogsZsbindirZlayoutZ	buildtyper   	localedirZ
libexecdirZ
unity_sizeZpkg_config_pathrM  ZsharedstatedirZ
licensedirlibdirZ	genvsliteZunityZdefault_libraryoptimizationZinstall_umaskZ	wrap_modeZdatadirr  Zforce_fallback_forZstdsplitZ
sysconfdirZprefer_staticZbackendZlocalstatedirZwarning_levelZwerrorZbindirZinfodir'OptionKey'c                 C  s   | j dr	tjS | jdurtjS | j tv s| jrtjS | j dr1| j	t
ju s.J t| tjS | j	t
ju s=J t| tjS )zGClassify arguments into groups so we know which dict to assign them to.Zb_NZbackend_)r  r  r7   r"  langr#  _BUILTIN_NAMESmoduler   rV  r2   rQ  r$   r!  r$  )rg  r    r    r!   _classify_argument  s   
r,  c                   @  s4  e Zd ZU dZg dZded< ded< ded< ded	< d
ed< ded< ded< dejdddfdIddZdJddZ	dKddZ
dLd d!ZdMd"d#ZdNd%d&ZdOd*d+ZdOd,d-ZdPd.d/ZdPd0d1ZedQd4d5Z			dRdSd7d8ZdTd9d:ZdTd;d<ZdTd=d>ZdUd?d@ZdUdAdBZdUdCdDZdUdEdFZdUdGdHZdS )Vr5   a	  Represents an option key in the various option dictionaries.

    This provides a flexible, powerful way to map option names from their
    external form (things like subproject:build.option) to something that
    internally easier to reason about and produce.
    )r  r  rV  r)  _hashrn  r+  r$   r  r  r2   rV  r   r)  r   r-  r7   rn  r+  r   N_typeT.Optional[OptionType]c              
   C  s   t | d| t | d| t | d| t | d| t | d| t | dt|||||f |d u r9t| }t | d| d S )Nr  r  rV  r)  r+  r-  rn  )r2  __setattr__r  r,  )r   r  r  rV  r)  r+  r.  r    r    r!   r     s   	zOptionKey.__init__rg  r  r   r   r   c                 C  s   t d)Nz,OptionKey instances do not support mutation.)r  )r   rg  r  r    r    r!   r0    r  zOptionKey.__setattr__T.Dict[str, T.Any]c                 C  s   | j | j| j| j| j| jdS )N)r  r  rV  r)  r.  r+  )r  r  rV  r)  rn  r+  r   r    r    r!   __getstate__  s   zOptionKey.__getstate__statec                 C  s   | j di | dS )a+  De-serialize the state of a pickle.

        This is very clever. __init__ is not a constructor, it's an
        initializer, therefore it's safe to call more than once. We create a
        state in the custom __getstate__ method, which is valid to pass
        splatted to the initializer.
        Nr    )r   )r   r3  r    r    r!   __setstate__  s   	zOptionKey.__setstate__c                 C  r6  r   )r-  r   r    r    r!   r7    r8  zOptionKey.__hash__6T.Tuple[str, OptionType, str, str, MachineChoice, str]c                 C  s$   | j | j| jpd| jpd| j| jfS r   )r  rn  r)  r+  rV  r  r   r    r    r!   	_to_tuple  s   $zOptionKey._to_tupler1  r2  r   c                 C  s   t |tr|  | kS tS r   r   r5   r6  r3  r4  r    r    r!   r5       
zOptionKey.__eq__c                 C  s   t |tr|  | k S tS r   r7  r4  r    r    r!   r    r8  zOptionKey.__lt__c                 C  sb   | j }| jr| j d| }| jtju rd| }| jr$| j d| }| jr/| j d| }|S )Nr   rN  r  :)r  r)  rV  r2   rP  r+  r  )r   r  r    r    r!   r    s   
zOptionKey.__str__c                 C  s6   d| j d| jd| jd| jd| jd| jdS )Nz
OptionKey(rc  rd  )r  r  rV  r)  r+  rn  r   r    r    r!   r     s   6zOptionKey.__repr__rawr(  c           
        s   z	| d\}}W n ty   d|}}Y nw d}tj}z| d\} |dkr-tj}n|}W n ty;   | Y nw ddlm} t fdd	|D rV  d
d\}}	nd }}	d|	vsaJ d|	vsgJ | |	||||S )zParse the raw command line format into a three part tuple.

        This takes strings like `mysubproject:build.myoption` and Creates an
        OptionKey out of them.
        r9  r   Nr  rK  r   )all_languagesc                 3  s     | ]}  | d V  qdS )r   N)r  )r  lZraw3r    r!   r{  	  s    z(OptionKey.from_string.<locals>.<genexpr>r   r   )r  r  r2   rQ  rP  r>  r;  any)
r  r:  r  Zraw2r+  Zfor_machinerM  r;  r)  optr    r=  r!   from_string  s.   
zOptionKey.from_stringT.Optional[MachineChoice]c                 C  sX   t |dur|n| j|dur|n| j|dur|n| j|dkr|n| j|dkr(|S | jS )a  Create a new copy of this key, but with altered members.

        For example:
        >>> a = OptionKey('foo', '', MachineChoice.Host)
        >>> b = OptionKey('foo', 'bar', MachineChoice.Host)
        >>> b == a.evolve(subproject='bar')
        True
        Nr   )r5   r  r  rV  r)  r+  )r   r  r  rV  r)  r+  r    r    r!   evolve	  s   
zOptionKey.evolvec                 C  s   | j ddS )z1Convenience method for key.evolve(subproject='').r   )r  )rB  r   r    r    r!   as_root4	  r  zOptionKey.as_rootc                 C     | j tjdS )z?Convenience method for key.evolve(machine=MachineChoice.BUILD).rV  )rB  r2   rP  r   r    r    r!   as_build8	     zOptionKey.as_buildc                 C  rD  )z>Convenience method for key.evolve(machine=MachineChoice.HOST).rE  )rB  r2   rQ  r   r    r    r!   as_host<	  rG  zOptionKey.as_hostc                 C     | j tju S )z8Convenience method to check if this is a backend option.)rn  r7   r!  r   r    r    r!   
is_backend@	  r  zOptionKey.is_backendc                 C  rI  z8Convenience method to check if this is a builtin option.)rn  r7   r   r   r    r    r!   
is_builtinD	  r  zOptionKey.is_builtinc                 C  rI  rK  )rn  r7   r#  r   r    r    r!   is_compilerH	  r  zOptionKey.is_compilerc                 C  rI  )z8Convenience method to check if this is a project option.)rn  r7   r$  r   r    r    r!   
is_projectL	  r  zOptionKey.is_projectc                 C  rI  )z5Convenience method to check if this is a base option.)rn  r7   r"  r   r    r    r!   is_baseP	  r  zOptionKey.is_base)r  r$   r  r$   rV  r2   r)  r   r+  r   r.  r/  )rg  r$   r  r   r   r   )r   r1  )r3  r1  r   r   r;  )r   r5  r:  r  )r:  r$   r   r(  )NNNr   r   )r  r   r  r   rV  rA  r)  r   r+  r   r   r(  )r   r(  r   r   )r   r   r   r   	__slots__r   r2   rQ  r   r0  r2  r4  r7  r6  r5  r  r  r   r  r@  rB  rC  rF  rH  rJ  rL  rM  rN  rO  r    r    r    r!   r5     sN   
 









 






r5   filenameobject_nameobject_typeT.Type[_PL]suggest_reconfigurec              
   C  s  | d| d}|rdnd}zt | d}t|}W d    n1 s$w   Y  W n% tjtfy:   t||  tttfyO   t| d| d| w t	||s[t|| t
|drhtd|j}n	td	|jjj}d
dlm}	 d
dlm}
m} |
||	r|||	||S )Nz file z is corrupted.zG Consider reconfiguring the directory with "meson setup --reconfigure".r   rY  zz references functions or classes that don't exist. This probably means that it was generated with an old version of meson.r%   r#   r   r   )r%   )major_versions_differMesonVersionMismatchException)r8  pickleloadZUnpicklingErrorEOFErrorr   r  ModuleNotFoundErrorr  r   hasattrr   r  r%   r   coredatarW  rX  )rR  rS  rT  rV  Zload_fail_msgZ	extra_msgr<  objr%   Zcoredata_versionrW  rX  r    r    r!   rv   U	  s4   


rv   r  	predicateT.Callable[[_T], bool]rl  c                 C  s   | D ]
}||r|  S qdS )a8  Find the first entry in an iterable where the given predicate is true

    :param iter: The iterable to search
    :param predicate: A finding function that takes an element from the iterable
        and returns True if found, otherwise False
    :return: The first found element, or None if it is not found
    Nr    )r  r`  rd  r    r    r!   rW   v	  s
   rW   )F)
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r$   r   r   )r   r   )r   r   r   r   )r   r   r   r   )r>  r?  r@  rA  r   rB  )r>  r?  rD  rE  r   rF  rP  )r  r   r   r   )r  r$   r   r  r  )r  r  r   r  )r  r$   r   r  )r  r$   r  r$   r   r   )r  r$   r  r  r   r  )r  r$   r  r$   r   r   )r  r$   r   r$   )r  )r  r$   r  r$   r   r   )r  r$   r   r$   )r   r$   r   r   )r  r  r   r$   )
r  r  r	  r$   r
  r  r  r  r   r  r   )r  r  r	  r$   r  r  r
  r  r  r  r   r$   )r  )r
  r  r   r  )r@  r$   r  r   r  r  r
  r  r  r  r   r)  )r2  N)r@  r$   r3  r$   r  r  r
  r  r4  r$   r  r  r   r5  )
r>  r?  r@  r   rA  rB  rC  r   r   r   )
rP  r$   r@  r   rA  rQ  rC  r   r   r   )r3  r$   r=  r$   r   r   r  )r_  r   r`  r   r   ra  )re  rf  rg  r)   rh  r   r   ri  )r_  rj  rk  rl  r   rm  )r_  ro  r   r   )r  r  r   rp  )rt  ru  rv  rw  r   rx  )r  r   rK  r   r  r  r   r  r   r  r   r   r   r  )r  )r  r   r   r$   r   r   r   r  )r  r  r  r  r   r   )r  r   rV  r  r   r   )r  r   rV  r  r   r   )r  r   r  r   r   r  )r  r$   r   r   )r<  r$   r   r   )r  r$   r   r   )r   N)r  r$   r  r$   r  r  r   r  )r  r$   r  r   r   r   )r   r$   r  r$   r   r$   )r   r   r  r   r  r   r   r   )r   r   r  r   r  r   r   r   )r  r   r  r   r  r   r   r$   )r  r  r   r  )r  r  r   r  )rg  r(  r   r7   )
rR  r$   rS  r$   rT  rU  rV  r   r   r&   )r  rw  r`  ra  r   rl  )r   
__future__r   pathlibr   argparseenumr  r   r  r   ry  r  r  r   r  r  r  r  	functoolsr   r   r   	itertoolsr   tempfiler	   r
   typingr   r   rY  r  rS  
mesonbuildr   corer   r   TYPE_CHECKINGZtyping_extensionsr   r   Z_typingr   rK  r   r^  r   r   r   Zcompilers.compilersr   Zinterpreterbase.baseobjectsr   r   r#   TypeVarUnionr&   r$   r4   r)   r*   __all__defaultdictr-   r   r   getattrr]  
executabler,   r   r3   r0   r  r+   r]   ry   r   r   r   ra   rA   ABCMetar.   r/   r  r(   rY   rB   IntEnumr2   Genericr9   r;   Optionalr:   r<   rn   rl   ri   r`   rf   rk   ro   rp   rb   rc   rd   rj   re   rh   rg   rm   r_   rT   rD   r   rP   rC   r@   r  r   r   r   r   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r^   r   r  r  r  rz   r   rr   rS   r(  r[   rR   rQ   rI  rJ  rO  r6   r}   rs   rV   r   r   rU   rt   r  r  rw   r  rx   rq   r  r   rZ   r  r   r   r?   rO   r   
MutableSetr8   r|   ru   r{   r1   r  r  ImportErrorr=   r  Actionr>   r\   r~   rX   r7   r*  r,  r5   rv   rW   r    r    r    r!   <module>   sf  8

l
	ZQ$#&#	%1D&,#)<(	# (G/5		
4C
( 5!