£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
     fv                 @   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 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)Command)*)customize_compilerget_python_version)get_config_h_filename)newer_group)	Extension)get_platform)log)	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   @/opt/alt/python37/lib64/python3.7/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)z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   zswig-cppr#   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_optionsj   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rt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rt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+rtjt,d}tjt,d}	tj-|r| j	| tj-|	r| j|	 | j|	 t
| j.tryt/| j.| _.W n t0k
r   t1d%Y nX d S )&Nr   )	sysconfigZbuild)r%   r%   )r'   r'   )r0   r0   )r   r   )r   r   )r4   r4   )r&   r&      )Zplat_specificZincluder,   r/   ntZlibsZDebugZRelease_homewin32   ZPCbuild   cygwinbinlibpythonZconfig.Py_ENABLE_SHAREDZLIBDIR,c             S   s   g | ]}|d fqS )1r   ).0Zsymbolr   r   r   
<listcomp>   s    z.build_ext.finalize_options.<locals>.<listcomp> zparallel should be an integer)2	distutilsr7   Zset_undefined_optionsr(   distributionZext_packageZext_modulesr$   Zget_python_incr)   
isinstancestrsplitospathsepsysexec_prefixbase_exec_prefixappendpathjoinextendZensure_string_listr,   r-   r.   nameprefixr   r'   dirnamer   getattrr&   platform
executable
startswithr   get_config_varZpython_buildr*   r+   r3   r#   r   isdirr4   int
ValueErrorZDistutilsOptionError)
r5   r7   Z
py_includeZplat_py_includeZ	_sys_homesuffixZnew_libZdefinesZuser_includeZuser_libr   r   r   finalize_options   s    






zbuild_ext.finalize_optionsc             C   sr  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	rx | jD ]\}}| j|| qW | jd k	rx| jD ]}| j| qW | jd k	r| j| j | j	d k	r2| j| j	 | jd k	rL| j| j | j d k	rf| j!| j  | "  d S )Nr   )new_compiler
build_clib)r0   verbosedry_runr   r9   )#r   rd   r$   rJ   Zhas_c_librariesget_finalized_commandr,   rV   Zget_library_namesr-   rS   re   r0   rf   rg   r   r   rN   rW   r&   r	   Z
initializer)   Zset_include_dirsr*   Zdefine_macror+   Zundefine_macroZset_librariesZset_library_dirsr.   Zset_runtime_library_dirsr/   Zset_link_objectsbuild_extensions)r5   rd   re   rW   valuemacror   r   r   run  s>    





zbuild_ext.runc       
      C   s  t |tstdxjt|D ]\\}}t |tr4qt |trJt|dkrRtd|\}}td| t |t	rzt
|stdt |tstdt||d }x*dD ]"}||}|d	k	rt||| qW |d
|_d|krtd |d}|rtg |_g |_xj|D ]b}	t |	tr,t|	dks4tdt|	dkrT|j|	d  nt|	dkr|j|	 qW |||< qW 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)   r-   r,   extra_objectsextra_compile_argsextra_link_argsNr.   Zdef_filez9'def_file' element of build info dict no longer supportedmacros)r8   rm   z9'macros' element of build info dict must be 1- or 2-tupler8   r   )rK   listDistutilsSetupError	enumerater   tuplelenr
   warnrL   extension_name_rematchdictgetsetattrruntime_library_dirsdefine_macrosundef_macrosrS   )
r5   r$   r   extext_nameZ
build_infokeyvalrr   rk   r   r   r   check_extensions_listV  sP    










zbuild_ext.check_extensions_listc             C   s0   |  | j g }x| jD ]}||j qW |S )N)r   r$   rV   rn   )r5   	filenamesr   r   r   r   get_source_files  s
    zbuild_ext.get_source_filesc             C   s6   |  | j g }x | jD ]}|| |j qW |S )N)r   r$   rS   get_ext_fullpathrW   )r5   Zoutputsr   r   r   r   get_outputs  s
    zbuild_ext.get_outputsc             C   s(   |  | j | jr|   n|   d S )N)r   r$   r4   _build_extensions_parallel_build_extensions_serial)r5   r   r   r   ri     s    
zbuild_ext.build_extensionsc                s   j }j dkrt }yddlm} W n tk
r@   d }Y nX |d krV  d S ||dT  fddjD }x6tj|D ]&\}}	| |
  W d Q R X qW W d Q R X d S )NTr   )ThreadPoolExecutor)Zmax_workersc                s   g | ]}  j|qS r   )Zsubmitbuild_extension)rF   r   )executorr5   r   r   rG     s   z8build_ext._build_extensions_parallel.<locals>.<listcomp>)r4   rN   	cpu_countZconcurrent.futuresr   ImportErrorr   r$   zip_filter_build_errorsresult)r5   Zworkersr   Zfuturesr   Zfutr   )r   r5   r   r     s     


z$build_ext._build_extensions_parallelc          
   C   s4   x.| j D ]$}| | | | W d Q R X qW d S )N)r$   r   r   )r5   r   r   r   r   r     s    z"build_ext._build_extensions_serialc          
   c   sT   y
d V  W nD t ttfk
rN } z |js* | d|j|f  W d d }~X Y nX d S )Nz"building extension "%s" failed: %s)ZCCompilerErrorZDistutilsErrorZCompileErrorZoptionalrx   rW   )r5   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 t|}| |j}||j }| jslt	||dslt
d|j d S t
d|j | ||}|jpg }|jd d  }x|jD ]}||f qW | 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 filenamesZnewerz$skipping '%s' extension (up-to-date)zbuilding '%s' extension)Z
output_dirrr   r)   r   extra_postargsdepends)r,   r-   r~   r   export_symbolsr   r'   Ztarget_lang)!rn   rK   rs   rv   rt   rW   r   r   r   r   r
   r   infoswig_sourcesrp   r   r   rS   r0   compiler'   r)   Z_built_objectsro   rV   rq   languageZdetect_languageZlink_shared_objectget_librariesr-   r~   get_export_symbols)
r5   r   rn   ext_pathr   Z
extra_argsrr   r+   Zobjectsr   r   r   r   r     sN    



zbuild_ext.build_extensionc             C   s0  g }g }i }| j rtd | j s6d| jks6d|jkr<d}nd}xX|D ]P}tj|\}}	|	dkr||d |  || |d ||< qF|| qFW |s|S | jp| 	 }
|
dg}|
| j | j r|d | jsx|jD ]}|| qW x6|D ].}|| }td	|| | |d
||g  qW |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)r2   r
   rx   r3   rN   rT   splitextrS   r1   	find_swigrV   r   Zspawn)r5   rn   	extensionZnew_sourcesr   Zswig_targetsZ
target_extsourcebaser   r1   Zswig_cmdotargetr   r   r   r   1  s>    





zbuild_ext.swig_sourcesc             C   s`   t jdkrdS t jdkrNxBdD ]&}t jd| d}t j|r|S qW dS ntdt j 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.
        posixr1   r9   )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)rN   rW   rT   rU   isfileZDistutilsPlatformError)r5   Zversfnr   r   r   r   g  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).
        rB   r   Nr   build_py)get_ext_fullnamerM   get_ext_filenamer   rN   rT   rU   r%   rh   abspathZget_package_dir)r5   r   fullnameZmodpathfilenamer(   r   Z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.` prefixNrB   )r(   )r5   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   )r^   rB   Z
EXT_SUFFIX)distutils.sysconfigr^   rM   rN   rT   rU   )r5   r   r^   r   Z
ext_suffixr   r   r   r     s    
zbuild_ext.get_ext_filenamec             C   s0   d|j dd  }||jk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.
        ZPyInit_rB   r   )rW   rM   r   rS   )r5   r   Zinitfunc_namer   r   r   r     s    
zbuild_ext.get_export_symbolsc             C   s   t jdkrdddlm} t| j|s\d}| jr4|d }|t jd? t jd? d@ f }|j|g S |jS ntt jd	krt|jS t jd
d dkr|jS ddl	m
} |drdt jd? t jd? d@ |d}|j|g S |jS d
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).
        r;   r   )MSVCCompilerz
python%d%dZ_d         darwinN   Zaix)r7   rC   zpython{}.{}{}ZABIFLAGS)rP   r[   Zdistutils._msvccompilerr   rK   r0   r   
hexversionr,   rI   r7   r^   format)r5   r   r   templateZ	pythonlibr7   r   r   r   r     s*    



zbuild_ext.get_libraries) __name__
__module____qualname__ZdescriptionrN   rO   Zsep_byr	   Zuser_optionsZboolean_optionsr   Zhelp_optionsr6   rc   rl   r   r   r   ri   r   r   
contextlibcontextmanagerr   r   r   r   r   r   r   r   r   r   r   r   r   r   !   s^   

 @N	
K6	
r   )__doc__r   rN   rerP   Zdistutils.corer   Zdistutils.errorsr   r   r   r   Zdistutils.dep_utilr   Zdistutils.extensionr   Zdistutils.utilr	   rI   r
   Zsiter   r   ry   r   r   r   r   r   r   <module>   s"   