B
    bx                 @   s0  d Z ddlmZ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mZ ddlmZmZ G dd dZeZg fdd	ZG d
d dejjZG dd dejjZG dd dejjZG dd deZdddZG dd deZdd Zdd ZG dd dZG dd dZG dd  d ejjZd!d" Z dS )#a  
SCons.Builder

Builder object subsystem.

A Builder object is a callable that encapsulates information about how
to execute actions to create a target Node (file) from source Nodes
(files), and how to create those dependencies for tracking.

The main entry point here is the Builder() factory method.  This provides
a procedural interface that creates the right underlying Builder object
based on the keyword arguments supplied and the types of the arguments.

The goal is for this external interface to be simple enough that the
vast majority of users can create new Builders as necessary to support
building new types of files in their configurations, without having to
dive any deeper into this subsystem.

The base class here is BuilderBase.  This is a concrete base class which
does, in fact, represent the Builder objects that we (or users) create.

There is also a proxy that looks like a Builder:

    CompositeBuilder

        This proxies for a Builder with an action that is actually a
        dictionary that knows how to map file suffixes to a specific
        action.  This is so that we can invoke different actions
        (compilers, compile options) for different flavors of source
        files.

Builders and their proxies have the following public interface methods
used by other modules:

    - __call__()
        THE public interface.  Calling a Builder object (with the
        use of internal helper methods) sets up the target and source
        dependencies, appropriate mapping to a specific action, and the
        environment manipulation necessary for overridden construction
        variable.  This also takes care of warning about possible mistakes
        in keyword arguments.

    - add_emitter()
        Adds an emitter for a specific file suffix, used by some Tool
        modules to specify that (for example) a yacc invocation on a .y
        can create a .h *and* a .c file.

    - add_action()
        Adds an action for a specific file suffix, heavily used by
        Tool modules to add their specific action(s) for turning
        a source file into an object file to the global static
        and shared object file Builders.

There are the following methods for internal use within this module:

    - _execute()
        The internal method that handles the heavily lifting when a
        Builder is called.  This is used so that the __call__() methods
        can set up warning about possible mistakes in keyword-argument
        overrides, and *then* execute all of the steps necessary so that
        the warnings only occur once.

    - get_name()
        Returns the Builder's name within a specific Environment,
        primarily used to try to return helpful information in error
        messages.

    - adjust_suffix()
    - get_prefix()
    - get_suffix()
    - get_src_suffix()
    - set_src_suffix()
        Miscellaneous stuff for handling the prefix and suffix
        manipulation we use in turning source file names into target
        file names.

    )UserDictUserListN)logInstanceCreation)InternalError	UserErrorc               @   s   e Zd ZdS )_NullN)__name__
__module____qualname__ r   r   ,lib/python3.7/site-packages/SCons/Builder.pyr   q   s   r   c                s`   |rT fdd|D }|rTt dd |D d } d t|   t| d  gS tj S )Nc                s&   g | ]} t | d  |kr|qS )N)len).0S)pathr   r   
<listcomp>x   s    z"match_splitext.<locals>.<listcomp>c             S   s   g | ]}t ||fqS r   )r   )r   Z_fr   r   r   r   z   s       )maxr   SConsUtilsplitext)r   suffixesZmatchsufsufr   )r   r   match_splitextv   s    $r   c                   s:   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Z  ZS )DictCmdGeneratorzThis is a callable class that can be used as a
    command generator function.  It holds on to a dictionary
    mapping file suffixes to Actions.  It uses that dictionary
    to return the proper action based on the file suffix of
    the source file.NTc                s   t  | || _d S )N)super__init__source_ext_match)selfmappingr   )	__class__r   r   r      s    zDictCmdGenerator.__init__c             C   s   t |  S )N)listkeys)r   r   r   r   src_suffixes   s    zDictCmdGenerator.src_suffixesc             C   s   || |< dS )z1Add a suffix-action pair to the mapping.
        Nr   )r   suffixactionr   r   r   
add_action   s    zDictCmdGenerator.add_actionc          
   C   sf  |sg S | j rp|  }d }xntt|D ]D}t||d }|rf||krftdtttt||||f |}q&W ntt|d |  d }|stdtttt|tttt|f ytj	j
| |||}	W nH tk
r }
 z(td|
jd |
jd |
jd f W d d }
~
X Y nX |	d krbtdtttt|tttt||tt|  f |	S )Nr   z^While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %sr   zGWhile building `%s': Cannot deduce file extension from source files: %szAAmbiguous suffixes after environment substitution: %s == %s == %s   zWhile building `%s' from `%s': Don't know how to build from a source file with suffix `%s'.  Expected a suffix in this list: %s.)r   r#   mapstrr   r   reprr!   r   r   Selector__call__KeyErrorargsr"   )r   targetsourceenvZfor_signaturer   ZextsrcZmy_extreter   r   r   r,      s.    
(6
8zDictCmdGenerator.__call__)NT)	r   r	   r
   __doc__r   r#   r&   r,   __classcell__r   r   )r    r   r   ~   s
   r   c               @   s   e Zd ZdZdd ZdS )CallableSelectorzPA callable dictionary that will, in turn, call the value it
    finds if it can.c             C   s(   t jj| ||}t|r$|||}|S )N)r   r   r+   r,   callable)r   r1   r0   valuer   r   r   r,      s    
zCallableSelector.__call__N)r   r	   r
   r5   r,   r   r   r   r   r7      s   r7   c               @   s   e Zd ZdZdd ZdS )DictEmitteral  A callable dictionary that maps file suffixes to emitters.
    When called, it finds the right emitter in its dictionary for the
    suffix of the first source file, and calls that emitter to get the
    right lists of targets and sources to return.  If there's no emitter
    for the suffix in its dictionary, the original target and source are
    returned.
    c             C   s.   t jj| ||}|r&||||\}}||fS )N)r   r   r+   r,   )r   r/   r0   r1   emitterr   r   r   r,      s    zDictEmitter.__call__N)r   r	   r
   r5   r,   r   r   r   r   r:      s   r:   c               @   s   e Zd ZdZdd ZdS )ListEmitterzWA callable list of emitters that calls each in sequence,
    returning the result.
    c             C   s(   x| j D ]}||||\}}qW ||fS )N)data)r   r/   r0   r1   r4   r   r   r   r,      s    zListEmitter.__call__N)r   r	   r
   r5   r,   r   r   r   r   r<      s   r<   r/   r0   )Ztargetssourcesc                   s(   e Zd ZdZ fddZdd Z  ZS )OverrideWarnera'  A class for warning about keyword arguments that we use as
    overrides in a Builder call.

    This class exists to handle the fact that a single Builder call
    can actually invoke multiple builders.  This class only emits the
    warnings once, no matter how many Builders are invoked.
    c                s(   t  | tjjrt| d d | _d S )NzBuilder.OverrideWarner)r   r   r   Debugtrack_instancesr   already_warned)r   r   )r    r   r   r      s     
zOverrideWarner.__init__c             C   sT   | j r
d S x>|  D ]2}|tkrt| }d||f }tjtjj| qW d| _ d S )Nz)Did you mean to use `%s' instead of `%s'?r   )rB   r"   misleading_keywordsr   WarningswarnZMisleadingKeywordsWarning)r   kZaltmsgr   r   r   rE      s    zOverrideWarner.warn)r   r	   r
   r5   r   rE   r6   r   r   )r    r   r?      s   r?   c              K   sN  d}d| kr:d| krt dtj| d i | d< | d= ntd| kr| dd}d| kr\| d= tj| d rt| d |}tj|i | d< | | d< ntj| d | d< d| kr,| d }tj	|rtj
|}|st d	| t|| d< n6tj|rt|| d< ntj|r,t|| d< tf | }|dk	rJt||}|S )
zA factory for builder objects.N	generatorr%   z4You must not specify both an action and a generator.r   T
src_suffixr;   zISupplied emitter '%s' does not appear to refer to an Environment variable)r   r   ZActionZCommandGeneratorActiongetr   is_Dictr   r#   	is_StringZget_environment_varEmitterProxyr:   is_Listr<   BuilderBaseCompositeBuilder)kwZ	compositer   r;   varresultr   r   r   Builder   s<    



rT   c       	   	   C   s  x|D ]}|j r td| | r|jdk	r"|j|k	r"t|jddt|ddkr|t|jddt|ddkr|| jr"|jj}|jj|||j}| j|||}||krd||	|||jf }t
jt
jj| nFyd||d	|d	f }W n tk
r   d
| }Y nX t|| jr|j| krZd|j|| ||f }t||  |krd|ttt|  ttt|f }t|q|j|krd|ttt|jttt|f }t|qW | jrt|dkrtdttt|ttt|f dS )zValidate that the lists of target and source nodes are
    legal for this builder and environment.  Raise errors or
    issue warnings as appropriate.
    z=Multiple ways to build the same target were specified for: %sNZ	__subjectr   r   	overrideszeTwo different environments were specified for target %s,
	but they appear to have the same action: %szlTwo environments with different actions were specified for the same target: %s
(action 1: %s)
(action 2: %s)zutf-8zNTwo environments with different actions were specified for the same target: %szITwo different builders (%s and %s) were specified for the same target: %szMTwo different target lists have a target in common: %s  (from %s and from %s)zTMultiple ways to build the same target were specified for: %s  (from %s and from %s)zKMore than one source given for single-source builder: targets=%s sources=%s)Zside_effectr   Zhas_explicit_builderr1   getattrmultibuilderr%   Zget_contentsZ	genstringr   rD   rE   ZDuplicateEnvironmentWarningdecodeUnicodeDecodeErrorget_nameget_executorZget_all_targetsr!   r(   r)   r>   single_sourcer   )	rX   r1   tlistslisttr%   Z
t_contentscontentsrG   r   r   r   _node_errors  s@    *

$rb   c               @   sH   e Zd 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S )rM   a  This is a callable class that can act as a
    Builder emitter.  It holds on to a string that
    is a key into an Environment dictionary, and will
    look there at actual build time to see if it holds
    a callable.  If so, we will call that as the actual
    emitter.c             C   s   t j|| _d S )N)r   r   Z	to_StringrR   )r   rR   r   r   r   r   R  s    zEmitterProxy.__init__c             C   st   | j }x tj|r&||kr&|| }qW t|rB||||\}}n*tj|rlx|D ]}||||\}}qTW ||fS )N)rR   r   r   rL   r8   rN   )r   r/   r0   r1   r;   r4   r   r   r   r,   U  s    
zEmitterProxy.__call__c             C   s   | j |j kS )N)rR   )r   otherr   r   r   __eq__e  s    zEmitterProxy.__eq__c             C   s   | j |j k S )N)rR   )r   rc   r   r   r   __lt__h  s    zEmitterProxy.__lt__c             C   s   | j |j kS )N)rR   )r   rc   r   r   r   __le__k  s    zEmitterProxy.__le__c             C   s   | j |j kS )N)rR   )r   rc   r   r   r   __gt__n  s    zEmitterProxy.__gt__c             C   s   | j |j kS )N)rR   )r   rc   r   r   r   __ge__q  s    zEmitterProxy.__ge__N)r   r	   r
   r5   r   r,   rd   re   rf   rg   rh   r   r   r   r   rM   K  s   rM   c               @   s,  e Zd ZdZdddddddddddddedddfddZd	d
 Zdd Zdd Zd7ddZ	d8ddZ
d9ddZi i fddZddefddZdd Zg fddZdd Zg fdd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zi fd+d,Zd-d. Zejed/d0 Zd1d2 Zejed3d4 Zd5d6 ZdS ):rO   zdBase class for Builders, objects that create output
    nodes (files) from input nodes (files).
    N r   r   Fc             K   s  t jjrt| d i | _|| _|
| _t j|r8t	|}|| _
t j|rRt	|}|| _|| _d|krrd}t|d|krd}t||| _| | | | || _|| _|| _|| _|| _|	| _|r|| _i | _|tk	r|| jd< || _|d krg }nt j|s|g}|| _d S )NzBuilder.BuilderBaserU   zThe "overrides" keyword to Builder() creation has been removed;
	specify the items as keyword arguments to the Builder() call instead.scannerztThe "scanner" keyword to Builder() creation has been removed;
	use: source_scanner or target_scanner as appropriate.chdir)r   r@   rA   r   _memor%   rW   r   rK   r7   prefixr1   r]   	TypeErrorrU   
set_suffixset_src_suffixensure_suffixtarget_factorysource_factorytarget_scannersource_scannerr;   nameexecutor_kw_nullis_explicitrN   src_builder)r   r%   rm   r$   rI   rr   rs   rt   ru   r;   rW   r1   r]   rv   rk   ry   rz   rq   rU   rG   r   r   r   r   y  sL     



zBuilderBase.__init__c             C   s   t dd S )NzSDo not test for the Node.builder attribute directly; use Node.has_builder() instead)r   )r   r   r   r   __bool__  s    zBuilderBase.__bool__c             C   sn   y*t |d  | }t |d  | S  ttttfk
rh   y| jS  tk
rb   t	| j
S X Y nX dS )aB  Attempts to get the name of the Builder.

        Look at the BUILDERS variable of env, expecting it to be a
        dictionary containing this Builder, and return the key of the
        dictionary.  If there's no key, then return a directly-configured
        name (if there is one) or the name of the class (by default).BUILDERSN)r!   valuesindexr"   AttributeErrorr-   rn   
ValueErrorrv   r)   r    )r   r1   r~   r   r   r   r[     s    zBuilderBase.get_namec             C   s   | j |j kS )N)__dict__)r   rc   r   r   r   rd     s    zBuilderBase.__eq__c             C   s(   |s
| j }|r| |}ng }t||S )N)r1   r#   r   )r   r   r1   r   r   r   r   r     s    zBuilderBase.splitextc             C   sX   |sg S g }t j|s|g}x4|D ],}t j|rFt j||||}|| q$W |S )N)r   r   rN   rL   Z
adjustixesappend)r   filesprer   rq   rS   fr   r   r   _adjustixes  s    
zBuilderBase._adjustixesc                s    } j} j}|d|} ||} |} |}	|dkry|d j}
W n: t	k
r   t
d|d  Y q tk
r   g }Y qX  fdd}|
||	|g}n$|||	j} j||||d}jrg }x(|D ] }| s| || qW |dd }|dd }j|| d\}}x$|D ]}|jkrP|d qPW  j||||d} j||||d}||fS )z<Create and return lists of target and source nodes.
        Nr   z3Do not know how to create a target from source `%s'c                s    |  S )N)r   )r   )r1   r   r   r   <lambda>      z+BuilderBase._create_nodes.<locals>.<lambda>)r/   r0   )r/   r0   r1   )get_src_suffixget_factoryrr   rs   r   	arg2nodes
get_prefix
get_suffixZtarget_from_sourcer   r   
IndexErrorrq   r;   Z
is_derivedbuilder_setr   rX   )r   r1   r/   r0   src_sufrr   rs   r_   r   r   Zt_from_sr^   r   Znew_targetsr`   Z
orig_tlistZ
orig_slistr   )r1   r   r   _create_nodes  sF    






zBuilderBase._create_nodesc          	   C   sv  | j r| |||}| jrt|dkr|d krg }|d krHd gt| }xHt||D ]:\}}|d k	rj|g}|d k	rx|g}|| |||| qTW tj	|S |
  | |||\}	}
t|	dkrx|	D ]
}|	|_qW t| ||	|
 d }d }| jr0y|	d jdd}W n ttfk
r$   Y nX ||
 |d kr| jsnd}t|| |pX| jttt|	f | j|p~| j|	|
}|rytj|}W n tk
r   Y nX ||	|
 |d krtj| j|g |	|
|}|rtj|| xN|	D ]F}|j ! |_"|#|  |$| |%|
 |&| |'| j( qW |)drjx|	D ]}d|j*_+qXW tj	|	S )Nr   r   )Zcreatez+Builder %s must have an action to build %s.Z
SCONF_NODE),rz   src_builder_sourcesr]   r   zipextend_executer   ZNodeZNodeListrE   r   Ztarget_peersrb   rW   r\   r   r   Zadd_sourcesr%   r   r[   r1   r!   r(   r)   Z	batch_keyZExecutorZGetBatchExecutorr-   Z	add_batchZAddBatchExecutorZfsgetcwdcwdr   Zenv_setZ
add_sourceZset_executorZset_explicitry   rJ   Z
attributesZconftest_node)r   r1   r/   r0   overwarnrw   rS   Ztgtr2   r^   r_   r`   ZexecutorkeyZfmtZnoder   r   r   r   '  sn     











zBuilderBase._executec       	      K   s   |t kr| j}n| j }||d< d|krLtj|d rL||d |d< |rd|kr|d fdd}tj|sz|g}tt	||}|d= | j
r| j
 }|| q|}n| j
}||}| |||t||S )Nrk   srcdirc             S   s2   dd l }tj| r.|j| s.|j|| } | S )Nr   )os.pathr   r   rL   r   isabsjoin)r   r   osr   r   r   prependDirIfRelative  s    z2BuilderBase.__call__.<locals>.prependDirIfRelative)rx   rw   copyr   r   rL   substrN   r!   r(   rU   updateZOverrider   r?   )	r   r1   r/   r0   rk   rQ   Zekwr   Zenv_kwr   r   r   r,   w  s(    


zBuilderBase.__call__c             C   s   |r|d dkrd| S |S )Nr   )._$r   r   )r   Zsuffr   r   r   adjust_suffix  s    zBuilderBase.adjust_suffixc             C   s"   | j }t|r|||}||S )N)rm   r8   r   )r   r1   r>   rm   r   r   r   r     s    
zBuilderBase.get_prefixc             C   s   t |s| |}|| _d S )N)r8   r   r$   )r   r$   r   r   r   ro     s    
zBuilderBase.set_suffixc             C   s"   | j }t|r|||}||S )N)r$   r8   r   )r   r1   r>   r$   r   r   r   r     s    
zBuilderBase.get_suffixc                s4   |s
g }nt j|s|g} fdd|D  _d S )Nc                s"   g | ]}t |r|p |qS r   )r8   r   )r   r   )r   r   r   r     s    z.BuilderBase.set_src_suffix.<locals>.<listcomp>)r   r   rN   rI   )r   rI   r   )r   r   rp     s
    zBuilderBase.set_src_suffixc             C   s   |  |}|sdS |d S )z5Get the first src_suffix in the list of src_suffixes.ri   r   )r#   )r   r1   r3   r   r   r   r     s    
zBuilderBase.get_src_suffixc             C   s   || j |< dS )a?  Add a suffix-emitter mapping to this Builder.

        This assumes that emitter has been initialized with an
        appropriate dictionary type, and will throw a TypeError if
        not, so the caller is responsible for knowing that this is an
        appropriate method to call for the Builder in question.
        N)r;   )r   r$   r;   r   r   r   add_emitter  s    zBuilderBase.add_emitterc             C   s   i | _ | j| dS )z
        Add a new Builder to the list of src_builders.

        This requires wiping out cached values so that the computed
        lists of source suffixes get re-calculated.
        N)rl   rz   r   )r   rX   r   r   r   add_src_builder  s    zBuilderBase.add_src_builderc             C   s8   i }x.|  |D ] }x||D ]}|||< q W qW |S )au  
        Returns a dictionary mapping all of the source suffixes of all
        src_builders of this Builder to the underlying Builder that
        should be called first.

        This dictionary is used for each target specified, so we save a
        lot of extra computation by memoizing it for each construction
        environment.

        Note that this is re-computed each time, not cached, because there
        might be changes to one of our source Builders (or one of their
        source Builders, and so on, and so on...) that we can't "see."

        The underlying methods we call cache their computed values,
        though, so we hope repeatedly aggregating them into a dictionary
        like this won't be too big a hit.  We may need to look for a
        better way to do this if performance data show this has turned
        into a significant bottleneck.
        )get_src_buildersr#   )r   r1   sdictbldr   r   r   r   
_get_sdict  s
    zBuilderBase._get_sdictc          	      s,  |  |}| |}tttt|}||fdd g }xtj|D ]}tj	|r |
|}	|	sd|kr| |}
| |d |
d }n
 |j}	|	ry||	 }W n tk
r   || Y n<X ||d |g|}t|dkr fdd|D }|| qF|| qFW || j}|||S )Nc                s0    fdd|D }x|D ]}||kr|S qW d S )Nc                s   g | ]} | d  qS )Nr   )r   l)rv   r   r   r     s    zMBuilderBase.src_builder_sources.<locals>.match_src_suffix.<locals>.<listcomp>r   )rv   r#   lengthsZnode_suffixesr   r   )rv   r   match_src_suffix  s
    
z9BuilderBase.src_builder_sources.<locals>.match_src_suffixr   r   r   c                s   g | ]} |j r|qS r   )rv   )r   r`   )r   r   r   r     s    z3BuilderBase.src_builder_sources.<locals>.<listcomp>)r   r#   r!   setr(   r   r   r   ZflattenrL   r   r   r   rv   r-   r   r   r   r   rs   r   )r   r1   r0   r   r   r#   r   rS   sZmatch_suffixr   r   r^   rs   r   )r   r   r     s0    



zBuilderBase.src_builder_sourcesc             C   s   t |S )N)id)r   r1   r   r   r   _get_src_builders_key  s    z!BuilderBase._get_src_builders_keyc          	   C   s   t |}y| jd }W n" tk
r8   i }|| jd< Y n X y|| S  tk
rV   Y nX g }xL| jD ]B}tj|ry|d | }W n tk
r   wdY nX || qdW |||< |S )z
        Returns the list of source Builders for this Builder.

        This exists mainly to look up Builders referenced as
        strings in the 'BUILDER' variable of the construction
        environment and cache the result.
        r   r|   )r   rl   r-   rz   r   r   rL   r   )r   r1   memo_key	memo_dictZbuildersr   r   r   r   r     s(    	zBuilderBase.get_src_buildersc             C   s   t |S )N)r   )r   r1   r   r   r   _subst_src_suffixes_key:  s    z#BuilderBase._subst_src_suffixes_keyc                sx   t  }y| jd }W n" tk
r8   i }|| jd< Y n X y|| S  tk
rV   Y nX  fdd| jD }|||< |S )z
        The suffix list may contain construction variable expansions,
        so we have to evaluate the individual strings.  To avoid doing
        this over and over, we memoize the results for each construction
        environment.
        subst_src_suffixesc                s   g | ]}  |qS r   )r   )r   x)r1   r   r   r   P  s    z2BuilderBase.subst_src_suffixes.<locals>.<listcomp>)r   rl   r-   rI   )r   r1   r   r   r   r   )r1   r   r   =  s    zBuilderBase.subst_src_suffixesc             C   sj   i }|  |}x|D ]}d||< qW x@| |D ]2}x,||D ]}||kr@d||< || q@W q0W |S )a+  
        Returns the list of source suffixes for all src_builders of this
        Builder.

        This is essentially a recursive descent of the src_builder "tree."
        (This value isn't cached because there may be changes in a
        src_builder many levels deep that we can't see.)
        r   )r   r   r#   r   )r   r1   r   r   r   rX   r   r   r   r#   T  s    	

zBuilderBase.src_suffixes)N)F)NN) r   r	   r
   r5   rx   r   r{   r[   rd   r   r   r   r   r,   r   r   ro   r   rp   r   r   r   r   r   r   r   ZMemoizeZCountDictCallr   r   r   r#   r   r   r   r   rO   t  sR   1
	

@P"

+!rO   c                   s4   e Zd ZdZ fddZejdZdd Z	  Z
S )rP   zA Builder Proxy whose main purpose is to always have
    a DictCmdGenerator as its action, and to provide access
    to the DictCmdGenerator's add_action() method.
    c                s.   t jjrt| d t | || _|| _d S )NzBuilder.CompositeBuilder)r   r@   rA   r   r   r   cmdgenrX   )r   rX   r   )r    r   r   r   n  s
     
zCompositeBuilder.__init__r,   c             C   s"   | j || | | j   d S )N)r   r&   rp   r#   )r   r$   r%   r   r   r   r&   x  s    zCompositeBuilder.add_action)r   r	   r
   r5   r   r   r   ZDelegater,   r&   r6   r   r   )r    r   rP   h  s   rP   c             C   s   t | tpt | tpt| S )z"Returns True if the specified obj is one of our Builder classes.

    The test is complicated a bit by the fact that CompositeBuilder
    is a proxy, not a subclass of BuilderBase.
    )
isinstancerO   rP   r8   )objr   r   r   is_a_Builder|  s    

r   )!r5   collectionsr   r   ZSCons.Actionr   ZSCons.DebugZSCons.ExecutorZSCons.MemoizeZ
SCons.UtilZSCons.Warningsr   ZSCons.Errorsr   r   r   rx   r   r   r+   r   r7   r:   r<   rC   r?   rT   rb   rM   rO   ZProxyrP   r   r   r   r   r   <module>d   s8   2	*1)   w