o
    ʩZhy                     @   sR  d 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	m
Z
 ddlmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZ dd	lmZ d
d ZG dd dejZedej j!Z"edej j!Z#edej j!Z$edej j%Z&edej j%Z'dd Z(dd Z)dd Z*edej j!Z+edej j!Z,dd Z-dS )z Build swig and f2py sources.
    N)	build_ext)newer_groupnewer)get_platform)DistutilsErrorDistutilsSetupError)log)fortran_ext_match
appendpath	is_stringis_sequenceget_cmd)process_filec                 C   s   t d}t|dK}t| d-}|D ]"}||}|r0||d|d ||d  q|| qW d   n1 s@w   Y  W d   dS W d   dS 1 sXw   Y  dS )zPSubstitute any occurrence of @foo@ by d['foo'] from source file into
    target.z@([a-zA-Z_]+)@rwz@%s@   N)recompileopensearchwritereplacegroup)targetsourcedvarfsftlm r!   X/var/www/html/lang_env/lib/python3.10/site-packages/numpy/distutils/command/build_src.py
subst_vars   s   

("r#   c                   @   s   e Zd ZdZg dZg dZg Zdd Zdd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zg fddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S )+	build_srcz1build sources from SWIG, F2PY files or a function)
)z
build-src=r   zdirectory to "build" sources to)z
f2py-opts=Nz!list of f2py command line options)zswig=Nzpath to the SWIG executable)z
swig-opts=Nz!list of SWIG command line options)zswig-cppNzAmake SWIG create C++ files (default is autodetected from sources))z
f2pyflags=Nz3additional flags to f2py (use --f2py-opts= instead))z
swigflags=Nz3additional flags to swig (use --swig-opts= instead))forcefz2forcibly build everything (ignore file timestamps))inplaceiziignore build-lib and put compiled extensions into the source directory alongside your pure Python modules)verbose-cfgNzJchange logging level from WARN to INFO which will show all compiler output)r%   r'   r)   c                 C   sj   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d S N)
extensionspackage
py_modulespy_modules_dictr$   	build_lib
build_baser%   r'   package_dir	f2pyflags	f2py_opts	swigflags	swig_optsswig_cppswigverbose_cfgselfr!   r!   r"   initialize_options?   s"   
zbuild_src.initialize_optionsc                 C   s  |  dddd | jd u r| jj| _| jj| _| jjpg | _| jjp#g | _| jjp*g | _| j	d u rKdj
t gtjd d R  }tj| jd| | _	i | _| jra| jrZtd n| j| _d | _| jd u rjg | _nt| j| _| jr| jr}td	 n| j| _d | _| jd u rg | _nt| j| _| d
}| jd u r|j| _| jd u r|j| _dD ].}d|dd }t||d }|rt| |rtd|  qt d||f  t!| || qd S )Nbuild)r0   r0   )r/   r/   )r%   r%   z	.{}-{}.{}   srcz0ignoring --f2pyflags as --f2py-opts already usedz0ignoring --swigflags as --swig-opts already usedr   )r7   Zswig_optz--_-z-both build_src and build_ext define %s optionz+using "%s=%s" option from build_ext command)"Zset_undefined_optionsr,   distributionZext_packageZext_modulesr+   	librariesr-   
data_filesr$   formatr   sysversion_infoospathjoinr0   r.   r2   r3   r   warnshlexsplitr4   r5   get_finalized_commandr'   r6   r   getattrinfosetattr)r:   Zplat_specifierr   covr!   r!   r"   finalize_optionsR   s\   









zbuild_src.finalize_optionsc                 C   s&   t d | js| jsd S |   d S )Nr$   )r   rO   r+   rB   build_sourcesr9   r!   r!   r"   run   s   
zbuild_src.runc                 C   sn   | j r
| dj| _|   | jD ]}| j|  q| jr-| | j | jD ]}| | q%| 	  | 
  d S )NZbuild_py)r'   rM   get_package_dirbuild_py_modules_sourcesrB   build_library_sourcesr+   Zcheck_extensions_listbuild_extension_sourcesbuild_data_files_sourcesbuild_npy_pkg_config)r:   Zlibname_infoextr!   r!   r"   rU      s   


zbuild_src.build_sourcesc                 C   sB  | j sd S td ddlm} g }| j D ]}t|tr"|| qt|tr|\}}| j	r;| 
d|tj}ntj| j|}dd |D }dd |D }|D ]0}|jjdkr`||}	n| }	|	d urt|	trr||	 qSt|	tr}||	 qStt|	qS|||f}
|||
f qtt||| j d d < d S )	Nzbuilding data_files sourcesr   )get_data_files.c                 S   s   g | ]	}t |d r|qS __call__hasattr.0r&   r!   r!   r"   
<listcomp>       z6build_src.build_data_files_sources.<locals>.<listcomp>c                 S   s   g | ]	}t |d s|qS r`   rb   rd   r!   r!   r"   rf      rg   r   )rC   r   rO   numpy.distutils.misc_utilr^   
isinstancestrappendtupler'   rW   rI   rL   rG   seprH   r$   __code__co_argcountlistextend	TypeErrorrepr)r:   r^   Znew_data_filesdatar   files	build_dirfuncsr&   s	filenamesr!   r!   r"   r[      s<   






z"build_src.build_data_files_sourcesc                 C   s   |\}}}t j|}| D ]\}}|||< q| jdkr%t j||}	n	t j| j||}	t jt j|d }
t j|	|
}t j	|	sLt 
|	 t||| t j||}||fS )Nr   r   )rG   rH   dirnameitemsr'   rI   r$   basenamesplitextexistsmakedirsr#   )r:   rO   gdtemplateinstall_dirZ
subst_dictZtemplate_dirkrS   Zgenerated_dir	generatedZgenerated_pathZfull_install_dirr!   r!   r"   _build_npy_pkg_config   s    



zbuild_src._build_npy_pkg_configc                 C   s   t d ttd}|jdks|  d}| jdkr!d}d}n
t|dr+|j}d}|rd| j	j
 D ]2\}}| j	j| }tjtj||}d|i}|D ]}	| |	|\}
}| j	j|
|gf qNq3d S d S )	Nz(build_src: building npy-pkg config filesinstallr   Fr_   Tinstall_libbaseprefix)r   rO   copyr   Z	finalizedrT   r'   rc   r   rA   Zinstalled_pkg_configr{   r1   rG   rH   rI   abspathr   rC   rk   )r:   Zinstall_cmdZ
build_npkgZ
top_prefixpkginfosZpkg_pathr   r   rO   r   r   r!   r!   r"   r\      s0   




zbuild_src.build_npy_pkg_configc                 C   s   | j sd S td g }| j D ]_}t|rit|dkri|\}}}| jr)| |}ntj	| j
tjj	|d }t|drJtj	||d }||}|d u rOq|||fg}|| jvr_g | j|< | j|  |7  < q|| q|| j d d < d S )Nzbuilding py_modules sources   r_   ra   .py)r-   r   rO   r   lenr'   rW   rG   rH   rI   r$   rL   rc   r.   rk   )r:   Znew_py_modulesr   r,   Zmodule_baserv   r   modulesr!   r!   r"   rX      s.   






z"build_src.build_py_modules_sourcesc                 C   st   t |dg }|sd S td|  | |||f}| |||f}| |\}}|r4td| j| ||d< d S )Nsourceszbuilding library "%s" sources#%s - nothing done with h_files = %s)rp   getr   rO   generate_sourcestemplate_sourcesfilter_h_filesr,   )r:   Zlib_name
build_infor   h_filesr!   r!   r"   rY     s   zbuild_src.build_library_sourcesc                 C   s$  t |j}td|j  | |j}|d}d|dd }| jr*| 	|| _
| ||}| ||}| ||}| ||}| ||}| |\}}|| jvrYg | j|< g }|D ]}tjtj|d }	|||	|f q]| j|  |7  < | |\}}
|
rtd||
 ||_d S )Nzbuilding extension "%s" sourcesr_   r   r   )rp   r   r   rO   nameZget_ext_fullnamerL   rI   r'   rW   ext_target_dirr   r   swig_sourcesf2py_sourcespyrex_sourcesfilter_py_filesr.   rG   rH   r}   r|   rk   r   )r:   r]   r   fullnamemodpathr,   py_filesr   r&   moduler   r!   r!   r"   rZ   0  s4   




z!build_src.build_extension_sourcesc                 C   s  g }g }|D ]}t |r|| q|| q|s|S | jr't|s'| j}nt|r0|d }n|j}tjj| j	g|
dd d   }| | | jrPtj}ntj}t|}	|D ](}
|
||}|sdqZt|rudd |D  || qZtd|f  || qZt|	 |S )Nr   r_   r   c                 S   s   g | ]
}t d |f qS )  adding '%s' to sources.)r   rO   )re   rx   r!   r!   r"   rf   ~  s    z.build_src.generate_sources.<locals>.<listcomp>r   )r   rk   r'   r   r   r   rG   rH   rI   r$   rL   mkpathr8   r   INFOWARNZset_thresholdrq   rO   )r:   r   	extensionnew_sourcesZfunc_sourcesr   rv   r   Z	new_levelZ	old_levelfuncr!   r!   r"   r   X  s@   




zbuild_src.generate_sourcesc                 C   s   |  |dgS )Nr   filter_filesr:   r   r!   r!   r"   r     s   zbuild_src.filter_py_filesc                 C   s   |  |g dS )N)z.hz.hppz.incr   r   r!   r!   r"   r     s   zbuild_src.filter_h_filesc                 C   sH   g }g }|D ]}t j|\}}||v r|| q|| q||fS r*   )rG   rH   r}   rk   )r:   r   extsr   ru   r   baser]   r!   r!   r"   r     s   zbuild_src.filter_filesc              	   C   sn  g }t |r|d d}|d d}n|j}|j}|D ]}tj|\}}|dkr| jr5tj|}	n
t	| j
tj|}	| |	 tj|	tj|}
| jsZt|g| |
rt|rjtd|
  t|}ntd|
  t|}t|
d}|| W d    n1 sw   Y  t|
rtj|
}||vrtd|  || ||
 q|| q|S )	Nr   dependsinclude_dirsz.srczfrom_template:> %szconv_template:> %sr     adding '%s' to include_dirs.)r   r   r   r   rG   rH   r}   r'   rz   r
   r$   r   rI   r|   r%   r   _f_pyf_ext_matchr   rO   process_f_fileprocess_c_filer   r   _header_ext_matchrk   )r:   r   r   r   r   r   r   r   r]   
target_dirtarget_fileZoutstrZfidr   r!   r!   r"   r     s>   


zbuild_src.template_sourcesc           	      C   s`   g }|j dd }|D ]!}tj|\}}|dkr(| ||||}|| q|| q|S )z@Pyrex not supported; this remains for Cython support (see below)r_   r   z.pyx)r   rL   rG   rH   r}   generate_a_pyrex_sourcerk   )	r:   r   r   r   ext_namer   r   r]   r   r!   r!   r"   r     s   zbuild_src.pyrex_sourcesc                 C   s   g S )zPyrex is not supported, but some projects monkeypatch this method.

        That allows compiling Cython code, see gh-6955.
        This method will remain here for compatibility reasons.
        r!   )r:   r   r   r   r   r!   r!   r"   r     s   z!build_src.generate_a_pyrex_sourcec                 C   s   g }g }g }i }g }|j dd }d}	|D ]}
tj|
\}}|dkr| jr.tj|}n
t| jtj|}tj	|
rYt
|
}||krOtd|
||f tj||d }nFtd|
  |}d}	tj||d }tj	|std	||f  tj|}tj||d }tj	|std
|f td|  || ||
 |||
< || qt|r||
 q||
 q|s|s|S |D ]}| | q|j| j }| jjr| jjD ]\}}||jv r||dg  qtd|  |rQt|dkrtd|f |d }
||
 }tj|pd}|
g|j }| js.t||drI|	sItd|
  ddlm} | |d||
g  nqtd|
  nit!|r[|d }n|j }tjj| jg|dd d   }tj||d }|| ||j }| jst||dr|	std|  | | ddlm} | |dd|g d|g |  ntd|  tj	|st"d|f tj| j|}tj|d}tj|d}td|  || ||j#vrtd|  |j#| |	s>dd l}tj|j$j%}tj|dd}tj|dd}t&||s(t&||r=| tj| | '|| | '|| ntj	|sLtd|f tj	|sZtd|f d D ]}tj||| }tj	|rztd|  || q\|| S )!Nr_   r   r   z.pyf;mismatch of extension names: %s provides %r but expected %rzmodule.cz.  source %s does not exist: skipping f2py'ing.r   zd  target %s does not exist:
   Assuming %smodule.c was generated with "build_src --inplace" command.
%r missing&   Yes! Using %r as up-to-date target.f2py_optionszf2py options: %szConly one .pyf file is allowed per extension module but got more: %rr   zf2py: %s)f2py2ez--build-dirz+  skipping '%s' f2py interface (up-to-date)z	f2py:> %sz--lowerz-mz3  skipping f2py fortran files for '%s' (up-to-date)z!f2py target file %r not generatedzfortranobject.czfortranobject.hr   r   r>   zf2py target_c file %r not foundzf2py target_h file %r not found)z-f2pywrappers.fz-f2pywrappers2.f90)(r   rL   rG   rH   r}   r'   rz   r
   r$   isfileget_f2py_modulenamer   rI   r   debugrJ   rO   rk   r	   r   r   r3   rA   rB   rq   r   r   r   r%   r   Z
numpy.f2pyr   run_mainr   r   r   Zf2py__file__r   	copy_file)r:   r   r   r   r   Z	f_sourcesZf2py_targetstarget_dirsr   Z	skip_f2pyr   r   r]   r   r   r   r   r   r   r   r   rv   Ztarget_cZtarget_hnumpyZsource_cZsource_hZname_extfilenamer!   r!   r"   r     s  









zbuild_src.f2py_sourcesc              	   C   s  g }g }i }g }g }d}d|j v rd}	d}
|j d n| jr$d}	d}
nd }	d}
d}|jdd }|D ]}tj|\}}|d	kr2| jrQtj	|}| j
}nt| jtj	|}|}tj|rt|}||d
d  kr|td|||d
d  f |	d u rt|}	|	dk}
n3t|}|d u rtd||	f  n!|	|krtd|	||f  |dkrtd d}
ntd|  |
rd}tj|d||f }nDtd|  |d
d  }d
}t||}tj|std||f  tj	|}t||}tj|s	td|f td|  || || |tj||d  || |d ||< q4|| q4|s=|S |rD|| S |D ]}| | qF| jpV|  }|dg|j  }|
rf|d |jD ]
}|d|  qi|D ]E}|| }|g|j }| jst||drtdtj||
rdpd |f  | || j  d|d||g  qvt d|  qv|| S ) N.cz-c++c++TFr   r_   r   z.ir   r   z>source %r does not define swig target, assuming %s swig targetz0expected %r but source %r defines %r swig targetzAresetting swig target to c++ (some targets may have .c extension)z$assuming that %r has c++ swig target.cpp	%s_wrap%sz.  source %s does not exist: skipping swig'ing.zi  target %s does not exist:
   Assuming %s_wrap.{c,cpp} was generated with "build_src --inplace" command.r   r   r   z-pythonz-Ir   z%s: %sz++ z-oz-outdirz+  skipping '%s' swig interface (up-to-date))!r5   remover6   r   rL   rG   rH   r}   r'   rz   r   r
   r$   r   get_swig_modulenamer   get_swig_targetr   rJ   rI   _find_swig_targetrk   r   r7   Z	find_swigr   r   r%   r   rO   r|   Zspawnr   )r:   r   r   r   r   Zswig_targetsr   r   Z
target_exttypZis_cppZ	skip_swigr   r   r   r]   r   Zpy_target_dirr   Ztyp2r   r   r7   Zswig_cmdr   r   r!   r!   r"   r   \  s   














zbuild_src.swig_sourcesN)__name__
__module____qualname__descriptionZuser_optionsZboolean_optionsZhelp_optionsr;   rT   rV   rU   r[   r   r\   rX   rY   rZ   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r$   &   s2    :$(.$ r$   z!.*\.(f90|f95|f77|for|ftn|f|pyf)\Zz.*\.(inc|h|hpp)\ZzQ\s*%module\s*(.*\(\s*package\s*=\s*"(?P<package>[\w_]+)".*\)|)\s*(?P<name>[\w_]+)z-\*-\s*c\s*-\*-z-\*-\s*c\+\+\s*-\*-c                 C   sb   t | #}d }| }t|rd}t|rd}W d    |S W d    |S 1 s*w   Y  |S )Nr   rQ   )r   readline_has_cpp_header_has_c_header)r   r&   resultliner!   r!   r"   r     s   


r   c                 C   sf   t | %}d }|D ]}t|}|r|d} n	q	W d    |S W d    |S 1 s,w   Y  |S Nr   )r   _swig_module_name_matchr   )r   r&   r   r   r    r!   r!   r"   r     s    



r   c                 C   s6   dD ]}t j| d||f }t j|r |S q|S )N)r   r   r   )rG   rH   rI   r   )r   r   r]   r   r!   r!   r"   r     s   r   z%\s*python\s*module\s*(?P<name>[\w_]+)z4\s*python\s*module\s*(?P<name>[\w_]*?__user__[\w_]*)c                 C   sp   d }t | (}|D ]}t|}|rt|rq	|d} n	q	W d    |S W d    |S 1 s1w   Y  |S r   )r   _f2py_module_name_match_f2py_user_module_name_matchr   )r   r   r&   r   r    r!   r!   r"   r     s$   



r   ).__doc__rG   r   rE   rK   r   Zdistutils.commandr   Zdistutils.dep_utilr   r   Zdistutils.utilr   Zdistutils.errorsr   r   Znumpy.distutilsr   rh   r	   r
   r   r   r   Znumpy.distutils.from_templater   r   Znumpy.distutils.conv_templater   r#   r$   r   Imatchr   r   r   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   <module>   sX         -

	