\dvdZddlZddlZddlZddlZddlmZmZmZm Z m Z ddl m Z m Z ddlmZddlmZddlZejZejZejZejZejejejejfZej dko ej!dkZ"e"rd Z#d Z$d Z%nd Z#d Z$dZ%dddZ&GddZ'GddZ(dZ)dZ*dZ+dZ,ddZ-e)Z.e.dkrede.zGdde Z/dS) a distutils.msvc9compiler Contains MSVCCompiler, an implementation of the abstract CCompiler class for the Microsoft Visual Studio 2008. The module is compatible with VS 2005 and VS 2008. You can find legacy support for older versions of VS in distutils.msvccompiler. N)DistutilsExecErrorDistutilsPlatformError CompileErrorLibError LinkError) CCompilergen_lib_options)log) get_platformwin32lz1Software\Wow6432Node\Microsoft\VisualStudio\%0.1fz5Software\Wow6432Node\Microsoft\Microsoft SDKs\Windowsz,Software\Wow6432Node\Microsoft\.NETFrameworkz%Software\Microsoft\VisualStudio\%0.1fz)Software\Microsoft\Microsoft SDKs\Windowsz Software\Microsoft\.NETFrameworkx86amd64r z win-amd64ceZdZdZdZeeZdZeeZdZeeZdZe eZdS)Regz2Helper class to read values from the registry ctD](}|||}|r||vr ||cS)t|N)HKEYS read_valuesKeyError)clspathkeybaseds (..\python\lib\distutils\msvc9compiler.py get_valuez Reg.get_value?sN  Dd++A SAXXv smmc t||}n#t$rYdSwxYwg}d} t||}n#t$rYnwxYw|||dz }=|S)zReturn list of registry keys.NrT) RegOpenKeyExRegError RegEnumKeyappend)rrrhandleLiks r read_keysz Reg.read_keysGs !$,,FF   44     vq))     HHQKKK FA  s !!; AAc, t||}n#t$rYdSwxYwi}d} t||\}}}n#t$rYnIwxYw|}|||||<|dz }k|S)z`Return dict of registry keys and values. All names are converted to lowercase. NrTr )r!r" RegEnumValuelower convert_mbcs) rrrr%rr'namevaluetypes rrzReg.read_valuesYs  !$,,FF   44     $0$;$;!eTT    ::<> NN-t{M J J J NN?K9O P P P P PAA B B$T1--AAH A&&MM$AAAss(;<<56y\ 122 B Bs2BB)8D  DDcp|jD]\}}|||}|Sr)rBitemsreplace)rFr6r(vs rsubzMacroExpander.subs;K%%''  DAq !QAArN)r8r9r:rHrKrEr`r>rrr@r@ysV""" @@@BBB>rr@cvd}tj|}|dkrdS|t|z}tj|ddd\}}t |dddz }|dkr|dz }t |d d d z }|dkrd }|dkr||zSdS) zReturn the version of MSVC that was used to build Python. For Python 2.3 and up, the version number is included in sys.version. For earlier versions, assume the compiler is MSVC 6. zMSC v.N r g$@r)sysrGfindlensplitint)prefixr'r6rest majorVersion minorVersions rget_build_versionrrs F   ABwwq CKKAk!""o##C++GAtq"v;;?Lr q1v;;%Lq ql** 4rcg}|D]:}tj|}||vr||;|S)znReturn a list of normalized paths with duplicates removed. The current order of paths is maintained. )osrnormpathr$)paths reduced_pathsrZnps rnormalize_and_reduce_pathsrysS M %% W  a  ] " "   $ $ $ rc|tj}g}|D]}||vr||tj|}|S)z8Remove duplicate values of an environment variable. )rlrtpathsepr$join)variableoldListnewListr' newVariables rremoveDuplicatesrsbnnRZ((GG  G   NN1   *//'**K rct|z} td|zd}n&#t$rt jdd}YnwxYw|rt j|sd|z}t j |d}|rt j|rt j |t j t j d}t j |}t j|st jd|zdSnt jd|z|st jd dSt j |d }t j|r|St jd dS) zFind the vcvarsall.bat file At first it tries to find the productdir of VS 2008 in the registry. If that fails it falls back to the VS90COMNTOOLS env var. z %s\Setup\VCrNz%Unable to find productdir in registryNzVS%0.f0COMNTOOLSVCz%s is not a valid directoryz Env var %s is not set or invalidzNo productdir foundz vcvarsall.batUnable to find vcvarsall.bat)rCrrrr debugrtrisdirenvirongetr|pardirabspathisfile)rGrDrNtoolskeytoolsdir vcvarsalls rfind_vcvarsallrs w F]]>F#:#/11  9:::   ERW]]:66 E%/:>>(D11  E h// Eh 29dKKJ44J7==,,  7*DEEEt  I88C D D D  '(((t Z99I w~~i  I,--- 4s+ A Act|}hd}i}|tdtjd||t jd|d|dtjtj} |\}}|d kr"t| d | d }| d D]}t |}d |vr!| }| d d \} } | } | |vr;| t jr | dd} t%| || < |j|jn7#|j|jwxYwt-|t-|kr;t/t1t3||S)zDLaunch vcvarsall.bat and read the settings from its environment >librincludelibpathNrz'Calling 'vcvarsall.bat %s' (version=%s)"z" z & set)stdoutstderrrr3 =r rb)rrr r subprocessPopenPIPE communicatewaitr2rlrr-stripr,endswithrtr{rrcloserrk ValueErrorstrlistkeys) rGarchr interestingresultpopenrrlinerr/s rquery_vcvarsallrs(w''I777K F$%CDDDI7wGGG    444@$.O$.O 5 5 5E**,, ::<<1  (v)>)>?? ?v&&LL&& 6 6D##D))D$::<>"*--'!#2#JE.u55s  6       6{{c+&&&&T&++--0011222 Ms 0DG4G5rRz(VC %0.1f is not supported by this moduleceZdZdZdZiZdgZgdZdgZdgZ eezeze zZ dZ dZ d Z d Zd xZZd ZddZddZ d dZ d!dZ d"dZ d#dZdZdZdZdZdZdZd$dZdZdS)% MSVCCompilerzwConcrete class that implements an interface to Microsoft Visual C++, as defined by the CCompiler abstract class.msvcz.c)z.ccz.cppz.cxx.rcz.mcz.resz.objz.libz.dllz%s%sz.exerctj||||t|_d|_g|_d|_d|_d|_dS)NzSoftware\Microsoft\VisualStudioF) rrHVERSION_MSVCCompiler__version_MSVCCompiler__root_MSVCCompiler__paths plat_name_MSVCCompiler__arch initialized)rFverbosedry_runforces rrHzMSVCCompiler.__init__HsJD'7E::: 8    rNc|jr Jd|t}d}||vrtd|dtjvrHdtjvr:|dr%d|_d|_d|_d |_ d |_ nj|tks|d krt|}n*ttd zt|z}tt|}|d tj|_|dtjd<|dtjd<t#|jdkrtd|jz|d|_|d|_|d|_|d |_ |d |_ tjd dD]}|j|n#t($rYnwxYwt+|j|_d|jtjd <d|_|jdkrgd|_gd|_ngd|_gd|_gd|_|jdkr gd|_dg|_d|_dS)Nzdon't init multiple timesrz--plat-name must be one of DISTUTILS_USE_SDKMSSdkzcl.exezlink.exezlib.exezrc.exezmc.exer _rrrrzxPython was built with %s, and extensions need to be built with the same version of the compiler, but it isn't installed.;r )/nologo/Ox/MD/W3/DNDEBUG)r/Od/MDdr/Z7/D_DEBUG)rrrr/GS-r)rrrrrrr)/DLLrz/INCREMENTAL:NO)rrz/INCREMENTAL:noz/DEBUGrT)rr rrtrfind_execclinkerrrcmcPLAT_TO_VCVARSrrrlr{rrk_MSVCCompiler__productr$rryr|preprocess_optionsrcompile_optionscompile_options_debugldflags_sharedrldflags_shared_debugldflags_static)rFrok_plats plat_specvc_envrZs r initializezMSVCCompiler.initializeSs"#@@%@@@@  $I' H $ $((*2(*566 6 "* , ,BJ1F1F4==YaKbKb1FDG$DK DHDGDGG LNN**i7.B.B*95 +<>>:S@*956 %Wi88F!&>// ;;DL &u BJu $*9$5BJy !4<  A%%,.J.())) mmH--DG-- 33DK}}Y//DHmmH--DGmmH--DG  Z'--c22 ' ' ##A&&&& '    D 1$,??  XXdl33 6"& ;%  $1$1$1D *=*=*=D & &$1$1$1D *=*=*=D &EDD >Q  )))D %!*ls;AH>> I  I c|d}g}|D]s}tj|\}}tj|d}|tj|d}||jvrt d|z|rtj|}||jvr<| tj |||j z||j vr=| tj |||j z8| tj |||j zu|S)Nrr zDon't know how to compile %s)rtrsplitext splitdriveisabssrc_extensionsrbasename_rc_extensionsr$r| res_extension_mc_extensions obj_extension)rFsource_filenames strip_dir output_dir obj_namessrc_namerexts robject_filenameszMSVCCompiler.object_filenamess  Bz ( L LH'**H55KT37%%d++A.D d++,,-D$---#$BX$MNNN /w''..d)))  "',, 04t7I0I#K#KLLLL+++  "',, 04t7I0I#K#KLLLL  "',, 04t7I0I#K#KLLLLrc |js||||||||} | \}} }} } |pg} | d|r| |jn| |j| D];} | |\}}n#t$rYwxYw|rtj |}||j vrd|z}n||j vrd|z}n||j vrQ|}d|z} ||jg| z|gz|gzn!#t $r}t#|d}~wwxYw||jvrtj |}tj |} ||jgd|d|gz|gztj tj |\}}tj ||dz}||jgd|zgz|gzn!#t $r}t#|d}~wwxYwt#d|d |d |z} ||jg| z| z||gz|z#t $r}t#|d}~wwxYw| S) Nz/cz/Tcz/Tpz/foz-hz-rrzDon't know how to compile z to z/Fo)rr_setup_compiler$extendrrrrtrr _c_extensions_cpp_extensionsrspawnrrrrdirnamerrrr|r)rFsourcesrrB include_dirsr extra_preargsextra_postargsdepends compile_infoobjectspp_optsbuild compile_optsobjsrcr input_opt output_optmsgh_dirrc_dirrrrc_files rcompilezMSVCCompiler.compiles  OO   **:v|+2G^MM :F7%$* T"""  6    : ; ; ; ;    4 5 5 5? (? (C  :SS     +gooc**d(((!CK ,,,!CK +++ "S[ ,JJy72 *| ,/8k :;;;;),,,&s+++,+++,,-- ,JJy $eT6: ;>AU CDDD g..0@0@#0F0FGGGD! gllFD5LAAGJJy % } -07y 9::::*,,,&s+++,#l&)cc33$0111J ( DG9|3g=%z23)*++++& ( ( ("3''' (s[ B  B-,B-&D)) E3EEB.I I! II!)J,, K 6KK c|js||||\}}|||}|||rN|d|zgz}|r ||jg|zdS#t$r}t|d}~wwxYwtj d|dS)N)r/OUT:skipping %s (up-to-date)) rr_fix_object_argslibrary_filename _need_linkrrrrr r) rFroutput_libnamerr target_langoutput_filenamelib_argsrs rcreate_static_libzMSVCCompiler.create_static_libs  OO    $ 5 5gz J J*//;E0GG ??7O 4 4 C'O";!<> :D7L"6  5 IIN2334 5 5 5#4#/1E#,..  ! gll:GGO ??7O 4 4= Ci2226"7;GG"1!""5GG2"7GG"1GK&," 5 5"":#34444)K7")O";!<=G44J)&(g&6&6G$$_55'7'7#7 gll))(3355  [ 8999  & & G L L L ,+  /~... KK88 9 9 9 % DK=723333% % % %nn$ %11+wGGF!#) DD5D__ddK)JJ)[ *G 566666))))#C..() "! I0/ B B B B Bs0I44 J>J  J;K K5!K00K5ctj|tj|dz}|d|zdS)Nz .manifest/MANIFESTFILE:)rtrr|rr$)rFrrr% temp_manifests rrz"MSVCCompiler.manifest_setup_ldargssV   11K?AA  '-788888rc|D]5}|dr|ddd}n6dS|tjkrd}nd}||}|dS||fS)Nr/:r rg) startswithrlrr_remove_visual_c_ref)rFrr%argr0r+s rrz$MSVCCompiler.manifest_get_embed_infos   C~~.//  # #q 1 1! 4   4 ). . .DDD 55mDDM  4d""rcz t|} |}|n#|wxYwtjdtj}tj|d|}d}tj|d|}tjdtj}tj||dSt|d} ||||S#|wxYw#t$rYdSwxYw)NzU|)rz*\s*zI|)w) openreadrrerDOTALLr`searchwriteOSError)rF manifest_file manifest_f manifest_bufpatterns rr4z!MSVCCompiler._remove_visual_c_refsR$ m,,J #)00   """"   """"jD G6'2|<D,D))D,, D:9D:c d|zS)Nz /LIBPATH:r>rFdirs rlibrary_dir_optionzMSVCCompiler.library_dir_options S  rc td)Nz>'**#"NNNNN# # 4rc|jD]b}tjtj||}tj|r|cSctjddD]b}tjtj||}tj|r|cSc|S)aReturn 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'. Pathr)rrtrr|rrrrl)rFexerZfns rrzMSVCCompiler.find_exes  Abgooa00#66Bw~~b!!   F#))#..  Abgooa0055Bw~~b!!    r)rrrr)rr)NNNrNNN)NrN) NNNNNrNNNN)r) r8r9r:r; compiler_type executablesrrrrrrrstatic_lib_extensionshared_lib_extensionstatic_lib_formatshared_lib_format exe_extensionrHrrrrr-rrr4rFrHrJrQrr>rrrr*s66MKFM---OWNWN$o5$%'56NMM!!,22)M ! ! ! !Q Q Q Q n$%$&@HIAERRRRp&* !&* CCCC:"&  ]C]C]C]C~ 9 9 9###0%%%V!!!NNN***$rr)r )0r;rtrrir:distutils.errorsrrrrrdistutils.ccompilerrr distutilsr distutils.utilr winreg OpenKeyExr!EnumKeyr# EnumValuer+errorr" HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOTrplatformmaxsize NATIVE_WIN64rCrYrXrrr@rrryrrrrrr>rrrmsk  ??????????????::::::::''''''  ^  <    !  "  ! #  '?CK%,?  3CGJK>HH6G>K2H  <.<.<.<.<.<.<.<.|,,,,,,,,\2      !!!F&&&&R     S== !Kg!U V VVjjjjj9jjjjjr