3 2az@sddlZddlZddlZddlZddlmZddlTddlmZm Z ddlm Z ddl m Z ddl mZddlmZdd lmZdd lmZejd Zd d ZGdddeZdS)N)Command)*)customize_compilerget_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./opt/alt/python36/lib64/python3.6/build_ext.pyr s r c@seZdZdZdejZd`dad d d efdcdddefdddedfdddefdgdhdidjdkdldmdndodpgZd d%d(d1d8gZ d:d2d;e fgZ dd?Z d@dAZdBdCZdDdEZdFdGZdHdIZdJdKZdLdMZejdNdOZdPdQZdRdSZdTdUZdVdWZdXdYZdZd[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=t1directory for temporary files (build by-products)z plat-name=pz>platform name to cross-compile for, if supported (default: %s)inplaceiz=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 filesdefine=DC preprocessor macros to defineundef=U!C preprocessor macros to undefine libraries=l!external C libraries to link withz library-dirs=Lz.directories to search for external C librariesrpath=R7directories to search for shared C libraries at runtime link-objects=O2extra explicit link objects to include in the linkdebugg'compile/link with debugging informationforcef2forcibly build everything (ignore file timestamps) compiler=cspecify the compiler type parallel=jnumber of parallel build jobsswig-cppN)make SWIG create C++ files (default is C) swig-opts=!list of SWIG command line optionsswig=path to the SWIG executableuser#add user include, library and rpathz help-compilerzlist available compilerscCsd|_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_temprpackage include_dirsdefineundef libraries library_dirsrpath link_objectsr+r.compilerswigswig_cpp swig_optsr=parallel)selfrrrinitialize_optionsjs*zbuild_ext.initialize_optionsc Csddlm}|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|jdkrg|_|jdkrg|_nt |jt r&|jj t j|_|jdkr:g|_nt |jt rX|jj t j|_t jdkrT|jjt jjtjdtjtjkr|jjt jjtjd|jrt jj|jd|_nt jj|jd|_|j jt jjtttdd}|r|jj||j dkrd}n|j dd}t jjtjd}|rHt jj||}|jj|tj!dddks|tj!dddkrtj"j#t jjtjdr|jjt jjtjddt$dn |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)dkrHg|_)n|j)j d%|_)|j*rt jjt+d }t jjt+d} t jj,|r|j j|t jj,| r|jj| |jj| t |j-t ryt.|j-|_-Wnt/k rt0d&YnXdS).Nr) sysconfigZbuildr@rBrKr+r.rOrA)Z plat_specificincluderGrJntZlibsZDebugZRelease_homewin32ZPCbuildcygwinatheosbinlibpythonconfig.Py_ENABLE_SHAREDLIBDIR,cSsg|] }|dfqS)1r).0symbolrrr 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 isinstancestrsplitospathsepsys exec_prefixbase_exec_prefixappendpathjoinZensure_string_listrGrHrInameprefixr+rBdirnamergetattrrAplatform executable startswithrget_config_varZ python_buildrErFrNr=r isdirrOint ValueErrorZDistutilsOptionError) rPrRZ py_includeZplat_py_include _sys_homesuffixZnew_libZdefinesZ user_includeZuser_librrrfinalize_optionss                    (         zbuild_ext.finalize_optionscCstddlm}|jsdS|jjrL|jd}|jj|jp:g|j j |j ||j |j |j|jd|_ t|j tjdkr|jtkr|j j|j|jdk r|j j|j|jdk rx |jD]\}}|j j||qW|jdk rx|jD]}|j j|qW|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)rKverbosedry_runr.rU)#r rr?rjZhas_c_librariesget_finalized_commandrGextendZget_library_namesrHrsrrKrrr.rrnrvrAr Z initializerDZset_include_dirsrEZ define_macrorFZundefine_macroZ set_librariesZset_library_dirsrIZset_runtime_library_dirsrJZset_link_objectsbuild_extensions)rPrrrvvaluemacrorrrruns>             z build_ext.runc Cst|tstdxnt|D]`\}}t|tr4qt|t sLt|dkrTtd|\}}tjd|t|t ozt j |stdt|t stdt||d}x*dD]"}|j |}|dk rt|||qW|j d|_d|krtjd|j d}|rxg|_g|_xj|D]b} t| to,t| dks8tdt| dkrX|jj| dnt| dkr|jj| qW|||<qWdS)Nz:'ext_modules' option must be a list of Extension instanceszMeach 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_objectsextra_compile_argsextra_link_argsrIZdef_filez9'def_file' element of build info dict no longer supportedmacrosrSz9'macros' element of build info dict must be 1- or 2-tupler)rDrHrGrrr)rSr)rklistDistutilsSetupError enumeratertuplelenr warnrlextension_name_rematchdictgetsetattrruntime_library_dirs define_macros undef_macrosrs) rPr?rextext_nameZ build_infokeyvalrrrrrcheck_extensions_listUsT           zbuild_ext.check_extensions_listcCs0|j|jg}x|jD]}|j|jqW|S)N)rr?rr)rP filenamesrrrrget_source_filess   zbuild_ext.get_source_filescCs6|j|jg}x |jD]}|j|j|jqW|S)N)rr?rsget_ext_fullpathrv)rPZoutputsrrrr get_outputss   zbuild_ext.get_outputscCs(|j|j|jr|jn|jdS)N)rr?rO_build_extensions_parallel_build_extensions_serial)rPrrrrs  zbuild_ext.build_extensionscsj}jdkrtj}yddlm}Wntk r@d}YnX|dkrVjdS||dTfddjD}x6tj|D]&\}}j ||j WdQRXqWWdQRXdS)NTr)ThreadPoolExecutor) max_workerscsg|]}jj|qSr)Zsubmitbuild_extension)rer)executorrPrrrgsz8build_ext._build_extensions_parallel..) rOrn cpu_countconcurrent.futuresr ImportErrorrr?zip_filter_build_errorsresult)rPworkersrZfuturesrZfutr)rrPrrs       z$build_ext._build_extensions_parallelc Cs4x.|jD]$}|j||j|WdQRXqWdS)N)r?rr)rPrrrrrs  z"build_ext._build_extensions_serialccsTy dVWnDtttfk rN}z"|js*|jd|j|fWYdd}~XnXdS)Nz"building extension "%s" failed: %s)ZCCompilerErrorZDistutilsErrorZ CompileErrorZoptionalrrv)rPrerrrrs zbuild_ext._filter_build_errorsc CsX|j}|dkst|ttf r,td|jt|}|j|j}||j}|jpZt ||dsnt j d|jdSt j d|j|j ||}|jpg}|jdd}x|jD]}|j|fqW|jj||j||j|j ||jd}|dd|_|jr|j|j|jp g}|jp|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_dirrrDr+extra_postargsdepends)rGrHrrexport_symbolsr+rBZ target_lang)!rrkrrrrvrrr.rr r+info swig_sourcesrrrrsrKcompilerBrDZ_built_objectsrrrlanguageZdetect_languageZlink_shared_object get_librariesrHrget_export_symbols) rPrrext_pathrZ extra_argsrrFZobjectsrrrrrsN         zbuild_ext.build_extensioncCs2g}g}i}|jrtjd|js6d|jks6d|jkr        zbuild_ext.swig_sourcescCs`tjdkrdStjdkrNxBd D]&}tjjd|d}tjj|r|SqWdSntd tjdS) NposixrLrU1.31.21.1z c:\swig%szswig.exez>I don't know how to find (much less run) SWIG on platform '%s')rrr)rnrvrtruisfileZDistutilsPlatformError)rPZversfnrrrrfs    zbuild_ext.find_swigcCs|j|}|jd}|j|d}|jsRtjj|dd|g}tjj|j|Sdj|dd}|jd}tjj |j |}tjj||S)Nr`rSrbuild_pyrrr) get_ext_fullnamermget_ext_filenamerrnrtrur@rabspathZget_package_dir)rPrfullnameZmodpathfilenamerCrZ package_dirrrrr~s   zbuild_ext.get_ext_fullpathcCs |jdkr|S|jd|SdS)Nr`)rC)rPrrrrrs zbuild_ext.get_ext_fullnamecCs.ddlm}|jd}|d}tjj||S)Nr)r}r` EXT_SUFFIX)distutils.sysconfigr}rmrnrtru)rPrr}rZ ext_suffixrrrrs  zbuild_ext.get_ext_filenamecCs0d|jjdd}||jkr*|jj||jS)NZPyInit_r`rSr)rvrmrrs)rPrZ initfunc_namerrrrs  zbuild_ext.get_export_symbolscCstjdkrfddlm}t|j|s\d}|jr4|d}|tjd?tjd?d@f}|j|gS|jSnRtjdd d krd }|tjd?tjd?d@f}|j|gStjdd d kr>dd l m }d }|tjd?tjd?d@f}g}xB|j dj D]0}|j dr|j|ddn |j|qW|j|dg|StjdkrP|jStjdddkrj|jSdd l m }|j drdjtjd?tjd?d@|j d}|j|gS|jSdS)NrWr) MSVCCompilerz python%d%dZ_drYrZz python%d.%dr[)rRSHLIBSz-lrmdarwinaixraz python{}.{}{}ABIFLAGS)rprzZdistutils._msvccompilerrrkrKr+ hexversionrGrirRr}rmr|rsformat)rPrrtemplateZ pythonlibrRZextrar]rrrrsJ             zbuild_ext.get_libraries)rrr)rrriignore 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__ descriptionrnroZsep_byr Z user_optionsZboolean_optionsr Z help_optionsrQrrrrrrrr contextlibcontextmanagerrrrrrrrrrrrrrr!s  @N  K6   r)rrnrerpZdistutils.corerZdistutils.errorsrrrrZdistutils.dep_utilrZdistutils.extensionrZdistutils.utilr rir Zsiter rrr rrrrrs