a
    Lf                     @  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   T/var/www/ai-form-bot/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>