Ë
    Ï"Kb;5  ã                   ó`  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ej                  j                  ej                  j                  e«      «      Z ej                  dej                   «      Zd„ Z G d„ de«      Zedk(  r& e	j,                   ee	j.                  d	d «      «       yy)
zuUtility functions for Windows builds.

These functions are executed via gyp-win-tool when using the ninja generator.
é    )Úprint_functionNz/OUT:(?P<out>.+)$c                 ój   — t        «       }|j                  | «      }|�t        j                  |«       y y ©N)ÚWinToolÚDispatchÚsysÚexit)ÚargsÚexecutorÚ	exit_codes      ú./usr/lib/python3/dist-packages/gyp/win_tool.pyÚmainr      s0   € Ü‹Y€(Ø×Ñ Ó%€)ØÐÜ‡H�HˆYÕð ó    c                   ój   — e 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d„ Zd„ Zy)r   z†This class performs all the Windows tooling steps. The methods can either
  be executed directly, or dispatched from an argument list.c           	      ó  — t        |«      dk  rt        d«      ‚|d   dk7  ryd}|D ]X  }t        j                  |«      }|sŒt	        j
                  ddd|j                  d	«      t        j                  «       fz  «      } n |€y||d
<   y)zWAllows to use a unique instance of mspdbsrv.exe per linker instead of a
    shared one.é   úNot enough argumentsr   zlink.exeNz\W+Ú z%s_%dÚoutÚ_MSPDBSRV_ENDPOINT_)	ÚlenÚ	ExceptionÚ_LINK_EXE_OUT_ARGÚmatchÚreÚsubÚgroupÚosÚgetpid)ÚselfÚenvr
   Úendpoint_nameÚargÚms         r   Ú_UseSeparateMspdbsrvzWinTool._UseSeparateMspdbsrv'   s›   € ô ˆ4ƒy�1‚}ÜÐ,Ó-Ð-àˆA�w�*ÒØð €MØò ˆÜ
×
!Ñ
! #Ó
&€aÚ	
ÜŸ™˜v rØ�q—w‘w˜u“~¤r§y¡y£{Ð3Ñ3ó5ˆáðð ÐØð
 "/€CÐÒr   c                 ó†   — t        |«      dk  rt        d«      ‚d| j                  |d   «      z  } t        | |«      |dd Ž S )z(Dispatches a string command to a method.r   r   zExec%sr   N)r   r   Ú_CommandifyNameÚgetattr)r    r
   Úmethods      r   r   zWinTool.DispatchB   sL   € ä
ˆ4ƒy�1‚}ÜÐ,Ó-Ð-à˜×,Ñ,¨T°!©WÓ5Ñ5€FØ Œ7�4˜Ó  $ q r (Ð+Ð+r   c                 óB   — |j                  «       j                  dd«      S )z@Transforms a tool name like recursive-mirror to RecursiveMirror.ú-r   )ÚtitleÚreplace)r    Úname_strings     r   r'   zWinTool._CommandifyNameJ   s   € à×ÑÓ×&Ñ& s¨BÓ/Ð/r   c                 ó¶   — t        |«      j                  «       dd j                  d«      }|D �cg c]  }|j                  dd«      ‘Œ }}t        |«      S c c}w )z@Gets the saved environment from a file for a given architecture.Néþÿÿÿú ú=r   )ÚopenÚreadÚsplitÚdict)r    ÚarchÚpairsÚitemÚkvss        r   Ú_GetEnvzWinTool._GetEnvN   sS   € ô
 �‹J�O‰OÓ˜c˜rÐ"×(Ñ(¨Ó.€EØ*/Ö
0 $ˆ4�:‰:�c˜1ÕÐ
0€CÐ
0Ü�‹9Ðùò 1s   °Ac                 ó8   — t        |d«      j                  «        y)zSimple stamp command.ÚwN)r3   Úclose)r    Úpaths     r   Ú	ExecStampzWinTool.ExecStampW   s   € äˆˆsƒO×ÑÕr   c                 ó  — t         j                  j                  |«      r—t         j                  j                  |«      rd„ }t	        j
                  ||¬«       n]t        j                  |t         j                  «      s$t        j                  |t        j                  «       t        j                  |«       t         j                  j                  |«      rt	        j                  ||«       yt	        j                  ||«       y)z)Emulation of rm -rf out && cp -af in out.c                 ó¤   — t        j                  |t         j                  «      s$t        j                  |t        j
                  «        | |«       y r   )r   ÚaccessÚW_OKÚchmodÚstatÚS_IWRITE)Úfnr?   Úexcinfos      r   Ú	_on_errorz.WinTool.ExecRecursiveMirror.<locals>._on_error_   s/   € ô —‘˜4¤§¡Ô)Ü�H‰H�Tœ4Ÿ=™=Ô)Ù
ˆT�(r   )ÚonerrorN)r   r?   ÚexistsÚisdirÚshutilÚrmtreerC   rD   rE   rF   rG   ÚunlinkÚcopytreeÚcopy2)r    ÚsourceÚdestrJ   s       r   ÚExecRecursiveMirrorzWinTool.ExecRecursiveMirror[   s’   € ä	‡w�w‡~�~�dÔÜ	�‰�‰�tÔ	ò	ô 	�‰�d IÖ.ä�y‰y˜œrŸw™wÔ'ä
�(‰(�4œŸ™Ô
'Ü
�	‰	�$Œä	‡w�w‡}�}�VÔÜ‡o�o�f˜dÕ#ä‡l�l�6˜4Õ r   c                 ó8  — | j                  |«      }|dk(  r| j                  ||«       t        j                  dk(  r#t	        |«      }|d   j                  dd«      |d<   t        j                  |t        j                  dk(  |t        j                  t        j                  d¬«      }|j                  «       \  }}|j                  «       D ]C  }|j                  d«      rŒ|j                  d	«      rŒ'|j                  d
«      rŒ9t        |«       ŒE |j                  S )z°Filter diagnostic output from link that looks like:
    '   Creating library ui.dll.lib and object ui.dll.exp'
    This happens when there are exports from the dll or exe.
    ÚTrueÚwin32r   ú/ú\T©Úshellr!   ÚstdoutÚstderrÚuniversal_newlinesz   Creating library zGenerating codezFinished generating code)r;   r%   r   ÚplatformÚlistr-   Ú
subprocessÚPopenÚPIPEÚSTDOUTÚcommunicateÚ
splitlinesÚ
startswithÚprintÚ
returncode)	r    r7   Úuse_separate_mspdbsrvr
   r!   Úlinkr   Ú_Úlines	            r   ÚExecLinkWrapperzWinTool.ExecLinkWrapperq   sî   € ð
 �,‰,�tÓ
€CØ Ò&Ø
×Ñ  TÔ*Ü
‡|�|�wÒÜ�$‹Z€dØ�Q‘—‘  TÓ*€dˆ1�gô ×Ñ˜D¬¯©¸Ñ(?ÀSÜ#-§?¡?¼:×;LÑ;LØ/3ô5€Dð ×ÑÓ�F€CˆØ—‘Ó ò ˆØ�o‰oÐ4Õ5Ø�o‰oÐ/Õ0Ø�o‰oÐ8Õ9Üˆd�ð	ð
 �?‰?Ðr   c	                 óR  — t         j                  |||||||dj                  |	«      dœ	}
d}|	rRt        j                  d|
z  «       |dk(  r5t        j                  d|
z  «       t        j                  d|
z  «       d|
z  }t        j                  ||z   «       |	röt        j                  d	|
z  «       d
|
z  }d|
z  }t        |d«      5 }t        |d«      5 }t        j                  dd|j                  «       «      }t        j                  dd|j                  «       «      }ddd«       ddd«       k7  rZt        j                  |«       d„ } ||«        ||«        ||«       t         j                  j                  d|›d|›d|›d�«       yyy# 1 sw Y   ŒrxY w# 1 sw Y   ŒvxY w)zZA wrapper for handling creating a manifest resource and then executing
    a link command.ú )	Úpythonr7   r   ÚldcmdÚresnameÚmtÚrcÚintermediate_manifestÚ	manifestsr   zn%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo -manifest %(manifests)s -out:%(out)s.manifestrW   z`%(python)s gyp-win-tool manifest-to-rc %(arch)s %(out)s.manifest %(out)s.manifest.rc %(resname)szF%(python)s gyp-win-tool rc-wrapper %(arch)s %(rc)s %(out)s.manifest.rcz %(out)s.manifest.resz’%(python)s gyp-win-tool manifest-wrapper %(arch)s %(mt)s -nologo -manifest %(out)s.manifest %(intermediate_manifest)s -out:%(out)s.assert.manifestz%(out)s.assert.manifestz%(out)s.manifestÚrz\s+Nc                 ó:  — t        | t        j                  ¬«       t        dt        j                  ¬«       t        | d«      5 }t        |j	                  «       t        j                  ¬«       t        dt        j                  ¬«       d d d «       y # 1 sw Y   y xY w)N)Úfilez-----ry   )ri   r   r^   r3   r4   )ÚfilenameÚfs     r   Údumpz+WinTool.ExecLinkWithManifests.<locals>.dumpÍ   sa   € Ü
�œsŸz™zÕ
*Ü
�œcŸj™jÕ
)Ü�H˜cÓ"ð , aÜ�!—&‘&“(¤§¡Õ,Ü�'¤§
¡
Õ+÷,÷ ,ñ ,ús   ÁABÂBzLinker generated manifest "z" added to final manifest "z" (result in "z8"). Were /MANIFEST switches used in #pragma statements? r   )r   Ú
executableÚjoinrb   Ú
check_callr3   r   r   r4   r   rP   r^   Úwrite)r    r7   Úembed_manifestr   rs   rt   ru   rv   rw   rx   Ú	variablesÚ	add_to_ldÚassert_manifestÚour_manifestÚour_fÚassert_fÚour_dataÚassert_datar~   s                      r   ÚExecLinkWithManifestszWinTool.ExecLinkWithManifests�   sÍ  € ô —‘ØØØØØØØ4Ø—8‘8˜IÓ&ñ
€Ið €IÙÜ×Ñð:Ø<EñFôGð 
˜6Ò	!Ü×Ñð-Ø/8ñ9ô	:ô 	×Ñð"Ø$-ñ.ô	/ð ,¨iÑ7ˆ	Ü×Ñ˜% )Ñ+Ô,ñ ô ×Ñð)à+4ñ5ô6ð 2°IÑ=€oØ'¨)Ñ3€lô �˜cÓ"ð < eÜ�/ 3Ó'ð 	<¨8Ü—V‘V˜F B¨¯
©
«Ó5ˆ(ÜŸ™˜v r¨8¯=©=«?Ó;ˆ+÷	<÷<ð 
�[Ò	 Ü
�	‰	�#Œò	,ñ 	Ð"Ô#Ùˆ\ÔÙˆ_ÔÜ�
‰
×Òò $¢\²?ðDô	Eð
 ð! 
!ð ÷	<ð 	<ú÷<ð <ús%   ÃFÃAFÄ FÆF	ÆFÆF&c                 ó   — | j                  |«      }t        j                  |d|t        j                  t        j                  d¬«      }|j                  «       \  }}|j                  «       D ]  }|sŒd|vsŒt        |«       Œ |j                  S )z›Run manifest tool with environment set. Strip out undesirable warning
    (some XML blocks are recognized by the OS loader, but not the manifest
    tool).Tr[   z#manifest authoring warning 81010002)	r;   rb   rc   rd   re   rf   rg   ri   rj   ©r    r7   r
   r!   Úpopenr   rm   rn   s           r   ÚExecManifestWrapperzWinTool.ExecManifestWrapperÝ   s„   € ð �,‰,�tÓ
€CÜ×Ñ˜T¨°3Ü$.§O¡O¼J×<MÑ<MØ04ô6€Eð ×ÑÓ �F€CˆØ—‘Ó ò ˆÚ	Ð7¸tÒCÜˆd�ðð ×ÑÐr   c           
      óÜ   — |\  }}}t        |d«      5 }|j                  d|›dt        j                  j	                  |«      j                  dd«      ›d�«       ddd«       y# 1 sw Y   yxY w)zÑCreates a resource file pointing a SxS assembly manifest.
    |args| is tuple containing path to resource file, path to manifest file
    and resource name which can be "1" (for executables) or "2" (for DLLs).r=   z#include <windows.h>
z RT_MANIFEST "rZ   rY   ú"N)r3   r‚   r   r?   Úabspathr-   )r    r7   r
   Úmanifest_pathÚresource_pathÚresource_nameÚoutputs          r   ÚExecManifestToRczWinTool.ExecManifestToRcë   sb   € ð 37Ñ/€M�= -Ü	ˆm˜SÓ	!ð < VØ‡l‚lÚÜ
�‰�‰˜Ó&×.Ñ.¨t°SÕ9ð;ô <÷<÷ <ñ <ús   “AA"Á"A+c	                 ó°  ‡— ddgt        |	«      z   d|d|d|d|d|d||gz   }
| j                  |«      }t        j                  |
d	|t        j                  t        j
                  d	¬
«      }|j                  «       \  }}|j                  «       }dŠt        ˆfd„|D «       «      }|D ]$  }|j                  ‰«      rŒ||vsŒt        |«       Œ& |j                  S )zjFilter noisy filenames output from MIDL compile step that isn't
    quietable via command line flags.
    Úmidlz/nologoz/outz/tlbz/hz/dlldataz/iidz/proxyTr[   )zProcessing z64 bit Processing c              3   ó~   •K  — | ]4  }|j                  ‰«      r!t        j                  j                  |«      –— Œ6 y ­wr   )rh   r   r?   Úbasename)Ú.0ÚxÚprefixess     €r   ú	<genexpr>z*WinTool.ExecMidlWrapper.<locals>.<genexpr>  s3   øè ø€ ò ?Ø q§|¡|°HÔ'=ô —W‘W×%Ñ% a×(ñ ?ùs   ƒ:=)ra   r;   rb   rc   rd   re   rf   rg   Úsetrh   ri   rj   )r    r7   ÚoutdirÚtlbÚhÚdlldataÚiidÚproxyÚidlÚflagsr
   r!   r�   r   rm   ÚlinesÚ
processingrn   rŸ   s                     @r   ÚExecMidlWrapperzWinTool.ExecMidlWrapperõ   sð   ø€ ð
 �IÐ¤ e£Ñ,Ø�Ø�ØˆaØ�GØ�Ø�%Øð0ñ €Dð �,‰,�tÓ
€CÜ×Ñ˜T¨°3Ü$.§O¡O¼J×<MÑ<MØ04ô6€Eð ×ÑÓ �F€Cˆð
 �N‰NÓ€EØ4€HÜó ?Ø#ô?ó ?€Jàò ˆØ�_‰_˜XÕ&¨4°zÒ+AÜˆd�ðð ×ÑÐr   c                 ó‚  — | j                  |«      }t        j                  |d|t        j                  t        j                  d¬«      }|j                  «       \  }}|j                  «       D ]F  }|j                  d«      rŒ|j                  d«      rŒ'|j                  d«      rŒ9|sŒ<t        |«       ŒH |j                  S )z/Filter logo banner from invocations of asm.exe.Tr[   ú#Copyright (C) Microsoft CorporationzMicrosoft (R) Macro Assemblerz Assembling: ©
r;   rb   rc   rd   re   rf   rg   rh   ri   rj   rŽ   s           r   ÚExecAsmWrapperzWinTool.ExecAsmWrapper  s    € à
�,‰,�tÓ
€CÜ×Ñ˜T¨°3Ü$.§O¡O¼J×<MÑ<MØ04ô6€Eð ×ÑÓ �F€CˆØ—‘Ó ò ˆØ�o‰oÐCÕDØ�o‰oÐ=Õ>Ø�o‰o˜oÕ.Ú
Üˆd�ðð ×ÑÐr   c                 ó^  — | j                  |«      }t        j                  |d|t        j                  t        j                  d¬«      }|j                  «       \  }}|j                  «       D ]4  }|j                  d«      rŒ|j                  d«      rŒ'|sŒ*t        |«       Œ6 |j                  S )zgFilter logo banner from invocations of rc.exe. Older versions of RC
    don't support the /nologo flag.Tr[   z+Microsoft (R) Windows (R) Resource Compilerr®   r¯   rŽ   s           r   ÚExecRcWrapperzWinTool.ExecRcWrapper#  s–   € ð �,‰,�tÓ
€CÜ×Ñ˜T¨°3Ü$.§O¡O¼J×<MÑ<MØ04ô6€Eð ×ÑÓ �F€CˆØ—‘Ó ò ˆØ�o‰oÐKÕLØ�o‰oÐCÕDÚ
Üˆd�ð	ð
 ×ÑÐr   c                 óú   — | j                  |«      }t        j                  j                  «       D ]  \  }}||vsŒ|||<   Œ t	        |«      j                  «       }|r|d   nd}t        j                  |d||¬«      S )z�Runs an action command line from a response file using the environment
    for |arch|. If |dir| is supplied, use that as the working directory.r   NT)r\   r!   Úcwd)r;   r   ÚenvironÚitemsr3   r4   rb   Úcall)r    r7   ÚrspfileÚdirr!   ÚkÚvr
   s           r   ÚExecActionWrapperzWinTool.ExecActionWrapper2  sz   € ð �,‰,�tÓ
€Cô —
‘
× Ñ Ó"ò ‰ˆˆ1Ø	
�#ŠØˆˆAŠðô �‹=×ÑÓ€DÙˆ#ˆaŠ&˜T€CÜ�?‰?˜4 t°¸#Ô>Ð>r   c                 ó6  — t         j                  j                  |t        «      }|j	                  d«      }|D �cg c]%  }t         j                  j                  ||«      dz   ‘Œ' }}dg}|j                  |«       t        j                  |dt        ¬«      S c c}w )zfExecuted by msvs-ninja projects when the 'ClCompile' target is used to
    build selected C/C++ files.ú;z^^z	ninja.exeT)r\   r´   )	r   r?   ÚrelpathÚBASE_DIRr5   r€   Úextendrb   r·   )r    Úproject_dirÚselected_filesr|   Úninja_targetsÚcmds         r   ÚExecClCompilezWinTool.ExecClCompile?  s„   € ô —'‘'—/‘/ +¬xÓ8€KØ#×)Ñ)¨#Ó.€Nà&ö(Øô —W‘W—\‘\ +¨xÓ8¸4Ó?ð (€Mð (àˆ-€CØ‡J�Jˆ}ÔÜ�?‰?˜3 d´Ô9Ð9ùò	(s   º*BN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r   r'   r;   r@   rU   ro   rŒ   r�   r˜   r¬   r°   r²   r¼   rÆ   © r   r   r   r   #   sU   „ ñ@ò/ò6,ò0òòò!ò,ò<Lò\ò<òò>òò?ó	:r   r   Ú__main__r   )rÊ   Ú
__future__r   r   r   rN   rb   rF   Ústringr   r?   Údirnamer“   Ú__file__rÀ   ÚcompileÚ
IGNORECASEr   r   Úobjectr   rÇ   r	   ÚargvrË   r   r   ú<module>rÕ      s�   ðñõ
 &ã 	Û 	Û Û Û Û Û 
à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€ð �B—J‘JÐ2°B·M±MÓBÐ òôe:ˆfô e:ðN	 ˆzÒØ
€#‡(�(‰4�—‘˜˜�ÓÕð r   