U Å:âeRNã@sÖdZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z mZddlmZddlmZddlmZdd „Zd d „Zd d dddœZdd„Zdd„Zddd„Zd ddddœ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 CsztjtjdtjtjBd}Wn tk r>t d¡YdSXd}d}|¦tƒD]˜}zt  ||¡\}}}Wntk rˆYqîYnX|rT|tj krTt j   |¡rTztt|ƒƒ}Wnttfk rÐYqTYnX|dkrT||krT||}}qTW5QRX||fS)Nz'Software\Microsoft\VisualStudio\SxS\VC7)ÚaccesszVisual C++ is not registered©NNré)Ú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ÚvZvc_dirZvtÚversion©r úwsÿz_get_vc_env..zUnable to find vcvarsall.batzcmd /u /c "{}" {} && set)Ústderrzutf-16leÚreplace)r'zError executing {}cSs$i|]\}}}|r|r| ¡|“qSr r=)r?rr:r@r r r!rAŠs ýcss|]}| d¡VqdS)ú=N)Ú partition)r?Úliner r r!Ú sz_get_vc_env..)rÚgetenvr*Úitemsr<rr,r-ÚformatÚSTDOUTÚdecoder0r ÚerrorÚoutputÚcmdÚ splitlines)r9r;r:ÚoutÚexcÚenvr r r!Ú _get_vc_envus0 þ  þý  ÿýrTcCsN|st d¡ tj¡}|D].}tj tj |¡|¡}tj |¡r|Sq|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)rrHÚsplitÚpathseprr.Úabspathr8)ZexeÚpathsÚpÚfnr r r!Ú _find_exe“s   r[r5r6r7)Úwin32z win-amd64z win-arm32z win-arm64c sÎeZdZdZdZiZdgZdddgZdgZdgZ eeee Z d Z d Z d Z d Zd ZZdZd(dd„Zd)dd„Zd*dd„Zd+dd„Zd,dd„Zd-dd„Z‡fdd„Zd d!„Zd"d#„Zd$d%„Zd.d&d'„Z‡ZS)/Ú MSVCCompilerzwConcrete class that implements an interface to Microsoft Visual C++, as defined by the CCompiler abstract class.Zmsvcz.cz.ccz.cppz.cxxú.rcz.mcz.resz.objz.libz.dllz%s%sz.exercCs t ||||¡d|_d|_dS)NF)rÚ__init__Ú plat_nameÚ initialized)ÚselfÚverboseÚdry_runÚforcer r r!r_ÍszMSVCCompiler.__init__NcCs |jrtdƒ‚|dkrtƒ}|tkr6td ttƒ¡ƒ‚t|}t|ƒ}|sRtdƒ‚| dd¡|_ |j   t j ¡}t d|ƒ|_t d|ƒ|_t d|ƒ|_t d |ƒ|_t d |ƒ|_t d |ƒ|_| d d¡  t j ¡D]}|rÊ| | t j¡¡qÊ| d d¡  t j ¡D]}|rú| | t j¡¡qúd|_ddddddg|_ddddddg|_dddg}ddddg}|d!•|_|d"•|_|d#•|_|d$•|_|•|_|•|_ t!j"df|jt!j"df|jt!j"d f|jt!j#df|jt!j#df|jt!j#d f|jt!j$df|jt!j$df|jt!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.exeZincludeÚlibz/nologoz/Oxz/W3z/GLz/DNDEBUGz/MDz/Odz/MDdz/Ziz/D_DEBUGz/INCREMENTAL:NOz/LTCGz /DEBUG:FULLú/MANIFEST:EMBED,ID=1ú/DLLú/MANIFEST:EMBED,ID=2ú/MANIFESTUAC:NOFT)rh)rh)rirjrk)rirjrk)&raÚAssertionErrorr ÚPLAT_TO_VCVARSrrJÚtuplerTr+Ú_pathsrUrrVr[ÚccÚlinkerrgÚrcÚmcÚmtZadd_include_dirÚrstripÚsepZadd_library_dirZpreprocess_optionsÚcompile_optionsÚcompile_options_debugZ ldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugrZ EXECUTABLEZ SHARED_OBJECTZSHARED_LIBRARYÚ_ldflags)rbr`r9Zvc_envrXÚdirÚldflagsZ ldflags_debugr r r!Ú initializeÓs–ÿ      ÿÿÿÿ    ÷ zMSVCCompiler.initializerfcsT‡fdd„ˆjDƒ‡fdd„ˆjˆjDƒ–‰ˆp4d‰‡‡‡fdd„}tt||ƒƒS)Ncsi|] }|ˆj“qSr )Ú obj_extension©r?Úext©rbr r!rA&sz1MSVCCompiler.object_filenames..csi|] }|ˆj“qSr )Ú res_extensionr~r€r r!rA'srfcs”tj |¡\}}ˆr"tj |¡}n2tj |¡\}}| tjjtjjf¡rT|dd…}ztj ˆ|ˆ|¡WSt k rŽt d  |¡ƒ‚YnXdS)NézDon't know how to compile {}) rrÚsplitextÚbasenameÚ splitdriveÚ startswithrvÚaltsepr.Ú LookupErrorrrJ)rYÚbaserr:)Ú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)rbZsource_filenamesrŒr‹rr )rŠr‹rbrŒr!Úobject_filenames!s þzMSVCCompiler.object_filenamesc  Cs†|js| ¡| ||||||¡} | \}} }} } |p6g} |  d¡|rT|  |j¡n |  |j¡d}| D]}z| |\}}Wntk r–YqhYnX|r¨tj   |¡}||j kr¾d|}nD||j krØd|}d}n*||j kr@|}d|}z| |jg| ||g¡Wqhtk r:}z t|ƒ‚W5d}~XYqhXqhnÂ||jkròtj  |¡}tj  |¡}z\| |jd|d||g¡tj  tj  |¡¡\}}tj  ||d ¡}| |jd||g¡Wqhtk rì}z t|ƒ‚W5d}~XYqhXqhntd  ||¡ƒ‚|jg| | }|r"| d ¡| |¡| d |¡| |¡z| |¡Wqhtk r~}z t|ƒ‚W5d}~XYqhXqh| S) Nz/cFz/Tcz/TpTz/foz-hz-rr^z"Don't know how to compile {} to {}z/EHscz/Fo)rar|Z_setup_compileÚappendÚextendrxrwÚKeyErrorrrrWÚ _c_extensionsÚ_cpp_extensionsrÚspawnrrrrrÚdirnamersrƒr„r.rJrp)rbZsourcesr‹ZmacrosZ include_dirsrÚ extra_preargsÚextra_postargsZdependsZ compile_infoÚobjectsZpp_optsZbuildZ compile_optsZ add_cpp_optsÚobjÚsrcrZ input_optZ output_optÚmsgZh_dirZrc_dirr‰r:Zrc_fileÚargsr r r!ÚcompileBsx ÿ           ÿ   zMSVCCompiler.compilec Cs´|js| ¡| ||¡\}}|j||d}| ||¡r¤|d|g}|rJz,t d|jd |¡¡|  |jg|¡Wq°t k r }z t |ƒ‚W5d}~XYq°Xn t d|¡dS)N)r‹ú/OUT:úExecuting "%s" %sú úskipping %s (up-to-date)) rar|Ú_fix_object_argsÚlibrary_filenameÚ _need_linkr rrgr.r™rr) rbrZoutput_libnamer‹rÚ target_langÚoutput_filenameZlib_argsr r r r!Úcreate_static_libœsÿ zMSVCCompiler.create_static_libc Cs¸|js| ¡| ||¡\}}| |||¡}|\}}}|rL| dt|ƒ¡t||||ƒ}|dk rptj  ||¡}|  ||¡r¨|j || f}dd„|p˜gDƒ}||||d|g}tj  |d¡} |dk r tj  tj |¡¡\}}tj  | | |¡¡}| d|¡| r| |dd…<| r.| | ¡tj  tj |¡¡}| |¡z,t d|jd  |¡¡| |jg|¡Wn,tk r¤}z t|ƒ‚W5d}~XYnXn t d |¡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..r£rz/IMPLIB:r¤r¥r¦)rar|r§Z _fix_lib_argsÚwarnÚstrrrrr.r©ryršrƒr„r¨r”r•rWZmkpathr rrqr™rr)rbZ target_descrr«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¶s`ÿ ÿþ ÿÿ  ÿþ   zMSVCCompiler.linkc s8t d¡}z|jtjd<tƒ |¡W¢S|tjd<XdS)Nr)rrHr*roÚsuperr™)rbrOZold_path©Ú __class__r r!r™ûs   zMSVCCompiler.spawncCsd|S)Nz /LIBPATH:r ©rbrzr r r!Úlibrary_dir_optionszMSVCCompiler.library_dir_optioncCs tdƒ‚dS)Nz:don't know how to set runtime library search path for MSVC)rr´r r r!Úruntime_library_dir_option sÿz'MSVCCompiler.runtime_library_dir_optioncCs | |¡S)N)r¨)rbrgr r r!Úlibrary_optionszMSVCCompiler.library_optioncCs\|r|d|g}n|g}|D]:}|D]0}tj || |¡¡}tj |¡r$|Sq$qdS)NZ_d)rrr.r¨r8)rbÚdirsrgrZ try_namesrzÚnameZlibfiler r r!Úfind_library_files zMSVCCompiler.find_library_file)rrr)N)rrf)NNNrNNN)NrN) NNNNNrNNNN)r)Ú__name__Ú __module__Ú __qualname__Ú__doc__Z compiler_typeZ executablesr—r˜rrrŽrr}Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionr_r|r“r¢r¬r°r™rµr¶r·rºÚ __classcell__r r r²r!r]®sf ÿÿ  Pý "þ ]û ó E r])N)r¾rÚshutilÚstatr,rZdistutils.errorsrrrrrZdistutils.ccompilerrrZ distutilsr Zdistutils.utilr Ú itertoolsr r"r3ZPLAT_SPEC_TO_RUNTIMEr<rTr[rmr]r r r r!Ús4   #ü ü