a ÕDOg“{ã@s¶dZddlZddlZddlZddlZddlmZddlTddlm Z m Z ddlm Z ddl m Z ddlmZdd lmZdd lmZdd lmZe d ¡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ú@/opt/alt/python39/lib64/python3.9/distutils/command/build_ext.pyr s r c@seZdZdZdejZdddddeƒfdd d d efd d ddddefddddddddddgZgd¢Z ddde fgZ d d!„Z d"d#„Z d$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zejd2d3„ƒZd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„Zd@dA„ZdBdC„ZdS)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)zdefine=ÚDzC preprocessor macros to define)zundef=Ú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)zrpath=Ú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=Úczspecify the compiler type)z parallel=Újznumber of parallel build jobs)úswig-cppNz)make SWIG create C++ files (default is C))z swig-opts=Nz!list of SWIG command line options)zswig=Nzpath to the SWIG executable)ÚuserNz#add user include, library and rpath)rrr r$r%z help-compilerNzlist 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_objectsrr ÚcompilerÚswigÚswig_cppÚ swig_optsr%Úparallel©ÚselfrrrÚinitialize_optionsjs*zbuild_ext.initialize_optionsc Csúddlm}| ddddddd d ¡|jdur8|jj|_|jj|_| ¡}|jd d }|j durn|jj pjg|_ t |j t ƒrŠ|j   t j¡|_ tjtjkr®|j  t j tjd ¡¡|j  |  t jj¡¡||krâ|j  |  t jj¡¡| d¡| d¡|jdurg|_|jdurg|_nt |jt ƒr:|j  t j¡|_|jdurNg|_nt |jt ƒrl|j  t j¡|_t jdkrh|j t j tjd¡¡tjtjkr¶|j t j tjd¡¡|jrÒt j |jd¡|_nt j |jd¡|_|j  t j tƒ¡¡t tddƒ}|r|j |¡|j!dkr*d}n|j!dd…}t j tjd¡}|r\t j ||¡}|j |¡tj"dd…dkrÆtj# $t j tjd¡¡rº|j t j tjddt%ƒ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*durHg|_*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özt/|j.ƒ|_.Wnt0yôt1d%ƒ‚Yn0dS)&Nr)Ú sysconfigZbuild)r'r')r)r))r2r2)rr)r r )r6r6)r(r(é)Z plat_specificZincluder.r1ÚntZlibsZDebugZReleaseÚ_homeÚwin32éZPCbuildéÚcygwinÚbinÚlibÚpythonZconfigÚ.ÚPy_ENABLE_SHAREDZLIBDIRú,cSsg|] }|df‘qS)Ú1r)Ú.0ZsymbolrrrÚ ùóz.build_ext.finalize_options..ú zparallel should be an integer)2Ú distutilsr:Zset_undefined_optionsr*Ú distributionZ ext_packageZ ext_modulesr&Zget_python_incr+Ú isinstanceÚstrÚsplitÚosÚpathsepÚsysÚ exec_prefixÚbase_exec_prefixÚappendÚpathÚjoinÚextendZensure_string_listr.r/r0ÚnameÚprefixrr)ÚdirnamerÚgetattrr(ÚplatformÚ executableÚ startswithrÚget_config_varZ python_buildr,r-r5r%r Úisdirr6ÚintÚ ValueErrorZDistutilsOptionError) r8r:Z py_includeZplat_py_includeZ _sys_homeÚsuffixZnew_libZdefinesZ user_includeZuser_librrrÚfinalize_options‚s° ù        ÿ          þ        zbuild_ext.finalize_optionscCsjddlm}|jsdS|j ¡rL| d¡}|j | ¡p:g¡|j   |j ¡||j |j |j|jd|_ t|j ƒtjdkr”|jtƒkr”|j  |j¡|jdur¬|j  |j¡|jdurÔ|jD]\}}|j  ||¡q¼|jdurö|jD]}|j  |¡qä|jdur|j  |j¡|j dur*|j  |j ¡|jdurD|j  |j¡|j dur^|j  !|j ¡| "¡dS)Nr)Ú new_compilerÚ build_clib)r2ÚverboseÚdry_runr r<)#rrhr&rNZhas_c_librariesÚget_finalized_commandr.rZZget_library_namesr/rWrir2rjrkr rrRr[r(r Z initializer+Zset_include_dirsr,Z define_macror-Zundefine_macroZ set_librariesZset_library_dirsr0Zset_runtime_library_dirsr1Zset_link_objectsÚbuild_extensions)r8rhrir[ÚvalueÚmacrorrrÚruns@   ý         z build_ext.runc Csvt|tƒstdƒ‚t|ƒD]T\}}t|tƒr0qt|tƒrFt|ƒdkrNtdƒ‚|\}}t d|¡t|t ƒrvt   |¡s~tdƒ‚t|t ƒstdƒ‚t||dƒ}dD]"}|  |¡}|d ur¢t|||ƒq¢|  d ¡|_d |vrät d ¡|  d ¡}|rhg|_g|_|D]b} t| tƒr"t| ƒdvs*tdƒ‚t| ƒdkrJ|j | d¡nt| ƒdkr|j | ¡q|||<qd 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_argsNr0Zdef_filez9'def_file' element of build info dict no longer supportedÚmacros)r;rqz9'macros' element of build info dict must be 1- or 2-tupler;r)rOÚlistÚDistutilsSetupErrorÚ enumeraterÚtupleÚlenr ÚwarnrPÚextension_name_reÚmatchÚdictÚgetÚsetattrÚruntime_library_dirsÚ define_macrosÚ undef_macrosrW) r8r&rÚextÚext_nameZ build_infoÚkeyÚvalrvrorrrÚcheck_extensions_listVs^ ÿ ÿþ ÿÿ ÿ    ÿzbuild_ext.check_extensions_listcCs,| |j¡g}|jD]}| |j¡q|S©N)r‰r&rZrr)r8Ú filenamesr…rrrÚget_source_files¤s   zbuild_ext.get_source_filescCs2| |j¡g}|jD]}| | |j¡¡q|SrŠ)r‰r&rWÚget_ext_fullpathr[)r8Zoutputsr…rrrÚ get_outputs­s   zbuild_ext.get_outputscCs(| |j¡|jr| ¡n| ¡dSrŠ)r‰r&r6Ú_build_extensions_parallelÚ_build_extensions_serialr7rrrrm»s  zbuild_ext.build_extensionsc sàˆj}ˆjdurt ¡}zddlm}Wnty>d}Yn0|durTˆ ¡dS||dn‰‡‡fdd„ˆjDƒ}tˆj|ƒD]:\}}ˆ  |¡|  ¡Wdƒq‚1s²0Yq‚Wdƒn1sÒ0YdS)NTr)ÚThreadPoolExecutor)Z max_workerscsg|]}ˆ ˆj|¡‘qSr)ZsubmitÚbuild_extension)rIr…©Zexecutorr8rrrJÑsÿz8build_ext._build_extensions_parallel..) r6rRÚ cpu_countZconcurrent.futuresr‘Ú ImportErrorrr&ÚzipÚ_filter_build_errorsÚresult)r8Zworkersr‘Zfuturesr…Zfutrr“rrÃs"     ÿ z$build_ext._build_extensions_parallelc CsD|jD]8}| |¡| |¡Wdƒq1s40YqdSrŠ)r&r—r’)r8r…rrrr×s  z"build_ext._build_extensions_serialc csVz dVWnFtttfyP}z(|js(‚| d|j|f¡WYd}~n d}~00dS)Nz"building extension "%s" failed: %s)ZCCompilerErrorZDistutilsErrorZ CompileErrorZoptionalr|r[)r8r…Úerrrr—Üs ÿzbuild_ext._filter_build_errorsc CsP|j}|dust|ttfƒs*td|jƒ‚t|ƒ}| |j¡}||j}|j slt ||dƒslt   d|j¡dSt   d|j¡| ||¡}|jpŽg}|jdd…}|jD]}| |f¡q¤|jj||j||j|j ||jd}|dd…|_|jrø| |j¡|jpg}|jp|j |¡} |jj||| |¡|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_dirrvr+rÚextra_postargsÚdepends)r.r/r‚ršÚexport_symbolsrr)Z target_lang)"rrrOrwrzrxr[Úsortedrr›r rr rÚinfoÚ swig_sourcesrtrƒr„rWr2Úcompiler)r+Z_built_objectsrsrZruÚlanguageZdetect_languageZlink_shared_objectÚ get_librariesr/r‚Úget_export_symbols) r8r…rrÚext_pathr›Z extra_argsrvr-Zobjectsr¡rrrr’æsVþÿ     ú   ÷zbuild_ext.build_extensioncCs$g}g}i}|jrt d¡|js6d|jvs6d|jvrI don't know how to find (much less run) SWIG on platform '%s'N)rRr[rXrYÚisfileZDistutilsPlatformError)r8ZversÚfnrrrr¨hs    ÿÿzbuild_ext.find_swigcCsŽ| |¡}| d¡}| |d¡}|jsRtjj|dd…|gŽ}tj |j|¡Sd |dd…¡}| d¡}tj  |  |¡¡}tj ||¡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). rEr¦NrÚbuild_py) Úget_ext_fullnamerQÚget_ext_filenamerrRrXrYr'rlÚabspathZget_package_dir)r8r†ÚfullnameÚmodpathÚfilenamer*r±Z package_dirrrrr€s   zbuild_ext.get_ext_fullpathcCs |jdur|S|jd|SdS)zSReturns the fullname of a given extension name. Adds the `package.` prefixNrE)r*)r8r†rrrr²›s zbuild_ext.get_ext_fullnamecCs.ddlm}| d¡}|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©rbrEZ EXT_SUFFIX)Údistutils.sysconfigrbrQrRrXrY)r8r†rbr¤Z ext_suffixrrrr³¤s  zbuild_ext.get_ext_filenamecCsvd|j d¡d}z| d¡Wn.tyPd| d¡ dd¡ d¡}Yn0d |}||jvrp|j |¡|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. Ú_rEr¦ÚasciirZpunycodeó-ó_ZPyInit)r[rQÚencodeÚUnicodeEncodeErrorÚreplaceÚdecoderœrW)r8r…rfZ initfunc_namerrrr£®s "  zbuild_ext.get_export_symbolscCsätjdkr^ddlm}t|j|ƒsÞd}|jr4|d}|tjd?tjd?d@f}|j|gSn€dd l m }d }|d ƒrÂt td ƒr†d }nr)Ú MSVCCompilerz python%d%dZ_déééÿr¸FrFZgetandroidapilevelTrAZ_PYTHON_HOST_PLATFORMZANDROID_API_LEVELZMACHDEPZ LDVERSIONrD)rTr_Zdistutils._msvccompilerrÂrOr2rÚ hexversionr.r¹rbÚhasattrrRÚenviron)r8r…rÂÚtemplateZ pythonlibrbZlink_libpythonZ ldversionrrrr¢Ás4   ÿ      zbuild_ext.get_libraries) Ú__name__Ú __module__Ú __qualname__Z descriptionrRrSZsep_byr Z user_optionsZboolean_optionsr Z help_optionsr9rgrpr‰rŒrŽrmrrÚ contextlibÚcontextmanagerr—r’rŸr¨rr²r³r£r¢rrrrr!sn ÿÿÿÿÙ+ÿÿ@N  L6  r)Ú__doc__rÍrRÚrerTZdistutils.corerZdistutils.errorsr¹rrrZdistutils.dep_utilrZdistutils.extensionrZdistutils.utilr rMr Zsiter r r}r rrrrrÚs$       ÿ