U
    O8ÚcÄ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ƒf}t| dƒP}|D ]D}| |¡}|r`| | d| d¡ || d¡ ¡¡ q&| |¡ q&W 5 Q R X W 5 Q R X 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!   úE/tmp/pip-unpacked-wheel-fd_gsd75/numpy/distutils/command/build_src.pyÚ
subst_vars   s    

(r#   c                
   @   sÒ   e Zd ZdZdddddddd	d
dg
Zdddg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/d0„ Zd1d2„ Zd3d4„ Zd5S )6Ú	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 outputr%   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 kr$| jj| _| jj| _| jjp8g | _| jjpFg | _| jjpTg | _| j	d kr”dj
tƒ ftjd d… žŽ }tj | jd| ¡| _	i | _| jrÀ| jr²t d¡ n| j| _d | _| jd krÒg | _nt | j¡| _| jr| jrút d	¡ n| j| _d | _| jd krg | _nt | j¡| _|  d
¡}| jd krH|j| _| jd kr\|j| _dD ]b}d| dd¡ }t||d ƒ}|r`t| |ƒr¢t d| ¡ nt  d||f ¡ t!| ||ƒ q`d 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 k	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>µ   s     
 z6build_src.build_data_files_sources.<locals>.<listcomp>c                 S   s   g | ]}t |d ƒs|‘qS re   rg   ri   r!   r!   r"   rk   ¶   s     
 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   ro   )r:   Zinstall_cmdZ
build_npkgZ
top_prefixÚpkgZ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 kržq|||fg}|| jk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.   ro   )r:   Znew_py_modulesr   r,   Zmodule_baserz   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)rt   Ú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k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–   )rt   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€   ro   rš   )r:   rb   r•   ÚfullnameÚmodpathr,   Úpy_filesr”   r&   Úmodulerœ   r!   r!   r"   r_   0  s6    



 ÿ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   ~  s     z.build_src.generate_sources.<locals>.<listcomp>r¨   )r   ro   r'   r   rŸ   rž   rJ   rK   rL   r$   rO   Úmkpathr8   r   ÚINFOÚWARNÚset_thresholdru   rR   )r:   r•   Ú	extensionÚnew_sourcesZfunc_sourcesr   rz   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   |   |dddg¡S )Nz.hz.hppz.incr°   r²   r!   r!   r"   rš   ‰  s    zbuild_src.filter_h_filesc                 C   sH   g }g }|D ]2}t j |¡\}}||kr4| |¡ q| |¡ q||fS r*   )rJ   rK   r   ro   )r:   r•   Úextsr®   ry   r   Úbaserb   r!   r!   r"   r±   Œ  s    zbuild_src.filter_filesc              
   C   sd  g }t |ƒr*|d  d¡}|d  d¡}n|j}|j}|D ]"}tj |¡\}}|dkrT| 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 5 Q R X t|
ƒrHtj |
¡}||krHt 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_matchro   )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_sourcero   )	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k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#k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   ro   r	   r©   rÃ   r3   rB   rE   ru   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µ   Znumpyrz   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 k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 krt|ƒ}	|	dk}
nlt|ƒ}|d k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_targetro   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$   &   sD   ô
:$(.$ 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   s>   t | dƒ*}d }| ¡ }t|ƒr$d}t|ƒr0d}W 5 Q R X |S )Nr   rÍ   rU   )r   ÚreadlineÚ_has_cpp_headerÚ_has_c_header)r   r&   ÚresultÚliner!   r!   r"   rÓ   ×  s    rÓ   c              	   C   sB   t | dƒ.}d }|D ]}t|ƒ}|r| d¡} q4qW 5 Q R X |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   sJ   d }t | ƒ4}|D ](}t|ƒ}|rt|ƒr,q| d¡} q<qW 5 Q R X |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   rl   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        -ÿ

	ÿÿ