B
    ›³ëb3  ã               @   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ZddlmZmZmZmZ ddlmZ dZddgZd	d
dddg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d¡Zej j edeej!j"dZ#ej$j% &¡ Z'ej d d!¡Z(ej j e(d"d#g e'd$Z)d%d&„ Z*d'd(„ Z+ejjd)d*e*d+d,Z,ejjd-d.e*d+d,Z-ejjd/d0e*d+d,Z.ejjd1d2e*d+d,Z/d3d4„ Z0d5d6„ Z1dS )7zåSCons.Tool.msvc

Tool-specific initialization for Microsoft Visual C/C++.

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_toolÚmsvc_setup_env_onceÚmsvc_version_to_maj_minÚmsvc_find_vswhere)Úget_pch_nodeÚmsvcz.cz.Cz.ccz.cppz.cxxz.c++z.C++c             C   sL   d| krH| d rHd| kr$t j d¡‚t j | d ¡sHt j d| d  ¡‚dS )z4Validate the PCH and PCHSTOP construction variables.ÚPCHZPCHSTOPz;The PCHSTOP construction must be defined if PCH is defined.z6The PCHSTOP construction variable must be a string: %rN)ÚSConsZErrorsZ	UserErrorÚUtilZ	is_String)Úenv© r   ú.lib/python3.7/site-packages/SCons/Tool/msvc.pyÚvalidate_vars7   s
    r   c             C   sX   |   dd¡rBt| d ƒ\}}|dk r8tj dg¡| d< qTd| d< ntj dg¡| d< dS )zF
    Set appropriate PCHPDBFLAGS for the MSVC version being used.
    ZMSVC_VERSIONFé   z${(PDB and "/Yd") or ""}ZPCHPDBFLAGSÚ N)Úgetr   r
   r   ÚCLVar)r   ZmajÚminr   r   r   Úmsvc_set_PCHPDBFLAGS?   s    
r   c             C   s‚   t |ƒ d}d}xD| D ]<}tj t|ƒ¡d dkr6|}tj t|ƒ¡d dkr|}qW |srtj t|ƒ¡d d }||g} | |fS )zAdds the object file target.Nr   z.pchz.objr   )r   r
   r   ÚsplitextÚstr)ÚtargetÚsourcer   ÚpchÚobjÚtr   r   r   Úpch_emitterN   s    
r   c             C   s\   t |ƒ || ||ƒ t|| |ƒ}|rTt| d ƒtj t|ƒ¡d d krT| | |¡ | |fS )z0Sets up the PCH dependencies for an object file.r   z.obj)r   r   r   r
   r   r   ZDepends)r   r   r   Zparent_emitterr   r   r   r   Úobject_emitterd   s    $r   c             C   s   t | ||tjjƒS )N)r   r
   ÚDefaultsZStaticObjectEmitter)r   r   r   r   r   r   Ústatic_object_emitter|   s    r    c             C   s   t | ||tjjƒS )N)r   r
   r   ZSharedObjectEmitter)r   r   r   r   r   r   Úshared_object_emitter€   s    r!   c             C   s(   t | ||ƒ}|sdS tj dd| g¡S )zu
    Generator for CCPCHFLAGS
    if PCH is not defined or evaluates to a false value, then return empty string.
    r   z/Yu$PCHSTOPz/Fp%s)r   r
   r   r   )r   r   r   Úfor_signatureZpch_noder   r   r   Úgen_ccpchflags…   s    r#   z$PCHCOMz
$PCHCOMSTRz.pch)ÚactionÚsuffixZemitterÚsource_scannerz$RCCOMz	$RCCOMSTRz.rcz.res)r$   Z
src_suffixr%   Zsrc_builderr&   c             C   sj   d|ks|  d¡dkrdS |d }|d }tj |j¡d tj |j¡d krRdS t| ƒt|ƒ|j|jfS )a¡  
    Returns a key to identify unique batches of sources for compilation.

    If batching is enabled (via the $MSVC_BATCH setting), then all
    target+source pairs that use the same action, defined by the same
    environment, and have the same target and source directories, will
    be batched.

    Returning None specifies that the specified target+source should not
    be batched with other compilations.
    Ú
MSVC_BATCHz$MSVC_BATCH)Ú0ÚFalser   NNr   )ÚsubstÚosÚpathr   ÚnameÚidÚdir)r$   r   r   r   r   Úsr   r   r   Úmsvc_batch_keyŸ   s    $r1   c             C   s,   d|ks|  d¡dkrdS dtjd  S dS )aQ  
    Returns the correct /Fo flag for batching.

    If batching is disabled or there's only one source file, then we
    return an /Fo string that specifies the target explicitly.  Otherwise,
    we return an /Fo string that just specifies the first target's
    directory (where the Visual C/C++ compiler will put the .obj files).
    r'   z$MSVC_BATCH)r(   r)   r   Nz
/Fo$TARGETz/Fo${TARGET.dir}é   N)r*   r+   Úsep)r   r   r   r"   r   r   r   Úmsvc_output_flag¼   s    
r4   z$CCCOMz	$CCCOMSTRz$CHANGED_TARGETS)Z	batch_keyZtargetsz$SHCCCOMz$SHCCCOMSTRz$CXXCOMz
$CXXCOMSTRz	$SHCXXCOMz$SHCXXCOMSTRc             C   s’  t j | ¡\}}d|j_d|j_x<tD ]4}| |t¡ | |t¡ | 	|t
¡ | 	|t¡ q&W x<tD ]4}| |t¡ | |t¡ | 	|t
¡ | 	|t¡ qdW t j dg¡| d< t| d< t| d< d| d< d| d	< t j d
¡| d< t j d¡| d< d| d< d| d< t j d¡| d< t j d¡| d< d| d< d| d< t j d¡| d< d| d< d| d< t j d¡| d < d!| d"< d#| d$< d| d%< d&| d'< d| d(< d)| d*< d+| d,< t j d
¡| d-< d.d/g| d0< d1| d2< t| d3 d4< d| d5< d6| d7< d8| d9< d:| d;< t j d<¡| d=< |  d>tƒ ¡| d>< t| td? d@| dA< dB| dC< t| ƒ tj| dD< dE| dF< t| d3 dG< dH| kr\i | dH< dI| dH kr~t jj ¡ | dH dI< dJ| dK< dL| dM< dNS )OzEAdd Builders and construction variables for MSVC++ to an Environment.Fz${(PDB and "/Z7") or ""}Z
CCPDBFLAGSZ
CCPCHFLAGSZ_MSVC_OUTPUT_FLAGz=$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGSZ	_CCCOMCOMZclZCCz/nologoZCCFLAGSr   ZCFLAGSza${TEMPFILE("$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM","$CCCOMSTR")}ZCCCOMz$CCZSHCCz$CCFLAGSZ	SHCCFLAGSz$CFLAGSZSHCFLAGSzi${TEMPFILE("$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCCCOMSTR")}ZSHCCCOMZCXXz	$( /TP $)ZCXXFLAGSze${TEMPFILE("$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM","$CXXCOMSTR")}ZCXXCOMz$CXXZSHCXXz	$CXXFLAGSZ
SHCXXFLAGSzm${TEMPFILE("$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCXXCOMSTR")}ZSHCXXCOMz/DZCPPDEFPREFIXZCPPDEFSUFFIXz/IZ	INCPREFIXZ	INCSUFFIXr   Z&STATIC_AND_SHARED_OBJECTS_ARE_THE_SAMEZrcÚRCZRCFLAGSz.rcz.rc2Z
RCSUFFIXESz<$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCESZRCCOMZBUILDERSZRESZ	OBJPREFIXz.objZ	OBJSUFFIXz
$OBJPREFIXZSHOBJPREFIXz
$OBJSUFFIXZSHOBJSUFFIXz
--nounistdZ	LEXUNISTDZVSWHERE)Útoolz.cZCFILESUFFIXz.ccZCXXFILESUFFIXZTEMPFILEARGJOINz$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGSZPCHCOMr	   ZENVZ
SystemRootz/showIncludesZ
CCDEPFLAGSr   ZNINJA_DEPFILE_PARSE_FORMATN)r
   ÚToolZcreateObjBuildersZcmdgenZsource_ext_matchÚ	CSuffixesZ
add_actionÚCActionÚ	ShCActionZadd_emitterr    r!   ÚCXXSuffixesÚ	CXXActionÚShCXXActionr   r   r#   r4   Úres_builderr   r   r   Ú	tool_namer   r+   ÚlinesepÚpch_builderZPlatformZwin32Zget_system_root)r   Z
static_objZ
shared_objr%   r   r   r   Úgenerateè   sx    



rB   c             C   s   t | tdS )N)r6   )r   r?   )r   r   r   r   ÚexistsD  s    rC   )2Ú__doc__Úos.pathr+   ZSCons.Actionr
   ZSCons.BuilderZSCons.ErrorsZSCons.Platform.win32Z
SCons.ToolZSCons.Tool.msvsZ
SCons.UtilZSCons.WarningsZSCons.Scanner.RCZMSCommonr   r   r   r   ZMSCommon.commonr   r?   r8   r;   r   r   r   r   r    r!   r#   ZActionZ
pch_actionZBuilderr7   ZSourceFileScannerrA   ÚScannerr5   ZRCScanZres_scannerZ
res_actionr>   r1   r4   r9   r:   r<   r=   rB   rC   r   r   r   r   Ú<module>    sd   




\