U
    +|jÅ{  ã                   @   sÂ   d 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T ddlm	Z	m
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 ddlmZ ddlmZ e d¡Zdd„ ZG dd„ deƒZdS )z¶distutils.command.build_ext

Implements the Distutils 'build_ext' command, for building extension
modules (currently limited to C extensions, should accommodate C++
extensions ASAP).é    N)ÚCommand)Ú*)Úcustomize_compilerÚget_python_version)Úget_config_h_filename)Únewer_group)Ú	Extension)Úget_platform)Úlogé   )Ú
py37compat)Ú	USER_BASEz3^[a-zA-Z_][a-zA-Z_0-9]*(\.[a-zA-Z_][a-zA-Z_0-9]*)*$c                  C   s   ddl m}  | ƒ  d S )Nr   ©Úshow_compilers)Údistutils.ccompilerr   r   © r   úoC:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\site-packages\setuptools/_distutils/command/build_ext.pyr      s    r   c                   @   s  e Zd ZdZdej Zdddddeƒ  fdd	d
de fdddddde fddddddddddgZddddd gZ	d!d"d#e
fgZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zejd6d7„ ƒZd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ Zd"S )HÚ	build_extz8build C/C++ extensions (compile/link to build directory)z (separated by '%s'))z
build-lib=Úbz(directory for compiled extension modules)zbuild-temp=Útz1directory for temporary files (build by-products)z
plat-name=Úpz>platform name to cross-compile for, if supported (default: %s))ÚinplaceÚiziignore build-lib and put compiled extensions into the source directory alongside your pure Python moduleszinclude-dirs=ÚIz.list of directories to search for header files)zdefine=ÚDzC preprocessor macros to define)zundef=ÚUz!C preprocessor macros to undefine)z
libraries=Úlz!external C libraries to link withzlibrary-dirs=ÚLz.directories to search for external C libraries)zrpath=ÚRz7directories to search for shared C libraries at runtime)zlink-objects=ÚOz2extra explicit link objects to include in the link)ÚdebugÚgz'compile/link with debugging information)ÚforceÚfz2forcibly build everything (ignore file timestamps))z	compiler=Úczspecify the compiler type)z	parallel=Újznumber of parallel build jobs)úswig-cppNz)make SWIG create C++ files (default is C))z
swig-opts=Nz!list of SWIG command line options)zswig=Nzpath to the SWIG executable)ÚuserNz#add user include, library and rpathr   r    r"   r&   r'   zhelp-compilerNzlist available compilersc                 C   s‚   d | _ d | _d | _d | _d| _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d S )Nr   )Ú
extensionsÚ	build_libÚ	plat_nameÚ
build_tempr   ÚpackageÚinclude_dirsÚdefineÚundefÚ	librariesÚlibrary_dirsÚrpathÚlink_objectsr    r"   ÚcompilerÚswigÚswig_cppÚ	swig_optsr'   Úparallel©Úselfr   r   r   Úinitialize_optionsk   s*    zbuild_ext.initialize_optionsc           
   
   C   sü  ddl m} |  ddddddd	d
¡ | jd kr8| jj| _| jj| _| ¡ }|jdd�}| j	d krn| jj	pjg | _	t
| j	tƒrŠ| j	 tj¡| _	tjtjkr®| j	 tj tjd¡¡ | j	 | tjj¡¡ ||krâ| j	 | tjj¡¡ |  d¡ |  d¡ | jd k�rg | _| jd k�rg | _nt
| jtƒ�r:| j tj¡| _| jd k�rNg | _nt
| jtƒ�rl| j tj¡| _tjdk�rh| j tj tjd¡¡ tjtjk�r¶| j tj tjd¡¡ | j�rÒtj | jd¡| _ntj | jd¡| _| j	 tj tƒ ¡¡ t tdd ƒ}|�r| j |¡ | j!dk�r*d}n| j!dd … }tj tjd¡}|�r\tj ||¡}| j |¡ tj"d d… dk�rÆtj# $tj tjd¡¡�rº| j tj tjddt%ƒ  d¡¡ n| j d¡ | &d¡�rú|j'�sî| j | &d ¡¡ n| j d¡ | j(�r| j( d!¡}d"d#„ |D ƒ| _(| j)�r4| j) d!¡| _)| j*d k�rHg | _*n| j* d$¡| _*| j+�rºtj t,d¡}tj t,d¡}	tj -|¡�r”| j	 |¡ tj -|	¡�rº| j |	¡ | j |	¡ t
| j.tƒ�røzt/| j.ƒ| _.W n t0k
�rö   t1d%ƒ‚Y nX d S )&Nr   )Ú	sysconfigÚbuild)r)   r)   )r+   r+   )r4   r4   )r    r    )r"   r"   )r8   r8   )r*   r*   r   )Úplat_specificÚincluder0   r3   ÚntZlibsZDebugZReleaseÚ_homeÚwin32é   ÚPCbuildé   ÚcygwinÚbinÚlibÚpythonÚconfigÚ.ÚPy_ENABLE_SHAREDZLIBDIRú,c                 S   s   g | ]}|d f‘qS )Ú1r   )Ú.0Úsymbolr   r   r   Ú
<listcomp>ú   s     z.build_ext.finalize_options.<locals>.<listcomp>ú zparallel should be an integer)2Ú	distutilsr<   Úset_undefined_optionsr,   ÚdistributionÚext_packageÚext_modulesr(   Úget_python_incr-   Ú
isinstanceÚstrÚsplitÚosÚpathsepÚsysÚexec_prefixÚbase_exec_prefixÚappendÚpathÚjoinÚextendÚensure_string_listr0   r1   r2   ÚnameÚprefixr    r+   Údirnamer   Úgetattrr*   ÚplatformÚ
executableÚ
startswithr   Úget_config_varÚpython_buildr.   r/   r7   r'   r   Úisdirr8   ÚintÚ
ValueErrorÚDistutilsOptionError)
r:   r<   Z
py_includeZplat_py_includeÚ	_sys_homeÚsuffixZnew_libZdefinesZuser_includeZuser_libr   r   r   Úfinalize_optionsƒ   s°    ù




ÿ

þzbuild_ext.finalize_optionsc                 C   sj  ddl m} | jsd S | j ¡ rL|  d¡}| j | ¡ p:g ¡ | j	 
|j¡ || j| j| j| jd�| _t| jƒ tjdkr”| jtƒ kr”| j | j¡ | jd k	r¬| j | j¡ | jd k	rÔ| jD ]\}}| j ||¡ q¼| jd k	rö| jD ]}| j |¡ qä| jd k	�r| j | j¡ | j	d k	�r*| j | j	¡ | jd k	�rD| j | j¡ | j d k	�r^| j !| j ¡ |  "¡  d S )Nr   )Únew_compilerÚ
build_clib)r4   ÚverboseÚdry_runr"   r@   )#r   rv   r(   rU   Úhas_c_librariesÚget_finalized_commandr0   rd   Zget_library_namesr1   ra   rw   r4   rx   ry   r"   r   r\   rf   r*   r	   Z
initializer-   Zset_include_dirsr.   Zdefine_macror/   Zundefine_macroZset_librariesZset_library_dirsr2   Zset_runtime_library_dirsr3   Zset_link_objectsÚbuild_extensions)r:   rv   rw   rf   ÚvalueÚmacror   r   r   Úrun  s@    

ý




zbuild_ext.runc           
      C   sv  t |tƒstdƒ‚t|ƒD �]T\}}t |tƒr0qt |tƒrFt|ƒdkrNtdƒ‚|\}}t d|¡ t |t	ƒrvt
 |¡s~tdƒ‚t |tƒs�tdƒ‚t||d ƒ}dD ]"}| |¡}|d	k	r¢t|||ƒ q¢| d
¡|_d|krät d¡ | d¡}|�rhg |_g |_|D ]b}	t |	tƒ�r"t|	ƒdk�s*tdƒ‚t|	ƒdk�rJ|j |	d ¡ nt|	ƒdk�r|j |	¡ �q|||< qd	S )a¬  Ensure that the list of extensions (presumably provided as a
        command option 'extensions') is valid, i.e. it is a list of
        Extension objects.  We also support the old-style list of 2-tuples,
        where the tuples are (ext_name, build_info), which are converted to
        Extension instances here.

        Raise DistutilsSetupError if the structure is invalid anywhere;
        just returns otherwise.
        z:'ext_modules' option must be a list of Extension instancesé   zMeach element of 'ext_modules' option must be an Extension instance or 2-tuplezvold-style (ext_name, build_info) tuple found in ext_modules for extension '%s' -- please convert to Extension instancezRfirst element of each tuple in 'ext_modules' must be the extension name (a string)zOsecond element of each tuple in 'ext_modules' must be a dictionary (build info)Úsources)r-   r1   r0   Úextra_objectsÚextra_compile_argsÚextra_link_argsNr2   Zdef_filez9'def_file' element of build info dict no longer supportedÚmacros)r   r€   z9'macros' element of build info dict must be 1- or 2-tupler   r   )rY   ÚlistÚDistutilsSetupErrorÚ	enumerater   ÚtupleÚlenr
   ÚwarnrZ   Úextension_name_reÚmatchÚdictÚgetÚsetattrÚruntime_library_dirsÚdefine_macrosÚundef_macrosra   )
r:   r(   r   ÚextÚext_nameZ
build_infoÚkeyÚvalr…   r~   r   r   r   Úcheck_extensions_listW  s^    

ÿ
ÿþ
ÿÿ
ÿ


ÿzbuild_ext.check_extensions_listc                 C   s,   |   | j¡ g }| jD ]}| |j¡ q|S ©N)r˜   r(   rd   r�   )r:   Ú	filenamesr”   r   r   r   Úget_source_files¥  s
    
zbuild_ext.get_source_filesc                 C   s2   |   | j¡ g }| jD ]}| |  |j¡¡ q|S r™   )r˜   r(   ra   Úget_ext_fullpathrf   )r:   Úoutputsr”   r   r   r   Úget_outputs®  s
    
zbuild_ext.get_outputsc                 C   s(   |   | j¡ | jr|  ¡  n|  ¡  d S r™   )r˜   r(   r8   Ú_build_extensions_parallelÚ_build_extensions_serialr9   r   r   r   r|   ¼  s    
zbuild_ext.build_extensionsc                    sº   ˆj }ˆj dkrt ¡ }zddlm} W n tk
r@   d }Y nX |d krVˆ ¡  d S ||d��P‰ ‡ ‡fdd„ˆjD ƒ}tˆj|ƒD ]&\}}ˆ 	|¡� | 
¡  W 5 Q R X q„W 5 Q R X d S )NTr   )ÚThreadPoolExecutor)Úmax_workersc                    s   g | ]}ˆ   ˆj|¡‘qS r   )ÚsubmitÚbuild_extension)rO   r”   ©Úexecutorr:   r   r   rQ   Ò  s   ÿz8build_ext._build_extensions_parallel.<locals>.<listcomp>)r8   r\   Ú	cpu_countÚconcurrent.futuresr¡   ÚImportErrorr    r(   ÚzipÚ_filter_build_errorsÚresult)r:   Úworkersr¡   Úfuturesr”   Úfutr   r¥   r   rŸ   Ä  s"    

ÿz$build_ext._build_extensions_parallelc              
   C   s0   | j D ]$}|  |¡� |  |¡ W 5 Q R X qd S r™   )r(   r«   r¤   )r:   r”   r   r   r   r    Ø  s    
z"build_ext._build_extensions_serialc              
   c   sT   z
d V  W nD t ttfk
rN } z |js*‚ |  d|j|f ¡ W 5 d }~X Y nX d S )Nz"building extension "%s" failed: %s)ÚCCompilerErrorÚDistutilsErrorÚCompileErrorÚoptionalr‹   rf   )r:   r”   Úer   r   r   r«   Ý  s    
ÿzbuild_ext._filter_build_errorsc           
      C   sP  |j }|d kst|ttfƒs*td|j ƒ‚t|ƒ}|  |j¡}||j }| j	slt
||dƒslt d|j¡ d S t d|j¡ |  ||¡}|jpŽg }|jd d … }|jD ]}| |f¡ q¤| jj|| j||j| j||jd�}|d d … | _|jrø| |j¡ |j�pg }|j�p| j |¡}	| jj|||  |¡|j|j ||  !|¡| j| j|	d�
 d S )Nzjin 'ext_modules' option (extension '%s'), 'sources' must be present and must be a list of source filenamesÚnewerz$skipping '%s' extension (up-to-date)zbuilding '%s' extension)Ú
output_dirr…   r-   r    Úextra_postargsÚdepends)r0   r1   r‘   r·   Úexport_symbolsr    r+   Ztarget_lang)"r�   rY   r†   r‰   r‡   rf   Úsortedrœ   r¸   r"   r   r
   r    ÚinfoÚswig_sourcesrƒ   r’   r“   ra   r4   Úcompiler+   r-   Z_built_objectsr‚   rd   r„   ÚlanguageZdetect_languageZlink_shared_objectÚget_librariesr1   r‘   Úget_export_symbols)
r:   r”   r�   Úext_pathr¸   Ú
extra_argsr…   r/   Zobjectsr¾   r   r   r   r¤   ç  sX    þÿ


ú
 ÷zbuild_ext.build_extensionc                 C   s$  g }g }i }| j rt d¡ | j s6d| jks6d|jkr<d}nd}|D ]P}tj |¡\}}	|	dkrŠ| |d | ¡ | |¡ |d ||< qD| |¡ qD|sž|S | jpª|  	¡ }
|
dg}| 
| j¡ | j rÐ| d¡ | jsì|jD ]}| |¡ qÜ|D ].}|| }t d	||¡ |  |d
||g ¡ qð|S )züWalk the list of source files in 'sources', looking for SWIG
        interface (.i) files.  Run SWIG on all that are found, and
        return a modified 'sources' list with SWIG source files replaced
        by the generated C (or C++) files.
        z/--swig-cpp is deprecated - use --swig-opts=-c++z-c++z.cppz.cz.iÚ_wrapéÿÿÿÿz-pythonzswigging %s to %sz-o)r6   r
   r‹   r7   r\   rb   Úsplitextra   r5   Ú	find_swigrd   r»   Úspawn)r:   r�   Ú	extensionZnew_sourcesr¼   Zswig_targetsZ
target_extÚsourceÚbaser”   r5   Zswig_cmdÚoÚtargetr   r   r   r¼   3  s@    
ÿ


zbuild_ext.swig_sourcesc                 C   s^   t jdkrdS t jdkrLdD ]*}t j d| d¡}t j |¡r|  S qdS tdt j ƒ‚dS )	z›Return the name of the SWIG executable.  On Unix, this is
        just "swig" -- it should be in the PATH.  Tries a bit harder on
        Windows.
        Úposixr5   r@   )z1.3z1.2z1.1z	c:\swig%szswig.exez>I don't know how to find (much less run) SWIG on platform '%s'N)r\   rf   rb   rc   ÚisfileÚDistutilsPlatformError)r:   ÚversÚfnr   r   r   rÆ   i  s    


ÿÿzbuild_ext.find_swigc                 C   sŽ   |   |¡}| d¡}|  |d ¡}| jsRtjj|dd… |g Ž }tj | j|¡S d |dd… ¡}|  d¡}tj 	| 
|¡¡}tj ||¡S )z¡Returns the path of the filename for a given extension.

        The file is located in `build_lib` or directly in the package
        (inplace option).
        rK   rÄ   Nr   Úbuild_py)Úget_ext_fullnamer[   Úget_ext_filenamer   r\   rb   rc   r)   r{   ÚabspathZget_package_dir)r:   r•   ÚfullnameÚmodpathÚfilenamer,   rÒ   Úpackage_dirr   r   r   rœ   �  s    


zbuild_ext.get_ext_fullpathc                 C   s    | j dkr|S | j d | S dS )zSReturns the fullname of a given extension name.

        Adds the `package.` prefixNrK   )r,   )r:   r•   r   r   r   rÓ   œ  s    
zbuild_ext.get_ext_fullnamec                 C   s.   ddl m} | d¡}|dƒ}tjj|Ž | S )z¦Convert the name of an extension (eg. "foo.bar") into the name
        of the file from which it will be loaded (eg. "foo/bar.so", or
        "foo\bar.pyd").
        r   ©rm   rK   Ú
EXT_SUFFIX)Údistutils.sysconfigrm   r[   r\   rb   rc   )r:   r•   rm   rÁ   Z
ext_suffixr   r   r   rÔ   ¥  s    
zbuild_ext.get_ext_filenamec                 C   sx   d|j  d¡d  }z| d¡ W n0 tk
rR   d| d¡ dd¡ d¡ }Y nX d	| }||jkrr|j |¡ |jS )
a  Return the list of symbols that a shared extension has to
        export.  This either uses 'ext.export_symbols' or, if it's not
        provided, "PyInit_" + module_name.  Only relevant on Windows, where
        the .pyd file (DLL) must export the module "PyInit_" function.
        Ú_rK   rÄ   Úasciir   Úpunycodeó   -ó   _ZPyInit)rf   r[   ÚencodeÚUnicodeEncodeErrorÚreplaceÚdecoder¹   ra   )r:   r”   rt   Zinitfunc_namer   r   r   rÀ   ¯  s    "
zbuild_ext.get_export_symbolsc                 C   sì   t jdkr^ddlm} t| j|ƒsÞd}| jr4|d }|t jd? t jd? d@ f }|j|g S n€dd	l	m
} d
}|dƒrÂtt dƒr†d}n<t jdkr–d}n,dtjkrÂ|dƒdkr²d}n|dƒdkrÂd}|rÞ|dƒ}|jd| g S |jt ¡  S )zÓReturn the list of libraries to link against when building a
        shared extension.  On most platforms, this is just 'ext.libraries';
        on Windows, we add the Python library (eg. python20.dll).
        rB   r   )ÚMSVCCompilerz
python%d%dZ_dé   é   éÿ   rÚ   FrL   ZgetandroidapilevelTrF   Ú_PYTHON_HOST_PLATFORMZANDROID_API_LEVELZMACHDEPZ	LDVERSIONrI   )r^   rj   Zdistutils._msvccompilerræ   rY   r4   r    Ú
hexversionr0   rÜ   rm   Úhasattrr\   Úenvironr   Ú	pythonlib)r:   r”   ræ   Útemplaterî   rm   Zlink_libpythonZ	ldversionr   r   r   r¿   Â  s4    

ÿ



zbuild_ext.get_libraries) Ú__name__Ú
__module__Ú__qualname__Údescriptionr\   r]   Zsep_byr	   Úuser_optionsÚboolean_optionsr   Úhelp_optionsr;   ru   r   r˜   r›   rž   r|   rŸ   r    Ú
contextlibÚcontextmanagerr«   r¤   r¼   rÆ   rœ   rÓ   rÔ   rÀ   r¿   r   r   r   r   r   "   sp   
ÿÿÿÿÙ+ ÿÿ @N	
	L6	
r   )Ú__doc__r÷   r\   Úrer^   Údistutils.corer   Údistutils.errorsrÜ   r   r   r   Údistutils.dep_utilr   Údistutils.extensionr   Údistutils.utilr	   rS   r
   Ú r   Úsiter   r½   rŒ   r   r   r   r   r   r   Ú<module>   s&   ÿ