B
    ›³ëbÝÐ  ã               @   sð  d Z dZ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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ZddlZddlZddlmZ  da!da"da#da$da%da&da'da(da)da*da+da,g Z-dd„ Z.G dd	„ d	e/ƒZ0ej1j2Z2ej1 3¡ Z4G d
d„ dƒZ5ej1 6¡ a7dd„ Z8g Z9d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ƒZAdd„ ZBe
jCfdd„ZDe
jCfdd„ZEG dd„ dƒZFeFƒ aGd d!„ ZHd"d#„ ZId$d%„ ZJdSd&d'„ZKG d(d)„ d)ƒZLG d*d+„ d+eLƒZMeMƒ ZNG d,d-„ d-eLƒZOeOƒ ZPd.d/„ ZQd0d1„ ZRd2d3„ ZSd4d5„ ZTd6d7„ ZUd8d9„ ZVd:g dfd;d<„ZWd=d>„ ZXd?d@„ ZYdTdAdB„ZZdUdCdD„Z[dEdF„ Z\dGdH„ Z]dIdJ„ Z^dKdL„ Z_dMdN„ Z`dOdP„ ZadQdR„ ZbdS )Vaœ  The main() function used by the scons script.

Architecturally, this *is* the scons script, and will likely only be
called from the external "scons" wrapper.  Consequently, anything here
should not be, or be considered, part of the build engine.  If it's
something that we expect other software to want to use, it should go in
some other module.  If it's specific to the "scons" script invocation,
it goes here.
)é   é   é    r   N)Ú__version__Fc               C   s   t jt _t jt _d S )N)ÚsysÚ
__stderr__ÚstderrÚ
__stdout__Ústdout© r
   r
   ú0lib/python3.7/site-packages/SCons/Script/Main.pyÚ	revert_ioU   s    r   c               @   s   e Zd ZdS )ÚSConsPrintHelpExceptionN)Ú__name__Ú
__module__Ú__qualname__r
   r
   r
   r   r   ]   s   r   c               @   sR   e Zd ZdZdZdZddd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú
ProgressorÚ r   z$TARGETé   NFc             C   sr   |d krt j}|| _|| _|| _|| _t|ƒr6|| _n8tj	 
|¡rL| j| _n"| | j¡dkrf| j| _n| j| _d S )Néÿÿÿÿ)r   r	   ÚobjÚfileÚintervalÚ	overwriteÚcallableÚfuncÚSConsÚUtilÚis_ListÚspinnerÚfindÚtarget_stringÚreplace_stringÚstring)Úselfr   r   r   r   r
   r
   r   Ú__init__j   s    

zProgressor.__init__c             C   s    | j  |¡ | j  ¡  || _d S )N)r   ÚwriteÚflushÚprev)r#   Úsr
   r
   r   r%   |   s    
zProgressor.writec             C   sB   | j r>t| j ƒ}| j d dkr&|d }|  d| d ¡ d| _ d S )Nr   )Ú
úr   ú r*   r   )r'   Úlenr%   )r#   Úlengthr
   r
   r   Úerase_previous   s    
zProgressor.erase_previousc             C   s    |   | j| jt| jƒ  ¡ d S )N)r%   r   Úcountr,   )r#   Únoder
   r
   r   r   ‰   s    zProgressor.spinnerc             C   s   |   | j¡ d S )N)r%   r   )r#   r0   r
   r
   r   r"   Œ   s    zProgressor.stringc             C   s   |   | j | jt|ƒ¡¡ d S )N)r%   r   Úreplacer    Ústr)r#   r0   r
   r
   r   r!      s    zProgressor.replace_stringc             C   s8   | j d | _ | j | j dkr4| jr*|  ¡  |  |¡ d S )Nr   r   )r/   r   r   r.   r   )r#   r0   r
   r
   r   Ú__call__’   s
    zProgressor.__call__)r   NF)r   r   r   r'   r/   r    r$   r%   r.   r   r"   r!   r3   r
   r
   r
   r   r   e   s   
r   c              O   s   t | |Žad S )N)r   ÚProgressObject)ÚargsÚkwr
   r
   r   ÚProgress›   s    r7   c               C   s   t S )N)Ú_BuildFailuresr
   r
   r
   r   ÚGetBuildFailures¥   s    r9   c               @   s^   e Zd ZdZeZdd„ Zdd„ Zdd„ Zdd	„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )Ú	BuildTaskzAn SCons build task.c             C   s   t d| ƒ d S )Nzscons: )Údisplay)r#   Úmessager
   r
   r   r;   ­   s    zBuildTask.displayc             C   s8   t | jtjjƒs*x| jD ]}|  |¡ qW tjj | ¡S )N)	Ú
isinstanceÚprogressr   r   ÚNullÚtargetsÚ
TaskmasterÚOutOfDateTaskÚprepare)r#   Útargetr
   r
   r   rC   °   s    zBuildTask.preparec             C   s<   t jj | ¡rdS | jr8| jd  ¡ r8tdt| j	ƒ ƒ dS )NTr   zscons: `%s' is up to date.F)
r   rA   rB   Úneeds_executeÚtopr@   Úhas_builderr;   r2   r0   )r#   r
   r
   r   rE   ¶   s
    zBuildTask.needs_executec             C   sœ   t rt ¡ }td kr|atjj | ¡ t r˜t ¡ }|at|| 7 at	rzt
j dt| jƒ|f ¡ t
j dt| jƒ|f ¡ t
j dt| jƒ|| f ¡ d S )Nz*Command execution start timestamp: %s: %f
z(Command execution end timestamp: %s: %f
z'Command execution time: %s: %f seconds
)Ú
print_timeÚtimeÚfirst_command_startr   rA   rB   ÚexecuteÚlast_command_endÚcumulative_command_timeÚprint_action_timestampsr   r	   r%   r2   r0   )r#   Ú
start_timeZfinish_timer
   r
   r   rK   ½   s&    zBuildTask.executeé   c             C   sb   t  | jd ¡ | jjr(tjj | ¡ n6| jj	rHtjj 
| ¡ |a|antjj | ¡ |a|ad S )Nr   )r8   ÚappendÚ	exceptionÚoptionsÚignore_errorsr   rA   rB   ÚexecutedÚ
keep_goingZfail_continueÚexit_statusÚthis_build_statusZ	fail_stop)r#   Ústatusr
   r
   r   Ú	do_failedØ   s    zBuildTask.do_failedc             C   sþ   | j d }| jrì| ¡ sì|jsì| ¡ sÐ|jjdkrJd|jj|| ¡ f }nd|jj|f }tj	 
d| ¡ | jjs~tj	 
d¡ tj	 
d¡ ytj ||¡‚W n( tk
r²   ‚ Y n   |  ¡  Y nX |  ¡  qútd| ƒ tjj | ¡ ntjj | ¡ d S )	Nr   )ÚFileÚDirÚEntryz,Do not know how to make %s target `%s' (%s).z'Do not know how to make %s target `%s'.zscons: *** z  Stop.r)   z#scons: Nothing to be done for `%s'.)r@   rF   rG   Úside_effectÚexistsÚ	__class__r   Úget_abspathr   r   r%   rS   rV   r   ÚErrorsÚ
BuildErrorÚKeyboardInterruptZexception_setrZ   ÚprintrA   rB   rU   )r#   ÚtÚerrstrr
   r
   r   rU   ç   s(    

zBuildTask.executedc             C   sª  |   ¡ }y|\}}}W n  tk
r6   |\}}d }Y nX |d kr|yt  ¡ d d … \}}}W n  tk
rz   |\}}d }Y nX |d krˆ|}tj |¡}|js¢| j|_|j}tj |¡sº|g}d 	t
t|ƒ¡}d}tj |||f ¡ |j d r^|j d r^t|j d ttjjtjjfƒs^|j \}	}
}|rNtrNtj d¡ tj|tjd t |	|
|¡ n(|r†tr†tj d¡ tj|tjd |||f| _|  |j¡ |  ¡  d S )Nz, zscons: *** [%s] %s
rP   r   zscons: internal stack trace:
)r   )Úexc_infoÚ
ValueErrorr   r   rb   Zconvert_to_BuildErrorr0   r   r   ÚjoinÚmapr2   r   r%   r=   ÚEnvironmentErrorÚ	StopErrorÚ	UserErrorÚprint_stacktraceÚ	tracebackÚprint_tbÚprint_exceptionrR   rZ   Ú
exitstatusZ	exc_clear)r#   rh   rf   ÚeÚtbZ
buildErrorr0   ÚnodenameZerrfmtÚtypeÚvalueZtracer
   r
   r   Úfailed   sN    

zBuildTask.failedc             C   s`   | j rN| jd }x| jjD ]}| |¡ qW | jjrN| ¡ }|rNtƒ  t|ƒ tj	j
 | ¡ d S )Nr   )rF   r@   rS   Útree_printersr;   Údebug_includesZrender_include_treere   r   rA   rB   Úpostprocess)r#   rf   ÚtpÚtreer
   r
   r   r|   8  s    
zBuildTask.postprocessc             C   sB   t jj | ¡ | jr>| jjr>| jd  ¡ }|r>tj	 
d| ¡ dS )zMake a task ready for executionr   zscons: N)r   rA   rB   Ú
make_readyZout_of_daterS   Údebug_explainÚexplainr   r	   r%   )r#   Zexplanationr
   r
   r   r   D  s
    zBuildTask.make_readyN)rP   )r   r   r   Ú__doc__r4   r>   r;   rC   rE   rK   rZ   rU   ry   r|   r   r
   r
   r
   r   r:   ©   s   
8r:   c               @   s\   e Zd ZdZddd„Zdd„ Zddd„Zd	d
„ Zdd„ ZeZ	e
jjjZe
jjjZdd„ ZdS )Ú	CleanTaskzAn SCons clean task.Tc          
   C   sb  yöt j |¡rôt j |¡s&t j |¡rB|r4t  |¡ td| ƒ n²t j |¡ràt j |¡sàxhtt  	|¡ƒD ]V}t j 
||¡}t j 
||¡}t j |¡r²|r¤t  |¡ td| ƒ qj|  |||¡ qjW |rÒt  |¡ td| ƒ nd}tj || ¡‚W nf tjjk
r& } zt|ƒ W d d }~X Y n8 ttfk
r\ } ztd| |jƒ W d d }~X Y nX d S )NzRemoved zRemoved directory z/Path '%s' exists but isn't a file or directory.zscons: Could not remove '%s':)ÚosÚpathÚlexistsÚisfileÚislinkÚunlinkr;   ÚisdirÚsortedÚlistdirrj   Ú	fs_deleteÚrmdirr   rb   rn   re   ÚIOErrorÚOSErrorÚstrerror)r#   r…   ZpathstrÚremovert   Úpr(   rg   r
   r
   r   r   O  s0     
 
 
zCleanTask.fs_deletec             C   s0   g }| j d }| ¡ s|jr,dd„ | j D ƒ}|S )Nr   c             S   s   g | ]}|j s|‘qS r
   )Znoclean)Ú.0rf   r
   r
   r   ú
<listcomp>n  s    z1CleanTask._get_files_to_clean.<locals>.<listcomp>)r@   rG   r^   )r#   ÚresultrD   r
   r
   r   Ú_get_files_to_cleanj  s
    
zCleanTask._get_files_to_cleanc             C   sJ   | j d }|tjjkrFtjj| }x"|D ]}|  | ¡ t|ƒ|¡ q(W d S )Nr   )r@   r   ZEnvironmentZCleanTargetsr   ra   r2   )r#   r’   rD   ÚfilesÚfr
   r
   r   Ú_clean_targetsq  s
    

zCleanTask._clean_targetsc             C   s:   x(|   ¡ D ]}| ¡ s
tdt|ƒ ƒ q
W | jdd d S )NzRemoved F)r’   )r—   rŠ   r;   r2   rš   )r#   rf   r
   r
   r   Úshowx  s    zCleanTask.showc             C   s|   xj|   ¡ D ]^}y| ¡ }W n8 tk
rR } ztd t|ƒ¡|jƒ W d d }~X Y q
X |r
tdt|ƒ ƒ q
W | jdd d S )Nzscons: Could not remove '{0}'zRemoved T)r’   )	r—   r’   r   re   Úformatr2   r‘   r;   rš   )r#   rf   Zremovedrt   r
   r
   r   r’   ~  s    (zCleanTask.removec             C   s   d S )Nr
   )r#   r
   r
   r   rC   ›  s    zCleanTask.prepareN)T)T)r   r   r   r‚   r   r—   rš   r›   r’   rK   r   rA   ZTaskZexecuted_without_callbacksrU   Zmake_ready_allr   rC   r
   r
   r
   r   rƒ   M  s   



rƒ   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚQuestionTaskz+An SCons task for the -q (question) option.c             C   s   d S )Nr
   )r#   r
   r
   r   rC      s    zQuestionTask.preparec             C   s@   | j d  ¡ tjjks*| jr<| j d  ¡ s<dada| j	 
¡  d S )Nr   r   )r@   Z	get_stater   ÚNodeZ
up_to_daterF   r_   rW   rX   ZtmÚstop)r#   r
   r
   r   rK   £  s
    zQuestionTask.executec             C   s   d S )Nr
   )r#   r
   r
   r   rU   ¬  s    zQuestionTask.executedN)r   r   r   r‚   rC   rK   rU   r
   r
   r
   r   r   ž  s   	r   c               @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚTreePrinterFc             C   s   || _ || _|| _|| _d S )N)ÚderivedÚprunerY   Ú	sLineDraw)r#   r¡   r¢   rY   r£   r
   r
   r   r$   ±  s    zTreePrinter.__init__c             C   s   |  ¡ S )N)Úall_children)r#   r0   r
   r
   r   Úget_all_children¶  s    zTreePrinter.get_all_childrenc             C   s   |  d ¡}dd„ |D ƒS )Nc             S   s   g | ]}|  ¡ r|‘qS r
   )rG   )r”   Úxr
   r
   r   r•   º  s    z4TreePrinter.get_derived_children.<locals>.<listcomp>)r¤   )r#   r0   Zchildrenr
   r
   r   Úget_derived_children¸  s    
z TreePrinter.get_derived_childrenc             C   sB   | j r| j}n| j}| jrdp d}tjj||| j|d| jd d S )NrP   r   T)r¢   ZshowtagsZ	lastChildZsingleLineDraw)	r¡   r§   r¥   rY   r   r   Z
print_treer¢   r£   )r#   rf   r   r(   r
   r
   r   r;   »  s
    zTreePrinter.displayN)FFFF)r   r   r   r$   r¥   r§   r;   r
   r
   r
   r   r    °  s   
r    c               C   s   t j ¡ d S )Nr   )r   ÚversionÚsplitr
   r
   r
   r   Úpython_version_stringÄ  s    rª   c             C   s   | t k S )N)Úminimum_python_version)r¨   r
   r
   r   Úpython_version_unsupportedÇ  s    r¬   c             C   s   | t k S )N)Údeprecated_python_version)r¨   r
   r
   r   Úpython_version_deprecatedÊ  s    r®   c               @   s,   e Zd ZdZG dd„ dƒZeƒ Zdd„ ZdS )ÚFakeOptionParseraÆ  
    A do-nothing option parser, used for the initial OptionsParser variable.

    During normal SCons operation, the OptionsParser is created right
    away by the main() function.  Certain tests scripts however, can
    introspect on different Tool modules, the initialization of which
    can try to add a new, local option to an otherwise uninitialized
    OptionsParser object.  This allows that introspection to happen
    without blowing up.

    c               @   s   e Zd Zdd„ ZdS )z!FakeOptionParser.FakeOptionValuesc             C   s   d S )Nr
   )r#   Úattrr
   r
   r   Ú__getattr__Û  s    z-FakeOptionParser.FakeOptionValues.__getattr__N)r   r   r   r±   r
   r
   r
   r   ÚFakeOptionValuesÚ  s   r²   c             O   s   d S )Nr
   )r#   r5   r6   r
   r
   r   Úadd_local_optionÞ  s    z!FakeOptionParser.add_local_optionN)r   r   r   r‚   r²   Úvaluesr³   r
   r
   r
   r   r¯   Î  s   r¯   c              O   s    d|krd |d< t j| |Ž}|S )NÚdefault)ÚOptionsParserr³   )r5   r6   r–   r
   r
   r   Ú	AddOptionã  s    r·   c             C   s   t tj| ƒS )N)Úgetattrr¶   r´   )Únamer
   r
   r   Ú	GetOptioné  s    rº   c             C   s   t j | |¡S )N)r¶   r´   Z
set_option)r¹   rx   r
   r
   r   Ú	SetOptionì  s    r»   c             C   s   t j| d d S )N)r   )r¶   Ú
print_help)r   r
   r
   r   Ú	PrintHelpï  s    r½   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚStatsc             C   s    g | _ g | _| j| _| j| _d S )N)ÚstatsÚlabelsÚ
do_nothingrQ   Úprint_stats)r#   r
   r
   r   r$   ó  s    zStats.__init__c             C   s   || _ | j| _| j| _d S )N)ÚoutfpÚ	do_appendrQ   Údo_printrÂ   )r#   rÃ   r
   r
   r   Úenableø  s    zStats.enablec             O   s   d S )Nr
   )r#   r5   r6   r
   r
   r   rÁ   ü  s    zStats.do_nothingN)r   r   r   r$   rÆ   rÁ   r
   r
   r
   r   r¾   ò  s   r¾   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú
CountStatsc             C   s"   | j  |¡ | j tj ¡ ¡ d S )N)rÀ   rQ   r¿   r   ÚDebugZfetchLoggedInstances)r#   Úlabelr
   r
   r   rÄ      s    zCountStats.do_appendc             C   sb  i }x6| j D ],}x&dd„ |D ƒD ]}ddddg||< q W qW d}x4| j D ]*}x|D ]\}}||| |< qRW |d }qHW | j d¡ dg}dg}t| j ƒ}d |d	g|  | ¡}	d |d
g|  | ¡}
| jd |… }| d¡ | j |	tdd„ |D ƒƒ ¡ | j |	tdd„ |D ƒƒ ¡ x@t| 	¡ ƒD ]0}|| d |… |g }| j |
t|ƒ ¡ q*W d S )Nc             S   s   g | ]}|d  ‘qS )r   r
   )r”   rf   r
   r
   r   r•     s    z'CountStats.do_print.<locals>.<listcomp>r   r   zObject counts:
z   z   %s
r   z %7sz %7d)r   ZClassc             S   s   g | ]}|d  ‘qS )r   r
   )r”   r¦   r
   r
   r   r•     s    c             S   s   g | ]}|d  ‘qS )r   r
   )r”   r¦   r
   r
   r   r•     s    )
r¿   rÃ   r%   r,   rj   rÀ   rQ   Útupler‹   Úkeys)r#   Zstats_tabler(   ÚnÚiÚcZpreZpostÚlZfmt1Zfmt2rÀ   ÚkÚrr
   r
   r   rÅ     s,    

zCountStats.do_printN)r   r   r   rÄ   rÅ   r
   r
   r
   r   rÇ   ÿ  s   rÇ   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚMemStatsc             C   s"   | j  |¡ | j tj ¡ ¡ d S )N)rÀ   rQ   r¿   r   rÈ   Úmemory)r#   rÉ   r
   r
   r   rÄ     s    zMemStats.do_appendc             C   s8   d}x.t | j| jƒD ]\}}| j |||f ¡ qW d S )NzMemory %-32s %12d
)ÚziprÀ   r¿   rÃ   r%   )r#   ÚfmtrÉ   r¿   r
   r
   r   rÅ   !  s    zMemStats.do_printN)r   r   r   rÄ   rÅ   r
   r
   r
   r   rÒ     s   rÒ   c             C   sF   t  ¡ \}}}t ||¡}x|D ]}t j |d ¡ q W t  d¡ dS )zUHandle syntax errors. Print out a message and show where the error
    occurred.
    r)   rP   N)r   rh   rp   Úformat_exception_onlyr   r%   Úexit)rt   Úetyperx   ru   ÚlinesÚliner
   r
   r   Ú_scons_syntax_error*  s
    
rÛ   c             C   sD   |   ¡  x2| D ]*}|d }| tjd tj ¡dkr|S qW | d S )z½
    Find the deepest stack frame that is not part of SCons.

    Input is a "pre-processed" stack trace in the form
    returned by traceback.extract_tb() or traceback.extract_stack()
    r   r   r   )Úreverser   r„   Úsep)ru   ÚframeÚfilenamer
   r
   r   Úfind_deepest_user_frame4  s    
rà   c             C   sj   t  ¡ \}}}tr t |||¡ tt |¡ƒ\}}}}t j d| ¡ t j d|||f ¡ t  	d¡ dS )zìHandle user errors. Print out a message and a description of the
    error, along with the line number and routine where it occured.
    The file and line number will be the deepest stack frame that is
    not part of SCons itself.
    z
scons: *** %s
zFile "%s", line %d, in %s
rP   N)
r   rh   ro   rp   rr   rà   Ú
extract_tbr   r%   r×   )rt   rØ   rx   ru   rß   ÚlinenoÚroutineÚdummyr
   r
   r   Ú_scons_user_errorF  s    rå   c             C   sN   t  ¡ \}}}tt |¡ƒ\}}}}t j d|  ¡ t j d|||f ¡ dS )zðHandle user warnings. Print out a message and a description of
    the warning, along with the line number and routine where it occured.
    The file and line number will be the deepest stack frame that is
    not part of SCons itself.
    z
scons: warning: %s
zFile "%s", line %d, in %s
N)r   rh   rà   rp   rá   r   r%   )rt   rØ   rx   ru   rß   râ   rã   rä   r
   r
   r   Ú_scons_user_warningU  s    ræ   c             C   sD   t t ¡ ƒ\}}}}tj d| jd  ¡ tj d|||f ¡ dS )zÈSlightly different from _scons_user_warning in that we use the
    *current call stack* rather than sys.exc_info() to get our stack trace.
    This is used by the warnings framework to print warnings.z
scons: warning: %s
r   zFile "%s", line %d, in %s
N)rà   rp   Úextract_stackr   r   r%   r5   )rt   rß   râ   rã   rä   r
   r
   r   Ú_scons_internal_warning`  s    rè   c               C   s   t dƒ t ¡  t d¡ dS )z‚Handle all errors but user errors. Print out a message telling
    the user what to do in this case and print a normal trace.
    zinternal errorrP   N)re   rp   Ú	print_excr   r×   r
   r
   r
   r   Ú_scons_internal_errorh  s    rê   r   c             C   sx   |sddddddg}x^|D ]V}t j | |¡}t j |¡r<|S t j |¡sx&|D ]}t j t j ||¡¡rN|S qNW qW dS )z¥This function checks that an SConstruct file exists in a directory.
    If so, it returns the path of the file. By default, it checks the
    current directory.
    Z
SConstructZ
SconstructZ
sconstructzSConstruct.pyzSconstruct.pyzsconstruct.pyN)r„   r…   rj   r‡   Úisabs)ÚdirnameÚrepositoriesÚfilelistr   ÚsfileÚrepr
   r
   r   Ú_SConstruct_existsp  s    

rñ   c             C   sJ  | j }d|krFd}d}|r0t tj¡ dtj_nd}tj 	tjj
|¡ d|kr`| j tdd¡ d|k| _d|kr|dtjj_d	|k| _d
|kad|kr¢t tj¡ d|katr¶dtj_d|krÆdtj_d|krÒdad|krì| j tdd¡ d|krødad|kr
dadad|kr"| j tƒ ¡ d|kr4dtj_d|krFdtj_d S )Nr/   FTzi--debug=count is not supported when running SCons
	with the python -O option or optimized (.pyo) modules.Zdtree)r¡   r   ZfindlibsZincludesZmemoizerrÓ   ZobjectsZpresubZ
stacktraceZstree)rY   rI   zaction-timestampsr~   rC   Ú	duplicate)ÚdebugÚcount_statsrÆ   r   r	   r   rÈ   Ztrack_instancesÚWarningsÚwarnZNoObjectCountWarningrz   rQ   r    r€   ÚScannerZProgZprint_find_libsr{   Úprint_memoizerÚmemory_statsÚprint_objectsÚActionZprint_actions_presubro   rH   rN   rA   Zprint_preparerž   Zprint_duplicate)rS   Zdebug_valuesZenable_countÚmsgr
   r
   r   Ú_set_debug_values  sL    







rý   c             C   s4   d}x*| D ]"}t j |¡r |}q
|d | }q
W |S )NÚ.ú/)r„   r…   rë   )Zplistr…   Údr
   r
   r   Ú_create_path²  s    
r  c          	   C   sF  |r
d}nd}d}t j | |¡}t j |¡sD|r@tj d| ¡‚dS tj dt j 	|¡¡ d}d}d	}t j ||¡}t j ||¡}t j |¡r¦tj
j dt j 	|¡¡ t j |¡s¶dS yDytjd
 }	W n* tk
rò   d}
tj |
 |¡¡‚Y nX tj ||¡}|j|jddœ}t d¡}x,|	j ¡ D ]\}}| |¡s(|||< q(W t|jdƒ}| ¡ }W dQ R X yt||jdƒ}t||ƒ W nD tk
rž   ‚ Y n\ tk
rÊ   d}
tj  |
 |¡¡ ‚ Y n0X x,| ¡ D ] \}}| |¡sÖ||	j|< qÖW W nD tk
r   ‚ Y n. tk
r@   d}
tj  |
 |¡¡ ‚ Y nX dS )a  Load the site directory under topdir.

    If a site dir name is supplied use it, else use default "site_scons"
    Prepend site dir to sys.path.
    If a "site_tools" subdir exists, prepend to toolpath.
    Import "site_init.py" from site dir if it exists.
    TZ
site_sconsFzsite dir %s not found.Nr   zsite_init.pyZ	site_initZ
site_toolszSCons.Scriptz-cannot import {}: missing SCons.Script module)Ú__file__r   r‚   z	__[^_]+__rÑ   Úexecz%*** Error loading site_init file {}:
z%*** cannot import site init file {}:
)!r„   r…   rj   r_   r   rb   rn   r   ÚinsertÚabspathZToolZDefaultToolpathÚmodulesÚKeyErrorÚInternalErrorrœ   Ú	importlibÚutilÚspec_from_file_locationÚoriginr¹   ÚreÚcompileÚ__dict__ÚitemsÚmatchÚopenÚreadr  rd   Ú	Exceptionr   r%   )ÚtopdirZsite_dir_nameZerr_if_not_foundÚsite_dirZsite_init_filenameZsite_init_modnameZsite_tools_dirnameZsite_init_fileZsite_tools_dirÚmrÕ   ÚspecZsite_mZ	re_dunderrÐ   Úvr™   ÚcodeZcodeobjr
   r
   r   Ú_load_site_scons_dir»  sj    
r  c             C   sè   t j ¡ }dd„ }|dks"|dkrrtj d¡tj d¡tj d¡g}tj d¡}||krb| |¡ | |d	ƒ¡ nD|d
kr’ddd|dƒ|d	ƒg}n$|dkrªdd|d	ƒg}nd|d	ƒg}|| g }x"|D ]}|rØtd|ƒ t|ƒ qÆW dS )zÍLoad all of the predefined site_scons dir.
    Order is significant; we load them in order from most generic
    (machine-wide) to most specific (topdir).
    The verbose argument is only for testing.
    c             S   s   t j d|  ¡S )Nz~/)r„   r…   Ú
expanduser)r   r
   r
   r   Úhomedir  s    z*_load_all_site_scons_dirs.<locals>.homedirZwin32Úcygwinz%AllUsersProfile%\sconsz(%AllUsersProfile%\Application Data\sconsz%LocalAppData%\sconsz%AppData%\sconsz.sconsÚdarwinz"/Library/Application Support/SConsz/opt/local/share/sconsz/sw/share/sconsz!Library/Application Support/SConsZsunosz/opt/sfw/sconsz/usr/share/sconszLoading site dir N)	r   ÚPlatformZplatform_defaultr„   r…   Ú
expandvarsrQ   re   r  )r  ÚverboseÚplatformr  ZsysdirsZ
appdatadirÚdirsr   r
   r
   r   Ú_load_all_site_scons_dirs  s6    







r%  c             C   s   t | dƒ d S )NT)r%  )r   r
   r
   r   Útest_load_all_site_scons_dirs8  s    r&  c             C   sH   |j }|j}|r,|d dkr$d| }|| }d}|| ||j|j|jf S )Nr   rþ   z	%s: v%s, %s, by %s on %s
)r   Z	__build__Z__date__Z__developer__Z__buildsys__)rÉ   Úmoduler¨   ÚbuildrÕ   r
   r
   r   Úversion_string;  s    r)  c             C   s   |j }d| |f S )Nz	%s path: %s
)Ú__path__)rÉ   r'  r…   r
   r
   r   Úpath_stringI  s    r+  c          
   C   sl  | j }tjjtjjg}x|D ]}tj |¡ qW ttj_tj |j	¡ y
|j
}W n tk
rd   Y nX t
 |¡ xt
D ]\}}tj 	||¡ qvW tjjjsª|jrªdtjj_|jrºdtjj_|jrÐtjj |j¡ |jrêtj t|jƒ¡}nt ¡ }d }|jrLd}xH|rJt||j|jƒsJtj  |¡\}}	|	rBtj !|	|¡}nd}qW |rª|t ¡ krª|j"stt#d| ƒ yt $|¡ W n& t%k
r¨   t&j' (d| ¡ Y nX tjj )¡ }
x|jD ]}|
 *|¡ q¾W g }|jrê| |j¡ |st|j|jd}|r| +|¡ |s.|j,r"t-‚tj. /d¡‚|d d	krF|
 ¡ }n|
 0|d ¡j1}|
 2|¡ t3|ƒ |j4tj_4|j5tj_5|j6tj_6|j7ržd
tj8_9d tj:_;|j<r®d
tj8_9|j=rÂtj8 >d¡ |j,rÖtj8 >d¡ tj8 ?|j@¡ tj8 AtB¡ |jCs |j"r
tB Dd¡ |jEd kr$tF| G¡ ƒ n|jEr<tH| G¡ |jEƒ |jIrR|jIt&j t&_|jJrbdtj_Jg }g }xJ| jKD ]@}| Ld	¡sr|dkrqrd|kr¦| +|¡ n
| +|¡ qrW tjM N|| jO ¡ tjM P|¡ tQt&jRdƒrît&jR S¡ sþtjT Ut&jR¡t&_RtQt&j'dƒrt&j' S¡ s(tjT Ut&j'¡t&_'tV +d¡ tW +d¡ tBdƒ tXrRtY Y¡ }y$x|D ]}tjMjZ Z|
|¡ qZW W nH tj.j[k
r¾ } z$t\ƒ  t&j' (d| ¡ t& ]d¡ W d d }~X Y nX tXrÒtY Y¡ | a^tBdƒ tV +d¡ tW +d¡ tj |j	¡ t_ƒ r4d}d !t`tatbƒ¡}tj 	tjjc||tdƒ f ¡ |j,sZtj8 e¡ rZtj8 ftjg h¡ ¡ d| _i|  j| jK|¡ |j,r¦tjMjk}|d krŽt-‚ntl|ƒ tldƒ damd S |
 $|
jn¡ tjj od
¡ |j4tj_4tjj p|jq¡ |
 r|js¡ |jttju_vtjT w|jx¡ |jyr|jyd tjjj0_ztj {¡ }|jJrBtjMj| }|
t~|||¡ n&t|
|||ƒ}|sht\ƒ  tldƒ damd S )NTrþ   r   zscons: Entering directory `%s'z!Could not change directory to %s
)rí   rî   zNo SConstruct file found.r   ú-r   ÚcleanÚhelp)r   z""z''ú=Úisattyz before reading SConscript files:)zpre-r  z#scons: Reading SConscript files ...zscons: *** %s  Stop.
rP   z%scons: done reading SConscript files.zafter reading SConscript files:)zpost-r  zrSupport for pre-%s Python version (%s) is deprecated.
    If this will cause hardship, contact scons-dev@scons.orgFz1Use scons -H for help about command-line options.i   zFound nothing to build)€r´   r   rõ   ZWarningOnByDefaultZDeprecatedWarningZenableWarningClassrè   Z_warningOutZprocess_warn_stringsrö   Údelayed_warningsÚAttributeErrorÚextendr   Z
virtualenvZvirtualenv_enabled_by_defaultZenable_virtualenvZignore_virtualenvÚ	diskcheckrž   ÚFSÚset_diskcheckÚ	directoryr„   r…   r  r  ÚgetcwdÚclimb_uprñ   Z
repositoryr   r©   rj   Úsilentr;   Úchdirr   r   r   r%   Zget_default_fsZ
RepositoryrQ   r.  r   rb   rn   r[   ÚdirZset_SConstruct_dirrý   Zimplicit_cacheZimplicit_deps_changedZimplicit_deps_unchangedÚno_execÚSConfÚdryrunrû   Úexecute_actionsÚquestionr-  ZSetBuildTypeZSetCacheModeZconfigZSetProgressDisplayÚprogress_displayÚno_progressÚset_moder  r%  Zget_internal_pathr  Zinclude_dirÚinteractiveZlargsÚ
startswithÚScriptZ_Add_TargetsZrargsZ_Add_ArgumentsÚhasattrr	   r0  r   Z
Unbufferedrù   rô   rH   rI   Ú_SConscriptrm   r   r×   Úsconscript_timer®   rk   r2   r­   ZPythonVersionWarningrª   ZNeedConfigHBuilderZCreateConfigHBuilderZDefaultsZDefaultEnvironmentZpreserve_unknown_optionsÚ
parse_argsÚ	help_textre   rW   ZTopZsave_stringsZset_duplicaterò   Zset_max_driftZ	max_driftÚ
stack_sizeÚJobZexplicit_stack_sizeZset_hash_formatZhash_formatZmd5_chunksizeZhash_chunksizeZplatform_moduleZInteractiveZinteractr¶   Ú_build_targets)ÚparserrS   Zdefault_warningsZwarningZdwZwarning_typer<   Z
script_dirÚ
target_topZ	last_partÚfsrð   Zscriptsrï   r   r@   Z	xmit_argsÚarO   Zscriptrt   rü   Zdeprecated_version_stringrL  r#  Únodesr
   r
   r   Ú_mainM  s2   	




























rU  c                sl  da t |jp|j ¡ t |j ¡ |j tj_|j	 tj_
|j	 tj_|j	tj_|jrjtjj |j¡ |j tj_|jtj_|jtj_|jtj_|jtj_|j	r®tjt_ntjt_d }|sÎtjjtjjkrê|rà|   |¡}d }tjj}nšd }|rv|j!dkr|   |¡}|}nf|j!dkr&d }d }nP|j!dkrv|   |¡}|fdd„‰ ‡ fdd„tjj"D ƒ}|tjj"d d …< d }d }tj #|| ¡}|sšt$j% &d	¡ d S ||| fd
d„}dd„ t'||ƒD ƒ}t(}d}	d}
|j)rØd}nd}|j*rèt+}y*|j,rt}d}	d}
|j)rd}nd}W n t-k
r(   Y nX t.|_/|j0rBdd„ }ndd„ }dd„ }|j1dkrft$j2}n&|j1rˆt3|j1dƒ}t4 5||¡ nd }tj6 6||||¡}|t(_7t8 9¡ dk}t$j:dk}t; <¡ dk}|j=a=tj> ?t=|¡}t=dkrd }|j=dksú|sþd}|rtj@ Atj@jB|¡ tC Dd ¡ tE Dd!¡ |||
|fd"d#„}td$|	 ƒ |jF|d% tC Dd&¡ tE Dd'¡ |S )(Nr   r   rP   r   c             S   s.   t | dƒr&| jd k	r&| j ¡ }||kS dS d S )NÚcwdr   )rH  rV  Zsrcnode)r¦   rQ  rV  r
   r
   r   Ú	check_dirª  s    
z!_build_targets.<locals>.check_dirc                s   g | ]}ˆ |ƒr|‘qS r
   r
   )r”   Ztgt)rW  r
   r   r•   ³  s    z"_build_targets.<locals>.<listcomp>zGscons: *** No targets specified and no Default() targets found.  Stop.
c             S   s°   t | tjjƒr| }nfd }|d kr$d}tj t ¡ t|ƒ¡}x&tjjD ]}|| |d}|d k	rDP qDW |d krz|j	| |dd}|r¬| 
|¡s¬t |tjjjƒr¨| 
|¡r¨|}nd }|S )Nr   )Úcurdirr   )r7  Zcreate)r=   r   rž   r„   r…   rj   r8  r2   Zarg2nodes_lookupsr]   Zis_underr5  r\   )r¦   ZltopZttoprR  r0   rX  Úlookupr
   r
   r   r]   ¾  s"     z_build_targets.<locals>.Entryc             S   s   g | ]}|r|‘qS r
   r
   )r”   Z_fr
   r
   r   r•   Ö  s    zBuilding targets ...zdone building targets.z5done building targets (errors occurred during build).z&building terminated because of errors.zCleaning targets ...zdone cleaning targets.z5done cleaning targets (errors occurred during clean).z&cleaning terminated because of errors.c             S   s   ddl }| | ¡ | S )zRandomize the dependencies.r   N)ÚrandomZshuffle)ÚdependenciesrZ  r
   r
   r   Úorderð  s    
z_build_targets.<locals>.orderc             S   s   | S )z&Leave the order of dependencies alone.r
   )r[  r
   r
   r   r\  ö  s    c             S   s   |   ¡  d S )N)Úclose)Ztfiler
   r
   r   Útmtrace_cleanupú  s    z'_build_targets.<locals>.tmtrace_cleanupr,  ÚwZPyPy)r   é   r   z\parallel builds are unsupported by this version of Python;
	ignoring -j or num_jobs option.
zbefore building targets:)zpre-r(  c             S   sj   |   ¡ r(|js |js tj d¡ dadatr:td| ƒ ntd| ƒ |j	sf|   ¡ r\tdƒ t
j ¡  d S )Nzscons: Build interrupted.
rP   zscons: zscons: writing .sconsign file.)Zwere_interruptedrC  r:  r   r   r%   rW   rX   rB  r=  r   ZSConsign)ÚjobsrS   Úclosing_messageÚfailure_messager
   r
   r   Újobs_postfunc$  s    z%_build_targets.<locals>.jobs_postfunczscons: )Zpostfunczafter building targets:)zpost-r(  )GrX   rB  rD  rC  r:  r;   r   rû   Zprint_actionsr=  r@  rž   Zdo_store_infor>  r?  r4  r5  r6  Zcache_disableZCacheDirZcache_enabledZcache_readonlyZcache_debugZcache_forceZ
cache_showrƒ   r›   rK   r’   rG  ZBUILD_TARGETSZ_build_plus_defaultr\   r9  ZDEFAULT_TARGETSZ_Get_Default_Targetsr   r   r%   rk   r:   rV   rA  r   r-  r2  r4   r>   rZ  Ztaskmastertrace_filer	   r  ÚatexitÚregisterrA   rS   r#  Zpython_implementationÚversion_infoÚ	threadingÚ	get_identÚnum_jobsrN  ZJobsrõ   rö   ZNoParallelSupportWarningrù   rQ   rô   Úrun)rR  rS   r@   rQ  Z
lookup_topr   r]   rT  Z
task_classZopening_messagerb  rc  r\  r^  ZtmtraceZ
taskmasterÚis_pypyZis_37_or_laterZpython_has_threadsra  rü   rd  r
   )rW  r   rO  t  sÂ    









	






rO  c       	   	   C   sª   t j dd¡}| ¡ tjdd …  }|  ||¡\}}t|jt	ƒrdd|jkrddd l
}| ¡  t| ¡ nB|jržddlm} |ƒ }z| t| ¡ W d | |j¡ X nt| ƒ d S )NZ
SCONSFLAGSr   r   Úpdbr   )ÚProfile)r„   ÚenvironÚgetr©   r   ÚargvrK  r=   ró   Úlistrm  ZPdbZruncallrU  Zprofile_fileZcProfilern  Ú
dump_stats)	rP  r´   Z
sconsflagsZall_argsrS   r5   rm  rn  Zprofr
   r
   r   Ú
_exec_mainC  s    rt  c           
   C   s   t ƒ r:d} tj | ttƒ f ¡ tj dt ¡ t d¡ dg}ydd l}| 	t
d|ƒ¡ W n ttfk
rt   Y nX | 	td|ƒ¡ | 	|j¡ d |¡}ddlm} | |¡}| | ¡ ¡}|ayzt||ƒ W d tƒ  X W nB tk
r } z|r|jaW d d }~X Y n tk
r:   td	ƒ t d
¡ Y nì tk
rd } zt|ƒ W d d }~X Y nÂ |jj k
r‚   t!ƒ  Y n¤ |jj"k
r° } zt#|ƒ W d d }~X Y nv t$k
rÐ   | %¡  daY nV |jj&k
r } zt|ƒ |j'aW d d }~X Y n"   |j(j) *¡  t d
¡ Y nX t+ ,¡  t- ,¡  t.rH|j/ 0d¡ t1rZ|j2 3d¡ |j/ 4¡  |j5 6¡  t7ròt8 8¡ |j(j9 }	t:dkr”t;}
n"t<d ks¨t=d kr®d}
nt<t= }
|	t> |
 }td|	 ƒ tdt> ƒ td| ƒ td|
 ƒ t t¡ d S )NzBscons: *** SCons version %s does not run under Python version %s.
z.scons: *** Minimum Python version is %d.%d.%d
r   zSCons by Steven Knight et al.:
r   r   r   )ÚSConsOptionszscons: Build interrupted.rP   Ú*z(Memoizer (memory cache) hits and misses:g        zTotal build time: %f secondsz0Total SConscript file execution time: %f secondsz&Total SCons execution time: %f secondsz(Total command execution time: %f seconds)?r¬   r   r   r%   ÚSConsVersionrª   r«   r×   r   rQ   r)  ÚImportErrorr2  r+  Z__copyright__rj   r   ru  ZParserZSConsValuesZget_default_valuesr¶   rt  r   Ú
SystemExitr  rW   rd   re   ÚSyntaxErrorrÛ   rb   r  rê   rn   rå   r   r¼   rc   rs   rG  rI  ZSConscript_exceptionrù   rÂ   rô   rú   rÈ   ZlistLoggedInstancesrø   ZMemoizeZDumpZdump_caller_countsrA   rs  rH   rI   rO   rj  rM   rL   rJ   rJ  )rü   Úpartsr   r¨   ru  rP  r´   r(   rt   Z
total_timeZctZ
scons_timer
   r
   r   ÚmainW  s€    	






r|  )N)N)F)cr‚   r«   r­   ZSCons.compatr   re  Úimportlib.utilr	  r„   r  r   rI   rp   r#  rh  ZSCons.CacheDirZSCons.DebugZSCons.DefaultsZSCons.EnvironmentZSCons.ErrorsZ	SCons.JobZ
SCons.NodeZSCons.Node.FSZSCons.PlatformZSCons.Platform.virtualenvZSCons.SConfZSCons.ScriptZSCons.TaskmasterZ
SCons.UtilZSCons.WarningsZSCons.Script.Interactiver   rw  rJ   rL   rú   rø   ro   rH   rN   rJ  rM   rW   rX   rj  r1  r   r  r   r   r;   ZDisplayEnginerB  r   r?   r4   r7   r8   r9   rA   rB   r:   Z
AlwaysTaskrƒ   r   r    rª   rg  r¬   r®   r¯   r¶   r·   rº   r»   r½   r¾   rÇ   rô   rÒ   rù   rÛ   rà   rå   ræ   rè   rê   rñ   rý   r  r  r%  r&  r)  r+  rU  rO  rt  r|  r
   r
   r
   r   Ú<module>    s¶   
4
 %Q
	
1	
R
+  ) P