a
    ç´«jp  ã                   @   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Zd dlm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„ Z0e/ede0ƒ dPdd„Z1e/ede1ƒ dQdd„Z2e/ede2ƒ dRdd„Z3e/ede3ƒ dSdd„Z4e/ed e4ƒ d!d"„ Z5d#d$„ Z6e/ed%e6ƒ dTd&d'„Z7e/ed(e7ƒ dUd*d+„Z8d,d gfd-d.„Z9e/ed/e9ƒ d0d1„ Z:e/ed2e:ƒ d3ed4< d5ed6< d7ed8< d9ed:< d;ed<< d=ed>< d?ed@< dAedB< e j;dC7  _;ejdDk�rjdEedF< e$ƒ �rje <dG¡ dHej; e_;eZ=dVdIdJ„Zee_eZ>dKdL„ Zee_dMD ]0Z?ej@ AdNe? dO ¡ZBeBdu�r”eCeBdLeƒ �q”dS )Wé    N)Úcopy)ÚPath)Ú	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|ƒ�}| ¡ }W d  ƒ n1 s>0    Y  t|||ƒ}|d }||krhd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
    ú.dTNéÿÿÿÿÚ c                 S   s"   g | ]}|d kr|  d¡s|‘qS )Ú
ú:)Úendswith)Ú.0Úx© r"   úX/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/numpy/distutils/ccompiler.pyÚ
<listcomp>G   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>[   ó    z replace_method.<locals>.<lambda>)Úsetattr)ÚklassÚmethod_namer?   Úmr"   r>   r#   Úreplace_methodY   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_executablesd   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_spawnr   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	                    s|  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 ]|}||v �r`|| \}}ˆjdk�r–t|ƒ}t|ƒ}t|ƒj ¡ |v �rÈ||ƒ�sÈ| |||ff¡ n| |||ff¡ �q`|}|D ]}||ƒ �qæn| ¡ }t|ƒdk�rd|	dk�rdddlm} ||	ƒ�}| ||¡}W d  ƒ n1 �sP0    Y  t|ƒ n|D ]}||ƒ �qh|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ÚFORTRAN_COMMON_FIXED_EXTENSIONSÚ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_compile4  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   r   ÚsuffixÚlowerÚ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Œ   ÚpoolÚresr"   rŠ   r#   ÚCCompiler_compileê   sl    ((

ÿÿ


ÿ
,
r¥   Úcompiler"   c                    s(  t  d| jjˆ jjf ¡ t| dƒr`d| jd v r`t ¡ dkrHtjdks`| j 	d¡ | j
 	d¡ ‡ ‡fdd	„}|d
ƒr‚|  ˆ j¡ |dƒr¦ˆ jD ]\}}|  ||¡ q�|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 ``distutils.ccompiler.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   Úarm64Údarwinz-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§   ÚplatformÚmachiner[   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_cmdx  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   Ú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 )ao  
    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 )ak  
    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 ``distutils.ccompiler.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#   ÚmatcherL  s    z%simple_version_match.<locals>.matcherr"   )rè   r­   ré   rê   r"   rç   r#   Úsimple_version_match2  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ê   …  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_versiona  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…  |_tj d¡r®|j 	d	¡ |j 	d
¡ |j 	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 ``distutils.ccompiler.CCompiler`` instance.

    )ÚmsvcÚintelwÚintelemwr   rj   N)ÚaixÚos400Z	ld_so_aixrk   rõ   z-D__STDC_FORMAT_MACROSz-fno-extern-tls-init)
r“   r   rÒ   r   r‘   r[   r¸   rp   Ú	linker_sort   )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)ZfujitsuccompilerZFujitsuCCompilerzFujitsu C CompilerZfujitsu))ú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±   ÚrZ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   )Dr&   r_   r[   r¸   r,   r„   rT   r   Úpathlibr   Ú	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_compilersrR   Z_distutils_new_compilerr  Z_ccr  ÚgetÚ_mrB   r"   r"   r"   r#   Ú<module>   sš    2

G
-   þ
 
6
Q
/C$
ÿ     ü
,
