o
    ʩZh                     @  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$   R/var/www/html/lang_env/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	   Z	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>Zsource_list)joinr   r   r-   r$   r:   r%   r   I      
z"MesonTemplate.sources_substitutionc                   r1   )Nr2   r3   c                      g | ]
}  d | dqS )zdependency('z')r$   )r8   depr:   r$   r%   r<   R   r=   z3MesonTemplate.deps_substitution.<locals>.<listcomp>Zdep_list)r>   r   r   r-   r$   r:   r%   r   O   r?   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$   )r8   ilib_dirr$   r$   r%   r<   W   s    z8MesonTemplate.libraries_substitution.<locals>.<listcomp>Zlib_dir_declarationsc                 S  s   g | ]
}| d | dqS )z& = declare_dependency(link_args : ['-lrD   r$   r8   libr$   r$   r%   r<   ^   s    Zlib_declarationsr2   c                   s   g | ]	}  | d qS ),r$   rG   r:   r$   r%   r<   f   s    Zlib_listc                   r@   )rC   rI   r$   )r8   rE   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                   r1   )Nr2   r3   c                   r4   r5   r$   )r8   incr:   r$   r%   r<   o   r=   z6MesonTemplate.include_substitution.<locals>.<listcomp>Zinc_list)r>   r   r   r-   r$   r:   r%   r    l   r?   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    rS   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dependenciesZbbdirc                 s  s    | ]}d |v V  qdS )debugNr$   )r8   flagr$   r$   r%   	<genexpr>   s    z(MesonBackend.__init__.<locals>.<genexpr>r[   release)	superr&   Z	extra_datgetrZ   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   ra   r   globr	   cwdnameexistsunlinkshutilcopy2osremove)r#   rh   Zwalk_dirZpath_objectsZ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   rZ   r   r   r   Zextra_objectsZ
flib_flagsrc   r   sys
executablerS   r   mkdir
write_text)r#   rh   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)rj   check)
subprocessrun)r#   commandrj   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)ra   r   )r#   rh   Zsetup_commandZcompile_commandr$   r$   r%   	run_meson   s   zMesonBackend.run_mesonc                 C  s<   t | j| j| j| _| | j | | j | | j d S rO   )_prepare_sourcesr	   r   rh   r|   r   rs   r-   r$   r$   r%   r      s   zMesonBackend.compile)rh   r   )rh   r   r'   r/   rT   )
rU   rV   rW   r&   rs   r|   r   r   r   __classcell__r$   r$   rf   r%   rY   y   s    


rY   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 )NTrt   zmodule.cz-f2pywrappers2.f90z-f2pywrappers.fc                 S  s$   g | ]}t |jd kst |jqS )z.pyf)r   suffixrk   r7   r$   r$   r%   r<      s
    z$_prepare_sources.<locals>.<listcomp>)	copyr   ry   rl   r(   rn   rk   appendrm   )Zmnamer   bdirZextended_sourcesr9   Zgenerated_sourcesZgenerated_sourcer$   r$   r%   r      s*   r   )
__future__r   rp   r*   rn   r~   rw   pathlibr   Z_backendr   stringr   	itertoolsr   warningsr   rY   r   r$   r$   r$   r%   <module>   s    h=