a
    p=icÄ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ƒ„}t| dƒZ}|D ]D}| |¡}|r`| | d| d¡ || d¡ ¡¡ q&| |¡ q&W d  ƒ n1 s€0    Y  W d  ƒ n1 sž0    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!   úr/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/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p8g | _| jjpFg | _| jjpTg | _| j	d u r–dj
tƒ gtjd d… ¢R Ž }tj | jd| ¡| _	i | _| jrÂ| jr´t d¡ n| j| _d | _| jd u rÔg | _nt | j¡| _| jr
| jrüt d	¡ n| j| _d | _| jd u rg | _nt | j¡| _|  d
¡}| jd u rJ|j| _| jd u r^|j| _dD ]b}d| dd¡ }t||d ƒ}|rbt| |ƒr¤t d| ¡ nt  d||f ¡ t!| ||ƒ qbd 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)"Úset_undefined_optionsr,   ÚdistributionÚext_packageÚ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:   Úplat_specifierr   ÚcÚoÚvr!   r!   r"   Úfinalize_optionsR   sX    ý





zbuild_src.finalize_optionsc                 C   s&   t  d¡ | js| jsd S |  ¡  d S )Nr$   )r   rR   r+   rE   Úbuild_sourcesr9   r!   r!   r"   ÚrunŒ   s    
zbuild_src.runc                 C   sn   | j r|  d¡j| _|  ¡  | jD ]}| j|Ž  q"| jrZ|  | j¡ | jD ]}|  |¡ qJ|  	¡  |  
¡  d S )NÚbuild_py)r'   rP   Úget_package_dirÚbuild_py_modules_sourcesrE   Ú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"   rY   ’   s    
ÿ

zbuild_src.build_sourcesc                 C   sJ  | j s
d S t d¡ ddlm} g }| j D ]
}t|tƒrF| |¡ q*t|tƒr*|\}}| j	rz|  
d | tj¡¡¡}ntj | j|¡}dd„ |D ƒ}dd„ |D ƒ}|D ]b}|jjdkrÄ||ƒ}	n|ƒ }	|	d urªt|	tƒrè| |	¡ qªt|	tƒr | |	¡ qªtt|	ƒƒ‚qª|||fƒ}
| ||
f¡ q*tt|ƒƒ‚q*|| 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 re   rg   ri   r!   r!   r"   rk   ¶   rl   r   )rF   r   rR   Únumpy.distutils.misc_utilrc   Ú
isinstanceÚstrÚappendÚtupler'   r\   rL   rO   rJ   ÚseprK   r$   Ú__code__Úco_argcountÚlistÚextendÚ	TypeErrorÚrepr)r:   rc   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rJt j ||¡}	nt j | j||¡}	t j t j |¡d ¡}
t j |	|
¡}t j 	|	¡s˜t  
|	¡ t|||ƒ t j ||¡}||fS )Nr   r   )rJ   rK   ÚdirnameÚitemsr'   rL   r$   ÚbasenameÚsplitextÚexistsÚmakedirsr#   )r:   rR   ÚgdÚtemplateÚinstall_dirZ
subst_dictZtemplate_dirÚkrW   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rBd}d}nt|dƒrV|j}d}|rÈ| j	j
 ¡ D ]`\}}| j	j| }tj tj |¡|¡}d|i}|D ](}	|  |	|¡\}
}| j	j |
|gf¡ qœqfd S )	Nz(build_src: building npy-pkg config filesÚinstallr   Frd   TÚinstall_libbaseÚprefix)r   rR   Úcopyr   Ú	finalizedrX   r'   rh   rŒ   rB   Zinstalled_pkg_configr€   r1   rJ   rK   rL   ÚabspathrŠ   rF   rp   )r:   Úinstall_cmdZ
build_npkgZ
top_prefixÚpkgÚinfosZpkg_pathr   r   rR   r‡   r‰   r!   r!   r"   ra   à   s*    




ÿzbuild_src.build_npy_pkg_configc                 C   sð   | j s
d S t d¡ g }| j D ]¾}t|ƒrÒt|ƒdkrÒ|\}}}| jrR|  |¡}ntj 	| j
tjj	| d¡Ž ¡}t|dƒr”tj 	||d ¡}||ƒ}|d u ržq|||fg}|| jvr¾g | j|< | j|  |7  < q| |¡ q|| j d d …< d S )Nzbuilding py_modules sourcesé   rd   rf   ú.py)r-   r   rR   r   Úlenr'   r\   rJ   rK   rL   r$   rO   rh   r.   rp   )r:   Znew_py_modulesr   r,   Zmodule_baser{   r   Úmodulesr!   r!   r"   r]   þ   s.    



ÿ


z"build_src.build_py_modules_sourcesc                 C   st   t | dg ¡ƒ}|sd S t d| ¡ |  |||f¡}|  |||f¡}|  |¡\}}|rht d| j|¡ ||d< d S )NÚsourceszbuilding library "%s" sourcesú#%s - nothing done with h_files = %s)ru   Úgetr   rR   Úgenerate_sourcesÚtemplate_sourcesÚfilter_h_filesr,   )r:   Zlib_nameÚ
build_infor˜   Úh_filesr!   r!   r"   r^     s    ÿzbuild_src.build_library_sourcesc                 C   s&  t |jƒ}t d|j ¡ |  |j¡}| d¡}d |dd… ¡}| jrT|  	|¡| _
|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  ||¡}|  |¡\}}|| jvr²g | j|< g }|D ],}tj tj |¡¡d }	| ||	|f¡ qº| j|  |7  < |  |¡\}}
|
rt d||
¡ ||_d S )Nzbuilding extension "%s" sourcesrd   r   éÿÿÿÿr™   )ru   r˜   r   rR   ÚnameZget_ext_fullnamerO   rL   r'   r\   Úext_target_dirr›   rœ   Úswig_sourcesÚf2py_sourcesÚpyrex_sourcesÚfilter_py_filesr.   rJ   rK   r‚   r   rp   r   )r:   rb   r˜   ÚfullnameÚmodpathr,   Úpy_filesr—   r&   ÚmodulerŸ   r!   r!   r"   r_   0  s4    



ÿz!build_src.build_extension_sourcesc                 C   s  g }g }|D ]"}t |ƒr$| |¡ q| |¡ q|s8|S | jrNt|ƒsN| j}n:t|ƒr`|d }n|j}tjj| j	g| 
d¡d d…  Ž }|  |¡ | jr tj}ntj}t |¡}	|D ]P}
|
||ƒ}|sÈq´t|ƒrêdd„ |D ƒ | |¡ q´t d|f ¡ | |¡ q´t |	¡ |S )Nr   rd   r    c                 S   s   g | ]}t  d |f ¡‘qS )ú  adding '%s' to sources.)r   rR   )rj   r}   r!   r!   r"   rk   ~  rl   z.build_src.generate_sources.<locals>.<listcomp>r«   )r   rp   r'   r   r¢   r¡   rJ   rK   rL   r$   rO   Úmkpathr8   r   ÚINFOÚWARNÚset_thresholdrv   rR   )r:   r˜   Ú	extensionÚnew_sourcesZfunc_sourcesr   r{   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 ]2}t j |¡\}}||v r4| |¡ q| |¡ q||fS r*   )rJ   rK   r‚   rp   )r:   r˜   Úextsr±   rz   r   Úbaserb   r!   r!   r"   r´   Œ  s    zbuild_src.filter_filesc              	   C   sz  g }t |ƒr*|d  d¡}|d  d¡}n|j}|j}|D ]8}tj |¡\}}|dkrj| jrntj |¡}	nt	| j
tj |¡ƒ}	|  |	¡ tj |	tj |¡¡}
| jsºt|g| |
ƒr&t|ƒrÚt d|
 ¡ t|ƒ}nt d|
 ¡ t|ƒ}t|
dƒ}| |¡ W d   ƒ n1 s0    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¹   rJ   rK   r‚   r'   r   r
   r$   r¬   rL   r   r%   r   Ú_f_pyf_ext_matchr   rR   Úprocess_f_fileÚprocess_c_filer   r   Ú_header_ext_matchrp   )r:   r˜   r°   r±   r¸   r¹   r   r·   rb   Ú
target_dirÚtarget_fileZoutstrZfidr   r!   r!   r"   rœ   —  s<    



*


zbuild_src.template_sourcesc           	      C   s`   g }|j  d¡d }|D ]B}tj |¡\}}|dkrP|  ||||¡}| |¡ q| |¡ q|S )z@Pyrex not supported; this remains for Cython support (see below)rd   r    z.pyx)r¡   rO   rJ   rK   r‚   Úgenerate_a_pyrex_sourcerp   )	r:   r˜   r°   r±   Úext_namer   r·   rb   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!   )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rn| jr`tj |¡}nt| jtj |¡ƒ}tj 	|
¡r¶t
|
ƒ}||kr¢td|
||f ƒ‚tj ||d ¡}nt d|
 ¡ |}d}	tj ||d ¡}tj 	|¡sFt d	||f ¡ tj |¡}tj ||d ¡}tj 	|¡s8t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| ¡ |r¶t|ƒdkr.td|f ƒ‚|d }
||
 }tj |¡pNd}|
g|j }| jsrt||dƒr¦|	s¦t d|
 ¡ dd l}|j  |d||
g ¡ nt d|
 ¡ nÐt!|ƒrÊ|d }n|j }tjj| jg| d¡d d…  Ž }tj ||d ¡}| |¡ ||j }| js.t||dƒrx|	sxt d| ¡ |  |¡ dd l}|j  |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%||ƒsbt%||ƒrÆ|  tj |¡¡ |  &||¡ |  &||¡ n8tj 	|¡sªtd|f ƒ‚tj 	|¡sÆtd|f ƒ‚dD ]>}tj ||| ¡}tj 	|¡rÊt d| ¡ | |¡ qÊ|| S ) Nrd   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: %sz--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¡   rO   rJ   rK   r‚   r'   r   r
   r$   ÚisfileÚget_f2py_modulenamer   rL   r   ÚdebugrM   rR   rp   r	   r¬   rÆ   r3   rB   rE   rv   rš   r–   r¸   r%   r   Z
numpy.f2pyZf2pyÚrun_mainr   r   r¹   Ú__file__r   Ú	copy_file)r:   r˜   r°   r±   r¤   Z	f_sourcesZf2py_targetsÚtarget_dirsrÂ   Z	skip_f2pyr   r·   rb   r¿   r¡   rÀ   r   rÆ   rž   r¸   Únumpyr{   Ztarget_cZtarget_hZ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 r8d}	d}
|j  d¡ n| jrHd}	d}
nd }	d}
d}|j d¡d }|D ]}tj |¡\}}|d	krp| jr¢t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}
nlt|ƒ}|d u r<t d||	f ¡ nF|	|kr‚t d|	||f ¡ |dkrtt d¡ d}
nt d| ¡ |
rŒd}tj |d||f ¡}nˆt 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 ||< qh| |¡ qh|s†|S |r”|| S |D ]}|  |¡ q˜| jp¸|  ¡ }|dg|j  }|
rØ| d¡ |jD ]}| d| ¡ qÞ|D ]ˆ}|| }|g|j }| js&t||dƒrpt dtj |¡|
rBdpDd |f ¡ |  || j  d|d||g ¡ nt  d| ¡ qø|| S ) Nú.cz-c++úc++TFr   rd   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¡   rO   rJ   rK   r‚   r'   r   r¢   r
   r$   rÇ   Úget_swig_modulenamer   Úget_swig_targetr   rM   rL   Ú_find_swig_targetrp   r¬   r7   Z	find_swigr¹   r¸   r%   r   rR   r   ÚspawnrÉ   )r:   r˜   r°   r±   r£   Zswig_targetsrÍ   r©   Z
target_extÚtypZis_cppZ	skip_swigrÂ   r   r·   rb   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__ÚdescriptionÚuser_optionsÚboolean_optionsÚhelp_optionsr;   rX   rZ   rY   r`   rŠ   ra   r]   r^   r_   r›   r¦   r   r´   rœ   r¥   rÁ   r¤   r£   r!   r!   r!   r"   r$   &   s0   :$(.$ 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   sR   t | dƒ4}d }| ¡ }t|ƒr$d}t|ƒr0d}W d   ƒ n1 sD0    Y  |S )Nr   rÑ   rU   )r   ÚreadlineÚ_has_cpp_headerÚ_has_c_header)r   r&   ÚresultÚliner!   r!   r"   r×   ×  s    "r×   c                 C   sV   t | dƒ8}d }|D ]}t|ƒ}|r| d¡} q4qW d   ƒ n1 sH0    Y  |S )Nr   r¡   )r   Ú_swig_module_name_matchr   )r   r&   r¡   ræ   r    r!   r!   r"   rÖ   á  s    
$rÖ   c                 C   s4   dD ]*}t j | d||f ¡}t j |¡r q0q|S )N)rÒ   rÐ   rÓ   )rJ   rK   rL   rÇ   )r¿   r¡   rb   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   s^   d }t | ƒ>}|D ](}t|ƒ}|rt|ƒr,q| d¡} q<qW d   ƒ n1 sP0    Y  |S )Nr¡   )r   Ú_f2py_module_name_matchÚ_f2py_user_module_name_matchr   )r   r¡   r&   ræ   r    r!   r!   r"   rÈ   ù  s    

$rÈ   ).Ú__doc__rJ   r   rH   rN   rŽ   Údistutils.commandr   Údistutils.dep_utilr   r   Údistutils.utilr   Údistutils.errorsr   r   Znumpy.distutilsr   rm   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>   sJ        -ÿ

	ÿÿ