a
    ç´«j´  ã                   @  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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ZG dd	„ d	ƒZG d
d„ deƒZdd„ Zdd„ ZdS )é    )ÚannotationsN)ÚPathé   )ÚBackend)ÚTemplate)Úchainc                   @  sœ   e Zd ZdZddddddddddddœdd„Zddœd	d
„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zdd„ ZdS )ÚMesonTemplatez+Template meson build file generation class.Ústrz
list[Path]z	list[str])Ú
modulenameÚsourcesÚdepsÚ	librariesÚlibrary_dirsÚinclude_dirsÚobject_filesÚlinker_argsÚfortran_argsÚ
build_typeÚ
python_exec                 C  s˜   || _ ttƒj ¡ d | _|| _|| _|| _|| _	|d urB|| _
ng | _
i | _|| _dd„ |	D ƒ| _| j| j| j| j| j| jg| _|
| _|| _d| _d S )Nzmeson.build.templatec                 S  s0   g | ](}|  d ¡r| d ¡s(d |› d �n|‘qS )ú')Ú
startswithÚendswith)Ú.0Úx© r   úZ/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/numpy/f2py/_backends/_meson.pyÚ
<listcomp>2   s   ÿz*MesonTemplate.__init__.<locals>.<listcomp>z                     )r
   r   Ú__file__ÚparentÚabsoluteÚbuild_template_pathr   r   r   r   r   ÚsubstitutionsÚobjectsr   Úinitialize_templateÚsources_substitutionÚdeps_substitutionÚinclude_substitutionÚlibraries_substitutionÚfortran_args_substitutionÚpipeliner   r   Úindent)Úselfr
   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__init__   s2    ÿþúzMesonTemplate.__init__©Úreturnc                 C  s.   | j  ¡ s$ttjd| j  ¡ › d�ƒ‚| j  ¡ S )NzMeson build template z does not exist.)r    Úis_fileÚFileNotFoundErrorÚerrnoÚENOENTr   Ú	read_text©r+   r   r   r   Úmeson_build_templateB   s    
ÿþz"MesonTemplate.meson_build_templateÚNonec                 C  s(   | j | jd< | j| jd< | j| jd< d S )Nr
   Z	buildtypeÚpython)r
   r!   r   r   r4   r   r   r   r#   L   s    z!MesonTemplate.initialize_templatec                   s$   d  ‡ fdd„ˆ jD ƒ¡ˆ jd< d S )Nú,
c                   s   g | ]}ˆ j › d |› d�‘qS ©z'''z''',©r*   ©r   Úsourcer4   r   r   r   S   ó    z6MesonTemplate.sources_substitution.<locals>.<listcomp>Zsource_list)Újoinr   r!   r4   r   r4   r   r$   Q   s    ÿz"MesonTemplate.sources_substitutionc                   s,   dˆ j › � ‡ fdd„ˆ jD ƒ¡ˆ jd< d S )Nr8   c                   s   g | ]}ˆ j › d |› d�‘qS )zdependency('z'),r:   )r   Údepr4   r   r   r   X   r=   z3MesonTemplate.deps_substitution.<locals>.<listcomp>Zdep_list)r*   r>   r   r!   r4   r   r4   r   r%   V   s    ÿzMesonTemplate.deps_substitutionc                   s˜   d  dd„ tˆ jƒD ƒ¡ˆ jd< d  dd„ ˆ jD ƒ¡ˆ jd< dˆ j› �  ‡ fdd„ˆ jD ƒ¡ˆ jd< dˆ j› �  ‡ fd	d„ttˆ jƒƒD ƒ¡ˆ jd
< d S )NÚ
c                 S  s"   g | ]\}}d |› d|› d�‘qS )Úlib_dir_z( = declare_dependency(link_args : ['''-Lz'''])r   )r   ÚiÚlib_dirr   r   r   r   ]   s   ÿz8MesonTemplate.libraries_substitution.<locals>.<listcomp>Zlib_dir_declarationsc                 S  s$   g | ]}|  d d¡› d|› d�‘qS )Ú.Ú_z& = declare_dependency(link_args : ['-lz']))Úreplace©r   Úlibr   r   r   r   d   s   ÿZlib_declarationsc                   s$   g | ]}ˆ j › | d d¡› d�‘qS )rD   rE   ú,)r*   rF   rG   r4   r   r   r   k   r=   Zlib_listc                   s   g | ]}ˆ j › d |› d�‘qS )rA   rI   r:   )r   rB   r4   r   r   r   n   r=   Úlib_dir_list)r>   Ú	enumerater   r!   r   r*   ÚrangeÚlenr4   r   r4   r   r'   [   s     þÿ
þÿ
ÿ
ÿz$MesonTemplate.libraries_substitutionc                   s,   dˆ j › � ‡ fdd„ˆ jD ƒ¡ˆ jd< d S )Nr8   c                   s   g | ]}ˆ j › d |› d�‘qS r9   r:   )r   Úincr4   r   r   r   s   r=   z6MesonTemplate.include_substitution.<locals>.<listcomp>Zinc_list)r*   r>   r   r!   r4   r   r4   r   r&   q   s    ÿz"MesonTemplate.include_substitutionc                 C  s@   | j r2| j› dd dd„ | j D ƒ¡› d�| jd< n
d| jd< d S )Nzfortran_args: [z, c                 S  s   g | ]}|‘qS r   r   )r   Úargr   r   r   r   y   r=   z;MesonTemplate.fortran_args_substitution.<locals>.<listcomp>z],r   Ú )r   r*   r>   r!   r4   r   r   r   r(   v   s    "ÿ
z'MesonTemplate.fortran_args_substitutionc                 C  s<   | j D ]
}|ƒ  qt|  ¡ ƒ}| | j¡}t dd|¡}|S )Nz,,rI   )r)   r   r5   Ú
substituter!   ÚreÚsub)r+   ÚnodeÚtemplateZmeson_buildr   r   r   Úgenerate_meson_build~   s    
z"MesonTemplate.generate_meson_buildN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r5   r#   r$   r%   r'   r&   r(   rV   r   r   r   r   r      s   "-
r   c                      s^   e Zd Z‡ fdd„Zddœdd„Zdddœd	d
„Zdd„ Zddœdd„Zddœdd„Z‡  Z	S )ÚMesonBackendc                   sV   t ƒ j|i |¤Ž | j dg ¡| _d| _tdd„ | jD ƒƒr@dnd| _t	| jƒ| _d S )NÚdependenciesZbbdirc                 s  s   | ]}d |v V  qdS )ÚdebugNr   )r   Úflagr   r   r   Ú	<genexpr>�   r=   z(MesonBackend.__init__.<locals>.<genexpr>r]   Úrelease)
Úsuperr,   Z	extra_datÚgetr\   Úmeson_build_dirÚanyÚfc_flagsr   Ú
_get_flags)r+   ÚargsÚkwargs©Ú	__class__r   r   r,   ˆ   s    ÿzMesonBackend.__init__r   )Ú	build_dirc                 C  sv   t |ƒ| j }t| | j› d�¡| | j› d�¡ƒ}|D ]8}t  ¡ |j }| ¡ rZ| ¡  t	 
||¡ t |¡ q8d S )Nz*.soz*.pyd)r   rc   r   Úglobr
   ÚcwdÚnameÚexistsÚunlinkÚshutilÚcopy2ÚosÚremove)r+   rk   Zwalk_dirZpath_objectsZpath_objectÚ	dest_pathr   r   r   Ú_move_exec_to_root‘   s    þzMesonBackend._move_exec_to_rootr6   )rk   r.   c                 C  sf   t | j| j| j| j| j| j| j| j| j	| j
tjƒ}| ¡ }t|ƒjddd� t|ƒd }| |¡ |S )z1Writes the meson build file at specified locationT©ÚparentsÚexist_okzmeson.build)r   r
   r   r\   r   r   r   Úextra_objectsZ
flib_flagsre   r   ÚsysÚ
executablerV   r   ÚmkdirÚ
write_text)r+   rk   Zmeson_templateÚsrcZmeson_build_filer   r   r   Úwrite_meson_build    s$    õ
zMesonBackend.write_meson_buildc                 C  s   t j||dd� d S )NT)rm   Úcheck)Ú
subprocessÚrun)r+   Úcommandrm   r   r   r   Ú_run_subprocess_commandµ   s    z$MesonBackend._run_subprocess_commandc                 C  s6   dd| j g}|  ||¡ ddd| j g}|  ||¡ d S )NÚmesonÚsetupÚcompilez-C)rc   r…   )r+   rk   Zsetup_commandZcompile_commandr   r   r   Ú	run_meson¸   s    zMesonBackend.run_mesonr-   c                 C  s<   t | j| j| jƒ| _|  | j¡ |  | j¡ |  | j¡ d S )N)Ú_prepare_sourcesr
   r   rk   r€   r‰   rv   r4   r   r   r   rˆ   ¾   s    zMesonBackend.compile)
rW   rX   rY   r,   rv   r€   r…   r‰   rˆ   Ú__classcell__r   r   ri   r   r[   ‡   s   	r[   c                 C  sÂ   |  ¡ }t|ƒjddd� |D ](}t|ƒ ¡ rt|ƒ ¡ rt  ||¡ qt| › d�ƒt| › d�ƒt| › d�ƒg}t|ƒ}|D ]2}| ¡ r|t  |||j ¡ | |j¡ | ¡  q|dd„ |D ƒ}|S )NTrw   zmodule.cz-f2pywrappers2.f90z-f2pywrappers.fc                 S  s$   g | ]}t |ƒjd kst |ƒj‘qS )z.pyf)r   Úsuffixrn   r;   r   r   r   r   ×   s   þz$_prepare_sources.<locals>.<listcomp>)	Úcopyr   r}   ro   r/   rq   rn   Úappendrp   )Zmnamer   ÚbdirZextended_sourcesr<   Zgenerated_sourcesZgenerated_sourcer   r   r   rŠ   Å   s&    ý
þrŠ   c                 C  sb   g }t  d¡}| D ]<}| |¡}|r| d¡ ¡  ¡ }dd„ |D ƒ}| |¡ qtt 	|¡ƒ}|S )Nz--f(77|90)flags=(.*)é   c                 S  s   g | ]}|  d ¡‘qS )z'")Ústrip)r   Úvalr   r   r   r   æ   r=   z_get_flags.<locals>.<listcomp>)
rR   rˆ   ÚmatchÚgroupr‘   ÚsplitÚextendÚlistÚdictÚfromkeys)re   Zflag_valuesZflag_patternr^   Zmatch_resultÚvaluesZunique_flagsr   r   r   rf   ß   s    

rf   )Ú
__future__r   rs   r1   rq   r‚   r{   rR   Úpathlibr   Z_backendr   Ústringr   Ú	itertoolsr   Úwarningsr   r[   rŠ   rf   r   r   r   r   Ú<module>   s   u>