o
    ýÄOcF{  ã                   @   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mZm	Z	m
Z
mZmZmZ 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)ÚDistutilsOptionErrorÚDistutilsSetupErrorÚCCompilerErrorÚDistutilsErrorÚCompileErrorÚDistutilsPlatformError)Ú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   úID:\Flask\env\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g d¢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d,d-„ Zd.d/„ Zd0d1„ Zejd2d3„ ƒZd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdS )DÚ	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 rpath)r   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_optionsn   s*   
zbuild_ext.initialize_optionsc           	   
   C   sÈ  ddl m} |  ddddddd	d
¡ | jd u r| jj| _| jj| _| ¡ }|jdd}| j	d u r7| jj	p5g | _	t
| j	tƒrE| j	 tj¡| _	tjtjkrW| j	 tj tjd¡¡ | j	 | tjj¡¡ ||krq| j	 | tjj¡¡ |  d¡ |  d¡ | jd u rƒg | _| jd u rŒg | _nt
| jtƒrš| j tj¡| _| jd u r£g | _nt
| jtƒr±| j tj¡| _tjdkr%| 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ƒ ¡¡ | j t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rK|j"sE| j tj tjddt#ƒ  d¡¡ n| j d¡ | $d¡re|j"s_| j | $d¡¡ n| j d¡ | j%rw| j% d¡}d d!„ |D ƒ| _%| j&r‚| j& d¡| _&| j'd u rŒg | _'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 d S  t-yá   t.d#ƒ‚w d S )$Nr   )Ú	sysconfigÚbuild)r.   r.   )r0   r0   )r9   r9   )r%   r%   )r'   r'   )r=   r=   )r/   r/   r   )Úplat_specificÚincluder5   r8   ÚntZlibsZDebugZReleaseÚwin32é   ÚPCbuildé   ÚcygwinÚ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)/Ú	distutilsrA   Úset_undefined_optionsr1   ÚdistributionÚext_packageÚext_modulesr-   Úget_python_incr2   Ú
isinstanceÚstrÚsplitÚosÚpathsepÚsysÚexec_prefixÚbase_exec_prefixÚappendÚpathÚjoinÚextendÚensure_string_listr5   r6   r7   ÚnameÚprefixr%   r0   Údirnamer   r/   ÚplatformÚpython_buildr
   Úget_config_varr3   r4   r<   r,   r   Úisdirr=   ÚintÚ
ValueErrorr   )	r?   rA   Z
py_includeZplat_py_includeÚsuffixZnew_libZdefinesZuser_includeZuser_libr   r   r   Úfinalize_options†   s°   ø








ÿÿÿýzbuild_ext.finalize_optionsc                 C   sb  ddl m} | jsd S | j ¡ r&|  d¡}| j | ¡ pg ¡ | j	 
|j¡ || j| j| j| jd| _t| jƒ tjdkrJ| jtƒ krJ| j | j¡ | jd urV| j | j¡ | jd urj| jD ]\}}| j ||¡ q^| jd ur{| jD ]}| j |¡ qr| jd ur‡| j | j¡ | j	d ur“| j | j	¡ | jd urŸ| j | j¡ | j d ur«| j !| j ¡ |  "¡  d S )Nr   )Únew_compilerÚ
build_clib)r9   ÚverboseÚdry_runr'   rE   )#r   rt   r-   rX   Úhas_c_librariesÚget_finalized_commandr5   rg   Zget_library_namesr6   rd   ru   r9   rv   rw   r'   r	   r_   ri   r/   r   Ú
initializer2   Úset_include_dirsr3   Údefine_macror4   Úundefine_macroÚset_librariesÚset_library_dirsr7   Úset_runtime_library_dirsr8   Úset_link_objectsÚbuild_extensions)r?   rt   ru   ri   ÚvalueÚmacror   r   r   Úrun  sB   

ü








zbuild_ext.runc           
      C   sh  t |tƒs	tdƒ‚t|ƒD ]¤\}}t |tƒrqt |tƒr"t|ƒdkr&tdƒ‚|\}}t d|¡ t |t	ƒr:t
 |¡s>tdƒ‚t |tƒsGtdƒ‚t||d ƒ}dD ]}| |¡}|d	urat|||ƒ qP| d
¡|_d|v rqt d¡ | d¡}|r­g |_g |_|D ],}	t |	tƒrt|	ƒdv s‘tdƒ‚t|	ƒdkr |j |	d ¡ q€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)r2   r6   r5   Úextra_objectsÚextra_compile_argsÚextra_link_argsNr7   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   )r\   Úlistr   Ú	enumerater   ÚtupleÚlenr   Úwarnr]   Úextension_name_reÚmatchÚdictÚgetÚsetattrÚruntime_library_dirsÚdefine_macrosÚundef_macrosrd   )
r?   r-   r   ÚextÚext_nameZ
build_infoÚkeyÚvalr‹   r„   r   r   r   Úcheck_extensions_list\  sb   

ÿ
ÿüÿ
ÿ
€

ÿ€
¸zbuild_ext.check_extensions_listc                 C   s,   |   | j¡ g }| jD ]}| |j¡ q|S ©N)r   r-   rg   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-   rd   Úget_ext_fullpathri   )r?   Úoutputsr™   r   r   r   Úget_outputs¾  s
   
zbuild_ext.get_outputsc                 C   s*   |   | j¡ | jr|  ¡  d S |  ¡  d S rž   )r   r-   r=   Ú_build_extensions_parallelÚ_build_extensions_serialr>   r   r   r   r‚   Ì  s   zbuild_ext.build_extensionsc              
      sâ   ˆj }ˆj du rt ¡ }zddlm} W n ty   d }Y nw |d u r*ˆ ¡  d S ||d8‰ ‡ ‡fdd„ˆjD ƒ}tˆj|ƒD ]\}}ˆ 	|¡ | 
¡  W d   ƒ n1 sYw   Y  qAW d   ƒ d S 1 sjw   Y  d S )NTr   )ÚThreadPoolExecutor)Úmax_workersc                    s   g | ]	}ˆ   ˆj|¡‘qS r   )ÚsubmitÚbuild_extension)rR   r™   ©Úexecutorr?   r   r   rT   â  s    ÿz8build_ext._build_extensions_parallel.<locals>.<listcomp>)r=   r_   Ú	cpu_countÚconcurrent.futuresr¦   ÚImportErrorr¥   r-   ÚzipÚ_filter_build_errorsÚresult)r?   Zworkersr¦   Úfuturesr™   Úfutr   rª   r   r¤   Ô  s,   
ÿÿ
ÿ€ÿ"üz$build_ext._build_extensions_parallelc              	   C   sD   | j D ]}|  |¡ |  |¡ W d   ƒ n1 sw   Y  qd S rž   )r-   r°   r©   )r?   r™   r   r   r   r¥   é  s   
ÿ€ÿz"build_ext._build_extensions_serialc              
   c   sX    zd V  W d S  t ttfy+ } z|js‚ |  d |j|¡¡ W Y d }~d S d }~ww )Nz"building extension "{}" failed: {})r   r   r   Úoptionalr   Úformatri   )r?   r™   Úer   r   r   r°   î  s   €"€ýzbuild_ext._filter_build_errorsc           
      C   sL  |j }|d u st|ttfƒstd|j ƒ‚t|ƒ}|  |j¡}||j }| j	s6t
||dƒs6t d|j¡ d S t d|j¡ |  ||¡}|jpGg }|jd d … }|jD ]}| |f¡ qR| 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‹   r2   r%   Úextra_postargsÚdepends)r5   r6   r–   r¹   Úexport_symbolsr%   r0   Útarget_lang)"r‡   r\   rŒ   rŽ   r   ri   Úsortedr¡   rº   r'   r   r   r%   ÚinfoÚswig_sourcesr‰   r—   r˜   rd   r9   Úcompiler0   r2   Z_built_objectsrˆ   rg   rŠ   ÚlanguageÚdetect_languageÚlink_shared_objectÚget_librariesr6   r–   Úget_export_symbols)
r?   r™   r‡   Úext_pathrº   Ú
extra_argsr‹   r4   ÚobjectsrÁ   r   r   r   r©   ÷  sZ   þÿ


ù

özbuild_ext.build_extensionc                 C   s$  g }g }i }| j rt d¡ | j sd| jv sd|jv rd}nd}|D ](}tj |¡\}}	|	dkrE| |d | ¡ | |¡ |d ||< q"| |¡ q"|sO|S | jpU|  	¡ }
|
dg}| 
| j¡ | j rh| d¡ | jsv|jD ]}| |¡ qn|D ]}|| }t d	||¡ |  |d
||g ¡ qx|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)r;   r   r   r<   r_   re   Úsplitextrd   r:   Ú	find_swigrg   r¾   Úspawn)r?   r‡   Ú	extensionZnew_sourcesr¿   Zswig_targetsÚ
target_extÚsourceÚbaser™   r:   Zswig_cmdÚoÚtargetr   r   r   r¿   H  sF   
ÿþý


zbuild_ext.swig_sourcesc                 C   sZ   t jdkrdS t jdkr&dD ]}t j d| d¡}t j |¡r#|  S qdS tdt j ƒ‚)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.
        Úposixr:   rE   )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')r_   ri   re   rf   Úisfiler   )r?   ÚversÚfnr   r   r   rÌ     s   

ÿÿÿzbuild_ext.find_swigc                 C   sŽ   |   |¡}| d¡}|  |d ¡}| js)t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).
        rN   rÊ   Nr   Úbuild_py)Úget_ext_fullnamer^   Úget_ext_filenamer   r_   re   rf   r.   ry   ÚabspathÚget_package_dir)r?   rš   ÚfullnameÚmodpathÚfilenamer1   rØ   Úpackage_dirr   r   r   r¡   š  s   


zbuild_ext.get_ext_fullpathc                 C   s   | j du r|S | j d | S )zSReturns the fullname of a given extension name.

        Adds the `package.` prefixNrN   )r1   )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   ©rn   rN   Ú
EXT_SUFFIX)Údistutils.sysconfigrn   r^   r_   re   rf   )r?   rš   rn   rÆ   Ú
ext_suffixr   r   r   rÚ   ¾  s   
zbuild_ext.get_ext_filenamec                 C   sz   |j  d¡d }z| d¡ W n ty&   d| d¡ dd¡ d¡ }Y nw d| }d	| }||jvr:|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.
        rN   rÊ   ÚasciiZU_Zpunycodeó   -ó   _Ú_ZPyInit)ri   r^   ÚencodeÚUnicodeEncodeErrorÚreplaceÚdecoder»   rd   )r?   r™   ri   rr   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r|d }|t jd? t jd? d@ f }|j|g S n@dd	l	m
} d
}|dƒratt dƒrCd}nt jdkrKd}ndtjv ra|dƒdkrYd}n|dƒdkrad}|ro|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).
        rF   r   )ÚMSVCCompilerz
python%d%dÚ_dé   é   éÿ   rá   FrO   ZgetandroidapilevelTrJ   Ú_PYTHON_HOST_PLATFORMZANDROID_API_LEVELZMACHDEPZ	LDVERSIONrL   )ra   rl   Zdistutils._msvccompilerrí   r\   r9   r%   Ú
hexversionr5   rã   rn   Úhasattrr_   Úenvironr   Ú	pythonlib)r?   r™   rí   Útemplaterö   rn   Zlink_libpythonZ	ldversionr   r   r   rÄ   Þ  s8   

þö


zbuild_ext.get_libraries) Ú__name__Ú
__module__Ú__qualname__Údescriptionr_   r`   Zsep_byr   Úuser_optionsÚboolean_optionsr   Úhelp_optionsr@   rs   r…   r   r    r£   r‚   r¤   r¥   Ú
contextlibÚcontextmanagerr°   r©   r¿   rÌ   r¡   rÙ   rÚ   rÅ   rÄ   r   r   r   r   r   )   sr    
ÿýýýÛ(
ÿ BY	
Q9	r   )"Ú__doc__rÿ   r_   Úrera   Údistutils.corer   Údistutils.errorsr   r   r   r   r   r   rã   r	   r
   r   Údistutils.dep_utilr   Údistutils.extensionr   Údistutils.utilr   rV   r   Ú r   Úsiter   rÀ   r‘   r   r   r   r   r   r   Ú<module>   s$     
