3 \�z�@s�dZddlZddlZddlZddlZddlmZddlTddlm Z m Z ddlm Z ddl m Z ddlmZdd lmZdd lmZdd lmZejd �Zd d�ZGdd�de�ZdS)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)� USER_BASEz3^[a-zA-Z_][a-zA-Z_0-9]*(\.[a-zA-Z_][a-zA-Z_0-9]*)*$cCsddlm}|�dS)Nr)�show_compilers)�distutils.ccompilerr )r �r�3/usr/lib64/python3.6/distutils/command/build_ext.pyr s r c@seZdZdZdejZd`dad d d e�fdcdddefdddedfdddefdgdhdidjdkdldmdndodpgZd d%d(d1d8gZ d:d2d;e fgZ dd?�Z d@dA�ZdBdC�ZdDdE�ZdFdG�ZdHdI�ZdJdK�ZdLdM�ZejdNdO��ZdPdQ�ZdRdS�ZdTdU�ZdVdW�ZdXdY�ZdZd[�Zd\d]�Zd^d_�Zd2S)q� build_extz8build C/C++ extensions (compile/link to build directory)z (separated by '%s')� build-lib=�b�(directory for compiled extension modules� build-temp=�t�1directory for temporary files (build by-products)z plat-name=�pz>platform name to cross-compile for, if supported (default: %s)�inplace�iz=ignore build-lib and put compiled extensions into the source z,directory alongside your pure Python modulesz include-dirs=�Iz.list of directories to search for header files�define=�D�C preprocessor macros to define�undef=�U�!C preprocessor macros to undefine� libraries=�l�!external C libraries to link withz library-dirs=�Lz.directories to search for external C libraries�rpath=�R�7directories to search for shared C libraries at runtime� link-objects=�O�2extra explicit link objects to include in the link�debug�g�'compile/link with debugging information�force�f�2forcibly build everything (ignore file timestamps)� compiler=�c�specify the compiler type� parallel=�j�number of parallel build jobs�swig-cppN�)make SWIG create C++ files (default is C)� swig-opts=�!list of SWIG command line options�swig=�path to the SWIG executable�user�#add user include, library and rpathz help-compilerzlist available compilerscCs�d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_dS)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)�selfrrr�initialize_optionsjs*zbuild_ext.initialize_optionsc Cs�ddlm}|jdd'd(d)d*d+d,d-�|jdkr8|jj|_|jj|_|j�}|jd d �}|j dkrn|jj pjg|_ t |j t �r�|j j t j�|_ tjtjkr�|j jt jjtjd ��|j j|�||kr�|j j|�|jd�|jd�|jdk�r�g|_|jdk�rg|_nt |jt ��r&|jj t j�|_|jdk�r:g|_nt |jt ��rX|jj t j�|_t jdk�rT|jjt jjtjd��tjtjk�r�|jjt jjtjd��|j�r�t jj|jd�|_nt jj|jd�|_|j jt jjt���ttdd�}|�r|jj|�|j dk�rd}n|j dd�}t jjtjd�}|�rHt jj||�}|jj|�tj!dd�dk�s|tj!dd�dk�r�tj"j#t jjtjd���r�|jjt jjtjddt$�d��n |jjd�|j%d ��r�|j&�s�|jj|j%d!��n |jjd�|j'�r|j'j d"�}d#d$�|D�|_'|j(�r4|j(j d"�|_(|j)dk�rHg|_)n|j)j d%�|_)|j*�r�t jjt+d �}t jjt+d�} t jj,|��r�|j j|�t jj,| ��r�|jj| �|jj| �t |j-t ��r�yt.|j-�|_-Wnt/k �r�t0d&��YnXdS).Nr)� sysconfigZbuildr@rBrKr+r.rOrA�)Z plat_specific�includerGrJ�ntZlibsZDebugZRelease�_home�win32�ZPCbuild��cygwin�atheos�bin�lib�python�config�.�Py_ENABLE_SHARED�LIBDIR�,cSsg|] }|df�qS)�1r)�.0Zsymbolrrr� �sz.build_ext.finalize_options..� zparallel should be an integer)r@r@)rBrB)rKrK)r+r+)r.r.)rOrO)rArA)1� distutilsrRZset_undefined_optionsrC� distributionZ ext_packageZ ext_modulesr?Zget_python_incrD� isinstance�str�split�os�pathsep�sys� exec_prefix�base_exec_prefix�append�path�joinZensure_string_listrGrHrI�name�prefixr+rB�dirnamer�getattrrA�platform� executable� startswithr�get_config_varZ python_buildrErFrNr=r �isdirrO�int� ValueErrorZDistutilsOptionError) rPrRZ py_includeZplat_py_include� _sys_home�suffixZnew_libZdefinesZ user_includeZuser_librrr�finalize_options�s�                    (         zbuild_ext.finalize_optionscCstddlm}|jsdS|jj�rL|jd�}|jj|j�p:g�|j j |j �||j |j |j|jd�|_ t|j �tjdkr�|jt�kr�|j j|j�|jdk r�|j j|j�|jdk r�x |jD]\}}|j j||�q�W|jdk �rx|jD]}|j j|�q�W|jdk �r|j j|j�|j dk �r4|j j|j �|jdk �rN|j j|j�|j dk �rh|j j!|j �|j"�dS)Nr)� new_compiler� build_clib)rK�verbose�dry_runr.rU)#r r�r?riZhas_c_libraries�get_finalized_commandrG�extendZget_library_namesrHrrr�rKr�r�r.rrmrurAr Z initializerDZset_include_dirsrEZ define_macrorFZundefine_macroZ set_librariesZset_library_dirsrIZset_runtime_library_dirsrJZset_link_objects�build_extensions)rPr�r�ru�value�macrorrr�runs>             z build_ext.runc Cs�t|t�std���xnt|�D�]`\}}t|t�r4qt|t� sLt|�dkrTtd��|\}}tjd|�t|t �ozt j |�s�td��t|t �s�td��t||d�}x*dD]"}|j |�}|dk r�t|||�q�W|j d�|_d|k�r�tjd�|j d�}|�rxg|_g|_xj|D]b} t| t��o,t| �dk�s8td��t| �dk�rX|jj| d�nt| �dk�r|jj| ��qW|||<qWdS)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)�sourcesrDrHrG� extra_objects�extra_compile_args�extra_link_argsNrIZdef_filez9'def_file' element of build info dict no longer supported�macrosrSz9'macros' element of build info dict must be 1- or 2-tupler)rDrHrGr�r�r�)rSr�)rj�list�DistutilsSetupError� enumerater�tuple�lenr �warnrk�extension_name_re�match�dict�get�setattr�runtime_library_dirs� define_macros� undef_macrosrr) rPr?r�ext�ext_nameZ build_info�key�valr�r�rrr�check_extensions_listUsT           zbuild_ext.check_extensions_listcCs0|j|j�g}x|jD]}|j|j�qW|S)N)r�r?r�r�)rP� filenamesr�rrr�get_source_files�s   zbuild_ext.get_source_filescCs6|j|j�g}x |jD]}|j|j|j��qW|S)N)r�r?rr�get_ext_fullpathru)rPZoutputsr�rrr� get_outputs�s   zbuild_ext.get_outputscCs(|j|j�|jr|j�n|j�dS)N)r�r?rO�_build_extensions_parallel�_build_extensions_serial)rPrrrr��s  zbuild_ext.build_extensionscs��j}�jdkrtj�}yddlm}Wntk r@d}YnX|dkrV�j�dS||d��T���fdd��jD�}x6t�j|�D]&\}}�j |��|j �WdQRXq�WWdQRXdS)NTr)�ThreadPoolExecutor)Z max_workerscsg|]}�j�j|��qSr)Zsubmit�build_extension)rer�)�executorrPrrrf�sz8build_ext._build_extensions_parallel..) rOrm� cpu_countZconcurrent.futuresr�� ImportErrorr�r?�zip�_filter_build_errors�result)rPZworkersr�Zfuturesr�Zfutr)r�rPrr��s       z$build_ext._build_extensions_parallelc Cs4x.|jD]$}|j|��|j|�WdQRXqWdS)N)r?r�r�)rPr�rrrr��s  z"build_ext._build_extensions_serialccsTy dVWnDtttfk rN}z"|js*�|jd|j|f�WYdd}~XnXdS)Nz"building extension "%s" failed: %s)ZCCompilerErrorZDistutilsErrorZ CompileErrorZoptionalr�ru)rPr��errrr��s zbuild_ext._filter_build_errorsc CsX|j}|dkst|ttf� r,td|j��t|�}|j|j�}||j}|jpZt ||d�snt j d|j�dSt j d|j�|j ||�}|jp�g}|jdd�}x|jD]}|j|f�q�W|jj||j||j|j ||jd�}|dd�|_|j�r|j|j�|j�p g}|j�p|jj|�} |jj|||j|�|j|j||j |�|j |j| d� dS)Nzjin 'ext_modules' option (extension '%s'), 'sources' must be present and must be a list of source filenamesZnewerz$skipping '%s' extension (up-to-date)zbuilding '%s' extension)Z output_dirr�rDr+�extra_postargs�depends)rGrHr�r��export_symbolsr+rBZ target_lang)!r�rjr�r�r�rur�r�r.rr r+�info� swig_sourcesr�r�r�rrrK�compilerBrDZ_built_objectsr�r�r��languageZdetect_languageZlink_shared_object� get_librariesrHr��get_export_symbols) rPr�r��ext_pathr�Z extra_argsr�rFZobjectsr�rrrr��sN         zbuild_ext.build_extensioncCs2g}g}i}|jrtjd�|js6d|jks6d|jkr        zbuild_ext.swig_sourcescCs`tjdkrdStjdkrNxBd D]&}tjjd|d�}tjj|�r|SqWdSntd tj��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. �posixrLrU�1.3�1.2�1.1z c:\swig%szswig.exez>I don't know how to find (much less run) SWIG on platform '%s'N)r�r�r�)rmrursrt�isfileZDistutilsPlatformError)rPZvers�fnrrrr�fs    zbuild_ext.find_swigcCs�|j|�}|jd�}|j|d�}|jsRtjj|dd�|g�}tjj|j|�Sdj|dd��}|jd�}tjj |j |��}tjj||�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). r`rSNr�build_pyr�r�r�) �get_ext_fullnamerl�get_ext_filenamerrmrsrtr@r��abspathZget_package_dir)rPr��fullnameZmodpath�filenamerCr�Z package_dirrrrr�~s   zbuild_ext.get_ext_fullpathcCs |jdkr|S|jd|SdS)zSReturns the fullname of a given extension name. Adds the `package.` prefixNr`)rC)rPr�rrrr��s zbuild_ext.get_ext_fullnamecCs.ddlm}|jd�}|d�}tjj|�|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)r|r`� EXT_SUFFIX)�distutils.sysconfigr|rlrmrsrt)rPr�r|r�Z ext_suffixrrrr��s  zbuild_ext.get_ext_filenamecCs0d|jjd�d}||jkr*|jj|�|jS)aReturn 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. ZPyInit_r`rSr�)rurlr�rr)rPr�Z initfunc_namerrrr��s  zbuild_ext.get_export_symbolscCs�tjdkrfddlm}t|j|�s\d}|jr4|d}|tjd?tjd?d@f}|j|gS|jS�nRtjd d �d kr�d }|tjd?tjd?d@f}|j|gStjd d �d k�r>ddl m }d }|tjd?tjd?d@f}g}xB|j d�j �D]0}|j d��r|j|dd ��n |j|��q�W|j|dg|Stjdk�rP|jStjd d�dk�rj|jSddl m }|j d��r�djtjd?tjd?d@|j d��}|j|gS|jSd 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). rWr)� MSVCCompilerz python%d%dZ_d����NrYrZz python%d.%dr[)rR�SHLIBSz-lr��m�darwin��aixraz python{}.{}{}�ABIFLAGS)roryZdistutils._msvccompilerr�rjrKr+� hexversionrGrhrRr|rlr{rr�format)rPr�r��templateZ pythonlibrRZextrar]rrrr��sJ             zbuild_ext.get_libraries)rrr)rrr�iignore build-lib and put compiled extensions into the source directory alongside your pure Python modules)rrr�)rrr)rrr )r!r"r#)r%r&r')r(r)r*)r+r,r-)r.r/r0)r1r2r3)r4r5r6)r7Nr8)r9Nr:)r;Nr<)r=Nr>) �__name__� __module__� __qualname__Z descriptionrmrnZsep_byr Z user_optionsZboolean_optionsr Z help_optionsrQr�r�r�r�r�r�r�r�� contextlib�contextmanagerr�r�r�r�r�r�r�r�r�rrrrr!s�  @N  K6   r)�__doc__r�rm�reroZdistutils.corerZdistutils.errorsr�rrrZdistutils.dep_utilrZdistutils.extensionrZdistutils.utilr rhr Zsiter r�r�r rrrrr�s"