o
    1Y e                     @  sz   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ZG dd dZG d	d
 d
eZdd ZdS )    )annotationsN)Path   )Backend)Templatec                   @  sJ   e Zd ZdZdddZdddZdddZdddZdddZdd Z	dS )MesonTemplatez+Template meson build file generation class.
modulenamestrsources
list[Path]deps	list[str]object_fileslinker_argsc_args
build_typec                 C  sN   || _ ttj d | _|| _|| _i | _|| _	| j
| j| jg| _|| _d S )Nzmeson.build.template)r   r   __file__parentabsolutebuild_template_pathr
   r   substitutionsobjectsinitialize_templatesources_substitutiondeps_substitutionpipeliner   )selfr   r
   r   r   r   r   r    r   J/var/www/myenv/lib/python3.10/site-packages/numpy/f2py/_backends/_meson.py__init__   s   

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_template*   s   

z"MesonTemplate.meson_build_templateNonec                 C  s   | j | jd< | j| jd< d S )Nr   	buildtype)r   r   r   r&   r   r   r   r   4   s   z!MesonTemplate.initialize_templatec                 C  *   d}d|  dd | jD | jd< d S )N                     ,
c                 S  s   g | ]}d | d qS )'r   .0sourcer   r   r   
<listcomp>;       z6MesonTemplate.sources_substitution.<locals>.<listcomp>source_list)joinr
   r   r   indentr   r   r   r   8      
z"MesonTemplate.sources_substitutionc                 C  r*   )Nr+   r,   c                 S  s   g | ]}d | dqS )zdependency('z')r   )r/   depr   r   r   r1   A   r2   z3MesonTemplate.deps_substitution.<locals>.<listcomp>dep_list)r4   r   r   r5   r   r   r   r   >   r7   zMesonTemplate.deps_substitutionc                 C  s*   | j D ]}|  qt|  }|| jS N)r   r   r'   
substituter   )r   nodetemplater   r   r   generate_meson_buildD   s   
z"MesonTemplate.generate_meson_buildN)r   r	   r
   r   r   r   r   r   r   r   r   r   r   r	   )r    r	   r    r(   )
__name__
__module____qualname____doc__r   r'   r   r   r   r>   r   r   r   r   r      s    





r   c                      sL   e Zd Z fddZdddZdd ZdddZdddZdddZ  Z	S )MesonBackendc                   sP   t  j|i | | jdg | _d| _tdd | jD r#d| _d S d| _d S )Ndependenciesbbdirc                 s  s    | ]}d |v V  qdS )debugNr   )r/   flagr   r   r   	<genexpr>Q   s    z(MesonBackend.__init__.<locals>.<genexpr>rG   release)	superr   	extra_datgetrE   meson_build_diranyfc_flagsr   )r   argskwargs	__class__r   r   r   L   s   zMesonBackend.__init__	build_dirr   c                 C  s>   t || j }|| j d}|D ]
}t|t   qd S )Nz*.so)r   rN   globr   shutilmovecwd)r   rU   walk_dirpath_objectspath_objectr   r   r   _move_exec_to_rootT   s
   zMesonBackend._move_exec_to_rootc                 C  s   dd| j gS )Nmesonsetup)rN   r&   r   r   r   _get_build_commandZ   s   zMesonBackend._get_build_commandr    r(   c                 C  sV   t | j| j| j| j| j| j| 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
   rE   extra_objects
flib_flagsrP   r   r>   r   mkdir
write_text)r   rU   meson_templatesrcmeson_build_filer   r   r   write_meson_builda   s   	
zMesonBackend.write_meson_buildc                 C  sb   t j|  |d}|jdkrt |j|jt jddd| jg|d}|jdkr/t |j|jd S )N)rY   r   r^   compilez-C)
subprocessrunr`   
returncodeCalledProcessErrorrQ   rN   )r   rU   completed_processr   r   r   	run_mesonr   s   

zMesonBackend.run_mesonc                 C  s<   t | j| j| j| _| | j | | j | | j d S r:   )_prepare_sourcesr   r
   rU   rk   rr   r]   r&   r   r   r   rl      s   zMesonBackend.compile)rU   r   )rU   r   r    r(   r?   )
r@   rA   rB   r   r]   r`   rk   rr   rl   __classcell__r   r   rS   r   rD   K   s    


rD   c                 C  s   |  }t|jddd |D ]}t || qt|  dt|  dt|  dg}t|}|D ]}| rKt |||j  ||j |  q2dd |D }|S )NTra   zmodule.cz-f2pywrappers2.f90z-f2pywrappers.fc                 S  s$   g | ]}t |jd kst |jqS )z.pyf)r   suffixnamer.   r   r   r   r1      s
    z$_prepare_sources.<locals>.<listcomp>)copyr   rf   rW   existsrv   appendunlink)mnamer
   bdirextended_sourcesr0   generated_sourcesgenerated_sourcer   r   r   rs      s&   rs   )
__future__r   r#   rW   rm   pathlibr   _backendr   stringr   warningsr   rD   rs   r   r   r   r   <module>   s    =<