o ?Og'N@sdZddlZddlZddlZddlmZmZmZmZm Z ddl m Z m Z ddl mZddlmZddlmZdd Zd d Zd d dddZddZddZdddZd ddddZGddde 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)DistutilsExecErrorDistutilsPlatformError CompileErrorLibError LinkError) CCompilergen_lib_options)log) get_platform)countc Cs ztjtjdtjtjBd}WntytdYdSwd}d}|_tD]F}z t ||\}}}Wn ty@Yn:w|ro|tj krot j |roztt|}Wn ttfyaYq)w|dkro||kro||}}q)Wd||fSWd||fS1swY||fS)Nz'Software\Microsoft\VisualStudio\SxS\VC7)accesszVisual C++ is not registeredNNr)winregZ OpenKeyExHKEY_LOCAL_MACHINEZKEY_READZKEY_WOW64_32KEYOSErrorr debugr Z EnumValueZREG_SZospathisdirintfloat ValueError TypeError)key best_versionbest_dirivZvc_dirZvtversionr >/opt/alt/python310/lib64/python3.10/distutils/_msvccompiler.py _find_vc2015sH           r"c Cstjdp tjd}|sdSztjtj|dddddd d d d d dg ddd}Wntjt t fy:YdSwtj|ddd}tj |rNd|fSdS)aJReturns "15, path" based on the result of invoking vswhere.exe If no install is found, returns "None, None" The version is returned to avoid unnecessarily changing the function result. It may be ignored when the path is not None. If vswhere.exe is not available, by definition, VS 2017 is not installed. zProgramFiles(x86)Z ProgramFilesr zMicrosoft Visual StudioZ Installerz vswhere.exez-latestz -prereleasez -requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z -propertyZinstallationPathz -products*mbcsstrict)encodingerrorsZVCZ AuxiliaryZBuild) renvironget subprocess check_outputrjoinstripCalledProcessErrorrUnicodeDecodeErrorr)rootrr r r! _find_vc20178s.  r2x86Zx64ZarmZarm64)r3 x86_amd64x86_arm x86_arm64cCs\t\}}|s t\}}|stddStj|d}tj|s*td|dS|dfS)Nz$No suitable Visual C++ version foundr z vcvarsall.batz%s cannot be found)r2r"r rrrr-isfile) plat_spec_rr vcvarsallr r r!_find_vcvarsall_s     r;c CstdrddtjDSt|\}}|stdztjd||tj dj ddd }Wntj yI}zt |jtd |jd}~wwd dd d |DD}|S)NZDISTUTILS_USE_SDKcSsi|] \}}||qSr lower).0rvaluer r r! ssz_get_vc_env..zUnable to find vcvarsall.batzcmd /u /c "{}" {} && set)stderrzutf-16lereplace)r'zError executing {}cSs$i|]\}}}|r|r||qSr r<)r>rr9r?r r r!r@scss|]}|dVqdS)=N) partition)r>liner r r! sz_get_vc_env..)rgetenvr)itemsr;rr+r,formatZSTDOUTdecoder/r erroroutputcmd splitlines)r8r:r9outexcenvr r r! _get_vc_envqs2     rRcCsN|s tdtj}|D]}tjtj||}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)rrGsplitpathseprr-abspathr7)Zexepathspfnr r r! _find_exes  rYr4r5r6)Zwin32z win-amd64z win-arm32z win-arm64cseZdZdZdZiZdgZgdZdgZdgZ eeee Z dZ dZ d Z d Zd ZZd Zd&ddZd'ddZ d(ddZ d)ddZ  d*ddZ         d+ddZfddZddZd d!Zd"d#Zd,d$d%ZZS)- MSVCCompilerzwConcrete class that implements an interface to Microsoft Visual C++, as defined by the CCompiler abstract class.Zmsvcz.c)z.ccz.cppz.cxx.rcz.mcz.resz.objz.libz.dllz%s%sz.exercCs t||||d|_d|_dS)NF)r__init__ plat_name initialized)selfverboseZdry_runZforcer r r!r\s zMSVCCompiler.__init__NcCs |durt}|tvrtdttt|}t|}|s"td|dd|_|jt j }t d||_ t d||_ t d||_t d||_t d ||_t d ||_|d dt j D] }|rk||t jq^|d dt j D] }|r||t jqvd|_gd |_gd|_gd}gd}g|d|_g|d|_g|ddd|_g|ddd|_g||_g||_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.rzcl.exezlink.exezlib.exezrc.exezmc.exezmt.exeZincludelib)/nologoz/Ox/W3z/GLz/DNDEBUGz/MD)rcz/Odz/MDdz/Zirdz/D_DEBUG)rc/INCREMENTAL:NO/LTCG)rcrerfz /DEBUG:FULLz/MANIFEST:EMBED,ID=1z/DLLz/MANIFEST:EMBED,ID=2z/MANIFESTUAC:NOFT)%r PLAT_TO_VCVARSrrItuplerRr*_pathsrSrrTrYcclinkerrbrcmcZmtZadd_include_dirrstripsepZadd_library_dirZpreprocess_optionscompile_optionscompile_options_debugZ ldflags_exeZldflags_exe_debugZldflags_sharedZldflags_shared_debugZldflags_staticZldflags_static_debugrZ EXECUTABLEZ SHARED_OBJECTZSHARED_LIBRARY_ldflagsr^)r_r]r8Zvc_envrVdirldflagsZ ldflags_debugr r r! initializes`                     zMSVCCompiler.initializeracsXifddjDfddjjDpdfdd}tt||S)Nci|]}|jqSr ) obj_extensionr>extr_r r!r@"z1MSVCCompiler.object_filenames..crvr ) res_extensionrxrzr r!r@#r{racstj|\}}rtj|}ntj|\}}|tjjtjjfr*|dd}z tj||WSt yDt d |w)NzDon't know how to compile {}) rrsplitextbasename splitdrive startswithroaltsepr- LookupErrorrrI)rWbaseryr9)ext_map output_dir strip_dirr r! make_out_path(s  z4MSVCCompiler.object_filenames..make_out_path)src_extensions_rc_extensions_mc_extensionslistmap)r_Zsource_filenamesrrrr )rrr_rr!object_filenamesszMSVCCompiler.object_filenamesc  CsL|js||||||||} | \}} }} } |pg} | d|r*| |jn| |jd}| D]}z| |\}}Wn tyGYq4w|rPtj |}||j vrZd|}n||j vrfd|}d}n||j vr|}d|}z||jg| ||gWnty}zt|d}~wwq4||jvrtj |}tj |}z.||jd|d||gtj tj |\}}tj ||d }||jd||gWnty}zt|d}~wwq4td |||jg| | }|r|d |||d |||z||Wq4ty#}zt|d}~ww| S) Nz/cFz/Tcz/TpTz/foz-hz-rr[z"Don't know how to compile {} to {}z/EHscz/Fo)r^ruZ_setup_compileappendextendrqrpKeyErrorrrrU _c_extensions_cpp_extensionsrspawnrlrrrdirnamermr~rr-rIrj)r_ZsourcesrZmacrosZ include_dirsr extra_preargsextra_postargsZdependsZ compile_infoobjectsZpp_optsZbuildZ compile_optsZ add_cpp_optsobjsrcryZ input_optZ output_optmsgZh_dirZrc_dirrr9Zrc_fileargsr r r!compile>s              zMSVCCompiler.compilec Cs|js||||\}}|j||d}|||rN|d|g}|r& ztd|jd|| |jg|WdSt yM}zt |d}~wwtd|dS)N)r/OUT:Executing "%s" %s skipping %s (up-to-date)) r^ru_fix_object_argslibrary_filename _need_linkr rrbr-rrr) r_rZoutput_libnamerr target_langoutput_filenameZlib_argsrr r r!create_static_libs$ zMSVCCompiler.create_static_libc Cs|js||||\}}||||}|\}}}|r&|dt|t||||}|dur8tj ||}| ||r|j || f}dd|pKgD}||||d|g}tj |d} |durtj tj|\}}tj | ||}|d|| r| |dd<| r|| tj tj|}||ztd|jd |||jg|WdSty}zt|d}~wwtd |dS) Nz5I don't know what to do with 'runtime_library_dirs': cSsg|]}d|qS)z/EXPORT:r )r>Zsymr r r! r{z%MSVCCompiler.link..rrz/IMPLIB:rrr)r^rurZ _fix_lib_argswarnstrrrrr-rrrrr~rrrrrUZmkpathr rrkrrr)r_Z target_descrrrZ librariesZ library_dirsZruntime_library_dirsZexport_symbolsrrrZ build_temprZ fixed_argsZlib_optsrtZ export_optsZld_argsZdll_nameZdll_extZ implib_filerr r r!linksb       zMSVCCompiler.linkc s<td}z|jtjd<t|W|tjd<S|tjd<w)Nr)rrGrir)superr)r_rMZold_path __class__r r!rs   zMSVCCompiler.spawncCsd|S)Nz /LIBPATH:r r_rsr r r!library_dir_optionszMSVCCompiler.library_dir_optioncCstd)Nz:don't know how to set runtime library search path for MSVC)rrr r r!runtime_library_dir_optionsz'MSVCCompiler.runtime_library_dir_optioncCs ||SN)r)r_rbr r r!library_option s zMSVCCompiler.library_optioncCs\|r |d|g}n|g}|D]}|D]}tj|||}tj|r*|SqqdS)NZ_d)rrr-rr7)r_dirsrbrZ try_namesrsnameZlibfiler r r!find_library_file s  zMSVCCompiler.find_library_file)rrrr)rra)NNNrNNN)NrN) NNNNNrNNNN)r)__name__ __module__ __qualname____doc__Z compiler_typeZ executablesrrrrrr|rwZstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionr\rurrrrrrrrr __classcell__r r rr!rZs^  P " ]  E rZr)rrr+rZdistutils.errorsrrrrrZdistutils.ccompilerrrZ distutilsr Zdistutils.utilr itertoolsr r"r2ZPLAT_SPEC_TO_RUNTIMEr;rRrYrgrZr r r r!s2   !