U
    X7h|                     @   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 ddl	m
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 dd
lmZmZmZ ddlmZmZ edZdd ZG dd deZ dS )zdistutils.command.build_ext

Implements the Distutils 'build_ext' command, for building extension
modules (currently limited to C extensions, should accommodate C++
extensions ASAP).    N)log)	USER_BASE   )newer_group)Command)CCompilerErrorCompileErrorDistutilsErrorDistutilsOptionErrorDistutilsPlatformErrorDistutilsSetupError)	Extension)customize_compilerget_config_h_filenameget_python_version)get_platformis_mingwz3^[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)	ccompilerr   r    r   a/var/www/formularioweb/env/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.pyr   !   s    r   c                   @   s*  e Zd ZdZdej dZddddde  d	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ed(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zejd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI Z dJdK Z!d$S )L	build_extz8build C/C++ extensions (compile/link to build directory)z (separated by 'z'))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: ])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 )NF)
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sdS | jrdV  dS tjdkrN|  d}|  d}tj||V  n|  dV  dS )z
        Resolve Python's library directory for building extensions
        that rely on a shared Python library.

        See python/cpython#44264 and python/cpython#48686
        Py_ENABLE_SHAREDN.zosbase
platlibdirLIBDIR)get_config_varpython_buildsysplatformospathjoin)	sysconfigZinstalled_dirlib_dirr   r   r   _python_lib_dir   s    



zbuild_ext._python_lib_dirc           	   
   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r`t s`| jtjtjd tjtjkr| jtjtjd | jrt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}|rTtj||}| j| tj"d d dkr|j#s| jtjtjddt$  d n| jd | j| %| | j&r| j&d}dd |D | _&| j'r| j'd| _'| j(d krg | _(n| j(d | _(| j)r~tjt*d}tjt*d}tj+|rX| j	| tj+|r~| j| | j| t
| j,trzt-| j,| _,W n t.k
r   t/d!Y nX d S )"Nr   )rO   build)r/   r/   )r1   r1   )r:   r:   )r&   r&   )r(   r(   )r>   r>   )r0   r0   T)plat_specificincluder6   r9   ntZlibsZDebugZReleasewin32   ZPCbuild   cygwinlibpythonconfigrC   ,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)0	distutilsrO   set_undefined_optionsr2   distributionext_packageext_modulesr.   get_python_incr3   
isinstancestrsplitrL   pathseprJ   exec_prefixbase_exec_prefixappendrM   rN   extendensure_string_listr6   r7   r8   namer   prefixr&   r1   dirnamer   r0   rK   rI   r   rQ   r4   r5   r=   r-   r   isdirr>   int
ValueErrorr
   )	r@   rO   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   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)r:   verbosedry_runr(   rU   )#r   rz   r.   re   has_c_librariesget_finalized_commandr6   rp   Zget_library_namesr7   ro   r{   r:   r|   r}   r(   r   rL   rr   r0   r   Z
initializer3   set_include_dirsr4   define_macror5   undefine_macroset_librariesset_library_dirsr8   set_runtime_library_dirsr9   set_link_objectsbuild_extensions)r@   rz   r{   rr   valuemacror   r   r   run'  sB    






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stdt||d }dD ]"}||}|d	k	rt||| q|d
|_d|krt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 instancesr   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)r3   r7   r6   extra_objectsextra_compile_argsextra_link_argsNr8   Zdef_filez9'def_file' element of build info dict no longer supportedmacros)   r   z9'macros' element of build info dict must be 1- or 2-tupler   r   )ri   listr   	enumerater   tuplelenr   warningrj   extension_name_rematchdictgetsetattrruntime_library_dirsdefine_macrosundef_macrosro   )
r@   r.   r   extext_nameZ
build_infokeyvalr   r   r   r   r   check_extensions_listi  s\    






zbuild_ext.check_extensions_listc                 C   s,   |  | j g }| jD ]}||j q|S N)r   r.   rp   r   )r@   	filenamesr   r   r   r   get_source_files  s
    
zbuild_ext.get_source_filesc                    s       j  fdd jD S )Nc                    s   g | ]}  |jqS r   )get_ext_fullpathrr   r_   r   r?   r   r   ra     s     z)build_ext.get_outputs.<locals>.<listcomp>)r   r.   r?   r   r?   r   get_outputs  s    zbuild_ext.get_outputsc                 C   s(   |  | j | jr|   n|   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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 qW 5 Q R X d S )NTr   )ThreadPoolExecutor)max_workersc                    s   g | ]}  j|qS r   )submitbuild_extensionr   Zexecutorr@   r   r   ra     s    z8build_ext._build_extensions_parallel.<locals>.<listcomp>)r>   rL   	cpu_countZconcurrent.futuresr   ImportErrorr   r.   zip_filter_build_errorsresult)r@   Zworkersr   futuresr   Z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   sX   z
d V  W nH t ttfk
rR } z$|js* | d|j d|  W 5 d }~X Y nX d S )Nzbuilding extension "z
" failed: )r   r	   r   optionalwarnrr   )r@   r   er   r   r   r     s    
zbuild_ext._filter_build_errorsc           
      C   sT  |j }|d kst|ttfs.td|j dt|}| |j}||j }| j	spt
||dsptd|j d S td|j | ||}|jpg }|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 )Nz$in 'ext_modules' option (extension 'zD'), '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   r3   r&   extra_postargsdepends)r6   r7   r   r   export_symbolsr&   r1   target_lang)"r   ri   r   r   r   rr   sortedr   r   r(   r   r   r&   infoswig_sourcesr   r   r   ro   r:   compiler1   r3   Z_built_objectsr   rp   r   languagedetect_languagelink_shared_objectget_librariesr7   r   get_export_symbols)
r@   r   r   ext_pathr   
extra_argsr   r5   objectsr   r   r   r   r     sV    


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 ].}|| }td	|| | |d
||g  q|S )zWalk 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_wrapz-pythonzswigging %s to %sz-o)r<   r   r   r=   rL   rM   splitextro   r;   	find_swigrp   r   spawn)r@   r   	extensionZnew_sourcesr   Zswig_targets
target_extsourcerE   r   r;   Zswig_cmdtargetr   r   r   r   R  sD    


zbuild_ext.swig_sourcesc                 C   sd   t jdkrdS t jdkrNdD ],}t jd| d}t j|r|  S qdS tdt j dd	S )
zReturn 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;   rU   )z1.3z1.2z1.1zc:\swigzswig.exez;I don't know how to find (much less run) SWIG on platform ''N)rL   rr   rM   rN   isfiler   )r@   versfnr   r   r   r     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 )zReturns the path of the filename for a given extension.

        The file is located in `build_lib` or directly in the package
        (inplace option).
        rC   r   Nr   build_py)get_ext_fullnamerk   get_ext_filenamer   rL   rM   rN   r/   r   abspathget_package_dir)r@   r   fullnamemodpathfilenamer2   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.` prefixNrC   )r2   )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 )zConvert 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   rH   rC   
EXT_SUFFIX)rO   rH   rk   rL   rM   rN   )r@   r   rH   r   
ext_suffixr   r   r   r     s    
zbuild_ext.get_ext_filenamec                 C   s|   |j dd }z|d W n0 tk
rN   d|dddd }Y n
X d| }d	| }||jkrv|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.
        rC   r   asciiZU_Zpunycode   -   __ZPyInit)rr   rk   encodeUnicodeEncodeErrorreplacedecoder   ro   )r@   r   rr   rx   Zinitfunc_namer   r   r   r     s    "
zbuild_ext.get_export_symbolsc                 C   s   t jdkrdt sdddlm} t| j|sd}| jr:|d }|t jd? t jd? d@ f }|j	|g S ndd	l
m} d
}|drtt drd}nBt jdkst rd}n,dtjkr|ddkrd}n|ddkrd}|r|d}|j	d| g S |j	S )zReturn 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).
        rV   r   )MSVCCompilerz
python%d%dZ_d         r   FrB   getandroidapilevelTrY   _PYTHON_HOST_PLATFORMANDROID_API_LEVELr   MACHDEP	LDVERSIONr[   )rJ   rK   r   _msvccompilerr   ri   r:   r&   
hexversionr6   rO   rH   hasattrrL   environ)r@   r   r   templateZ	pythonlibrH   Zlink_libpythonZ	ldversionr   r   r   r     s6    



zbuild_ext.get_libraries)"__name__
__module____qualname__descriptionrL   rl   Zsep_byr   user_optionsboolean_optionsr   help_optionsrA   staticmethodrQ   ry   r   r   r   r   r   r   r   
contextlibcontextmanagerr   r   r   r   r   r   r   r   r   r   r   r   r   r   '   sp   (

 BY	
Q8	r   )!__doc__r  rL   rerJ   Zdistutils._logr   Zsiter   	_modifiedr   corer   errorsr   r   r	   r
   r   r   r   r   rO   r   r   r   utilr   r   r   r   r   r   r   r   r   r   <module>   s    
