o
    e	#                     @  s  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 ddl	m
Z
mZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ejrSddlmZ ddlmZ ddlmZ ee
je
je
jhd#ddZeed< G dd deZG dd deZG dd  d eZ G d!d" d"eZ!dS )$    )annotationsN   )detect_cpu_family   )DependencyMethodsdetect_compilerSystemDependency)ConfigToolDependency)packages)factory_methods)PkgConfigDependency)DependencyGenerator)Environment)MachineChoiceenv'Environment'for_machine'MachineChoice'kwargsT.Dict[str, T.Any]methodsT.List[DependencyMethods]returnT.List['DependencyGenerator']c              	   C  s  | dd}|dvrg S g }td| ||}|sg S | dv }tj|v rI|sId }|dkr/d}n|dkr6d}n|d	kr<d
}|tjt|| ||d tj	|v r|
 }	|r| j|  rcd|	d< d|	d< |dkrptj ddg}
n|dkr}tj ddg}
n|d	krtj ddg}
t}n0|dkrtj ddg}
n!|dkrtj ddddg}
n|d	krdd dD }
|
g d t}d d |
D }
|
sJ |
|	d!< |tj||
d" | |	|d tj|v r|tjtd#| ||d |S )$Nlanguagec>   fortrancppr   mpi>   intel-clintelzompi-cr   zompi-cxxr   z	ompi-fortr   -vversion_arg   Zreturncode_valueZI_MPI_CCZmpiiccZ	I_MPI_CXXZmpiicpcZ	I_MPI_F90ZmpiifortZMPICCZmpiccZMPICXXzmpic++ZmpicxxZmpiCCc                 S  s   g | ]}t j|qS  )osenvironget).0er%   r%   @/usr/lib/python3.10/site-packages/mesonbuild/dependencies/mpi.py
<listcomp>W   s    zmpi_factory.<locals>.<listcomp>)ZMPIFCZMPIF90ZMPIF77)ZmpifortZmpif90Zmpif77c                 S  s   g | ]}|r|qS r%   r%   )r)   tr%   r%   r+   r,   \   s    toolsr   msmpi)r(   r   Zget_idr   	PKGCONFIGappend	functoolspartialr   CONFIG_TOOLcopymachines
is_windowsr&   r'   IntelMPIConfigToolDependencyextendOpenMPIConfigToolDependencySYSTEMMSMPIDependency)r   r   r   r   r   
candidatescompilerZcompiler_is_intelpkg_nameZnwargsZ
tool_namesclsr%   r%   r+   mpi_factory"   sf   



rA   r   c                   @  s*   e Zd ZdddZdddZdddZdS )_MPIConfigToolDependencyargsT.List[str]r   c                 C  s   g }d}| j dkr| jjj| j d }|| 7 }d}|D ]0}|d| s8|dks8|drD|dkrD|dsD|| ||v rCd	}q|rMd}|| q|S )
r
        MPI wrappers return a bunch of garbage args.
        Drop -O2 and everything that is not needed.
        )-Ir   F)z-Dz-f-pthread-W-Wall-WerrorT)r   r   coredata	compilersr   Zget_module_incdir_args
startswithr1   )selfrC   resultZ
multi_argsZfcinclude_nextfr%   r%   r+   _filter_compile_argsn   s(   


z-_MPIConfigToolDependency._filter_compile_argsc                 C  sJ   g }d}|D ]}|  |r|| |dv rd}q|r"d}|| q|S )rE   F>   -Xlinker-LT)_is_link_argr1   )rN   rC   rO   rP   rQ   r%   r%   r+   _filter_link_args   s   


z*_MPIConfigToolDependency._filter_link_argsrQ   strboolc                 C  sX   | j jdkr|dkp|dp|dS |dp+|dkp+|do+|dko+|d	 S )
Nr   z/linkz/LIBPATHz.lib)rT   -lrS   rG   rH   rI   rJ   )Zclib_compileridrM   endswith)rN   rQ   r%   r%   r+   rU      s   
z%_MPIConfigToolDependency._is_link_argN)rC   rD   r   rD   )rQ   rW   r   rX   )__name__
__module____qualname__rR   rV   rU   r%   r%   r%   r+   rB   l   s    

rB   c                      4   e Zd ZdZdZ	dd fddZdddZ  ZS )r8   z*Wrapper around Intel's mpiicc and friends.r"   NnamerW   r   r   r   r   r   T.Optional[str]c                   sH   t  j||||d | jsd S | dgd}| || _| || _d S )Nr!   z-showzlink and compile argssuper__init__is_foundZget_config_valuerR   compile_argsrV   	link_args)rN   r`   r   r   r   rC   	__class__r%   r+   rd      s   z%IntelMPIConfigToolDependency.__init__outr   c                 C  s,   t d|}|rd|d|dS |S )Nz(\d{4}) Update (\d)z{}.{}r   r   )researchformatgrouprN   rj   vr%   r%   r+   _sanitize_version   s   z.IntelMPIConfigToolDependency._sanitize_versionNr`   rW   r   r   r   r   r   ra   rj   rW   r   rW   r\   r]   r^   __doc__r#   rd   rq   __classcell__r%   r%   rh   r+   r8      s    
r8   c                      r_   )r:   z)Wrapper around OpenMPI mpicc and friends.z--showme:versionNr`   rW   r   r   r   r   r   ra   c                   sV   t  j||||d | jsd S | dgd}| || _| dgd}| || _d S )Nr!   z--showme:compilerf   z--showme:linkrg   rb   )rN   r`   r   r   r   Zc_argsZl_argsrh   r%   r+   rd      s   z$OpenMPIConfigToolDependency.__init__rj   r   c                 C  s   t d|}|r|dS |S )Nz\d+.\d+.\d+r   )rk   rl   rn   ro   r%   r%   r+   rq      s   
z-OpenMPIConfigToolDependency._sanitize_versionrr   rs   rt   ru   r%   r%   rh   r+   r:      s    r:   c                      s&   e Zd ZdZ	dd fddZ  ZS )r<   zThe Microsoft MPI.Nr`   rW   r   r   r   r   r   ra   c           	        s  t  j||||d |dvrd| _d S | jj| j  sd S tj	d}t
| jjjj}d }|dkr;tj	d}d}n|dkrGtj	d}d	}|d u sO|d u rTd| _d S d
| _dtj|d g| _d| dtj|| g| _| jdkr| jdtj|d  d S d S )Nr!   >   Nr   r   FZ	MSMPI_INCx86ZMSMPI_LIB32x86_64ZMSMPI_LIB64x64TrY   r/   rF   r   Zmsmpifec)rc   rd   re   r   r6   r   r7   r&   r'   r(   r   rK   rL   hostpathjoinrg   rf   r   r1   )	rN   r`   r   r   r   incdirarchlibdirpostrh   r%   r+   rd      s0   
zMSMPIDependency.__init__rr   rs   )r\   r]   r^   rv   rd   rw   r%   r%   rh   r+   r<      s    r<   )
r   r   r   r   r   r   r   r   r   r   )"
__future__r   r2   typingTr&   rk   environmentr   baser   r   r   Z
configtoolr	   detectr
   factoryr   Z	pkgconfigr   TYPE_CHECKINGr   r   Zmesonlibr   r0   r4   r;   rA   rB   r8   r:   r<   r%   r%   r%   r+   <module>   s,   F4