o
    Df                     @  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                   @  sh   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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]	librarieslibrary_dirsinclude_dirsobject_fileslinker_argsfortran_args
build_type
python_exec                 C  s   || _ ttj d | _|| _|| _|| _|| _	|d ur!|| _
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/home/ubuntu/webapp/venv/lib/python3.10/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	   	buildtypepython)r	   r#   r   r   r5   r   r   r   r%   L   s   z!MesonTemplate.initialize_templatec                   s$   d  fdd jD  jd< d S )N,
c                      g | ]} j  d | dqS z'''z''',r,   r   sourcer5   r   r   r   S       z6MesonTemplate.sources_substitution.<locals>.<listcomp>source_list)joinr   r#   r5   r   r5   r   r&   Q   s   z"MesonTemplate.sources_substitutionc                   ,   d j   fdd jD  jd< d S )Nr:   c                   r;   )zdependency('z'),r=   )r   depr5   r   r   r   X   r@   z3MesonTemplate.deps_substitution.<locals>.<listcomp>dep_list)r,   rB   r   r#   r5   r   r5   r   r'   V      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>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    lib_declarationsc                   s$   g | ]} j  |d d dqS )rL   rM   ,)r,   rN   rO   r5   r   r   r   k   s   $ lib_listc                   r;   )rH   rR   r=   )r   rI   r5   r   r   r   n   r@   lib_dir_list)rB   	enumerater   r#   r   r,   rangelenr5   r   r5   r   r)   [   s    


z$MesonTemplate.libraries_substitutionc                   rC   )Nr:   c                   r;   r<   r=   )r   incr5   r   r   r   s   r@   z6MesonTemplate.include_substitution.<locals>.<listcomp>inc_list)r,   rB   r   r#   r5   r   r5   r   r(   q   rF   z"MesonTemplate.include_substitutionc                 C  sB   | j r| j dddd | j D  d| jd< d S d| jd< d S )Nzfortran_args: [z, c                 S  s   g | ]}|qS r   r   )r   argr   r   r   r   y   s    z;MesonTemplate.fortran_args_substitution.<locals>.<listcomp>z],r    )r   r,   rB   r#   r5   r   r   r   r*   v   s   "z'MesonTemplate.fortran_args_substitutionc                 C  s<   | j D ]}|  qt|  }|| j}tdd|}|S )Nz,,rR   )r+   r   r6   
substituter#   resub)r-   nodetemplatemeson_buildr   r   r   generate_meson_build~   s   
z"MesonTemplate.generate_meson_buildN)r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r
   )r/   r
   r/   r7   )__name__
__module____qualname____doc__r.   r6   r%   r&   r'   r)   r(   r*   rb   r   r   r   r   r      s    

-






r   c                      sL   e Zd Z fddZdddZdd	d
Zdd ZdddZ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dependenciesbbdirc                 s  s    | ]}d |v V  qdS )debugNr   )r   flagr   r   r   	<genexpr>   s    z(MesonBackend.__init__.<locals>.<genexpr>rk   release)
superr.   	extra_datgetri   meson_build_diranyfc_flagsr   
_get_flags)r-   argskwargs	__class__r   r   r.      s   zMesonBackend.__init__	build_dirr   c                 C  sv   t || j }t|| j d|| j d}|D ]}t  |j }| r-|  t	
|| t| qd S )Nz*.soz*.pyd)r   rr   r   globr	   cwdnameexistsunlinkshutilcopy2osremove)r-   rz   walk_dirpath_objectspath_object	dest_pathr   r   r   _move_exec_to_root   s   zMesonBackend._move_exec_to_rootr/   r7   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   ri   r   r   r   extra_objects
flib_flagsrt   r   sys
executablerb   r   mkdir
write_text)r-   rz   meson_templatesrcmeson_build_filer   r   r   write_meson_build   s$   
zMesonBackend.write_meson_buildc                 C  s   t j||dd d S )NT)r|   check)
subprocessrun)r-   commandr|   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)rr   r   )r-   rz   setup_commandcompile_commandr   r   r   	run_meson   s   zMesonBackend.run_mesonc                 C  s<   t | j| j| j| _| | j | | j | | j d S )N)_prepare_sourcesr	   r   rz   r   r   r   r5   r   r   r   r      s   zMesonBackend.compile)rz   r   )rz   r   r/   r7   rc   )
rd   re   rf   r.   r   r   r   r   r   __classcell__r   r   rx   r   rh      s    
	

rh   c                 C  s   |  }t|jddd |D ]}t| r#t| r#t || qt|  dt|  dt|  dg}t|}|D ]}| rWt |||j  ||j |  q>dd |D }|S )NTr   zmodule.cz-f2pywrappers2.f90z-f2pywrappers.fc                 S  s$   g | ]}t |jd kst |jqS )z.pyf)r   suffixr}   r>   r   r   r   r      s
    z$_prepare_sources.<locals>.<listcomp>)	copyr   r   r~   r0   r   r}   appendr   )mnamer   bdirextended_sourcesr?   generated_sources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      s    z_get_flags.<locals>.<listcomp>)
r]   r   matchgroupr   splitextendlistdictfromkeys)rt   flag_valuesflag_patternrl   match_resultvaluesunique_flagsr   r   r   ru      s   


ru   )
__future__r   r   r2   r   r   r   r]   pathlibr   _backendr   stringr   	itertoolsr   warningsr   rh   r   ru   r   r   r   r   <module>   s     u>