3 \KTã@sÎdZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z mZddlmZddlmZddlmZdd „Zd d „Zd d „Zdd„Zddd„ZdddœZedgƒZGdd„de ƒZdS)adistutils._msvccompiler Contains MSVCCompiler, an implementation of the abstract CCompiler class for Microsoft Visual Studio 2015. The module is compatible with VS 2015 and later. You can find legacy support for older versions in distutils.msvc9compiler and distutils.msvccompiler. éN)ÚDistutilsExecErrorÚDistutilsPlatformErrorÚ CompileErrorÚLibErrorÚ LinkError)Ú CCompilerÚgen_lib_options)Úlog)Ú get_platform)Úcountc$CsüytjtjdtjtjBd�}Wntk r<tjdƒdSXd}d}|�¤xœtƒD]’}ytj ||ƒ\}}}Wntk r„PYnX|rT|tj krTt j j |ƒrTytt|ƒƒ}Wnttfk rÊwTYnX|dkrT||krT||}}qTWWdQRX||fS)Nz'Software\Microsoft\VisualStudio\SxS\VC7)ÚaccesszVisual C++ is not registeredré)NN)ÚwinregZ OpenKeyExÚHKEY_LOCAL_MACHINEZKEY_READZKEY_WOW64_32KEYÚOSErrorr Údebugr Z EnumValueZREG_SZÚosÚpathÚisdirÚintÚfloatÚ ValueErrorÚ TypeError)ÚkeyÚ best_versionÚbest_dirÚiÚvÚvc_dirZvtÚversion©r ú//usr/lib64/python3.6/distutils/_msvccompiler.pyÚ _find_vc2015s0  r"c süddl‰ddl}d }d}g‰‡‡fdd„}|j|d�}|jƒ|jƒx†ˆD]~\}}}}d|krLtjj|dddƒ} tjj| ƒs€qLytd d „|j d ƒDƒƒ} Wnt t fk r¶wLYnX| |krL| | }}qLWy |d}Wnt k ròd}YnX||fS) NrcsˆjˆjƒƒdS)N)ÚextendÚfindallr )Ú_distutils_findvsÚ all_packagesr r!Ú_getallDsz_find_vc2017.._getall)Útargetz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64ZVCZ AuxiliaryZBuildcss|]}t|ƒVqdS)N)r)Ú.0rr r r!ú Psz_find_vc2017..Ú.)r) r%Ú threadingZThreadÚstartÚjoinrrrÚtupleÚsplitrrÚ IndexError) r,rrr'ÚtÚnameZ version_strrZpackagesrrr )r%r&r!Ú _find_vc2017:s2    r4cCs tƒ\}}d}d|krdnd}|rztjj|ddddddd ƒ}yd dl}|j|d d �d}Wntttfk rxd}YnX|s tƒ\}}|r tjj|d|dd ƒ}|s²t j dƒdStjj|dƒ}tjj |ƒsÜt j d|ƒdS| pîtjj |ƒ �rt j d|ƒd}||fS)NÚamd64Zx64Úx86z..ZredistZMSVCz**zMicrosoft.VC141.CRTzvcruntime140.dllrT)Ú recursiveézMicrosoft.VC140.CRTz$No suitable Visual C++ version foundz vcvarsall.batz%s cannot be foundéÿÿÿÿ)NN)NN) r4rrr.ÚglobÚ ImportErrorrÚ LookupErrorr"r rÚisfile)Ú plat_specrrÚ vcruntimeZvcruntime_platZvcredistr:Ú vcvarsallr r r!Ú_find_vcvarsall[s6        rAcCsÊtjdƒrdd„tjjƒDƒSt|ƒ\}}|s6tdƒ‚y&tjdj||ƒtj d�j ddd �}Wn@tj k rœ}z"t j |jƒtd j|jƒƒ‚WYdd}~XnXd d„d d „|jƒDƒDƒ}|rÆ||d<|S)NZDISTUTILS_USE_SDKcSsi|]\}}||jƒ“qSr )Úlower)r)rÚvaluer r r!ú sz_get_vc_env..zUnable to find vcvarsall.batzcmd /u /c "{}" {} && set)Ústderrzutf-16leÚreplace)ÚerrorszError executing {}cSs$i|]\}}}|r|r||jƒ“qSr )rB)r)rÚ_rCr r r!rD’scss|]}|jdƒVqdS)ú=N)Ú partition)r)Úliner r r!r*•sz_get_vc_env..Úpy_vcruntime_redist)rÚgetenvÚenvironÚitemsrArÚ subprocessZ check_outputÚformatZSTDOUTÚdecodeZCalledProcessErrorr ÚerrorÚoutputÚcmdÚ splitlines)r>r@r?ÚoutÚexcÚenvr r r!Ú _get_vc_env}s(     rZcCsN|stjdƒjtjƒ}x2|D]*}tjjtjj|ƒ|ƒ}tjj|ƒr|SqW|S)atReturn path to an MSVC executable program. Tries to find the program in several places: first, one of the MSVC program search paths from the registry; next, the directories in the PATH environment variable. If any of those work, return an absolute path that is known to exist. If none of them work, just return the original program name, 'exe'. r)rrMr0Úpathseprr.Úabspathr=)ZexeÚpathsÚpÚfnr r r!Ú _find_exe�s   r`r6Z x86_amd64)Zwin32z win-amd64zvcruntime140.dllc sÖeZdZdZdZiZdgZdddgZdgZdgZ eeee Z d Z d Z d Z d Zd ZZdZd*dd„Zd+dd„Zd,dd„Zd-dd„Zd.dd„Zd/dd„Zdd„Z‡fd d!„Zd"d#„Zd$d%„Zd&d'„Zd0d(d)„Z‡ZS)1Ú MSVCCompilerzwConcrete class that implements an interface to Microsoft Visual C++, as defined by the CCompiler abstract class.Zmsvcz.cz.ccz.cppz.cxxz.rcz.mcz.resz.objz.libz.dllz%s%sz.exercCs tj||||ƒd|_d|_dS)NF)rÚ__init__Ú plat_nameÚ initialized)ÚselfÚverboseZdry_runZforcer r r!rbÛszMSVCCompiler.__init__NcCsN|j stdƒ‚|dkrtƒ}|tkr8tdjttƒƒƒ‚t|}t|ƒ}|sTtdƒ‚|jddƒ|_ |j j t j ƒ}t d|ƒ|_t d|ƒ|_t d|ƒ|_t d |ƒ|_t d |ƒ|_t d |ƒ|_|jd dƒ|_x2|jd dƒj t j ƒD]}|rÜ|j|jt jƒƒqÜWx6|jddƒj t j ƒD]}|�r|j|jt jƒƒ�qWd|_dddddg|_|jj|j�rZdndƒddddddg|_dddg}|j�sŽ|jd%ƒddddg}|d&•|_|d'•|_|d(•|_ |d)•|_!|•|_"|•|_#t$j%df|jt$j%d#f|jt$j%d$f|jt$j&df|j t$j&d#f|j t$j&d$f|j!t$j'df|j"t$j'd#f|j"t$j'd$f|j#i |_(d$|_dS)*Nzdon't init multiple timesz--plat-name must be one of {}z7Unable to find a compatible Visual Studio installation.rÚzcl.exezlink.exezlib.exezrc.exezmc.exezmt.exerLÚincludeÚlibz/nologoz/Oxz/W3z/GLz/DNDEBUGz/MDz/MTz/Odz/MDdz/Ziz/D_DEBUGz/INCREMENTAL:NOz/LTCGú/nodefaultlib:libucrt.libúucrt.libz /DEBUG:FULLú/MANIFEST:EMBED,ID=1ú/DLLú/MANIFEST:EMBED,ID=2ú/MANIFESTUAC:NOFT)rjrk)rl)rl)rmrnro)rmrnro))rdÚAssertionErrorr ÚPLAT_TO_VCVARSrrQr/rZÚgetÚ_pathsr0rr[r`ÚccÚlinkerriÚrcÚmcZmtÚ_vcruntime_redistZadd_include_dirÚrstripÚsepZadd_library_dirZpreprocess_optionsÚcompile_optionsÚappendÚcompile_options_debugr#Z ldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugrZ EXECUTABLEZ SHARED_OBJECTZSHARED_LIBRARYÚ_ldflags)rercr>Zvc_envr]ÚdirÚldflagsZ ldflags_debugr r r!Ú initializeásb                      zMSVCCompiler.initializergcsT‡fdd„ˆjDƒ‡fdd„ˆjˆjDƒ–‰ˆp4d‰‡‡‡fdd„}tt||ƒƒS)Ncsi|] }ˆj|“qSr )Ú obj_extension)r)Úext)rer r!rD8sz1MSVCCompiler.object_filenames..csi|] }ˆj|“qSr )Ú res_extension)r)rƒ)rer r!rD9srgc s’tjj|ƒ\}}ˆr"tjj|ƒ}n2tjj|ƒ\}}|jtjjtjjfƒrT|dd…}ytjjˆ|ˆ|ƒSt k rŒt dj |ƒƒ‚YnXdS)Nr8zDon't know how to compile {}) rrÚsplitextÚbasenameÚ splitdriveÚ startswithrzÚaltsepr.r<rrQ)r^ÚbaserƒrH)Úext_mapÚ output_dirÚ strip_dirr r!Ú make_out_path>s z4MSVCCompiler.object_filenames..make_out_path)Úsrc_extensionsÚ_rc_extensionsÚ_mc_extensionsÚlistÚmap)reZsource_filenamesr�rŒrŽr )r‹rŒrer�r!Úobject_filenames3s zMSVCCompiler.object_filenamesc CsŠ|js|jƒ|j||||||ƒ} | \}} }} } |p6g} | jdƒ|rT| j|jƒn | j|jƒd}�x| D�]}y| |\}}Wntk r˜wlYnX|rªtj j |ƒ}||j krÀd|}�nD||j krÚd|}d}�n*||j k�rB|}d|}y|j|jg| ||gƒWqltk �r<}zt|ƒ‚WYdd}~XqlXqlnÂ||jk�rôtj j|ƒ}tj j|ƒ}y\|j|jd|d||gƒtj jtj j|ƒƒ\}}tj j||d ƒ}|j|jd||gƒWqltk �rî}zt|ƒ‚WYdd}~XqlXqlntd j||ƒƒ‚|jg| | }|�r$|jd ƒ|j|ƒ|jd |ƒ|j|ƒy|j|ƒWqltk �r€}zt|ƒ‚WYdd}~XqlXqlW| S) Nz/cFz/Tcz/TpTz/foz-hz-rz.rcz"Don't know how to compile {} to {}z/EHscz/Fo)rdr�Z_setup_compiler|r#r}r{ÚKeyErrorrrr\Ú _c_extensionsÚ_cpp_extensionsr�Úspawnrvrrr‘Údirnamerwr…r†r.rQrt)reZsourcesrŒZmacrosZ include_dirsrÚ extra_preargsÚextra_postargsZdependsZ compile_infoÚobjectsZpp_optsZbuildZ compile_optsZ add_cpp_optsÚobjÚsrcrƒZ input_optZ output_optÚmsgZh_dirZrc_dirrŠrHZrc_fileÚargsr r r!ÚcompileTsn               zMSVCCompiler.compilec Cs´|js|jƒ|j||ƒ\}}|j||d�}|j||ƒr¤|d|g}|rJy,tjd|jdj|ƒƒ|j |jg|ƒWq°t k r }zt |ƒ‚WYdd}~Xq°Xn tjd|ƒdS)N)rŒz/OUT:zExecuting "%s" %sú zskipping %s (up-to-date)) rdr�Ú_fix_object_argsÚlibrary_filenameÚ _need_linkr rrir.r˜rr) rerœZoutput_libnamerŒrÚ target_langÚoutput_filenameZlib_argsrŸr r r!Úcreate_static_lib®s zMSVCCompiler.create_static_libcCsÂ|js|jƒ|j||ƒ\}}|j|||ƒ}|\}}}|rL|jdt|ƒƒt||||ƒ}|dk rptjj ||ƒ}|j ||ƒ�r²|j || f}dd„|p˜gDƒ}||||d|g}tjj |dƒ} |dk �r tjj tjj|ƒƒ\}}tjj | |j|ƒƒ}|jd|ƒ| �r| |dd…<| �r.|j| ƒtjj tjj|ƒƒ}|j|ƒy6tjd|jdj |ƒƒ|j|jg|ƒ|j|ƒWn,tk �r®}zt|ƒ‚WYdd}~XnXn tjd |ƒdS) Nz5I don't know what to do with 'runtime_library_dirs': cSsg|] }d|‘qS)z/EXPORT:r )r)Zsymr r r!ú ësz%MSVCCompiler.link..z/OUT:rz/IMPLIB:zExecuting "%s" %sr¢zskipping %s (up-to-date))rdr�r£Z _fix_lib_argsÚwarnÚstrrrrr.r¥r~r™r…r†r¤r|r#r\Zmkpathr rrur˜Ú_copy_vcruntimerr)reZ target_descrœr§rŒZ librariesZ library_dirsZruntime_library_dirsZexport_symbolsrršr›Z build_tempr¦Z fixed_argsZlib_optsr€Z export_optsZld_argsZdll_nameZdll_extZ implib_filerŸr r r!ÚlinkÈsN       zMSVCCompiler.linkcCs`|j}| stjj|ƒ rdStjj|ƒjƒtkr6dStjd|ƒt j ||ƒ}tj |t j ƒdS)Nz Copying "%s")rxrrr=r†rBÚ _BUNDLED_DLLSr rÚshutilÚcopyÚchmodÚstatÚS_IWRITE)rerŒr?r r r!r¬s  zMSVCCompiler._copy_vcruntimec s4tjdƒ}z|jtjd<tƒj|ƒS|tjd<XdS)Nr)rrMrsrNÚsuperr˜)rerUZold_path)Ú __class__r r!r˜s    zMSVCCompiler.spawncCsd|S)Nz /LIBPATH:r )rerr r r!Úlibrary_dir_option&szMSVCCompiler.library_dir_optioncCs tdƒ‚dS)Nz:don't know how to set runtime library search path for MSVC)r)rerr r r!Úruntime_library_dir_option)sz'MSVCCompiler.runtime_library_dir_optioncCs |j|ƒS)N)r¤)rerir r r!Úlibrary_option-szMSVCCompiler.library_optioncCs`|r|d|g}n|g}xB|D]6}x0|D](}tjj||j|ƒƒ}tjj|ƒr(|Sq(WqWdSdS)NZ_d)rrr.r¤r=)reÚdirsrirZ try_namesrr3Zlibfiler r r!Úfind_library_file0s    zMSVCCompiler.find_library_file)rrr)N)rrg)NNNrNNN)NrN) NNNNNrNNNN)r)Ú__name__Ú __module__Ú __qualname__Ú__doc__Z compiler_typeZ executablesr–r—r�r‘r�r„r‚Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionrbr�r”r¡r¨r­r¬r˜r¶r·r¸rºÚ __classcell__r r )rµr!ra¼sN   T  [  9 ra)N)r¾rr¯r²rPrZdistutils.errorsrrrrrZdistutils.ccompilerrrZ distutilsr Zdistutils.utilr Ú itertoolsr r"r4rArZr`rqÚ frozensetr®rar r r r!Ús&   !"