o
    ðT·j™  ã                   @  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 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   ú^/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/numpy/f2py/_backends/_meson.pyÚ
<listcomp>1   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_templateA   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%   K   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   R   ó    z6MesonTemplate.sources_substitution.<locals>.<listcomp>Úsource_list)Újoinr   r#   r5   r   r5   r   r&   P   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   W   r@   z3MesonTemplate.deps_substitution.<locals>.<listcomp>Údep_list)r,   rB   r   r#   r5   r   r5   r   r'   U   ó   ÿ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   c   s    ÿÿÚlib_declarationsc                   s$   g | ]}ˆ j › | d d¡› d�‘qS )rL   rM   ú,)r,   rN   rO   r5   r   r   r   j   s   $ Úlib_listc                   r;   )rH   rR   r=   )r   rI   r5   r   r   r   m   r@   Úlib_dir_list)rB   Ú	enumerater   r#   r   r,   ÚrangeÚlenr5   r   r5   r   r)   Z   s    þ
ÿþ
ÿ
ÿÿz$MesonTemplate.libraries_substitutionc                   rC   )Nr:   c                   r;   r<   r=   )r   Úincr5   r   r   r   r   r@   z6MesonTemplate.include_substitution.<locals>.<listcomp>Úinc_list)r,   rB   r   r#   r5   r   r5   r   r(   p   rF   z"MesonTemplate.include_substitutionc                 C  s<   | j r| j› dd t| j ƒ¡› d�| jd< d S d| jd< d S )Nzfortran_args: [z, z],r   Ú )r   r,   rB   Úlistr#   r5   r   r   r   r*   u   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Úextendr[   Ú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   r   rh   r¡   ru   r   r   r   r   Ú<module>   s    u>