a
    hÝEb+l  ã                   @   s®  d dl 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
mZmZmZ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lmZ d d	lmZmZ d d
lmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%Z%da&e% '¡ Z(e)ƒ Z*dd„ Z+dd„ Z,dd„ Z-e,ede-ƒ dMdd„Z.e,ede.ƒ dNdd„Z/e,ede/ƒ dOdd„Z0e,ede0ƒ dPdd„Z1e,ede1ƒ d d!„ Z2d"d#„ Z3e,ed$e3ƒ dQd%d&„Z4e,ed'e4ƒ dRd)d*„Z5d+d gfd,d-„Z6e,ed.e6ƒ d/d0„ Z7e,ed1e7ƒ d2e
d3< d4e
d5< d6e
d7< d8e
d9< d:e
d;< d<e
d=< d>e
d?< e j8d@7  _8ej9dAk�rNdBe
dC< e!ƒ �rNe :dD¡ dEej8 e_8eZ;dSdFdG„Zee_eZ<dHdI„ Zee_dJD ]0Z=ej> ?dKe= dL ¡Z@e@du�rxeAe@dIeƒ �qxdS )Té    N)Úcopy)Ú	ccompiler)Úcompiler_classÚgen_lib_optionsÚget_default_compilerÚnew_compilerÚ	CCompiler)ÚDistutilsExecErrorÚDistutilsModuleErrorÚDistutilsPlatformErrorÚCompileErrorÚUnknownFileError)Úcustomize_compiler)ÚLooseVersion)Úlog)Úfilepath_from_subprocess_outputÚforward_bytes_to_stdout)Ú	cyg2win32Úis_sequenceÚmingw32Úget_num_build_jobsÚ_commandline_dep_stringÚsanitize_cxx_flagsc                 C   sà   | d }t j |¡sdS t|dƒ�}| ¡ }W d  ƒ n1 s@0    Y  t|||ƒ}|d }||krjdS d |dd… ¡}	dd„ tj|	dd	�D ƒ}
z2t  	| ¡j
}|
D ]}t  	|¡j
|kr¦ W dS q¦W n tyÚ   Y dS 0 d
S )z®
    Check if an objects needs to be rebuild based on its dependencies

    Parameters
    ----------
    obj : str
        object file

    Returns
    -------
    bool
    ú.dTÚrNéÿÿÿÿÚ c                 S   s"   g | ]}|d kr|  d¡s|‘qS )Ú
ú:)Úendswith)Ú.0Úx© r"   úY/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/numpy/distutils/ccompiler.pyÚ
<listcomp>E   s   ÿz _needs_build.<locals>.<listcomp>)ÚposixF)ÚosÚpathÚexistsÚopenÚ	readlinesr   ÚjoinÚshlexÚsplitÚstatÚst_mtimeÚOSError)ÚobjÚcc_argsÚextra_postargsÚpp_optsZdep_fileÚfÚlinesZcmdlineZlast_cmdlineÚcontentsÚdepsZt_objr"   r"   r#   Ú_needs_build%   s&    &r9   c                    s   ‡ fdd„}t | ||ƒ d S )Nc                    s   ˆ | g|¢R i |¤ŽS ©Nr"   )ÚselfÚargsÚkw©Úfuncr"   r#   Ú<lambda>Y   ó    z replace_method.<locals>.<lambda>)Úsetattr)ÚklassÚmethod_namer?   Úmr"   r>   r#   Úreplace_methodW   s    rF   c                 C   s   dS )zÐ
    Does nothing here, but is called by the get_version method and can be
    overridden by subclasses. In particular it is redefined in the `FCompiler`
    class where more documentation can be found.

    Nr"   ©r;   r"   r"   r#   ÚCCompiler_find_executablesb   s    rH   Úfind_executablesc           	      C   s`  |dur|nt tjƒ}|du r8|}t|ƒr8d t|ƒ¡}t |¡ z,| jrZt	j
||d� nt	j
|t	j|d� W n– t	jy  } z|j}|j}W Y d}~nrd}~0  t�y } zLd|› d�}z| tjj¡}W n tyê   | d¡}Y n0 d}W Y d}~nd}~0 0 dS t|ƒ�r"d t|ƒ¡}| j�r2t|ƒ t d	|¡�rFd
}nd}td|||f ƒ‚dS )aé  
    Execute a command in a sub-process.

    Parameters
    ----------
    cmd : str
        The command to execute.
    display : str or sequence of str, optional
        The text to add to the log file kept by `numpy.distutils`.
        If not given, `display` is equal to `cmd`.
    env: a dictionary for environment variables, optional

    Returns
    -------
    None

    Raises
    ------
    DistutilsExecError
        If the command failed, i.e. the exit status was not 0.

    Nú )Úenv)ÚstderrrK   z

z


Úutf8é   s   Too many open filesz2
Try rerunning setup command until build succeeds.r   z)Command "%s" failed with exit status %d%s)Údictr&   Úenvironr   r+   Úlistr   ÚinfoÚverboseÚ
subprocessÚcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚ
returncoder0   ÚencodeÚsysÚstdoutÚencodingÚAttributeErrorr   ÚreÚsearchr	   )	r;   ÚcmdÚdisplayrK   ÚexcÚoÚsÚeÚmsgr"   r"   r#   ÚCCompiler_spawnp   s>    

ÿrh   Úspawnr   c                 C   sê   |du rd}g }|D ]Ð}t j t j |¡¡\}}t j |¡d }|t j |¡d… }| d¡rœ| d¡d }|d|… }	t j t j 	|	¡¡}	|	||d…  }|| j
vr¶td||f ƒ‚|rÆt j |¡}t j ||| j ¡}
| |
¡ q|S )aÞ  
    Return the name of the object files for the given source files.

    Parameters
    ----------
    source_filenames : list of str
        The list of paths to source files. Paths can be either relative or
        absolute, this is handled transparently.
    strip_dir : bool, optional
        Whether to strip the directory from the returned paths. If True,
        the file name prepended by `output_dir` is returned. Default is False.
    output_dir : str, optional
        If given, this path is prepended to the returned paths to the
        object files.

    Returns
    -------
    obj_names : list of str
        The list of paths to the object files corresponding to the source
        files in `source_filenames`.

    Nr   é   z..é   z"unknown file type '%s' (from '%s'))r&   r'   ÚsplitextÚnormpathÚ
splitdriveÚisabsÚ
startswithÚrfindÚbasenameÚabspathZsrc_extensionsr   r+   Zobj_extensionÚappend)r;   Zsource_filenamesZ	strip_dirÚ
output_dirZ	obj_namesÚsrc_nameÚbaseÚextÚiÚdÚobj_namer"   r"   r#   ÚCCompiler_object_filenames¹   s&    

r|   Zobject_filenamesc	                    sj  t ƒ }	t�" tdu rt |	¡aW d  ƒ n1 s20    Y  |sDg S ddlm}
m}m} t	ˆ|
ƒr¬g }dD ]4}t
ˆd| ƒ}|du r†qj| d|d |¡f ¡ qjd |¡}nˆj}d	d |¡f }t |¡ ˆ |||||ˆ¡\}}‰‰}ˆ ˆ||¡‰ d
d ˆ ¡ }ˆ�r|dd ˆ¡ 7 }t |¡ ‡ ‡‡‡fdd„}t	ˆ|
ƒ�rît| ¡ ƒ}g g  }}|D ]r}||v �r`|| \}}ˆjdk�r–t|ƒ}t|ƒ}||ƒ�r¾||ƒ�s¾| |||ff¡ n| |||ff¡ �q`|}|D ]}||ƒ �qÜn| ¡ }t|ƒdk�rR|	dk�rRddlm} ||	ƒ�}| ||¡ W d  ƒ n1 �sF0    Y  n|D ]}||ƒ �qV|S )aÁ  
    Compile one or more source files.

    Please refer to the Python distutils API reference for more details.

    Parameters
    ----------
    sources : list of str
        A list of filenames
    output_dir : str, optional
        Path to the output directory.
    macros : list of tuples
        A list of macro definitions.
    include_dirs : list of str, optional
        The directories to add to the default include file search path for
        this compilation only.
    debug : bool, optional
        Whether or not to output debug symbols in or alongside the object
        file(s).
    extra_preargs, extra_postargs : ?
        Extra pre- and post-arguments.
    depends : list of str, optional
        A list of file names that all targets depend on.

    Returns
    -------
    objects : list of str
        A list of object file names, one per source file `sources`.

    Raises
    ------
    CompileError
        If compilation fails.

    Nr   )Ú	FCompilerÚ	is_f_fileÚhas_f90_header)Zf77Úf90ZfixZ	compiler_zFortran %s compiler: %srJ   r   zC compiler: %s
zcompile options: '%s'z
extra options: '%s'c                    s  | \}\}}t |ˆ ˆˆƒsd S t�0 |tvrDt |¡ W d   ƒ qnW d   ƒ n1 sX0    Y  t d¡ qzjt�$ ˆ |||ˆ ˆˆ¡ W d   ƒ n1 sž0    Y  W t� t |¡ W d   ƒ n1 sÎ0    Y  n0t� t |¡ W d   ƒ n1 sþ0    Y  0 d S )Ngš™™™™™¹?)	r9   Ú_global_lockÚ_processing_filesÚaddÚtimeÚsleepÚ_job_semaphoreÚ_compileÚremove)r<   r1   Úsrcrx   ©r2   r3   r4   r;   r"   r#   Úsingle_compile1  s    
,4*ÿz)CCompiler_compile.<locals>.single_compileZabsoftrj   )ÚThreadPoolExecutor)r   r�   r†   Ú	threadingÚ	SemaphoreZnumpy.distutils.fcompilerr}   r~   r   Ú
isinstanceÚgetattrrt   r+   Úcompiler_sor   rR   Z_setup_compileZ_get_cc_argsrQ   ÚkeysÚcompiler_typer   ÚitemsÚlenÚconcurrent.futuresrŒ   Úmap)r;   Úsourcesru   ÚmacrosÚinclude_dirsÚdebugÚextra_preargsr3   ÚdependsÚjobsr}   r~   r   rb   ZfcZfcompZccompÚobjectsÚbuildr‹   Zobjects_to_buildZf77_objectsZother_objectsr1   r‰   rx   Zbuild_itemsrd   rŒ   Úpoolr"   rŠ   r#   ÚCCompiler_compileè   sf    ((

ÿÿ



.r¢   Úcompiler"   c                    s  t  d| jjˆ jjf ¡ t| dƒrJd| jd v rJ| j d¡ | j d¡ ‡ ‡fdd„}|dƒrl|  ˆ j	¡ |d	ƒr�ˆ j
D ]\}}|  ||¡ qz|d
ƒr®ˆ jD ]}|  |¡ qž|dƒrÈ|  | jˆ j ¡ |dƒrâ|  | jˆ j ¡ |dƒrö|  ˆ j¡ |dƒ�r|  ˆ j¡ dS )aã  
    Customize compiler using distutils command.

    Parameters
    ----------
    cmd : class instance
        An instance inheriting from `distutils.cmd.Command`.
    ignore : sequence of str, optional
        List of `CCompiler` commands (without ``'set_'``) that should not be
        altered. Strings that are checked for are:
        ``('include_dirs', 'define', 'undef', 'libraries', 'library_dirs',
        'rpath', 'link_objects')``.

    Returns
    -------
    None

    zcustomize %s using %sÚcompilerÚclangr   z-ftrapping-mathc                    s   t ˆ | d ƒd uo| ˆvS r:   )r�   )Úattr©ra   Úignorer"   r#   Úallow�  s    z&CCompiler_customize_cmd.<locals>.allowrš   ÚdefineÚundefÚ	librariesÚlibrary_dirsÚrpathÚlink_objectsN)r   rR   Ú	__class__Ú__name__Úhasattrr¤   rt   r‘   Zset_include_dirsrš   rª   Zdefine_macror«   Zundefine_macroZset_librariesr¬   Zset_library_dirsr­   Zset_runtime_library_dirsr®   Zset_link_objectsr¯   )r;   ra   r¨   r©   ÚnameÚvalueÚmacror"   r§   r#   ÚCCompiler_customize_cmds  s.    ÿ

r¶   Zcustomize_cmdc                    s    g }d}t | j ¡ ƒ}dD ]}||vr| |¡ q|D ]8}t| |ƒr6t| |ƒ}t|t|ƒƒ}| |t|ƒf¡ q6dt|d ƒ d ‰ ‡ fdd„|D ƒ}d 	|¡S )	Nr   )
Úversionr¬   r­   Zobject_switchZcompile_switchrš   rª   r«   r®   r¯   z%-rj   zs = %sc                    s   g | ]}ˆ | ‘qS r"   r"   )r    Úprop©Úfmtr"   r#   r$   ´  rA   z'_compiler_to_string.<locals>.<listcomp>r   )
rQ   Zexecutablesr’   rt   r²   r�   Úmaxr•   Úreprr+   )r¤   ÚpropsZmxr’   ÚkeyÚvr6   r"   r¹   r#   Ú_compiler_to_string¥  s    

rÀ   c                 C   sV   z|   ¡  W n ty   Y n0 tjjdk rRtdƒ t| jƒ tt| ƒƒ tdƒ dS )z×
    Print the compiler customizations to stdout.

    Parameters
    ----------
    None

    Returns
    -------
    None

    Notes
    -----
    Printing is only done if the distutils log threshold is < 2.

    rk   zP********************************************************************************N)Úget_versionÚ	Exceptionr   Ú_global_logÚ	thresholdÚprintr°   rÀ   rG   r"   r"   r#   ÚCCompiler_show_customization·  s    
rÆ   Zshow_customizationc           
   	   C   sò  t  d| jj ¡ t| ƒ |räz| j d¡ W n ttfyD   Y n0 t	| dƒr¬d| j
d v r¬| jsä| j
d  d¡r~d\}}nd\}}| j
d  ||¡g| j
d	d
…  | _n8t	| dƒrÈt  d| j
f ¡ t	| dƒsät  d| jj ¡ t	| dƒ�r(d| j
d v �s d| j
d v �s d| j
d v �r(d| _nÆtjdk�rîdd
l}dd
l}| ¡ }z”zjtj |d¡}t|dƒ�}	|	 d¡ W d
  ƒ n1 �sŠ0    Y  | j|g|dd|d gd� d| _W n t�yÒ   d| _Y n0 W | |¡ n| |¡ 0 d
S )am  
    Do any platform-specific customization of a compiler instance.

    This method calls `distutils.sysconfig.customize_compiler` for
    platform-specific customization, as well as optionally remove a flag
    to suppress spurious warnings in case C++ code is being compiled.

    Parameters
    ----------
    dist : object
        This parameter is not used for anything.
    need_cxx : bool, optional
        Whether or not C++ has to be compiled. If so (True), the
        ``"-Wstrict-prototypes"`` option is removed to prevent spurious
        warnings. Default is False.

    Returns
    -------
    None

    Notes
    -----
    All the default options used by distutils can be extracted with::

      from distutils import sysconfig
      sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS',
                                'CCSHARED', 'LDSHARED', 'SO')

    zcustomize %sz-Wstrict-prototypesr¤   Úccr   Úgcc)rÈ   úg++)rÇ   zc++rj   Nz#### %s #######Úcompiler_cxxzMissing compiler_cxx fix for rÉ   r¥   Tr%   zfile.cÚwzint a;
z-MMDz-MFr   )ru   rœ   F)r   rR   r°   r±   r   r‘   rˆ   r^   Ú
ValueErrorr²   r¤   rÊ   rp   ÚreplaceÚwarnZ_auto_dependsr&   r³   ÚtempfileÚshutilÚmkdtempr'   r+   r)   Úwriter£   r   Úrmtree)
r;   ÚdistZneed_cxxÚaÚbrÏ   rÐ   ZtmpdirÚfnr5   r"   r"   r#   ÚCCompiler_customizeÔ  sR    
ÿ

ÿþ*
ÿ
rØ   Z	customizeú[-.\d]+c                    s   ‡ ‡‡fdd„}|S )aU  
    Simple matching of version numbers, for use in CCompiler and FCompiler.

    Parameters
    ----------
    pat : str, optional
        A regular expression matching version numbers.
        Default is ``r'[-.\d]+'``.
    ignore : str, optional
        A regular expression matching patterns to skip.
        Default is ``''``, in which case nothing is skipped.
    start : str, optional
        A regular expression matching the start of where to start looking
        for version numbers.
        Default is ``''``, in which case searching is started at the
        beginning of the version string given to `matcher`.

    Returns
    -------
    matcher : callable
        A function that is appropriate to use as the ``.version_match``
        attribute of a `CCompiler` class. `matcher` takes a single parameter,
        a version string.

    c                    sz   |  dd¡}d}ˆr0t ˆ|¡}|s(d S | ¡ }t ˆ||d … ¡}|sLd S ˆ rpt ˆ | d¡¡rp| ¡ }q0qpq0| d¡S )Nr   rJ   r   )rÍ   r_   ÚmatchÚendr`   Úgroup)r;   Úversion_stringÚposrE   ©r¨   ÚpatÚstartr"   r#   ÚmatcherA  s    z%simple_version_match.<locals>.matcherr"   )rà   r¨   rá   râ   r"   rß   r#   Úsimple_version_match'  s    rã   Fc           	         s2  |st | dƒr| jS |  ¡  z
| j}W n ty:   Y dS 0 |rH|d sLdS z
| j}W n@ ty–   z
| j‰ W n ty„   Y Y dS 0 ‡ fdd„}Y n0 ztj|tj	d�}W nJ tj
yÞ } z|j}|j}W Y d}~n.d}~0  työ   d}d}Y n0 t|ƒ}d}d}||v �r(||ƒ}|�r(t|ƒ}|| _|S )	a…  
    Return compiler version, or None if compiler is not available.

    Parameters
    ----------
    force : bool, optional
        If True, force a new determination of the version, even if the
        compiler already has a version attribute. Default is False.
    ok_status : list of int, optional
        The list of status values returned by the version look-up process
        for which a version string is returned. If the status value is not
        in `ok_status`, None is returned. Default is ``[0]``.

    Returns
    -------
    version : str or None
        Version string, in the format of `distutils.version.LooseVersion`.

    r·   Nr   c                    s"   t  ˆ | ¡}|sd S | d¡}|S )Nr·   )r_   rÚ   rÜ   )rÝ   rE   r·   ©rà   r"   r#   râ   z  s
    
z&CCompiler_get_version.<locals>.matcher)rL   rN   rA   )r²   r·   rI   Úversion_cmdr^   Zversion_matchZversion_patternrT   rU   rV   rW   rX   rY   r0   r   r   )	r;   ÚforceZ	ok_statusrå   râ   rX   rc   Ústatusr·   r"   rä   r#   ÚCCompiler_get_versionV  sD    





rè   rÁ   c                 C   sž   | j dv r| S t| ƒ}|j|_|jd gt|jdd… ƒ |_tj d¡r~d|jd v r~|jd |jd g|jdd…  |_n|jd g|jdd…  |_|S )z²
    Return the C++ compiler.

    Parameters
    ----------
    None

    Returns
    -------
    cxx : class instance
        The C++ compiler, as a `CCompiler` instance.

    )ÚmsvcÚintelwÚintelemwr   rj   NÚaixZ	ld_so_aixrk   )	r“   r   rÊ   r   r‘   r[   Úplatformrp   Ú	linker_so)r;   Úcxxr"   r"   r#   ÚCCompiler_cxx_compiler›  s    

ÿÿrð   Zcxx_compiler)ÚintelccompilerZIntelCCompilerz(Intel C Compiler for 32-bit applicationsÚintel)rñ   ZIntelItaniumCCompilerz7Intel C Itanium Compiler for Itanium-based applicationsÚintele)rñ   ZIntelEM64TCCompilerz(Intel C Compiler for 64-bit applicationsÚintelem)rñ   ZIntelCCompilerWz3Intel C Compiler for 32-bit applications on Windowsrê   )rñ   ZIntelEM64TCCompilerWz3Intel C Compiler for 64-bit applications on Windowsrë   )ZpathccompilerZPathScaleCCompilerz2PathScale Compiler for SiCortex-based applicationsÚpathcc)ZarmccompilerZArmCCompilerzArm C CompilerÚarm))úlinux.*rò   )r÷   ró   )r÷   rô   )r÷   rõ   )Úntrê   )rø   rë   Úwin32)Zmingw32ccompilerZMingw32CCompilerz>Mingw32 port of GNU C Compiler for Win32(for MSC built Python)r   z+Setting mingw32 as default compiler for nt.))rø   r   c                 C   sŠ  |d u rt  ¡ t jk}| d u r$tj} z"|d u r6t| ƒ}t| \}}}W n6 ty|   d|  }|d urp|d|  }t|ƒ‚Y n0 d| }zt	|ƒ W n’ t
�y$ }	 zxt|	ƒ}t  dt|ƒ¡ |dd … }zt	|ƒ W n: t
�y }	 z t|	ƒ}td| ƒ‚W Y d }	~	n
d }	~	0 0 W Y d }	~	n
d }	~	0 0 ztj| }
t|
ƒ| }W n$ t�yd   td||f ƒ‚Y n0 |d ||ƒ}||_t  d| ¡ |S )	Nz5don't know how to compile C/C++ code on platform '%s'z with '%s' compilerznumpy.distutils.z,%s in numpy.distutils; trying from distutilsé   z4can't compile C/C++ code: unable to load module '%s'zBcan't compile C/C++ code: unable to find class '%s' in module '%s'znew_compiler returns %s)r   Zget_thresholdÚINFOr&   r³   r   r   ÚKeyErrorr   Ú
__import__ÚImportErrorÚstrrR   r
   r[   ÚmodulesÚvarsrS   r›   )Úplatr¤   rS   Údry_runræ   Úmodule_nameÚ
class_nameÚlong_descriptionrg   rf   ÚmodulerC   r"   r"   r#   r   Ý  sP    ÿÿ2
ÿr   c                 C   sB   t | |||ƒ}g }|D ]&}t|ƒr2| t|ƒ¡ q| |¡ q|S r:   )Ú_distutils_gen_lib_optionsr   ÚextendrQ   rt   )r¤   r­   Úruntime_library_dirsr¬   r   Zlib_optsry   r"   r"   r#   r     s    ÿr   )Zmsvc9ré   Z_msvcZbcppZcygwincZemxcZunixcz
distutils.r¤   )NN)r   r   )NNNr   NNN)r"   )r   )rÙ   r   r   )NNNr   r   )Br&   r_   r[   r,   r„   rT   r   Ú	distutilsr   Údistutils.ccompilerr   r   r   r   r   Údistutils.errorsr	   r
   r   r   r   Údistutils.sysconfigr   Zdistutils.versionr   Znumpy.distutilsr   Znumpy.distutils.exec_commandr   r   Znumpy.distutils.misc_utilr   r   r   r   r   r   r�   r†   ÚLockr�   Úsetr‚   r9   rF   rH   rh   r|   r¢   r¶   rÀ   rÆ   rØ   rã   rè   rð   Z_default_compilersrí   rR   Z_distutils_new_compilerr  Z_ccr   ÚgetÚ_mrB   r"   r"   r"   r#   Ú<module>   s”    2

G
-   þ
 

0
Q
/C
ÿ     ü
,
