o
    ék)hÊy  ã                   @   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ÚvarZfsZftÚlÚm© r   úAlib/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 ƒ}|rÛt| |ƒrÌt d| ¡ q­t  d||f ¡ t!| ||ƒ q­d S )NZbuild)r.   r.   )r-   r-   )r#   r#   z	.{}-{}.{}é   Úsrcz0ignoring --f2pyflags as --f2py-opts already usedz0ignoring --swigflags as --swig-opts already usedr   )r5   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Újoinr.   r,   r0   r1   r   ÚwarnÚshlexÚsplitr2   r3   Úget_finalized_commandr%   r4   r   ÚgetattrÚinfoÚsetattr)r8   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   rL   r)   r?   Úbuild_sourcesr7   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%   rJ   Úget_package_dirÚbuild_py_modules_sourcesr?   Úbuild_library_sourcesr)   Zcheck_extensions_listÚbuild_extension_sourcesÚbuild_data_files_sourcesÚbuild_npy_pkg_config)r8   Zlibname_infoÚextr   r   r    rR   ’   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rƒt|	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]   r_   ra   r   r   r    rc   ¶   rd   r   )r@   r   rL   Únumpy.distutils.misc_utilr[   Ú
isinstanceÚstrÚappendÚtupler%   rT   rF   rI   rD   ÚseprE   r"   Ú__code__Úco_argcountÚlistÚextendÚ	TypeErrorÚrepr)r8   r[   Znew_data_filesÚdatar   ÚfilesÚ	build_dirZfuncsr$   ÚsÚ	filenamesr   r   r    rX   ¦   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   )rD   rE   ÚdirnameÚitemsr%   rF   r"   ÚbasenameÚsplitextÚexistsÚmakedirsr!   )r8   rL   ÚgdÚtemplateÚinstall_dirZ
subst_dictZtemplate_dirÚkrP   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   rL   Úcopyr   Z	finalizedrQ   r%   r`   rƒ   r>   Zinstalled_pkg_configrw   r/   rD   rE   rF   Úabspathr   r@   rh   )r8   Zinstall_cmdZ
build_npkgZ
top_prefixZpkgZinfosZpkg_pathr„   r   rL   r~   r€   r   r   r    rY   à   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\   r^   ú.py)r+   r   rL   r   Úlenr%   rT   rD   rE   rF   r"   rI   r`   r,   rh   )r8   Znew_py_modulesr   r*   Zmodule_basers   r   Úmodulesr   r   r    rU   þ   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)rm   Úgetr   rL   Úgenerate_sourcesÚtemplate_sourcesÚfilter_h_filesr*   )r8   Zlib_nameÚ
build_infor‹   Úh_filesr   r   r    rV     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Œ   )rm   r‹   r   rL   ÚnameZget_ext_fullnamerI   rF   r%   rT   Úext_target_dirrŽ   r   Úswig_sourcesÚf2py_sourcesÚpyrex_sourcesÚfilter_py_filesr,   rD   rE   ry   rx   rh   r   )r8   rZ   r‹   ÚfullnameÚmodpathr*   Úpy_filesrŠ   r$   Úmoduler’   r   r   r    rW   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   rL   )rb   rt   r   r   r    rc   ~  s    z.build_src.generate_sources.<locals>.<listcomp>rž   )r   rh   r%   r   r•   r”   rD   rE   rF   r"   rI   Úmkpathr6   r   ÚINFOZWARNZset_thresholdrn   rL   )r8   r‹   Ú	extensionÚnew_sourcesZfunc_sourcesr   rs   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©r8   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(   )rD   rE   ry   rh   )r8   r‹   Zextsr¢   rr   r   ÚbaserZ   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 sŠw   Y  t|
ƒr©tj |
¡}||vr©t d| ¡ | |¡ | |
¡ q| |¡ q|S )	Nr   ÚdependsÚinclude_dirsz.srczfrom_template:> %szconv_template:> %sr   ú  adding '%s' to include_dirs.)r   r   r¨   r©   rD   rE   ry   r%   rv   r
   r"   rŸ   rF   rx   r#   r   Ú_f_pyf_ext_matchr   rL   Úprocess_f_fileÚprocess_c_filer   r   Ú_header_ext_matchrh   )r8   r‹   r¡   r¢   r¨   r©   r   r§   rZ   Ú
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”   rI   rD   rE   ry   Úgenerate_a_pyrex_sourcerh   )	r8   r‹   r¡   r¢   Úext_namer   r§   rZ   r°   r   r   r    r˜   »  s   þzbuild_src.pyrex_sourcesc                 C   s   g S )zÄPyrex 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   )r8   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 	|¡sŸt d	||f ¡ tj |¡}tj ||d ¡}tj 	|¡s˜t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 ¡¡ qát 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³|	s³t d| ¡ |  |¡ ddlm} |  |dd|g d|g | ¡ nt d| ¡ tj 	|¡sÈt"d|f ƒ‚tj | j|¡}tj |d¡}tj |d¡}t d| ¡ | |¡ ||j#vrýt 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”   rI   rD   rE   ry   r%   rv   r
   r"   ÚisfileÚget_f2py_modulenamer   rF   r   ÚdebugrG   rL   rh   r	   rŸ   r¶   r1   r>   r?   rn   r   r‰   r¨   r#   r   Z
numpy.f2pyr·   Zrun_mainr   r   r©   Zf2pyÚ__file__r   Z	copy_file)r8   r‹   r¡   r¢   r—   Z	f_sourcesZf2py_targetsÚtarget_dirsr²   Z	skip_f2pyr   r§   rZ   r¯   r”   r°   r   r¶   r‘   r¨   r·   rs   Ztarget_cZtarget_hZ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 |¡rÌt|ƒ}||d
d … kr|td|||d
d … f ƒ‚|	d u r‰t|ƒ}	|	dk}
n3t|ƒ}|d u r›t d||	f ¡ n!|	|kr¼t d|	||f ¡ |dkrµt d¡ d}
nt d| ¡ |
rÀd}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ƒr³t dtj |¡|
r›dpœd |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))!r3   Úremover4   r”   rI   rD   rE   ry   r%   rv   r•   r
   r"   r¸   Úget_swig_modulenamer   Úget_swig_targetr   rG   rF   Ú_find_swig_targetrh   rŸ   r5   Z	find_swigr©   r¨   r#   r   rL   rx   Zspawnrº   )r8   r‹   r¡   r¢   r–   Zswig_targetsr¼   rœ   Z
target_extÚtypZis_cppZ	skip_swigr²   r   r§   rZ   r¯   Zpy_target_dirr”   Ztyp2r°   r   r5   Zswig_cmdr   r¨   r   r   r    r–   \  sÒ   


ÿÿ
ÿÿ

ÿÿ
ý
ÿ




ÿÿ
ÿ
ÿzbuild_src.swig_sourcesN)Ú__name__Ú
__module__Ú__qualname__ÚdescriptionZuser_optionsZboolean_optionsZhelp_optionsr9   rQ   rS   rR   rX   r   rY   rU   rV   rW   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¿   rN   )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Á   )rD   rE   rF   r¸   )r¯   r”   rZ   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__rD   r   rB   rH   r…   Zdistutils.commandr   Zdistutils.dep_utilr   r   Zdistutils.utilr   Zdistutils.errorsr   r   Znumpy.distutilsr   re   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         -ÿÿ

	ÿÿÿÿ