Ë ëçkð.# ãóB—dZddlZddlZddlZddlZddlmZddlmZddl Z ddl Z ddl m Z  e ej d«Zd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„ZGd„de«Zd„ZGd„de«Zdad„Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&d„Z'd„Z(y#e$reZ YŒmwxYw)zg This module helps emulate Visual Studio 2008 behavior on top of other build systems, primarily ninja. éN)Úcollections_abc)Ú OrderedSet)Úversion_to_tuplez(\\*)"có—tjd«sG|jd«dkDs|jd«dkDrtjj |«}t jd„|«}|jdd«}d|zdzS) z¦Quote a command line argument so that it appears as one argument when processed via cmd.exe and parsed by CommandLineToArgvW (as is typical for Windows programs).Ú#GYP_MSVS_DISABLE_PATH_NORMALIZATIONÚ/récó0—d|jd«zdzS)Nér ú\")Úgroup)Úmos ú7/usr/lib/python3.12/site-packages/gyp/msvs_emulation.pyÚz!QuoteForRspFile..2s€¨A°·±¸³ ©O¸eÒ,CóÚ%z%%Ú") ÚosÚgetenvÚfindÚcountÚpathÚnormpathÚwindows_quoter_regexÚsubÚreplace)Úargs rÚQuoteForRspFiler s{€ô �‰Ð8Ô 9à ‡x�x�ƒ}�qÒ˜CŸI™I c›N¨QÒ.Ü �G‰G× Ñ ˜SÓ !€cô × Ñ Ñ!CÀSÓI€#ð � ‰ �C˜Ó€#ð ˆs‰�S‰Ðrcó2—|sy|djd«r>|djdd«\}}|dztjj |«z}n"tjj |d«}|dzdj d„|ddD««zS)z6Process a list of arguments using QuoteCmdExeArgument.Úrzcall Ú r c3ó2K—|]}t|«–—Œy­w©N)r)Ú.0rs rÚ z$EncodeRspFileList..Psèø€Ð!KÁ(¸3¤/°#×"6Á(ùó‚N)Ú startswithÚsplitrrrÚjoin)ÚargsÚcallÚprograms rÚEncodeRspFileListr-CsŒ€ñ �bØ ˆ!�W×Ñ˜Ô Ø˜‘G—M‘M # qÓ)�M€Dˆ'Ø�S‰jœ2Ÿ7™7×+Ñ+¨GÓ4Ñ4�Gä�g‰g×јt A™wÓ'€GØ �3‰˜Ÿ™Ñ!KÀ$ÀqÀrÁ(Ó!KÓKÑ KÐKrcóV—|s|S|s|St|j|d«||dd«S)zŽGiven a list of dictionary keys |path| and a tree of dicts |root|, find value at path, or return |default| if any of the path doesn't exist.rr N)Ú_GenericRetrieveÚget)ÚrootÚdefaultrs rr/r/Ss6€ñ Ø €NÙ Ø €KÜ ˜$Ÿ(™( 4¨¡7Ó+¨W°d¸1¸2°hÓ ?Ð?rcó˜—|€|St|tj«r#t|t«s|D�cgc]}||z‘Œ c}S||zScc}w)zDAdd |prefix| to |element| or each subelement if element is iterable.)Ú isinstancerÚIterableÚ basestring)ÚelementÚprefixÚes rÚ _AddPrefixr:]sO€à €_Ø €NÜ�œ/×2Ñ2Ô3Ü �WœjÔ )Ù 'Ó (¡˜1ˆF�Q‹J Ñ (Ð(à �GÑ Ðùò )s³ Ac óî—|�m|�kt|«s |j}t|tj«r2t|t «s"t d|D�cgc] }||«‘Œ c}«}|S||«}|Scc}w)z�If |element| then remap it through |map|. If |element| is iterable then each item will be remapped. Any elements not found will be removed.N)Úcallabler0r4rr5r6Úfilter)r7ÚmapÚelems rÚ _DoRemappingr@hss€ð €_˜Ð,Ü �CŒ=Ø �G‰G€cÜ�7œO×4Ñ4Ô5Ü �w¤ Ô +Ü�t±GÓ<±G¨D™c $�i°GÑ<Ó=€gð €.ñ�G“ €gØ €.ùò=sÁA2 cóª—|�P|�Nt|tj«r"t|t«s|j |«y|j |«y|S)z›If |append| is None, simply return |element|. If |append| is not None, then add |element| to it, adding each item in |element| if it's a list or tuple.N)r4rr5r6ÚextendÚappend)rCr7s rÚ_AppendOrReturnrDvsF€ð ИGÐ/Ü�7œO×4Ñ4Ô5Ü �w¤ Ô +Ø ‡m�m�GÕà ‡m�m�GÕà €Nrcó”—ttd«rtjStjj d«}|s{gd¢}t j|t jt jd¬«}|j«dj«D]}d|vsŒ|jd«d d z}Œ |t_|S) zÔTry to find an installation location for the DirectX SDK. Check for the standard environment variable, and if that doesn't exist, try to find via the registry. May return None if not found in either location.Ú dxsdk_dirÚ DXSDK_DIR)zreg.exeÚqueryzHKLM\Software\Microsoft\DirectXz/sT)ÚstdoutÚstderrÚuniversal_newlinesrÚ InstallPathz éÚ\) ÚhasattrÚ_FindDirectXInstallationrFrÚenvironr0Ú subprocessÚPopenÚPIPEÚ communicateÚ splitlinesr()rFÚcmdÚpÚlines rrPrP„s¥€ô  Ô % {Ô3Ü #× -Ñ -Ð-ä�j‰j�n‰n˜[Ó)€)Ù â H€CÜ×ј¤Z§_¡_¼Z¿_¹_Ø,0ô 2€Aà— ‘ “ Ñ"×-Ñ-Ö/ˆØ ˜$Ò Ø—J‘J˜vÓ& qÑ)¨DÑ0‰ ð0ð (1ÔÔ$Ø Ðrcó$—i}|j«rG|j«|d<tjj|j«d«dz|d<t «}|r|nd|d<tj j dd«|d<|S) z�Get a dict of variables mapping internal VS macro names to their gyp equivalents. Returns all variables that are independent of the target.z$(VSInstallDir)ÚVCrNz$(VCInstallDir)r z $(DXSDK_DIR)ÚWDK_DIRz $(WDK_DIR))ÚPathrrr)rPrQr0)Ú vs_versionÚenvrFs rÚGetGlobalVSMacroEnvr`›s…€ð €#ð‡_�_ÔØ'Ÿ_™_Ó.€CÐÑÜŸW™WŸ\™\¨*¯/©/Ó*;¸TÓBÀTÑI€CÐÑô 'Ó(€)Ù%.™ °B€#€nÑô—j‘j—n‘n Y°Ó3€#€lÑØ €*rc óÊ—t|djdg««}|ddD]"}|jdg«}|t|«z}Œ$|sytt|««}t|D�cgc]}t ||«‘Œc}«}t |D�cgc]}d|v‘Œc}«ry|D]0}|jdg«}|sŒ|D� cgc] } | |vsŒ| ‘Œ } } | |d<Œ2|Scc}wcc}wcc} w)zŠFinds msvs_system_include_dirs that are common to all targets, removes them from all targets, and returns an OrderedSet containing them.rÚmsvs_system_include_dirsr NÚ$)rr0r`Ú GetVSVersionÚ ExpandMacrosÚany) ÚconfigsÚgenerator_flagsÚall_system_includesÚconfigÚsystem_includesr_ÚincludeÚexpanded_system_includesÚincludesÚiÚ new_includess rÚExtractSharedMSVSSystemIncludesrq¯s€ô#Ø ˆa�j‡n�nÐ/°Ó4ó6Ðà˜˜“ €fØ—j‘jÐ!;¸RÓ@€OØ-´ ¸?Ó0KÑKÑðñ Ø äœL¨Ó9Ó:€#Ü'Ù8Kó)MÙ8K¨Wô*6°g¸sÕ)CØ8Kñ)MóNÐäÑ(@Ó AÑ(@˜Wˆ#�Š.Ð(@Ñ AÔBà ó€fØ�z‰zÐ4°bÓ9€HÚá!)ÓJ¡˜A¨QÐ6IÒ-I’a €lÐJØ+7€fÐ 'Ò(ð ð "Ð!ùò)Mùâ AùòKsÁ)C CÂ= C ÃC có.—eZdZdZd„Zd„Zd/d„Zd/d„Zd„Zd„Z Gd „d e «Z d „Z d „Z d0d „Z d0d„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d „Z!d!„Z"d"„Z#d#„Z$d$„Z%d%„Z&d&„Z'd'„Z(d(„Z)d)„Z*d*„Z+d+„Z,d,„Z-d-„Z.d.„Z/y)1Ú MsvsSettingszÇA class that understands the gyp 'msvs_...' values (especially the msvs_settings field). They largely correpond to the VS2008 IDE DOM. This class helps map those settings to command line options.c ó*—||_t|«|_dtfdtfdtfdtfdt fdt fdt fdt fg}|d }|D]N\}}t ||i«|j«D])\}}|j||««t||«|<Œ+ŒP|jd d g«|_ d d g} g} | D]+}|j«D]}||vsŒ| |›d|d›d�gz } ŒŒ-| rtdj| ««‚y)NÚmsvs_configuration_attributesÚ msvs_settingsrbÚmsvs_disabled_warningsÚmsvs_precompiled_headerÚmsvs_precompiled_sourceÚmsvs_configuration_platformÚmsvs_target_platformÚconfigurationsÚmsvs_cygwin_dirsÚ.Ú msvs_prebuildÚmsvs_postbuildz not supported (target Ú target_namez).Ú )Úspecrdr^ÚdictÚlistÚstrÚsetattrÚitemsr0Úgetattrr}ÚvaluesÚ Exceptionr)) ÚselfrƒrhÚsupported_fieldsrgÚfieldr2Ú confignamerjÚunsupported_fieldsÚ unsupporteds rÚ__init__zMsvsSettings.__init__ÐsF€Ø€D„IÜ" ?Ó3€D„Oð )¬$Ð/Ø œ$ÐØ #¤TÐ*Ø !¤4Ð(Ø "¤CÐ(Ø "¤CÐ(Ø &¬Ð,Ø ¤Ð%ð  ÐðÐ#Ñ$€GÛ*‰ˆˆwÜ ˆd�E˜2ÔØ '§ ¡ ¦Ñ ˆ*�fØ+1¯:©:°e¹W»YÓ+GŒ��eÓ˜ZÒ(ñ!0ð+ð !ŸH™HÐ%7¸#¸Ó?€DÔð ØðÐð€KÛ#ˆØ—N‘NÖ$ˆ&Ø �FŠ?Ø Ú  $ }Ó"5ð7ð8ñ 8‰+ñ%ð$ñ Ü �d—i‘i  Ó,Ó -Ð-ðrcó°—|jjdd«}|r|Stjjj|jdd«S)z¦Returns the extension for the target, with no leading dot. Uses 'product_extension' if specified, otherwise uses MSVS defaults based on the target type. Úproduct_extensionNÚtyper )rƒr0ÚgypÚMSVSUtilÚTARGET_TYPE_EXT)rŒÚexts rÚ GetExtensionzMsvsSettings.GetExtensionósG€ð �)‰)�-‰-Ð+¨TÓ 2€CÙ Ø €jÜ �<‰<× 'Ñ '× +Ñ +¨D¯I©I°fÑ,=¸rÓ BÐBrNcóÀ—|j|«dk(rdnd}|jjdd«|jjd|jd«z}|r|dznd}d |j«z}||z}d d d ||d|jd||||tj j ||«d œ }|jt|j««|S)zUGet a dict of variables mapping internal VS macro names to their gyp equivalents.Úx86ÚWin32Úx64Úproduct_prefixr Ú product_namer�rNr~z${root}z ${source}z$!INTERMEDIATE_DIR) z $(InputName)z $(InputPath)z $(IntDir)z $(OutDir)\z$(PlatformName)z$(ProjectDir)\z$(ProjectName)z $(TargetDir)\z $(TargetExt)z$(TargetFileName)z $(TargetName)z $(TargetPath)) ÚGetArchrƒr0ršrrr)Úupdater`r^) rŒÚ base_to_buildrjÚtarget_platformr�Ú target_dirÚ target_extÚtarget_file_nameÚ replacementss rÚ GetVSMacroEnvzMsvsSettings.GetVSMacroEnvþsã€ð"&§¡¨fÓ!5¸Ò!>‘gÀE€OØ—)‘)—-‘-Ð 0°"Ó5Ø � ‰ � ‰ �n d§i¡i° Ñ&>Ó?ñ@€Ká)6� Ò%¸B€JØ�t×(Ñ(Ó*Ñ*€JØ" ZÑ/Ðð"Ø#Ø)Ø!Ø*ØØŸ)™) MÑ2Ø$Ø"Ø-Ø$ÜŸ™Ÿ™ jÐ2BÓCñ €Lð×ÑÔ+¨D¯O©OÓ<Ô=Ø Ðrcó@—|j||¬«}t||«S)z4Convert from VS macro names to something equivalent.©rj)r©re)rŒÚsr£rjr_s rÚConvertVSMacroszMsvsSettings.ConvertVSMacross$€à × Ñ ˜]°6Ð Ó :€CÜ ˜˜3Ó ÐrcóÈ—|D�cgc]}|jd«r|ddn|‘Œ}}|D�cgc](}|j«jd«s|dzn|‘Œ*c}Scc}wcc}w)z2Strip -l from library if it's specified with that.z-lr Nz.lib)r'ÚlowerÚendswith)rŒÚ librariesÚlibÚlibss rÚAdjustLibrarieszMsvsSettings.AdjustLibrariesss€á@IÓ JÁ ¸�s—~‘~ dÔ+ˆC��‰G°Ñ 4À €DÐ Jáó Ù�ð!$§ ¡ £ × 4Ñ 4°VÔ <ˆC�&ŠLÀ#Ñ EØñ ðùò Kùò s …Aª-Acód—t|||«}t||«}t||«}t||«S)aRetrieve a value from |field| at |path| or return |default|. If |append| is specified, and the item is found, it will be appended to that object instead of returned. If |map| is specified, results will be remapped through |map| before being returned or appended.)r/r@r:rD)rŒrŽrr2r8rCr>Úresults rÚ _GetAndMungezMsvsSettings._GetAndMunge$s7€ô ˜e W¨dÓ 3€FÜ ˜& #Ó &€FÜ ˜ Ó '€FÜ ˜6 6Ó *Ð*rcó—eZdZdd„Zdd„Zy)úMsvsSettings._GetWrapperNcó>—||_||_|g|_||_yr#)ÚparentrŽÚ base_pathrC)rŒr»rŽr¼rCs rr’z!MsvsSettings._GetWrapper.__init__/s €Ø€d„kØ€d„jØ!�{€d„nØ€d…krcóˆ—|jj|j|j|gz|||j|¬«S)N)r2r8rCr>)r»r·rŽr¼rC)rŒÚnamer>r8r2s rÚ__call__z!MsvsSettings._GetWrapper.__call__4s@€Ø �[‰[× %Ñ % d§j¡j°$·.±.ÀDÀ6Ñ2IØ &°·±À#ð&óGðGrr#)Nr N)Ú__name__Ú __module__Ú __qualname__r’r¿©rrÚ _GetWrapperr¹.s „óô GrrÄcó¤—|jj|d«}|jj|d«}|s|}dddœj|d«S)zrGet architecture based on msvs_configuration_platform and msvs_target_platform. Returns either 'x86' or 'x64'.r rœrž)r�rž)rzr0r{)rŒrjÚconfiguration_platformÚplatforms rr¡zMsvsSettings.GetArch8sU€ð"×=Ñ=×AÑAÀ&È"ÓMÐØ×(Ñ(×,Ñ,¨V°RÓ8€HÙ Ø'€hà 5Ñ )× -Ñ -¨h¸Ó >Ð>rcóü—t|jj«dk\r|S|j|«}|dk(r|j d«s|dz }|dk(r&|j d«r|j dd«d}|S)z*Returns the target-specific configuration.ißržÚ_x64rœÚ_r r)Úintr^Ú short_namer¡r°Úrsplit)rŒrjÚarchs rÚ _TargetConfigzMsvsSettings._TargetConfigBsx€ô  ˆ4�?‰?× %Ñ %Ó&¨$Ò.Ø €mð �<‰<˜Ó €DØ ˆu‚}˜VŸ_™_¨VÔ4Ø �Ñ€fØ ˆu‚}˜Ÿ™¨Ô0Ø�}‰}˜S !Ó$ QÑ'€fØ €MrcóH—|j|j||||||«S)z_GetAndMunge for msvs_settings.)r·rv©rŒrrjr2r8rCr>s rÚ_SettingzMsvsSettings._SettingTs1€ð × Ñ Ø ×ј6Ñ" D¨'°6¸6À3ó HðHrcóH—|j|j||||||«S)z/_GetAndMunge for msvs_configuration_attributes.)r·rurÑs rÚ _ConfigAttribzMsvsSettings._ConfigAttribZs0€ð × Ñ Ø ×*Ñ*¨6Ñ2Ø ˆg�v˜v só ,ð,rcóÚ—|j|«}||j|z}|j|jd|g¬««|D�cgc]}|j ||¬«‘Œc}Scc}w)zyUpdates include_dirs to expand VS specific paths, and adds the system include dirs used for platform SDK and similar.)ÚVCCLCompilerToolÚAdditionalIncludeDirectories©r2r«©rÏrbrBrÒr­)rŒÚ include_dirsrjrnrXs rÚAdjustIncludeDirszMsvsSettings.AdjustIncludeDirsasv€ð× Ñ  Ó '€Fؘd×;Ñ;¸FÑCÑC€HØ ‡O�O�D—M‘MØ:¸FÈBð"óPôQáÐ*¨FÓ3°sÒ:Ø ‡n�nÐ,Ô-Ø ×ј>Ð*¨FÓ3°sÒ:Ø ‡n�n�WÔØ ‡N�N�4—=‘=Ø7¸Èð!óMôNà €Nrcó~—|j|«}|jd|«}|r||j|««}|S)zvGet the pdb file name that should be used for compiler invocations, or None if there's no explicit name specified.)rÖÚProgramDataBaseFileName©rÏrÒr­)rŒrjÚexpand_specialÚpdbnames rÚGetCompilerPdbNamezMsvsSettings.GetCompilerPdbName€sE€ð× Ñ  Ó '€FØ�m‰mØ7¸óA€GáÙ˜t×3Ñ3°GÓ<Ó=€gØ €Nrcó‚—|j|«}|jd|«}|r||j||¬««}|S)z]Gets the explicitly overriden map file name for a target or returns None if it's not set.)Ú VCLinkerToolÚ MapFileNamer«rí)rŒrjrîÚmap_files rÚGetMapFileNamezMsvsSettings.GetMapFileNameŠsG€ð× Ñ  Ó '€FØ�}‰}Ð<¸fÓE€HÙÙ × 4Ñ 4°XÀfÐ 4Ó MÓN€hØ €Orcó¶—|j|«}|jd}|dk(rdnd}|j|df|«}|r||j||¬««}|S)zcGets the explicitly overridden output name for a target or returns None if it's not overridden.r•Ústatic_libraryÚVCLibrarianToolròÚ OutputFiler«)rÏrƒrÒr­)rŒrjrîr•r1Ú output_files rÚ GetOutputNamezMsvsSettings.GetOutputName“sq€ð× Ñ  Ó '€FØ �9‰9�VÑ €DØ $Ð(8Ò 8Ñ ¸n€Dà—-‘-  |Ð 4°fÓ=€KÙÙ" 4×#7Ñ#7Ø ˜fð$8ó$&ó'€kà Ðrcó²—|j|«}|jd|«}|jd|«}|dk(r|r||j||¬««S|Sy)zƒGets the explicitly overridden pdb name for a target or returns default if it's not overridden, or if no pdb will be generated.)ròÚProgramDatabaseFile)ròÚGenerateDebugInformationÚtruer«Nrí)rŒrjrîr2rúÚgenerate_debug_infos rÚ GetPDBNamezMsvsSettings.GetPDBName sg€ð× Ñ  Ó '€FØ—-‘-Ð GÈÓP€KØŸ-™-Ø4°fó>Ðà˜fÒ$Ù Ù˜d×2Ñ2°;ÀvÐ2ÓNÓOÐOàˆà rcóR—|j|«}|jd|«}|dk(S)z\If NoImportLibrary: true, ninja will not expect the output to include an import library.)ÚNoImportLibraryrÿ©rÏrÒ)rŒrjÚnoimplibs rÚGetNoImportLibraryzMsvsSettings.GetNoImportLibrary¯s0€ð× Ñ  Ó '€FØ�}‰}Ð1°6Ó:€HØ �vÑ Ðrcó|—|j|«}g}|jd|«}|dk(r|jd«|S)z:Returns the flags that need to be added to ml invocations.)ÚMASMÚUseSafeExceptionHandlersrÿz/safeseh)rÏrÒrC)rŒrjÚasmflagsÚsafesehs rÚ GetAsmflagszMsvsSettings.GetAsmflags¶sA€à × Ñ  Ó '€FØ€HØ�m‰mÐ@À&ÓI€GØ�&ÒØ‡o�o�jÔ!Ø €Orc óÈ—|j|«}g}|j|j|D�cgc]}d|z‘Œ c}«|j||j|d|¬«}|dddddd œd d¬ «|d d ¬«|dd¬«|dddi¬«|dddi¬«|ddddœd¬«|ddddœd¬«|ddd d!œd ¬«|d"d#d$d%d&œd'd(¬ «|d)dd*dœ¬«|d+dd,i¬«|d-d.¬«|d/dd0i¬«|d1dd2d3d4d œd5¬«|d6d7d8d9d:œd;¬«|dd?œ¬«|d@dAdBd?œ¬«|dCddDi¬«|dEdFdGd?œ¬«|dHd dIddJœdK¬«|dLdMdNdOdPd œdQ¬«|dRdSdTd!œdU¬«|dVddWi¬«|dXdddœdY¬«|dZdd[i¬«|d\d¬«|d]d^d_d`dadbdcœdd¬«|j|j de|g¬f«D�cgc]}dg|z‘Œ c}«t |jj«dhk\r|jdi«|D�cgc]}|jdj«rŒ|‘Œ}}|Scc}wcc}wcc}w)kzCReturns the flags that need to be added to .c and .cc compilations.z/wdrÖ©rCÚ OptimizationÚdrãræÚx)Ú0rãræÚ3z/O©r>r8r2ÚInlineFunctionExpansionz/Ob©r8ÚDisableSpecificWarningsÚ StringPoolingrÿz/GF©r>ÚEnableFiberSafeOptimizationsz/GTÚOmitFramePointersÚ-r ©Úfalserÿz/Oy©r>r8ÚEnableIntrinsicFunctionsz/OiÚFavorSizeOrSpeedÚtr¬©rãræÚFloatingPointModelÚpreciseÚstrictÚfast©rrãræz/fp:rÚCompileAsManagedz/clrÚWholeProgramOptimizationz/GLÚ WarningLevelz/WÚ WarnAsErrorú/WXÚCallingConventionÚrÚzÚvz/GÚDebugInformationFormatÚ7roÚI)rãrÚ4z/ZÚRuntimeTypeInfoz/GRz/GR-©rÿrÚEnableFunctionLevelLinkingz/Gyz/Gy-ÚMinimalRebuildz/GmÚBufferSecurityCheckz/GSz/GS-ÚBasicRuntimeChecksÚu)rãrærz/RTCÚRuntimeLibraryÚTÚTdÚDÚDdz/MÚExceptionHandlingÚscÚaz/EHÚDefaultCharIsUnsignedz/JÚTreatWChar_tAsBuiltInTypez /Zc:wchar_tÚ EnablePREfastz/analyzeÚAdditionalOptionsÚEnableEnhancedInstructionSetÚSSEÚSSE2ÚAVXÚIA32ÚAVX2)rãrærr5Ú5z/arch:)rÖÚForcedIncludeFilesrØú/FI)é rz/FSz/MP) rÏrBrwrÄrvrÒrr^Úproject_versionrCr')rŒrjÚcflagsÚwÚclÚfrs rÚ GetCflagszMsvsSettings.GetCflags¿sñ€à × Ñ  Ó '€FØ €FØ ‡M�M d×&AÑ&AÀ&Ò&IÓJÑ&I �5˜1“9Ð&IÑJÔKØ × Ñ ˜$ × 2Ñ 2°6Ñ :Ø,°Vð ó =€Bá€~ؘ3 S¨sÑ 3¸DÈ#õOáÐ ¨Õ/ÙÐ ¨Õ/Ù€˜V U˜OÕ,ÙÐ%¨F°E¨?Õ;ÙШ#°rÑ :À5ÕIÙÐ!°¸bÑ'AÈ%ÕPÙРS¨sÑ3¸DÕAÙÐØ (°Ñ 8ÀØõñШ°VÑ<Õ=ÙÐ!¨° Õ7Ù€~˜dÕ#Ù€}˜6 5˜/Õ*ÙÐØ˜C c°Ñ 4¸TõCáÐØ˜C cÑ *°4õ9áРu°vÑ>Õ?ÙÐ#°%À&Ñ)IÕJÙИf e˜_Õ-ÙШ5¸6Ñ"BÕCÙРs°¸3Ñ!?ÈÕOÙÐØ˜D s°Ñ 6¸tõEáРd°Ñ 4¸UÕCÙРV¨T NÕ3ÙÐ"Ø 2Ñ &¨}õ>ဘV ZÐ0Õ1ÙР2Õ&ÙÐ%ؘf¨5°vÀFÑ KØõð ‡M�M d§m¡mØ2°FÀBð'4ô'HóIñ'H �5˜1“9ð'HñIôJ䘟™×7Ñ7Ó8¸GÒCð ‡m�m�EÔáÓ ;™�A q§|¡|°EÕ':Ša˜€FÐ ;Ø €MùòaKùòNIùò€Cà ‡O�O�D×9Ñ9ؘ6Ð#4ó6ô7áÐ  v¨wÐ&7Õ8Ùˆ 5°¸EÑBØõáÐÔØ €Orcó—|j}|ddvrp|jdg«D�cgc]#}|j«jd«r|‘Œ%}}t |«dk(r ||d«St |«dkDr t d«‚ycc}w) zDReturns the .def file from sources, if any. Otherwise returns None.r•)Úshared_libraryÚloadable_moduleÚ executableÚsourcesz.defr rzMultiple .def filesN)rƒr0r¯r°Úlenr‹)rŒrkrƒr¬Ú def_filess rÚ GetDefFilezMsvsSettings.GetDefFile's�€à �9‰9€DØ ˆF�|ÐJÑJØ"Ÿh™h y°"Ô5ó2Ñ5˜Ø—g‘g“i×(Ñ(¨Ô0òÐ5€ið2ä ˆY‹˜1Ò Ù  ¨1¡Ó.Ð.Ü ˆy‹>˜AÒ ÜÐ-Ó.Ð.Ø ùò 2s¨(BcóT—|j|«}|r|jd|z«yy)z‚.def files get implicitly converted to a ModuleDefinitionFile for the linker in the VS generator. Emulate that behaviour here.z /DEF:"%s"N)r�rC)rŒÚldflagsrkÚdef_files rÚ_GetDefFileAsLdflagsz!MsvsSettings._GetDefFileAsLdflags3s,€ð�‰Ð0Ó1€HÙØ ‡n�n�[ 8Ñ+Õ,ðrcó‚—|j|«}|jd|«}|r||j||¬««}|S)z`Gets the explicitly overridden pgd name for a target or returns None if it's not overridden.)ròÚProfileGuidedDatabaser«rí)rŒrjrîrús rÚ GetPGDNamezMsvsSettings.GetPGDName:sQ€ð× Ñ  Ó '€FØ—-‘-Ø1°6ó;€KáÙ" 4×#7Ñ#7Ø ˜fð$8ó$&ó'€kà Ðrcó�—|j|«}g}|j||j|d|¬«} |j||«| dddi¬«| ddd d d œd ¬ «|j |j d||««| dd¬«| dddddœ¬«|j ||«} | r|jd| z«|j|||dz«} | r|jd| z«|j||«} | r|jd| z«|j||«} | dd| rd| zndi¬«| dddi¬«| d d¬«|jd!|d¬"«}|rd#|z}| d$d%|zd&|zd'œd(¬ «|jd)|d¬"«}|r1|jd*|d¬"«}|rd#|z}|jd+|›|›�«| d,ddd'œd-¬ «| d.ddd'œd/¬ «| d0d1¬«| d2ddd'œd3¬ «| d4ddd'œd5¬ «| d6ddd'œd7¬ «| d8d9d:d'œd;¬ «| dd?d@d'œd;¬ «| dAddBdCdDdEœdF¬ «| dGdH¬«| dIddJi¬«| dKdL¬«| dMddNi¬«| dOddd'œdP¬ «| dQd¬«|j|«dRk(rd}ndS}| dTdddUœdV|¬W«tdX„|D««s|jd5«tdY„|D««s|jd7«tdZ„|D««}|j||||xr| |«\}}}|j |«|||fS)[zUReturns the flags that need to be added to link commands, and the manifest files.ròrrþrÿz/DEBUGrrqrrrsrtrurwrÚ DelayLoadDLLsz /DELAYLOAD:rÚTreatLinkerWarningAsErrorsr-r z:NOr7©r8r>z/OUT:z.pdbz/PDB:z/PGD:ÚGenerateMapFilez/MAP:z/MAPÚ MapExportsz/MAPINFO:EXPORTSrH)ròÚMinimumRequiredVersionrØÚ,Ú SubSystemz CONSOLE%sz WINDOWS%sr#z /SUBSYSTEM:)ròÚStackReserveSize)ròÚStackCommitSizez/STACK:ÚTerminalServerAwarez/TSAWAREÚLinkIncrementalz /INCREMENTALÚ BaseAddressz/BASE:ÚFixedBaseAddressú/FIXEDÚRandomizedBaseAddressz /DYNAMICBASEÚDataExecutionPreventionz /NXCOMPATÚOptimizeReferencesÚNOREFÚREFz/OPT:ÚForceSymbolReferencesz /INCLUDE:ÚEnableCOMDATFoldingÚNOICFÚICFroz :PGINSTRUMENTz :PGOPTIMIZEz :PGUPDATE)rãrærr5rpÚIgnoreDefaultLibraryNamesz/NODEFAULTLIB:ÚResourceOnlyDLLz/NOENTRYÚEntryPointSymbolz/ENTRY:ÚProfilez/PROFILEÚLargeAddressAwarez/LARGEADDRESSAWAREÚAdditionalDependenciesrœNÚImageHasSafeExceptionHandlersrz/SAFESEHrc3ó2K—|]}d|vxs|dk(–—Œy­w)Ú DYNAMICBASEr˜Nrér$Úflags rr%z*MsvsSettings.GetLdflags..™s#èø€ÐMÁW¸Tˆ} Ð$Ò8¨°Ñ(8Ó8ÁWùr&c3ó$K—|]}d|v–—Œ y­w)ÚNXCOMPATNrÃr«s rr%z*MsvsSettings.GetLdflags.. sèø€Ð6©g dˆz˜TÔ!©gùs‚c3ó>K—|]}|jd«–—Œy­w)z/DEF:N)r'r«s rr%z*MsvsSettings.GetLdflags..£sèø€ÐE¹W°T˜Ÿ™¨×0¹Wùs‚)rÏrÄrvr…rBrmrûrCrrˆrõrÒr¡rfÚ_GetLdManifestFlags)rŒrjrkrîÚmanifest_base_nameÚ output_nameÚ is_executableÚ build_dirrƒÚldÚoutÚpdbÚpgdrôÚminimum_required_versionÚstack_reserve_sizeÚstack_commit_sizeÚsafeseh_defaultÚ have_def_fileÚmanifest_flagsÚintermediate_manifestÚmanifest_filess rÚ GetLdflagszMsvsSettings.GetLdflagsEsý€ð× Ñ  Ó '€FØ€GØ × Ñ ˜$ × 2Ñ 2°6Ñ :Ø(°ð ó :€Bà×јgÐ'8Ô9ÙÐ!¨°Ð'9Õ:Ù€ %¨u¸5ÑAØõà ‡N�N�4×8Ñ8ؘР1ó3ô4ဘ}Õ-ÙÐ#¨EØ Ñ 'õ)à × Ñ ˜V ^Ó 4€CÙ Ø ‡n�n�W˜s‘]Ô#Ø �/‰/˜& .°+ÀÑ2FÓ G€CÙ Ø ‡n�n�W˜s‘]Ô#Ø �/‰/˜& .Ó 1€CÙ Ø ‡n�n�W˜s‘]Ô#Ø×"Ñ" 6¨>Ó:€HÙИv¹X w°Ò'9Ø ðõá€|˜&Ð"4Ð5Õ6ÙР2Õ&à#Ÿ}™}Ø2°FÀBð -ó HÐáØ!$Ð'?Ñ!?ÐÙ€{ØÐ7Ñ7ØÐ7Ñ7ñ 9àõð Ÿ™Ø,¨f¸bð'óBÐáØŸ-™-Ø -¨v¸rð(óCÐá ØÐ"3Ñ3ÐØ ‡n‚nÑ&8Ñ:KÐLÔMáШ°BÑ"7À ÕKÙРE°Ñ3¸NÕKÙ€}˜XÕ&ÙРU°Ñ4¸XÕFÙÐØ˜bÑ !¨.õ:áРؘbÑ !¨+õ7áРw°UÑ!;ÀGÕLÙР{Õ3ÙШ°eÑ"<ÀWÕMÙÐØ˜?°Øñ àõñÐ"Ð+;Õ<ÙИv zÐ2Õ3ÙР)Õ,Ù€y�v˜zÐ*Õ+ÙÐØ˜bÑ !Ð*>õ@ñШÕ+à ‡|�|�FÓ˜uÒ$Ø�oà€oÙÐ&Ø RÑ (°Øõ!ô ÑMÁWÓMÔ MØ ‡n�n�^Ô$ô Ñ6©gÓ6Ô 6Ø ‡n�n�[Ô!äÑE¹WÓEÓE€Mà × Ñ  Ð);Ð=NØ!.Ò!D°}Ð3DÀió Qñ:€NÐ)¨>ð ‡N�N�>Ô"Ø Ð)¨>Ð 9Ð9rcó—|jd|d¬«}|dk7rdgggfS|dz}dd|zg}|jd«|j|«}|jd |d¬«} g} d } | dk(r;|jd |d ¬«} d dddœ} |jd|d¬«}d| | ›d|›d�}nd}| |z}|dz}tjj ||«}t jj|«t jj|«}|j|«|j«|g} |r|jd«| |j||«z } ||| fS)ajReturns a 3-tuple: - the set of flags that need to be added to the link to generate a default manifest - the intermediate manifest that the linker will generate that should be used to assert it doesn't add anything to the merged one. - the list of all the manifest files to be merged by the manifest tool and included into the link.)ròÚGenerateManifestrÿrØz /MANIFEST:NOz.intermediate.manifestz /MANIFESTz/ManifestFile:z/MANIFESTUAC:NO)ròÚ EnableUACz�%s)ròÚUACExecutionLevelrÚ asInvokerÚhighestAvailableÚrequireAdministratorr()ròÚ UACUIAccessrzƒ r z.generated.manifestz/ALLOWISOLATION) rÒrCrÏrrr)r–ÚcommonÚEnsureDirExistsÚ WriteOnDiffÚwriteÚcloseÚ_GetAdditionalManifestFiles)rŒrjr¾rkÚallow_isolationr´Úgenerate_manifestr²ÚflagsÚ enable_uacrÀÚgenerated_manifest_outerÚexecution_levelÚexecution_level_mapÚ ui_accessÚinnerÚgenerated_manifest_contentsÚgenerated_nameÚbuild_dir_generated_namerWs rr°z MsvsSettings._GetLdManifestFlagsªsÁ€ðŸ ™ Ð&JØ&,Ø.4ð&ó6Ðð˜FÒ"ðÐ ˜r 2Ð %Ð%àÐ1Ñ1€KàØ˜Ñ$ð €Eð ‡L�LÐ"Ô#à × Ñ  Ó '€FØ—‘Ð<¸fØ'-ðó/€Jà€Nððð�VÒØŸ ™ Ð&KØ&,°cð&ó;€oðØ Ø #ñÐð —-‘-Ð ?ÀØ(/ð ó1�ið' Ó7ºðD�eð€eà":¸UÑ"BÐØÐ1Ñ1€Nô "Ÿw™wŸ|™|¨I°~ÓFÐ܇J�J×ÑÐ7Ô8Ü � ‰ ×ÑÐ7Ó8€A؇G�GÐ 'Ô(؇G�G„IØ$Ð%€NáØ ‡l�lÐ$Ô%à�d×6Ñ6°vØ7HóJñJ€Nà �+˜~Ð -Ð-rc óþ—|jd|g¬«}t|t«r|jd«}|D�cgc]8}tj j ||j||¬«««‘Œ:c}Scc}w)z]Gets additional manifest files that are added to the default one generated by the linker.)ÚVCManifestToolÚAdditionalManifestFilesrØÚ;r«)rÒr4r†r(rrrr­)rŒrjrkÚfilesrWs rrÏz(MsvsSettings._GetAdditionalManifestFiless†€ð �M‰MÐGÈØ"$ð ó &€Eä�%œÔØ�k‰k˜#Ó€eñó á�ô �G‰G× Ñ Ù! $×"6Ñ"6°qÀÐ"6Ó"HÓIõ Kàñ ðùò sº=A:cóR—|j|«}|jd|«}|dk(S)zzReturns whether the target should be linked via Use Library Dependency Inputs (using component .objs of a given .lib).)ròÚUseLibraryDependencyInputsrÿr)rŒrjÚuldis rÚIsUseLibraryDependencyInputsz)MsvsSettings.IsUseLibraryDependencyInputs s/€ð× Ñ  Ó '€FØ �=‰=ÐGÈÓ P€DØ �6‰>ÐrcóV—|j|«}|jd|d¬«}|dk(S)z6Returns whether manifest should be linked into binary.)rÝÚ EmbedManifestrÿrØr)rŒrjÚembeds rÚIsEmbedManifestzMsvsSettings.IsEmbedManifests7€à × Ñ  Ó '€FØ �M‰MÐ=¸vØ"(ð ó *€Eà �F‰?ÐrcóR—|j|«}|jd|«}|dk7S)z:Returns whether the target should be linked incrementally.)ròr•rãr)rŒrjÚlink_incs rÚIsLinkIncrementalzMsvsSettings.IsLinkIncrementals-€à × Ñ  Ó '€FØ�}‰}Ð@À&ÓI€HØ �s‰?Ðrcóæ—|j|«}g}|j||j|d|¬«}|d|d¬«|jd|d«z«|dd¬ «|d d d „¬ «|S)zTReturns the flags that need to be added to invocations of the resource compiler.ÚVCResourceCompilerToolrr×z/Irr~rèz/drÚCulturez/lcó0—tt|««ddS)Nr )ÚhexrË©rs rrz)MsvsSettings.GetRcflags..+s€¬S´°Q³«[¸¸©_rrŒ)rÏrÄrvrC)rŒrjÚgyp_to_ninja_pathÚrcflagsÚrcs rÚ GetRcflagszMsvsSettings.GetRcflags s„€ð× Ñ  Ó '€FØ€GØ × Ñ ˜$ × 2Ñ 2°6Ñ :Ø ¨ð ó 2€BáÐ%Ð+<ÀTÕJØ ‡N�N�4Ñ+¨CÓ0Ñ0Ô1ÙÐ ¨Õ.á€y˜Ñ#<Õ=Ø €Nrcóº—tjjtjj||jd««}d|zj dd«}|D�cgc]$}|j dd«j dd«‘Œ&}}|D�cgc]}d|j dd «z‘Œ}}d j|«}d |zd |›d |›d�z}|Scc}wcc}w)aOBuild a command line that runs args via cygwin bash. We assume that all incoming paths are in Windows normpath'd form, so they need to be converted to posix style for the part of the command line that's passed to bash. We also have to do some Visual Studio macro emulation here because various rules use magic VS names for things. Also note that rules that contain ninja variables cannot be fixed here (for example ${source}), so the outer generator needs to make sure that the paths that are written out are in posix style, if the command line will be used here.rzcd %srNrrr z'%s'Ú'z'\''r!z1call "%s\setup_env.bat" && set CYGWIN=nontsec && z bash -c "z ; )rrrr)r}r)rŒr*Ú path_to_baseÚ cygwin_dirÚcdrDÚbash_cmdrWs rÚBuildCygwinBashCommandLinez'MsvsSettings.BuildCygwinBashCommandLine.sÓ€ô—‘×!Ñ!Ü �‰� ‰ �\ 4×#8Ñ#8¸Ñ#;Ó<ó>€Jà �LÑ × )Ñ )¨$°Ó 4€BÙ>BÓ C¹d¸ˆA�I‰I�d˜CÓ × (Ñ (¨¨eÕ 4¸d€DÐ CÙ6:Ó ;±d°ˆF�Q—Y‘Y˜s GÓ,Ó ,°d€DÐ ;Ø�x‰x˜‹~€Hà<¸zÒIÚ!¢8Ð,ñ -ðð €Jùò DùÚ ;s Á$)CÂCc ór—t|jd|jjdd«««dk7S)zkDetermine if an action should be run under cygwin. If the variable is unset, or set to 1 we use cygwin.Úmsvs_cygwin_shellr r)rËr0rƒ)rŒÚrules rÚIsRuleRunUnderCygwinz!MsvsSettings.IsRuleRunUnderCygwinBs=€ô ˆt�x‰xÐ+ØŸ ™ Ÿ ™ Ð&9¸1Ó=ó?ó @ØCDñ EðErcóF—|jdg«D] }|d|k(sŒ yy)zADetermine if there's an explicit rule for a particular extension.Úrulesr\TF)r0)rŒrƒr\rÿs rÚ_HasExplicitRuleForExtensionz)MsvsSettings._HasExplicitRuleForExtensionHs,€à—‘˜ "Ö%ˆØ ˆkÑ ˜iÓ 'Ùð&ð rc ó~—t|jdg«D�cgc]}|jdd«‘Œc}«Scc}w)z:Determine if an action should not run midl for .idl files.ÚactionsÚexplicit_idl_actionr)rfr0)rŒrƒÚactions rÚ_HasExplicitIdlActionsz#MsvsSettings._HasExplicitIdlActionsOsF€ä Ø"Ÿh™h y°"Ô5ó7Ù5�Fð— ‘ Ð0°!Õ4Ø5ñ7ó 8ð8ùò7sš:cóL—|j|d«xs|j|«S)z�Determine if there's an explicit rule or action for idl files. When there isn't we need to generate implicit rules to build MIDL .idl files.Úidl)rr©rŒrƒs rÚHasExplicitIdlRulesOrActionsz)MsvsSettings.HasExplicitIdlRulesOrActionsTs,€ð × -Ñ -¨d°EÓ :ò .Ø × 'Ñ '¨Ó -ð/rcó&—|j|d«S)z„Determine if there's an explicit rule for asm files. When there isn't we need to generate implicit rules to assemble .asm files.Úasm)rr s rÚHasExplicitAsmRulesz MsvsSettings.HasExplicitAsmRulesZs€ð × ,Ñ ,¨T°5Ó 9Ð9rcój‡‡‡—‰j‰«Š‰j‰‰j‰d«Šdˆˆˆfd„ }|dd¬«}|dd¬«}|dd ¬«}|d d ¬«}|d d ¬«}|dd¬«} ||||g} d|fd|fd|fd|fd|fg} ‰j‰«dk(rdnd} ddd| dg} | | | | fS)z�Determine the implicit outputs for an idl file. Returns output directory, outputs, and variables and flags that are required.rÞcó:•—‰j‰||¬«‰¬«S)NrØr«)r­)r¾r2rjÚmidl_getrŒs €€€rÚmidlz*MsvsSettings.GetIdlBuildData..midlds'ø€Ø × !Ñ !¡(¨4¸Ô"AØ)/ð"ó1ð1rÚTypeLibraryNamez ${root}.tlbrØÚHeaderFileNamez ${root}.hÚDLLDataFileNamez dlldata.cÚInterfaceIdentifierFileNamez ${root}_i.cÚ ProxyFileNamez ${root}_p.cÚOutputDirectoryr ÚtlbÚhÚdlldataÚiidÚproxyrœÚwin32ržz/charÚsignedz/envz/Oicfr#)rÏrÄrvr¡)rŒÚsourcerjrrÚheaderrrrÚoutdirÚoutputÚ variablesr¤rÒrs` ` @rÚGetIdlBuildDatazMsvsSettings.GetIdlBuildData_süú€ð× Ñ  Ó '€FØ×Ñ  d×&8Ñ&8¸Ñ&@À,ÓO€H÷1ñ Ð ¨-Ô 8€CÙ Ð"¨KÔ 8€FÙÐ$¨kÔ:€GÙ Ð,°mÔ D€CÙ �¨-Ô 8€EñÐ#¨RÔ 0€FØ�g˜s EÐ *€Fؘ�Ø�v�ؘWÐ%ؘ�ؘ5Ð!ð #€Ið "&§¡¨fÓ!5¸Ò!>‘gÀE€OØ �h ¨¸Ð A€EØ �6˜9 eÐ +Ð+r)NN)Nr NN)0rÀrÁrÂÚ__doc__r’ršr©r­r´r·ÚobjectrÄr¡rÏrÒrÔrÛràrêrðrõrûrrr rXr`rerhrmryr�r…rˆrÁr°rÏrärèrërõrürrrr rr&rÃrrrsrsËsý„ñ=ò!.òF Cóó6 ò ò +ôG�FôGò?òð&9=óHð>Bó,òFòFò òòò ò òòò4òl ò+ò 6ò 6ò ò ò-ò òc:òJU.òn òòòò òò(Eò ò8ò /ò :ó ,rrscó6—d}d}||vxr||vxs ||vxr||vS)N)rb)rgz.cxxz.cpprÃ)r]Úpch_source_extÚc_extsÚcc_extss rr[r[{s<€Ø €&Ø #€'Ø ˜Ð Ò < N°fÐ$<ò @Ø ˜Ð Ò > ^°wÐ%>ðArcó.—eZdZdZd„Zd„Zd„Zd„Zd„Zy)ÚPrecompiledHeaderzšHelper to generate dependencies and build rules to handle generation of precompiled headers. Interface matches the GCH handler in xcode_emulation.py. có—||_||_|jj|j}||«|_tj j |«\}}|||z«j«|_yr#) ÚsettingsrjryÚ pch_sourcerrrZr¯Ú output_obj) rŒr0rjrkÚgyp_to_unique_outputÚobj_extr1ÚfilenamerÊs rr’zPrecompiledHeader.__init__†sf€à€D„MØ€D„KØ—‘×6Ñ6°t·{±{ÑC€JÙ'¨ Ó3€D„OÜ—'‘'×"Ñ" :Ó.�K€HˆaÙ*¨8°gÑ+=Ó>×DÑDÓF€D…OrcóH—|jj|jS)zMGet the header that will appear in an #include line for all source files.)r0rxrj)rŒs rÚ _PchHeaderzPrecompiledHeader._PchHeader�s€ð �=‰=× 0Ñ 0°·±Ñ =Ð=rcó—|�J‚|j«sgStjj|j«d}|D]@}t tjj|«d|«sŒ0dd|j fgcSgS)aGiven a list of sources files and the corresponding object files, returns a list of the pch files that should be depended upon. The additional wrapping in the return value is for interface compatibility with make.py on Mac, and xcode_emulation.py.Nr )r7rrrZr1r[r2)rŒr~ÚobjsrÎÚpch_extr!s rÚGetObjDependenciesz$PrecompiledHeader.GetObjDependencies”s}€ð ˆ<Ј<Ø �?‰?Ô Ø €iÜ�g‰g×јtŸ™Ó/°Ñ2€GÛˆÜ ¤§¡× 0Ñ 0°Ó 8¸Ñ ;¸WÕ EØ�t˜TŸ_™_Ð-Ð.Ò.ðð €Ircó—gS)zŽNot used on Windows as there are no additional build steps required (instead, existing steps are modified in GetFlagsModifications below).rÃ)rŒrÎs rÚGetPchBuildCommandsz%PrecompiledHeader.GetPchBuildCommands¢s €ð €Ircóâ—||jk(r\d|j«zg}|dk(rdt|||z«fg|jgfS|dk(rdt|||z«fg|jgfSg||fS)zgGet the modified cflags and implicit dependencies that should be used for the pch compilation step.z/YcÚcxxÚ cflags_ccÚccÚcflags_c)r1r7r>r2) rŒÚinputr$ÚimplicitÚcommandrBr@rîÚ pch_outputs rÚGetFlagsModificationsz'PrecompiledHeader.GetFlagsModifications§s”€ð �—‘ÒØ˜DŸO™OÓ-Ñ-Ð.€jØ �EÒ Øœs >°9¸zÑ3IÓJÐKÐLØ—‘ ð%ð %à �dŠ?Øœc .°(¸ZÑ2GÓHÐIÐJØ—‘ ð%ð %à ˆv�xÐ ÐrN) rÀrÁrÂr'r’r7r;r=rGrÃrrr.r.‚s!„ñòGò>ò òó  rr.có|—ts1tjj|j dd«d¬«atS)NÚ msvs_versionÚautoF)Úallow_fallback)r^r–Ú MSVSVersionÚSelectVisualStudioVersionr0)rhs rrdrd·s9€å Ü—‘×:Ñ:Ø×јN¨FÓ3Øð;ó€Jô Ðrcó8—t|«}|j«Sr#)rdÚ SetupScript)rhrÎÚvss rÚ_GetVsvarsSetupArgsrQ¿s€Ü�OÓ$€"Ø �‰Ó Ðrcóx—d|vr5|j«D]"\}}d|vsJ|«‚|j||«}Œ$|S)z{Expand $(Variable) per expansions dict. See MsvsSettings.GetVSMacroEnv for the canonical way to retrieve a suitable dict.rcz$()rˆr)ÚstringÚ expansionsÚoldÚnews rrereÃsJ€ð ˆF�]Ø×$Ñ$Ö&‰ˆˆSØ ˜‰_Ð!˜cÓ!ˆ_Ø�~‰~˜c 3Ó'�fð'ð €-rcóê—d}i}|jd«dk(rtd|z«‚|j«D] }|D]™}tj|dz|j ««sŒ+|j dd«\}}|dk(rAtjjtj«tjz|z}|||j«<Œ Œ¢dD]}||vsŒtd|z«‚|S) z{Extracts environment variables required for the toolchain to run from a textual dump output by the cmd.exe 'set' command.) zgoma_.*rlr²ÚlibpathrÚpathextÚ systemrootÚtempÚtmpÚ=rz#Invalid output_of_set. Value is: %sr r)Ú SYSTEMROOTÚTEMPÚTMPz:Environment variable "%s" required to be set to valid path)rr‹rVÚreÚmatchr¯r(rrÚdirnameÚsysr}ÚpathsepÚupper)Ú output_of_setÚenvvars_to_saver_rYÚenvvarÚvarÚsettingÚrequireds rÚ_ExtractImportantEnvironmentrmÌsø€ð €/ð €#ð×јӠÒ"Ü Ð:¸]ÑJÓ KÐKØ×&Ñ&Ö(€dÛ!ˆÜ �‰�&˜3‘, § ¡ £ Õ -Ø—z‘z # qÓ)‰ ˆˆWØ �VÒ ô —G‘G—O‘O¤C§N¡NÓ3´b·j±jÑ@À7ÑJˆ'Ø"ˆˆC�I‰I‹KÑÙ ñ"ð)ó0€hØ�sÒÜ ð9Ø;CñDó EðEð0ð €*rcód—d}d}|j«D]\}}||dz|z|zz }Œ||z }|S)zÀFormat as an 'environment block' directly suitable for CreateProcess. Briefly this is a list of key=value, terminated by an additional . See CreateProcess documentation for more details.r Úr])rˆ)Ú envvar_dictÚblockÚnulÚkeyÚvalues rÚ_FormatAsEnvironmentBlockruñsK€ð €%Ø €#Ø×%Ñ%Ö'�j€cˆ5Ø ˆS�3‰Y˜Ñ  Ñ $Ñ$�Eð(àˆ3�,€%Ø €,rcó¨—|j«j«D]1}|jd«sŒ|td«dj«cSy)z�Gets the path to cl.exe based on the output of calling the environment setup batch file, followed by the equivalent of `where`.zLOC:N)ÚstriprVr'r)Úoutput_of_whererYs rÚ_ExtractCLPathryüsF€ð×#Ñ#Ó%×0Ñ0Ö2€dØ ‡��vÕØ ”#�f“+�,Ð × %Ñ %Ó 'Ò'ñ3rcó¾—d}|jdd«ri}|D]}d||<Œ |St|«}i}|D�]¥}|j|«}|jd«t j |dtj tjd¬«} | j«\} } | jdk7rtd|| jfz«‚t| «} |rA|t| jd d «jd ««z}d j|«| d <t| «} |t j"j|d |z«d «}|j%| «|j'«|j|«}|jd«t j |dtj d¬«} | j«\}} t)|«||<�Œ¨|S)aþIt's not sufficient to have the absolute path to the compiler, linker, etc. on Windows, as those tools rely on .dlls being in the PATH. We also need to support both x86 and x64 compilers within the same build (to support msvs_target_platform hackery). Different architectures require a different compiler binary, and different supporting environment variables (INCLUDE, LIB, LIBPATH). So, we extract the environment here, wrap all invocations of compiler tools (cl, link, lib, rc, midl, etc.) via win_tool.py which sets up the environment, and then we do not prefix the compiler with an absolute path, instead preferring something like "cl.exe" in the rule which will then run whichever the environment setup has put in the path. When the following procedure to generate environment files does not meet your requirement (e.g. for custom toolchains), you can pass "-G ninja_use_custom_environment_files" to the gyp to suppress file generation and use custom environment files prepared by yourself.)rœržÚ"ninja_use_custom_environment_filesrzcl.exe)ú&&ÚsetT)ÚshellrIrJrKz"%s" failed with error %dÚINCLUDEr rßz environment.rU)r|Úforz%iÚinz(cl.exe)Údoz@echoz LOC:%~$PATH:i)r~rIrK)r0rdrOrBrRrSrTÚSTDOUTrUÚ returncoder‹rmrr(r)rurrrÍrÎry)Útoplevel_build_dirrhrkÚopen_outÚarchsÚcl_pathsrÎrPr*Úpopenr%rÊr_Ú env_blockrWr$s rÚGenerateEnvironmentFilesr‹s€ð €%Ø×ÑÐ=¸qÔAØ€Hۈ؀hˆt‚nðà €OÜ�OÓ$€"Ø €(Ü€dà �>‰>˜$Ó €D؇K�K� ÔÜ × Ñ Ø �D¤§¡¼×9JÑ9JØô !€Eð×$Ñ$Ó&�L€IˆqØ ×ј1ÒÜ Ð1°T¸5×;KÑ;KÐ4LÑLÓ MÐMÜ & yÓ 1€CñØ'¬*Ø.1¯g©g°iÀÓ.D×.JÑ.JÈ3Ó.Oó+QñQ€oà—x‘x Ó0€cˆ)�nä)¨#Ó.€IÙ”—‘—‘Ð0°.À4Ñ2GÓHÈ#ÓN€A؇G�GˆIÔØ‡G�G„Ið �>‰>˜$Ó €D؇K�KðEôFä × Ñ ˜T¨´j·o±oØ04ô 6€Eà×!Ñ!Ó#�I€FˆAÜ# FÓ+€HˆTƒNð=ð> €/rc óΗt|jdd««r»td„|«}|D�cgc](}tjj |||««‘Œ*}}|D�cgc]$}tjj |«rŒ#|‘Œ&}}|rI|D�cgc]!}tjj|«‘Œ#} }tddj | «z«‚yycc}wcc}wcc}w)aeEmulate behavior of msvs_error_on_missing_sources present in the msvs generator: Check that all regular source files, i.e. not created at run time, exist on disk. Missing files cause needless recompilation when building via VS, and we want this check to match for people/bots that build using ninja, so they're not surprised when the VS build fails.Úmsvs_error_on_missing_sourcesrcó —d|vS)NrcrÃrñs rrz&VerifyMissingSources..Ds€ 3¨a¡Ð�NÑ#ð  Œb�j‰j�n‰nÐ5°rÓ:Ñ:Ø Œb�j‰j�n‰nÐ5°rÓ:Ñ:Ø(*Ð�nÒ%à(*Ð�nÒ%r))r'rrarRrdÚ six.movesrÚ gyp.commonrÚ gyp.MSVSUtilr–Úgyp.MSVSVersionrr6Ú NameErrorr†Úcompilerrr-r/r:r@rDrPr`rqr(rsr[r.r^rdrQrermruryr‹r•r¢rÃrrÚr©sâðñ ó  Û ÛÛ å%å!ÛÛÝ,ðá ð "�r—z‘z )Ó,Ðò òF Lò @òò ò òò. ò("ô8m ,�6ôm ,ò`Aô1 ˜ô1 ðh€ òòòò# òJ ò(ò7òrJó$+øðm!òØ‚*ðús®BÂBÂB