U Å:âeRNã@sÒddlZddlZddlZddlZddlZddlmZmZmZm Z m Z ddl m Z m Z ddlmZddlmZddlmZdd„Zd d „Zd d d ddœZdd„Zdd„Zddd„Zd ddddœZGdd„de ƒZdS)é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©Nr)rrHÚsplitÚpathseprr.Úabspathr8)ZexeÚpathsÚpÚfnr r r!Ú _find_exe“s   r\r5r6r7)Úwin32z win-amd64z win-arm32z win-arm64c sÊeZdZdZiZdgZdddgZdgZdgZeeeeZ dZ d Z d Z d Z d ZZd Zd'dd„Zd(dd„Zd)dd„Zd*dd„Zd+dd„Zd,dd„Z‡fdd„Zdd „Zd!d"„Zd#d$„Zd-d%d&„Z‡ZS).Ú MSVCCompilerZmsvcz.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ü|dkrtƒ}|tkr(td ttƒ¡ƒ‚t|}t|ƒ}|sDtdƒ‚| 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|_d dddddg|_d dddddg|_d ddg}d dddg}|d •|_|d!•|_|d"•|_|d#•|_|•|_|•|_tj df|jtj df|jtj df|jtj!df|jtj!df|jtj!df|jtj"df|jtj"df|jtj"df|ji |_#d|_$dS)$Nz--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)ri)ri)rjrkrl)rjrkrl)%r ÚPLAT_TO_VCVARSrrJÚtuplerTr+Ú_pathsrVrrWr\ÚccÚlinkerrhÚ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Ú_ldflagsrb)rcrar9Zvc_envrYÚdirÚldflagsZ ldflags_debugr r r!Ú initializeÓs”ÿ      ÿÿÿÿ    ÷ zMSVCCompiler.initializergcsT‡fdd„ˆjDƒ‡fdd„ˆjˆjDƒ–‰ˆp4d‰‡‡‡fdd„}tt||ƒƒS)Ncsi|] }|ˆj“qSr )Ú obj_extension©r?Úext©rcr r!rA&sz1MSVCCompiler.object_filenames..csi|] }|ˆj“qSr )Ú res_extensionr~r€r r!rA'srgcs”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)rZÚ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)rcZsource_filenamesrŒr‹rr )rŠr‹rcrŒ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)rbr|Z_setup_compileÚappendÚextendrxrwÚKeyErrorrrrXÚ _c_extensionsÚ_cpp_extensionsrÚspawnrrrrrÚdirnamersrƒr„r.rJrp)rcZsourcesr‹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)) rbr|Ú_fix_object_argsÚlibrary_filenameÚ _need_linkr rrhr.r™rr) rcrZoutput_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¦)rbr|r§Z _fix_lib_argsÚwarnÚstrrrrr.r©ryršrƒr„r¨r”r•rXZmkpathr rrqr™rr)rcZ 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<XdSrU)rrHr*roÚsuperr™)rcrOZold_path©Ú __class__r r!r™ûs   zMSVCCompiler.spawncCsd|S)Nz /LIBPATH:r ©rcrzr 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¨)rcrhr r r!Úlibrary_optionszMSVCCompiler.library_optioncCs\|r|d|g}n|g}|D]:}|D]0}tj || |¡¡}tj |¡r$|Sq$qdS)NZ_d)rrr.r¨r8)rcÚdirsrhrZ try_namesrzÚnameZlibfiler r r!Úfind_library_files zMSVCCompiler.find_library_file)rrr)N)rrg)NNNrNNN)NrN) NNNNNrNNNN)r)Ú__name__Ú __module__Ú __qualname__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^®sd ÿÿ  Pý "þ ]û ó E r^)N)rÚshutilÚstatr,rZdistutils.errorsrrrrrZdistutils.ccompilerrrZ distutilsr Zdistutils.utilr Ú itertoolsr r"r3ZPLAT_SPEC_TO_RUNTIMEr<rTr\rmr^r r r r!Ús2   #ü ü