o
    e                     @  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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S )    )annotationsN)Path   )Backend)Template)chainc                   @  s^   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! 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c_args
build_type
python_exec                 C  s~   || _ ttj d | _|| _|| _|| _|| _	|d ur!|| _
ng | _
i | _|| _| j| j| j| j| jg| _|
| _|| _d S )Nzmeson.build.template)r	   r   __file__parentabsolutebuild_template_pathr   r   r   r   r   substitutionsobjectsinitialize_templatesources_substitutiondeps_substitutioninclude_substitutionlibraries_substitutionpipeliner   r   )selfr	   r   r   r   r   r   r   r   r   r   r    r$   N/var/www/html/venv/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< | j| jd< d S )Nr	   	buildtypepython)r	   r   r   r   r-   r$   r$   r%   r   D   s   z!MesonTemplate.initialize_templatec                   .   d d    fdd| jD | jd< d S )N                     ,
c                      g | ]
}  d | d qS 'r$   .0sourceindentr$   r%   
<listcomp>L       z6MesonTemplate.sources_substitution.<locals>.<listcomp>source_list)joinr   r   r-   r$   r;   r%   r   I      
z"MesonTemplate.sources_substitutionc                   r2   )Nr3   r4   c                      g | ]
}  d | dqS )zdependency('z')r$   )r9   depr;   r$   r%   r=   R   r>   z3MesonTemplate.deps_substitution.<locals>.<listcomp>dep_list)r@   r   r   r-   r$   r;   r%   r   O   rA   zMesonTemplate.deps_substitutionc                   s   d dd t| jD | jd< d dd | jD | jd< d d    fdd| jD | jd	< d    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 : ['-L'])r$   )r9   ilib_dirr$   r$   r%   r=   W   s    z8MesonTemplate.libraries_substitution.<locals>.<listcomp>lib_dir_declarationsc                 S  s   g | ]
}| d | dqS )z& = declare_dependency(link_args : ['-lrG   r$   r9   libr$   r$   r%   r=   ^   s    lib_declarationsr3   c                   s   g | ]	}  | d qS ),r$   rK   r;   r$   r%   r=   f   s    lib_listc                   rB   )rF   rN   r$   )r9   rH   r;   r$   r%   r=   i   r>   lib_dir_list)r@   	enumerater   r   r   rangelenr-   r$   r;   r%   r!   U   s"   




z$MesonTemplate.libraries_substitutionc                   r2   )Nr3   r4   c                   r5   r6   r$   )r9   incr;   r$   r%   r=   o   r>   z6MesonTemplate.include_substitution.<locals>.<listcomp>inc_list)r@   r   r   r-   r$   r;   r%   r    l   rA   z"MesonTemplate.include_substitutionc                 C  s*   | j D ]}|  qt|  }|| jS N)r"   r   r.   
substituter   )r#   nodetemplater$   r$   r%   generate_meson_buildr   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'   r/   )__name__
__module____qualname____doc__r&   r.   r   r   r   r!   r    rZ   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                   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$   )r9   flagr$   r$   r%   	<genexpr>   s    z(MesonBackend.__init__.<locals>.<genexpr>rc   release)	superr&   	extra_datgetra   meson_build_diranyfc_flagsr   )r#   argskwargs	__class__r$   r%   r&   z   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   rj   r   globr	   cwdnameexistsunlinkshutilcopy2osremove)r#   rq   walk_dirpath_objectspath_object	dest_pathr$   r$   r%   _move_exec_to_root   s   zMesonBackend._move_exec_to_rootr'   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   ra   r   r   r   extra_objects
flib_flagsrl   r   sys
executablerZ   r   mkdir
write_text)r#   rq   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)rs   check)
subprocessrun)r#   commandrs   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)rj   r   )r#   rq   setup_commandcompile_commandr$   r$   r%   	run_meson   s   zMesonBackend.run_mesonc                 C  s<   t | j| j| j| _| | j | | j | | j d S rV   )_prepare_sourcesr	   r   rq   r   r   r   r-   r$   r$   r%   r      s   zMesonBackend.compile)rq   r   )rq   r   r'   r/   r[   )
r\   r]   r^   r&   r   r   r   r   r   __classcell__r$   r$   ro   r%   r`   y   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 ]}| 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   suffixrt   r8   r$   r$   r%   r=      s
    z$_prepare_sources.<locals>.<listcomp>)	copyr   r   ru   r(   rw   rt   appendrv   )mnamer   bdirextended_sourcesr:   generated_sourcesgenerated_sourcer$   r$   r%   r      s*   r   )
__future__r   ry   r*   rw   r   r   pathlibr   _backendr   stringr   	itertoolsr   warningsr   r`   r   r$   r$   r$   r%   <module>   s    h=