o
    Eb                     @   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u rt| |rd}nd}|p | jd }t H}tj	
|d| }t|d}|| W d   n1 sDw   Y  z| j|g||d	 W n |yd   Y W d   d
S w W d   dS 1 spw   Y  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)Z
output_dirZextra_postargsFT)Zdistutils.errorsr   Znumpy.distutils.fcompilerr   
isinstanceZsrc_extensionstempfileZTemporaryDirectoryospathjoinopenwritecompile)	compilercodeflagsextr   r   Ztemp_dirfnamef r   D/usr/lib/python3/dist-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   sv   ddg}ddgddgddgd}| | j|}|D ]}|du r" dS t| |dd	r-|  S q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ZmsvcZintelwZintelemz.cppr   r   logz"Could not detect c++ standard flaggetZcompiler_typer   Z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u 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=c99r   z.cr   r   r   z"Could not detect c99 standard flagr   )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 dS )zBAppends flag to the list of arguments if supported by the compilerr   N)r   append)argsr   r   r   r   r   r   try_add_flagV   s   r&   c                 C   s&   t | j}|dur|j| dS 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   s`   | j }|j}t|}|dur|| tjdkr,d}t||r.|| |j| dS dS dS )z2Sets basic compiler flags for compiling C++11 codeNdarwin-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   



r2   c                 C   sf   | j }g }g }t|}|d ur|| tjdkr*d}t||r*|| || t|||d d S )Nr+   r,   )Zextra_compiler_argsr/   )r   r"   r$   r-   r.   r   r   )Z
build_clibZ
build_infor0   new_argsZnew_link_argsr)   r1   r   r   r   set_cxx_flags_clib_hookt   s   





r4   )N)__doc__r   r	   r-   Znumpy.distutils.system_infor   r   r   r"   r#   r&   r*   r2   r4   r   r   r   r   <module>   s    

