B
    ›³ëbÏ8  ã               @   s’  d 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ddl	Zddl
ZddlZddlmZmZ ddlmZ dZdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zej d¡Zej d ¡Z d!d"„ Z!d#d$„ Z"ej e!d¡Z#ej e"d¡Z$ej d%d&¡Z%ej ed¡Z&ej d'd(¡Z'e'e& e# Z(ej d)d*¡Z)e)e& e# Z*ej d+d,¡Z+e+e$ Z,d-d.„ Z-d/d0„ Z.dS )1zåSCons.Tool.mslink

Tool-specific initialization for the Microsoft linker.

There normally shouldn't be any need to import this module directly.
It will usually be imported through the generic SCons.Tool.Tool()
selection method.

é    Né   )Úmsvc_setup_env_onceÚmsvc_setup_env_tool)Úget_pch_nodeZmslinkc          	   C   s2   yd|d j j dgS  ttfk
r,   d S X d S )Nz/PDB:%sr   z/DEBUG)Ú
attributesÚpdbÚAttributeErrorÚ
IndexError)ÚenvÚtargetÚsourceÚfor_signature© r   ú0lib/python3.7/site-packages/SCons/Tool/mslink.pyÚpdbGenerator3   s    r   c             C   s\   g }|  | d| d| ¡}|r2| d| |¡ ¡ |  | dd¡}|rX| d| |¡ ¡ |S )Nz%sPREFIXz%sSUFFIXz/out:%sÚ	LIBPREFIXÚ	LIBSUFFIXz
/implib:%s)ÚFindIxesÚappendÚ
get_string)r   r   r
   r   ÚparamtpÚlistCmdÚdllZimplibr   r   r   Ú_dllTargets9   s      r   c             C   sP   g }|  |dd¡}x8|D ]0}|r>||kr>| d| |¡ ¡ q| |¡ qW |S )NÚWINDOWSDEFPREFIXÚWINDOWSDEFSUFFIXz/def:%s)r   r   r   )r   r   r
   r   r   r   ZdeffileÚsrcr   r   r   Ú_dllSourcesC   s    
r   c             C   s   t | |||dƒS )NÚSHLIB)r   )r   r   r
   r   r   r   r   ÚwindowsShlinkTargetsS   s    r   c             C   s   t | |||dƒS )Nr   )r   )r   r   r
   r   r   r   r   ÚwindowsShlinkSourcesV   s    r    c             C   s   t | |||dƒS )z!Get targets for loadable modules.ÚLDMODULE)r   )r   r   r
   r   r   r   r   Ú_windowsLdmodTargetsY   s    r"   c             C   s   t | |||dƒS )z!Get sources for loadable modules.r!   )r   )r   r   r
   r   r   r   r   Ú_windowsLdmodSources]   s    r#   c          	   C   sÜ  t jj |¡ g }g }| | d| d| ¡}| dd¡}|sVt j d| d| ¡ ¡‚| d¡}|dkr–| |d	d
¡s–| 	| 
|d| d| d	d
¡¡ t jj | dd¡¡\}	}
|	dkrð| dd¡sÐ| dd¡rð| 	| 
|d| d| dd¡¡ d|kr.|d r.|jd| |dd }| 	|¡ || d j_t|| |ƒ}|	dkrv|rvt j t|ƒ¡d d }||krv| 	|¡ |sÌ| | dd¡sÌ| 	| 
|d| d| dd¡¡ | 	| 
|d| d| dd¡¡ | | || fS )z%Common implementation of dll emitter.z%sPREFIXz%sSUFFIXÚno_import_libr   zCA shared library should have exactly one target with the suffix: %sz	$%sSUFFIXz$WINDOWS_INSERT_DEF)Ú Ú0r   r   r   ÚMSVS_VERSIONz6.0g       @ÚWINDOWS_INSERT_MANIFESTÚWINDOWS_EMBED_MANIFESTÚWINDOWSSHLIBMANIFESTPREFIXÚWINDOWSSHLIBMANIFESTSUFFIXÚPDBz$PDB)r   r   g      &@z.objr   r   ÚWINDOWSEXPPREFIXÚWINDOWSEXPSUFFIX)ÚSConsÚToolÚmsvcÚvalidate_varsr   ÚgetÚErrorsÚ	UserErrorÚsubstr   ÚReplaceIxesÚmsvsÚmsvs_parse_versionÚ	arg2nodesr   r   r   ÚUtilÚsplitextÚstr)r   r   r
   r   ÚextratargetsÚextrasourcesr   r$   Z
insert_defÚversion_numÚsuiter   Úpch_nodeÚpchobjr   r   r   Ú_dllEmittera   sR    







rD   c             C   s   t | ||dƒS )Nr   )rD   )r   r   r
   r   r   r   ÚwindowsLibEmitterž   s    rE   c             C   s   t | ||dƒS )z¬Emitter for loadable modules.

    Loadable modules are identical to shared libraries on Windows, but building
    them is subject to different parameters (LDMODULE*).
    r!   )rD   )r   r   r
   r   r   r   ÚldmodEmitter¡   s    rF   c          	   C   s"  t jj |¡ g }g }| | dd¡}|s>t j d| d¡ ¡‚t jj 	| 
dd¡¡\}}|dkr| 
dd	¡sx| 
d
d	¡r| | |dddd¡¡ d|krÊ|d rÊ|jd| |dd	 }| |¡ || d	 j_t|| |ƒ}	|dkr|	rt j t|	ƒ¡d	 d }
|
|kr| |
¡ | | || fS )NZ
PROGPREFIXZ
PROGSUFFIXz@An executable should have exactly one target with the suffix: %sz$PROGSUFFIXr'   z6.0g       @r(   r   r)   ÚWINDOWSPROGMANIFESTPREFIXÚWINDOWSPROGMANIFESTSUFFIXr,   z$PDB)r   r   g      &@z.obj)r/   r0   r1   r2   r   r4   r5   r6   r8   r9   r3   r   r7   r:   r   r   r   r;   r<   r=   )r   r   r
   r>   r?   Zexer@   rA   r   rB   rC   r   r   r   Úprog_emitter©   s.    



rI   c             C   sZ   d|krV|d rVt | d g|d g|ƒ}|rBtj d| d  ¡‚ntd| d  ƒ |S dS )NÚregisterr   zUnable to register %szRegistered %s sucessfully)ÚregServerActionr/   r4   r5   Úprint)r   r   r
   Úretr   r   r   ÚRegServerFuncÌ   s    rN   z	$MTEXECOMz$MTSHLIBCOMc             C   sn   |  dd¡rj| d  ¡ d }tj |¡rVt| d gd|ƒ}|rRtj d| d  ¡‚|S t	dt
| d ƒ ƒ dS )z¨Function run by embedManifestDllCheckAction to check for existence of manifest
    and other conditions, and embed the manifest by calling embedManifestDllAction if so.r)   r   z	.manifestNz Unable to embed manifest into %sz-(embed: no %s.manifest found; not embedding.))r3   Úget_abspathÚosÚpathÚexistsÚembedManifestDllActionr/   r4   r5   rL   r=   )r   r   r
   ÚmanifestSrcrM   r   r   r   ÚembedManifestDllCheckÛ   s    rU   c             C   sn   |  dd¡rj| d  ¡ d }tj |¡rVt| d gd|ƒ}|rRtj d| d  ¡‚|S t	dt
| d ƒ ƒ dS )z¨Function run by embedManifestExeCheckAction to check for existence of manifest
    and other conditions, and embed the manifest by calling embedManifestExeAction if so.r)   r   z	.manifestNz Unable to embed manifest into %sz-(embed: no %s.manifest found; not embedding.))r3   rO   rP   rQ   rR   ÚembedManifestExeActionr/   r4   r5   rL   r=   )r   r   r
   rT   rM   r   r   r   ÚembedManifestExeChecké   s    rW   z
$REGSVRCOMz$REGSVRCOMSTRzu${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES", "$SHLINKCOMSTR")}z$SHLINKCOMSTRz${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES", "$LDMODULECOMSTR")}z$LDMODULECOMSTRzs${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows", "$LINKCOMSTR")}z$LINKCOMSTRc             C   sÞ  t jj| dd t j | ¡ d| d< t j d¡| d< t| d< t| d< t| d	< | j	t
gd
 | j	t
gd d| d< t j d¡| d< t| d< t| d< | j	tgd d| d< d| d< d| d< d| d< d| d< d| d< d| d< d| d< d | d!< d| d"< d#| d$< d| d%< d&| d'< t| d(< tj t jj ¡ d)d*¡| d+< d,| d-< d.| d/< d | d0< d1| d2< t j d¡| d3< d4| d5< d6| d7< d8| d9< t| td: t jj| d;d< d=| d>< d?| d@< d| dA< dB| dC< t| dD< t| dE< tg| dF< t| dG< tj| dH< d8S )IzAAdd Builders and construction variables for ar to an Environment.z$SHLIBSUFFIX)Zshlib_suffixz$LINKZSHLINKz$LINKFLAGS /dllZSHLINKFLAGSZ_SHLINK_TARGETSZ_SHLINK_SOURCESZ	SHLINKCOM)ZSHLIBEMITTER)ÚLDMODULEEMITTERÚlinkZLINKz/nologoZ	LINKFLAGSZ_PDBZLINKCOM)ZPROGEMITTERz	/LIBPATH:ZLIBDIRPREFIXr%   ZLIBDIRSUFFIXZLIBLINKPREFIXz
$LIBSUFFIXZLIBLINKSUFFIXr   z.defr   r-   z.expr.   r   ZWINDOWS_INSERT_DEFr*   z${SHLIBSUFFIX}.manifestr+   rG   z${PROGSUFFIX}.manifestrH   ZREGSVRACTIONZSystem32Zregsvr32ZREGSVRz/s ZREGSVRFLAGSz&$REGSVR $REGSVRFLAGS ${TARGET.windows}Z	REGSVRCOMr)   ZmtZMTZMTFLAGSzW-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;1ZMTEXECOMzW-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;2Z
MTSHLIBCOMNZ_MANIFEST_SOURCES)Útoolz$LDMODULESUFFIX)Zloadable_module_suffixz$SHLINKr!   z$SHLIBPREFIXZLDMODULEPREFIXZLDMODULESUFFIXz$SHLINKFLAGSZLDMODULEFLAGSZ_LDMODULE_TARGETSZ_LDMODULE_SOURCESrX   ZLDMODULECOMZTEMPFILEARGJOIN)r/   r0   ZcreateSharedLibBuilderZcreateProgBuilderr;   ZCLVarr   r    ÚcompositeShLinkActionZAppendrE   r   ÚcompositeLinkActionrI   ÚregServerCheckrP   rQ   ÚjoinZPlatformZwin32Zget_system_rootr   Ú	tool_nameZcreateLoadableModuleBuilderr"   r#   rF   ÚcompositeLdmodActionÚlinesep)r
   r   r   r   Úgenerate  sb    
rb   c             C   s   t | tdS )N)rZ   )r   r_   )r
   r   r   r   rR   N  s    rR   )/Ú__doc__rP   Úos.pathZSCons.Actionr/   ZSCons.DefaultsZSCons.ErrorsZSCons.Platform.win32Z
SCons.ToolZSCons.Tool.msvcZSCons.Tool.msvsZ
SCons.UtilZMSCommonr   r   ZMSCommon.commonr   r_   r   r   r   r   r    r"   r#   rD   rE   rF   rI   rN   ZActionrV   rS   rU   rW   ZembedManifestDllCheckActionZembedManifestExeCheckActionrK   r]   ZshlibLinkActionr[   ZldmodLinkActionr`   ZexeLinkActionr\   rb   rR   r   r   r   r   Ú<module>    sR   
=#K