B
    0d                 @   sx   d Z ddlZddlZddlZddlmZ dg dfddZdddZdd	 Zd
d Z	dddZ
dd Zdd Zdd ZdS )z,
Helpers for detection of compiler features
    N)dict_appendc       	   
   C   s   ddl m} ddlm} |dkr4t| |r0d}nd}|p@| jd }t d}tj	
|d| }t|d}|| W dQ R X y| j|g||d	 W n |k
r   d
S X W dQ R X dS )z>Returns True if the compiler is able to compile the given coder   )CompileError)	FCompilerNz)      program main
      return
      endz.int main (int argc, char **argv) { return 0; }mainw)
output_dirZextra_postargsFT)distutils.errorsr   Znumpy.distutils.fcompilerr   
isinstanceZsrc_extensionstempfileTemporaryDirectoryospathjoinopenwritecompile)	compilercodeflagsextr   r   temp_dirfnamef r   T/var/www/html/venv/lib/python3.7/site-packages/scipy/_build_utils/compiler_helper.pytry_compile	   s     

r   c             C   s   t | |g|dS )z4Returns True if the compiler supports the given flag)r   r   )r   )r   flagr   r   r   r   has_flag"   s    r   c             C   st   ddg}ddgddgddgd}| | j|}x*|D ]"}|dkrDdS t| |dd	r4|S q4W d
dlm} |d dS )z?Detects compiler flag for c++14, c++11, or None if not detectedz
-std=c++14z
-std=c++11z
/std:c++14Nz/Qstd=c++14z/Qstd=c++11)msvcintelwintelemz.cpp)r   r   )logz"Could not detect c++ standard flag)getcompiler_typer   numpy.distutilsr!   warn)r   Z	gnu_flagsZflags_by_ccr   r   r!   r   r   r   get_cxx_std_flag'   s    

r&   c             C   sV   d}dddd}| | j|}|dkr*dS t| |ddr<|S ddlm} |d	 dS )
z#Detects compiler flag to enable C99z-std=c99Nz	/Qstd=c99)r   r   r    z.c)r   r   )r!   z"Could not detect c99 standard flag)r"   r#   r   r$   r!   r%   )r   Zgnu_flagZ
flag_by_ccr   r!   r   r   r   get_c_std_flagA   s    
r'   c             C   s"   t || |g |dr| | dS )zBAppends flag to the list of arguments if supported by the compiler)r   r   N)r   append)argsr   r   r   r   r   r   try_add_flagV   s    r*   c             C   s"   t | j}|dk	r|j| dS )z0Sets basic compiler flags for compiling C99 codeN)r'   r   extra_compile_argsr(   )	build_extr   std_flagr   r   r   set_c_flags_hook\   s    
r.   c             C   sX   | j }|j}t|}|dk	r&|| tjdkrTd}t||rT|| |j| dS )z2Sets basic compiler flags for compiling C++11 codeNdarwinz-mmacosx-version-min=10.9)Z_cxx_compilerr+   r&   r(   sysplatformr   extra_link_args)r,   r   ccr)   r-   min_macos_flagr   r   r   set_cxx_flags_hookc   s    



r5   c             C   sf   | j }g }g }t|}|d k	r(|| tjdkrTd}t||rT|| || t|||d d S )Nr/   z-mmacosx-version-min=10.9)Zextra_compiler_argsr2   )r   r&   r(   r0   r1   r   r   )
build_clibZ
build_infor3   new_argsZnew_link_argsr-   r4   r   r   r   set_cxx_flags_clib_hookt   s    




r8   )N)N)__doc__r
   r   r0   Znumpy.distutils.system_infor   r   r   r&   r'   r*   r.   r5   r8   r   r   r   r   <module>   s   

