o
    e                     @  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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 ejrQddlmZ ddlmZ ddlmZ eejejhdddZeed< G dd deZdS )    )annotations)PathN   )	OptionKey   )DependencyMethods)CMakeDependency)packages)PkgConfigDependency)factory_methods)Environment)MachineChoice)DependencyGeneratorenv'Environment'for_machine'MachineChoice'kwargsT.Dict[str, T.Any]methodsT.List[DependencyMethods]returnT.List['DependencyGenerator']c              	   C  s   g }t j|v r4|d| jtd}|rdnd}|tt	|| | dD ]}|tt
|| | q&t j|v rD|ttd| | |S )NstaticZprefer_staticzmkl-static-lp64-iompzmkl-dynamic-lp64-iomp)zscalapack-openmpi	scalapackZ	Scalapack)r   	PKGCONFIGgetZcoredataZ
get_optionr   append	functoolspartialMKLPkgConfigDependencyr
   CMAKEr   )r   r   r   r   
candidatesZ
static_optZmklpkg r$   F/usr/lib/python3.10/site-packages/mesonbuild/dependencies/scalapack.pyscalapack_factory"   s    

r&   r   c                      s>   e Zd ZdZ	dd fddZd fddZdddZ  ZS )r    zPkgConfigDependency for Intel MKL.

    MKL's pkg-config is pretty much borked in every way. We need to apply a
    bunch of fixups to make it work correctly.
    Nnamestrr   r   r   r   languageT.Optional[str]c                   s   t jd}|rt| nd | _t j||||d | jr,|j| j	 
 r/| jjdkr/d| _| js4d S | jdks=J d| jdkrx| jddd	}|sj| jrjz| j d
d ddd }W n	 tyi   Y nw |rzt|tssJ || _d S d S d S )NZMKLROOT)r)   gccF z0This should not happen if we didn't return aboveunknownVersion)	pkgconfigdefault_valueZcompilers_and_libraries_r   /r   )osenvironr   r   resolve _MKLPkgConfigDependency__mklrootsuper__init__machinesr   
is_windowsclib_compileridZis_foundversionZget_variableas_posixsplit
IndexError
isinstancer(   )selfr'   r   r   r)   _mv	__class__r$   r%   r7   C   s6   



zMKLPkgConfigDependency.__init__r   Nonec                   sH  t    | jj| j  rd}n| jrd}nd}| jd }| jj	dkrLt
| jD ]"\}}tj|\}}d|v rK|dd}d	tj|| | j|< q)d
}t
| jD ]\}}|dra|d }qS|dkrg nqS| jj| j  st| jr| j|t|d|   | j|d t|d|   d S | j|d | j|d d d S )Nz.libz.ar,   zlib/intel64r+   Zmkl_intel_lp64intelZgfr1   r   )z-Lz-Wlr      Zmkl_scalapack_lp64Zmkl_blacs_intelmpi_lp64z-lmkl_scalapack_lp64z-lmkl_blacs_intelmpi_lp64)r6   	_set_libsr   r8   r   r9   r   r5   r:   r;   	enumerateZ	link_argsr2   pathr>   replacejoin
startswithinsertr(   )rA   suffixlibdiriadirnamebasenamejrD   r$   r%   rI   l   s<   



z MKLPkgConfigDependency._set_libsc                 C  sB   d}| j dkr	d}| jj| j|d| j ffd}| || _d S )NFZfortranTprefix)Zdefine_variable)r)   r/   cflagsr'   r5   r=   Z_convert_mingw_pathsZcompile_args)rA   Zallow_systemrX   r$   r$   r%   
_set_cargs   s
   
 z!MKLPkgConfigDependency._set_cargs)N)r'   r(   r   r   r   r   r)   r*   )r   rF   )__name__
__module____qualname____doc__r7   rI   rY   __classcell__r$   r$   rD   r%   r    ;   s    )%r    )
r   r   r   r   r   r   r   r   r   r   )
__future__r   pathlibr   r   r2   typingTZmesonlibr   baser   Zcmaker   detectr	   r/   r
   factoryr   TYPE_CHECKINGenvironmentr   r   r   r   r!   r&   r    r$   r$   r$   r%   <module>   s&   