o
    e/6                     @  s  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	m
Z
mZmZmZ ddl	mZmZ 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 ddlmZmZ ddlmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ej+rd dl,m-Z- ddl	m.Z. ddl/m0Z0 ddlm1Z1m2Z2 ddl3m4Z4 ddlm5Z5 ddl"m6Z6 ddl7m8Z8 G dd de-Z9G dd de-Z:G dd deZ;G dd de
Z<d%d#d$Z=dS )&    )annotations)PathN   )ExtensionModuleModuleReturnValueNewExtensionModule
ModuleInfo   )mlogbuild)CFLAGS_MAPPING)ENV_VAR_PROG_MAP)InternalDependency)PkgConfigInterface)
FeatureNew)ENV_KW
DEPENDS_KW)ContainerTypeInfo	KwargInfotyped_kwargstyped_pos_args)EnvironmentExceptionMesonException
Popen_safeMachineChoiceget_variable_regexdo_replacement	join_args	OptionKey)	TypedDict)ModuleState)ImmutableListProtocol)BuildTargetCustomTarget)Interpreter)TYPE_var)EnvironmentVariables)EnvironOrDictc                   @  s   e Zd ZU ded< dS )
DependencystrsubdirN__name__
__module____qualname____annotations__ r0   r0   H/usr/lib/python3.10/site-packages/mesonbuild/modules/external_project.pyr(   -   s   
 r(   c                   @  s6   e Zd ZU ded< ded< ded< ded< ded	< d
S )
AddProjectT.List[str]configure_optionscross_configure_optionsboolverboser&   envz*T.List[T.Union[BuildTarget, CustomTarget]]dependsNr+   r0   r0   r0   r1   r2   1   s   
 r2   c                      s   e Zd ZU ded< d4 fddZd5ddZd6ddZd7ddZd8ddZd9d$d%Z	d:d'd(Z
ed)eed)ed*ed+d,d;d2d3Z  ZS )<ExternalProjectzImmutableListProtocol[str]makestate'ModuleState'configure_commandr)   r4   r3   r5   r8   r&   r7   r6   extra_depends.T.List[T.Union['BuildTarget', 'CustomTarget']]c                   s  t    | jd| ji t|j| _|j| _|j| _|j	| _
|j| _|j| _|| _|| _|| _|| _|| _t| j
 | j| _t| j
 | jd| _t| j
 | jd| _| j
jtd}t|tsiJ dt|| _| j
jtd}	t|	tsJ dt|	| _| j
jtd}
t|
tsJ dt|
| _| jj| _| jj r| j!| jj | _| j!| jj"| _#| $| | %|| _&d S )NZ
dependencyr   distprefixfor mypylibdir
includedir)'super__init__methodsupdatedependency_methodr   r*   project_version
subprojectenvironmentr8   build_machinehost_machiner>   r4   r5   r7   user_envZget_source_dirsrc_dirZget_build_dir	build_dirinstall_dircoredataZ
get_optionr   
isinstancer)   rB   rD   rE   namedriverelative_toroot
rel_prefix
_configure_create_targetstargets)selfr<   r>   r4   r5   r8   r7   r?   Z_p_lZ_i	__class__r0   r1   rG   >   s>   





zExternalProject.__init__returnNonec                   sZ  | j dkr/tdd| j|j |d}| }|ddt| jg7 }| j	}| dg | _
nt| j	| j }|| }| }| j}|d | _
dd	| j fd
d| j fdd | j fg}| || || | j|7 }| j rd| jj| jj| jj}dd |fg}|| | j|7 }g }	g }
tj | _| jjj t!j" # D ]T\ }t$ fddt%t&fD rq| jj't!j" }t(|t)sJ d| *|+ | jt%  < | *|| jt&  < |	s|, }	| jj-t!j" }t(|t)sJ d|}
q|	r	 | *|
| jd< | j./| j| _t0j1| j| jt!j"dd| _| jj2ddd | 3d|| d S )NwafzWaf external projectz0.60.0	configurez-or   r;   PREFIXz--prefix=@PREFIX@LIBDIRz--libdir=@PREFIX@/@LIBDIR@
INCLUDEDIRz{}-{}-{}HOSTc                 3  s    | ]} |vV  qd S Nr0   .0ilangr0   r1   	<genexpr>       z-ExternalProject._configure.<locals>.<genexpr>rC   LDFLAGST)Zuninstalled)parentsexist_ok)4r>   r   userL   current_nodeZfind_programZget_commandr)   rR   rQ   r;   r   as_posixrB   rD   rE   _validate_configure_options_format_optionsr4   r8   Zis_cross_buildformatrO   Z
cpu_familyrN   systemr5   osenvironcopyrun_envrT   	compilersr   ri   itemsanyr   r   Zget_external_argsrU   list_quote_and_joinZget_exelistZget_linker_exelistZget_external_link_argsrP   Zget_envr   Z	setup_envmkdir_run)r^   r<   rd   Zconfigure_cmdworkdirZconfigure_pathZconfigure_progdhostZlink_exelist	link_argscompilerZcargsr_   r0   rn   r1   r[   q   sd   



zExternalProject._configurearrayc                 C  s   d dd |D S )N c                 S  s   g | ]}t |qS r0   )shlexquoterk   r0   r0   r1   
<listcomp>   s    z3ExternalProject._quote_and_join.<locals>.<listcomp>)join)r^   r   r0   r0   r1   r      s   zExternalProject._quote_and_join	variablesT.List[T.Tuple[str, str, str]]c                 C  sd   |D ]-\}}}|d u rqd| d}| j D ]}||v r nqtdd| j|j | j | qd S )N@zDefault configure_optionz0.57.0)r4   r   ru   rL   rv   append)r^   r   r<   keydefaultvalZ
key_formatoptionr0   r0   r1   rx      s   
z+ExternalProject._validate_configure_optionsoptionsc                 C  s   g }t  }td}dd |D }|D ]}t||d|\}}	||	 || q|r>ddd t|D }
td|
 d|S )	NZmesonc                 S  s   i | ]
\}}}||d fqS rj   r0   )rl   k_vr0   r0   r1   
<dictcomp>   s    z3ExternalProject._format_options.<locals>.<dictcomp>z, c                 s  s    | ]}t |V  qd S rj   )repr)rl   mr0   r0   r1   rp      rq   z2ExternalProject._format_options.<locals>.<genexpr>z
Variables z" in configure options are missing.)setr   r   rI   r   r   sortedr   )r^   r   r   outmissingZregexZconfdataoargZmissing_varsZvar_listr0   r0   r1   ry      s   

zExternalProject._format_optionsstepcommandr   r   c           	      C  s   t d| j dt | dt| d t| d }tt  | j d| d}d }| jsBt|dd	d
}|	|d  |
  nt | t||| jtj|d^}}|jdkrq| d|j d}| jsm|dt| 7 }t|d S )NzExternal project :zRunning command z in directory 
-z.logwzutf-8)encoding)cwdr8   stderrstdoutr   z step returned error code .z
See logs: )r
   logrV   Zboldr)   r   get_log_dirr7   openwriteflushr   r   
subprocessSTDOUT
returncoder   )	r^   r   r   r   r   Zlog_filenameoutputpr   r0   r0   r1   r      s&   




zExternalProject._runT.List['TYPE_var']c                 C  s   | j  }|ddd| jd| j d| j d| j dt dt	| j
g7 }| jr.|d	 tj| j| j | j| j |d
dg g | j dg| j dd|dd| _tj| j td| j ddd d dd| jd	}| j|gS )Nz
--internalZexternalprojectz--namez--srcdirz
--builddirz--installdirz--logdirz--makez	--verbosez@OUTPUT@z	@DEPFILE@z.stampz.dTzGenerating external project {})ZdepfileZconsoler?   descriptionrA   r   F)rS   Zinstall_dir_nameZinstall_modeexcludeZstrip_directoryZfrom_source_dirrL   )r8   Zget_build_commandrV   rQ   rw   rR   rS   r
   r   r   r;   r7   r   r   r#   r*   rL   targetZ
InstallDirr   rZ   )r^   r?   cmdZidirr0   r0   r1   r\      sF   









zExternalProject._create_targetszexternal_project.dependencyr*    r   argsT.Tuple[str]kwargs'Dependency'r   c                 C  s   |d }t | j| j| j}|d rt ||d }t | j| j| j}| j}d| g}d| d| g}	| j}
t|g ||	g g |
gg g i g g g }|S )Nr   r*   z-Iz-Lz-l)r   rS   rZ   rE   rD   rK   r   r   )r^   r<   r   r   libnameZabs_includedirZ
abs_libdirversionZcompile_argsr   sourcesdepr0   r0   r1   rJ   
  s   z!ExternalProject.dependency_method)r<   r=   r>   r)   r4   r3   r5   r3   r8   r&   r7   r6   r?   r@   )r<   r=   rb   rc   )r   r3   rb   r)   )r   r   r<   r=   rb   rc   )r   r3   r   r   rb   r3   )r   r)   r   r3   r   r   rb   rc   )r?   r@   rb   r   )r<   r=   r   r   r   r   rb   r   )r,   r-   r.   r/   rG   r[   r   rx   ry   r   r\   r   r)   r   r   rJ   __classcell__r0   r0   r`   r1   r:   :   s   
 
3
>



'r:   c                
      s   e Zd ZeddddZd fddZed	eed
e	de
eeg dde	de
eedgdde	deddeejdddddZ  ZS ) ExternalProjectModulezExternal build systemz0.56.0T)Zunstableinterpreter'Interpreter'c                   s"   t  | | jd| ji d S )Nadd_project)rF   rG   rH   rI   r   )r^   r   r`   r0   r1   rG   !  s   zExternalProjectModule.__init__z external_project_mod.add_projectzexternal_project.add_projectr4   )r   Zlistifyr5   z--host=@HOST@r7   Fr   z0.63.0)Zsincer<   r=   r   r   r   'AddProject'rb   r   c              	   C  s<   |d }t |||d |d |d |d |d }t||jS )Nr   r4   r5   r8   r7   r9   )r:   r   r]   )r^   r<   r   r   r>   projectr0   r0   r1   r   &  s   
z!ExternalProjectModule.add_project)r   r   )r<   r=   r   r   r   r   rb   r   )r,   r-   r.   r   INFOrG   r   r)   r   r   r   r   r6   r   r   Zevolver   r   r0   r0   r`   r1   r     s    
r   interpr   rb   c                 C  s   t | S rj   )r   )r   r0   r0   r1   
initialize;  s   r   )r   r   rb   r   )>
__future__r   pathlibr   r|   r   r   typingTr   r   r   r   r   r
   r   Zcompilers.compilersr   Z	envconfigr   dependenciesr   Zdependencies.pkgconfigr   Zinterpreterbaser   Zinterpreter.type_checkingr   r   Zinterpreterbase.decoratorsr   r   r   r   Zmesonlibr   r   r   r   r   r   r   r   TYPE_CHECKINGtyping_extensionsr   r    Z_typingr!   r"   r#   r   r$   r%   r&   Z
utils.corer'   r(   r2   r:   r   r   r0   r0   r0   r1   <module>   s>   (	 d