B
    ôàn\–J  ã               @   sø   d dl mZmZ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	m
Z d dl	mZ d dlmZ d dlmZ d dlmZmZ d dlZd dl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ed< ded< G dd„ deƒZ
G dd„ de ƒZ!dS )é    )ÚdivisionÚabsolute_importÚprint_functionN)Úconfig)ÚLANG_EXT)Úlog)Ú	copy_file)ÚCompileErrorÚ	LinkError)Úfilepath_from_subprocess_output)Úgenerate_manifest)Úcheck_gcc_function_attributeÚcheck_gcc_variable_attributeÚcheck_inlineÚcheck_restrictÚcheck_compiler_gcc4)Úget_exceptionz.fÚf77z.f90Úf90c               @   s¼   e Zd Ze jdg7  _dd„ Zdd„ Zdd„ Zdd	„ Z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d „ Zd!d"„ Zd#d$„ Zd%d&„ Zd0d'd(„ZdS )1r   )z
fcompiler=Nz!specify the Fortran compiler typec             C   s   d | _ t | ¡ d S )N)Ú	fcompilerÚ
old_configÚinitialize_options)Úself© r   ú=lib/python3.7/site-packages/numpy/distutils/command/config.pyr   #   s    zconfig.initialize_optionsc             C   s2  t  | ¡ ddlm}m} tjdkrÌ| jjdkrÌ| jj	sˆy| j 
¡  W n@ tk
r†   tƒ }d|| jjjf }tdƒ tj |¡‚Y nX ddlm} | ¡ dkrÌx*| jj| jjgD ]}d	|kr²| d	¡ q²W t| j|ƒs.|| j| jd
| jd| _| jd k	r.| j | j¡ | j ¡ r.| j | ¡ | j ¡  d S )Nr   )Ú	FCompilerÚnew_fcompilerZwin32)ÚmsvcZintelwZintelemwaË  Could not initialize compiler instance: do you have Visual Studio
installed?  If you are trying to build with MinGW, please use "python setup.py
build -c mingw32" instead.  If you have Visual Studio installed, check it is
correctly installed, and the right version (VS 2008 for python 2.6, 2.7 and 3.2,
VS 2010 for >= 3.3).

Original exception was: %s, and the Compiler class was %s
============================================================================zL============================================================================)Úmsvc9compileré
   z	/MANIFESTé   )ÚcompilerÚdry_runZforceZ
c_compiler) r   Ú_check_compilerZnumpy.distutils.fcompilerr   r   ÚsysÚplatformr!   Úcompiler_typeZinitializedZ
initializeÚIOErrorr   Ú	__class__Ú__name__ÚprintÚ	distutilsÚerrorsZDistutilsPlatformErrorr   Zget_build_versionZldflags_sharedZldflags_shared_debugÚappendÚ
isinstancer   r"   Z	customizeZdistributionZget_versionZcustomize_cmdZshow_customization)r   r   r   ÚeÚmsgr   Zldflagsr   r   r   r#   '   s:    
	zconfig._check_compilerc          	   C   sx   ddl m} ddlm} | j}|dkr.| j| _y|| f| Ž }W n, ||fk
rl   ttƒ ƒ || _|‚Y nX || _|S )Nr   )r	   )ÚDistutilsExecError)r   r   )Údistutils.ccompilerr	   Zdistutils.errorsr1   r!   r   Ústrr   )r   ZmthÚlangÚargsr	   r1   Zsave_compilerZretr   r   r   Ú_wrap_methodY   s    

zconfig._wrap_methodc             C   s4   |   tj|||||f¡\}}| j |d ¡ ||fS )Nz.d)r6   r   Ú_compileÚ
temp_filesr-   )r   ÚbodyÚheadersÚinclude_dirsr4   ÚsrcÚobjr   r   r   r7   h   s    
zconfig._compilec          
   C   sÖ  | j jdkr¤|pg d d … }|p$g d d … }|dkrÊd}| jrÊx`| jjpLg D ]P}| d¡r”yt dd|g¡}W n ttjfk
rŠ   Y n
X t	|ƒ}| 
|¡ qNW x&| jjp®g D ]}||kr°| 
|¡ q°W xî|D ]Î}| d¡ràqÐd}	x4|pìg D ](}
tj |
d| ¡}tj |¡rîd	}	P qîW |	r"qÐd}	x\|D ]T}
tj |
d
| ¡}tj |¡r,tj |
d| ¡}t||ƒ | j 
|¡ d	}	P q,W |	rŒqÐt d||f ¡ qÐW n| j jdkrºt| ƒ |  tj|||||||f¡S )Nr   )r   r   Úcz/usr/libZcygpathz-wFz%s.libTzlib%s.az+could not find library %r in directories %sZmingw32)r!   r&   r   Úlibrary_dirsÚ
startswithÚ
subprocessÚcheck_outputÚOSErrorÚCalledProcessErrorr   r-   Ú	librariesÚosÚpathÚjoinÚisfiler   r8   r   Úwarnr   r6   r   Ú_link)r   r9   r:   r;   rE   r?   r4   ÚdZlibnameZ
fileexistsZlibdirZlibfileZlibfile2r   r   r   rK   p   s^    


  

 
zconfig._linkNr>   c             C   s   |   ¡  |  d|g|¡S )Nz2/* we need a dummy line to make distutils happy */)r#   Útry_compile)r   Úheaderr;   r?   r4   r   r   r   Úcheck_header¦   s    zconfig.check_headerc             C   s"   |   ¡  d||f }|  |||¡S )NzH
int main(void)
{
#ifndef %s
    (void) %s;
#endif
    ;
    return 0;
})r#   rM   )r   Úsymbolr:   r;   r9   r   r   r   Ú
check_decl¬   s    	zconfig.check_declc             C   s    |   ¡  d|f }|  |||¡S )Nz[
int main(void)
{
#if %s
#else
#error false or undefined macro
#endif
    ;
    return 0;
})r#   rM   )r   rP   r:   r;   r9   r   r   r   Úcheck_macro_true»   s    

zconfig.check_macro_truec             C   sj   |   ¡  dd|i }d}zBy |  |d|i ||d¡ d}W n tjjk
rV   d}Y nX W d|  ¡  X |S )zYCheck type availability. Return True if the type can be compiled,
        False otherwisez_
int main(void) {
  if ((%(name)s *) 0)
    return 0;
  if (sizeof (%(name)s))
    return 0;
}
ÚnameFÚtyper>   TN)r#   r7   r+   r,   r	   Ú_clean)r   Ú	type_namer:   r;   r?   r9   Ústr   r   r   Ú
check_typeË   s    


zconfig.check_typec          	   C   sT  |   ¡  d}|  |d|i ||d¡ |  ¡  |r~d}xH|D ]@}y&|  |||dœ ||d¡ |  ¡  |S  tk
rx   Y q:X q:W d}d}d}	xVy(|  |||	dœ ||d¡ |  ¡  P W qŒ tk
rÜ   |	d }d	|	 d }	Y qŒX qŒW |	}
xh||
krN|
| d	 | }	y*|  |||	dœ ||d¡ |  ¡  |	}
W qè tk
rJ   |	d }Y qèX qèW |S )
zCheck size of a given type.zÀ
typedef %(type)s npy_check_sizeof_type;
int main (void)
{
    static int test_array [1 - 2 * !(((long) (sizeof (npy_check_sizeof_type))) >= 0)];
    test_array [0] = 0

    ;
    return 0;
}
rT   r>   zÇ
typedef %(type)s npy_check_sizeof_type;
int main (void)
{
    static int test_array [1 - 2 * !(((long) (sizeof (npy_check_sizeof_type))) == %(size)s)];
    test_array [0] = 0

    ;
    return 0;
}
)rT   ÚsizezÇ
typedef %(type)s npy_check_sizeof_type;
int main (void)
{
    static int test_array [1 - 2 * !(((long) (sizeof (npy_check_sizeof_type))) <= %(size)s)];
    test_array [0] = 0

    ;
    return 0;
}
r   r    é   )r#   r7   rU   r	   )r   rV   r:   r;   r?   Zexpectedr9   rY   ZlowZmidZhighr   r   r   Úcheck_type_sizeè   sL    





zconfig.check_type_sizeFc	       
      C   sÈ   |   ¡  g }	|r6t|ƒtkr(|	 |¡ n|	 d| ¡ |	 d¡ |	 d| ¡ |	 d¡ |	 d¡ |r†|d krrd}|	 d||f ¡ n|	 d| ¡ |	 d	¡ |	 d
¡ d |	¡d }	|  |	||||¡S )Nzint %s (void);z#ifdef _MSC_VERz#pragma function(%s)z#endifzint main (void) {Ú z	  %s(%s);z  %s;z  return 0;Ú}Ú
)r#   rT   r3   r-   rH   Útry_link)
r   Úfuncr:   r;   rE   r?   ÚdeclÚcallÚ	call_argsr9   r   r   r   Ú
check_func;  s(    





zconfig.check_funcc	             C   s*  |   ¡  g }	|r8x&| ¡ D ]\}
}|r|	 d|
 ¡ qW |	 d¡ x|D ]}|	 d| ¡ qHW |	 d¡ |	 d¡ |rÚx~|D ]X}
|
|krÆ||
 rÆ|r¤|
|kr¤||
 sªd}n||
 }|	 d|
|f ¡ q||	 d|
 ¡ q|W nx|D ]}
|	 d|
 ¡ qàW |	 d	¡ |	 d
¡ d |	¡d }	|  |	||||¡S )a0  Check a list of functions at once.

        This is useful to speed up things, since all the functions in the funcs
        list will be put in one compilation unit.

        Arguments
        ---------
        funcs : seq
            list of functions to test
        include_dirs : seq
            list of header paths
        libraries : seq
            list of libraries to link the code snippet to
        library_dirs : seq
            list of library paths
        decl : dict
            for every (key, value), the declaration in the value will be
            used for function in key. If a function is not in the
            dictionary, no declaration will be used.
        call : dict
            for every item (f, value), if the value is True, a call will be
            done to the function f.
        zint %s (void);z#ifdef _MSC_VERz#pragma function(%s)z#endifzint main (void) {r\   z	  %s(%s);z  %s;z  return 0;r]   r^   )r#   Úitemsr-   rH   r_   )r   Zfuncsr:   r;   rE   r?   ra   rb   rc   r9   ÚfÚvr`   r5   r   r   r   Úcheck_funcs_once]  s4    








zconfig.check_funcs_oncec             C   s   t | ƒS )zUReturn the inline keyword recognized by the compiler, empty string
        otherwise.)r   )r   r   r   r   r   š  s    zconfig.check_inlinec             C   s   t | ƒS )zWReturn the restrict keyword recognized by the compiler, empty string
        otherwise.)r   )r   r   r   r   r   Ÿ  s    zconfig.check_restrictc             C   s   t | ƒS )z*Return True if the C compiler is gcc >= 4.)r   )r   r   r   r   r   ¤  s    zconfig.check_compiler_gcc4c             C   s   t | ||ƒS )N)r   )r   Ú	attributerS   r   r   r   r   ¨  s    z#config.check_gcc_function_attributec             C   s
   t | |ƒS )N)r   )r   ri   r   r   r   r   «  s    z#config.check_gcc_variable_attributec          
   C   s~  t jdtdd |  ¡  d\}}	y&tƒ }
y&|  ||||||¡\}}}|
 ¡  W n$ tk
rt   |
j}	|
 ¡  ‚ Y nX t	j
 d|¡}ytj|gdd}	W nH tjk
rÆ } z|j}d}	W dd}~X Y n$ tk
rà   d	}d}	Y n
X t|	ƒ}	tt	d
ƒr8t	 |¡}t	 |¡r<t	 |¡}t d|f ¡ |tjkr<t‚n|}t d¡ W n$ ttfk
rl   t d¡ Y nX |  ¡  ||	fS )z®Try to compile, link to an executable, and run a program
        built from 'body' and 'headers'. Returns the exit status code
        of the program and its output.
        zû
+++++++++++++++++++++++++++++++++++++++++++++++++
Usage of get_output is deprecated: please do not 
use it anymore, and avoid configuration checks 
involving running executable on the target machine.
+++++++++++++++++++++++++++++++++++++++++++++++++
rZ   )Ú
stacklevel)éÿ   r\   Ú.)Úcwdr\   Né   ÚWEXITSTATUSz subprocess exited with signal %dzsuccess!zfailure.)ÚwarningsrJ   ÚDeprecationWarningr#   Ú
GrabStdoutrK   ÚrestoreÚ	ExceptionÚdatarF   rG   rH   rA   rB   rD   Ú
returncoderC   r   Úhasattrro   ÚWIFSIGNALEDÚWTERMSIGr   ÚerrorÚsignalÚSIGINTÚKeyboardInterruptÚinfor	   r
   rU   )r   r9   r:   r;   rE   r?   r4   Zuse_teeZexitcodeÚoutputZgrabberr<   r=   ZexeÚexcZ
exitstatusZsigr   r   r   Ú
get_output®  sJ    




zconfig.get_output)NNr>   )NN)NN)NNN)NNNN)NNNNFFN)NNNNFFN)NNNNr>   N)r)   Ú
__module__Ú__qualname__r   Zuser_optionsr   r#   r6   r7   rK   rO   rQ   rR   rX   r[   rd   rh   r   r   r   r   r   r   r   r   r   r   r      s6   
26


 

T  
   
:  r   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rr   c             C   s   t j| _d| _| t _d S )Nr\   )r$   ÚstdoutÚ
sys_stdoutru   )r   r   r   r   Ú__init__í  s    zGrabStdout.__init__c             C   s   | j  |¡ |  j|7  _d S )N)r…   Úwriteru   )r   ru   r   r   r   r‡   ò  s    zGrabStdout.writec             C   s   | j  ¡  d S )N)r…   Úflush)r   r   r   r   rˆ   ö  s    zGrabStdout.flushc             C   s   | j t_d S )N)r…   r$   r„   )r   r   r   r   rs   ù  s    zGrabStdout.restoreN)r)   r‚   rƒ   r†   r‡   rˆ   rs   r   r   r   r   rr   ë  s   rr   )"Z
__future__r   r   r   rF   r{   rp   r$   rA   Zdistutils.command.configr   r   r   r+   r   Zdistutils.file_utilr   r2   r	   r
   Znumpy.distutils.exec_commandr   Z numpy.distutils.mingw32ccompilerr   Z numpy.distutils.command.autodistr   r   r   r   r   Znumpy.distutils.compatr   Úobjectrr   r   r   r   r   Ú<module>   s*      P