r$Lc@sdZdZddkZddkZddkZddkZddkZddkZddkZddk Z ddk Z ddk l Z ddkZ ddkZ ddkZ ddkZ ddkZ ddkZ ddkZ ddk lZeZdefdYZdd d d Zead Zead Zeea d Z!e!e"edo dZ#neZ#e"edo dZ$neZ$dZ%dddddgZ&ga'dZ(dZ)e i*i*e)eZ+dZ,e i*i*e)e,Z-dZ.e i*i*e.eZ/dZ0e i*i*e0edeZ1ea2dZ3de4fd YZ5e5Z6ea7ea8d!Z9d"Z:ei;d#jZ<ei=i>d$ei=i?d$joe< o d%Z@n d&Z@d'e4fd(YZAd)ZBd*ZCd+ZDd,ZEd-ZFd.ZGeAd/eBeCZHeAd0eDeEZIeAd1eFeGZJeHeIeJgZKd2ZLd3ZMd4e iNiOfd5YZPd6e iQiQfd7YZRd8eRfd9YZSeSZTd:e4fd;YZUd<eUfd=YZVd>e iQiWfd?YZXd@e iQiYfdAYZZei[dBZ\dCZ]dDeRfdEYZ^dFe^fdGYZ_dHe iQiWfdIYZ`dJe iQiYfdKYZadLeRfdMYZbeacdNZddOe4fdPYZeeeifZfdQZgdS(Rs?scons.Node.FS File system nodes. These Nodes represent the canonical external objects that people think of when they think of building software: files and directories. This holds a "default_fs" variable that should be initialized with an FS that can be used by scripts or modules looking for the canonical default. s:src/engine/SCons/Node/FS.py 5023 2010/06/14 22:05:46 sconsiN(tlogInstanceCreation(tTracetEntryProxyAttributeErrorcBs eZdZdZdZRS(s An AttributeError subclass for recording and displaying the name of the underlying Entry involved in an AttributeError exception. cCs#ti|||_||_dS(N(tAttributeErrort__init__t entry_proxyt attribute(tselfRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRBs  cCs>|ii}d}||iit|it|ifS(Ns"%s instance %s has no attribute %s(Rtgett __class__t__name__treprtnameR(Rtentrytfmt((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__str__Fs   (R t __module__t__doc__RR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR=s iii<cCs |adS(N(t Save_Strings(tval((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt save_stringsescCs$tiid\}}| adS(NsX:/foo(tostpatht splitdrivet do_splitdrive(tdriveR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytinitialize_do_splitdriverscCsCtidjo d}ndtiti}ti|adS(s Initialize the normpath_check regular expression. This function is used by the unit tests to re-initialize the pattern when testing for behavior with different values of os.sep. t/s .*/|\.$|\.\.$s.*[/%s]|\.$|\.\.$N(Rtseptretescapetcompiletneeds_normpath_check(tpattern((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytinitialize_normpath_check}s tlinkcCsyxb|i|oQ|i|}tii|p |}qtiitii||}qW|i||dS(N(tislinktreadlinkRRtisabstjointdirnameR#(tfstsrctdstR#((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_hardlink_funcs &tsymlinkcCs|i||dS(N(R-(R)R*R+((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_softlink_funcscCsJti|||i|}|i|ti|titiBdS(N(tshutiltcopy2tstattchmodtS_IMODEtST_MODEtS_IWRITE(R)R*tdesttst((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt _copy_funcsshard-soft-copyssoft-hard-copys hard-copys soft-copytcopycCshtd6td6td6}|tjotiidngax7|idD]&}||oti ||qTqTWdS(NthardtsoftR9s;The argument of set_duplicate should be in Valid_Duplicatest-( R,R.R8tValid_DuplicatestSConstErrorst InternalErrort Link_Funcstsplittappend(t duplicatet link_dicttfunc((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt set_duplicates   c Cs|di}|di}tii|\}}|o)|dii| oti|ntptdn|di}xWtD]O}y||||PWqt t fj o|tdjoqqXqWdS(Nishard-soft-copyi( tabspathRRRBR)tisdirtmakedirsRARGtIOErrortOSError( ttargettsourcetenvR*R6tdirtfileR)RF((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytLinkFuncs"   cCsd|d|dfS(NsLocal copy of %s from %si((RMRNRO((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt LocalStringscCs!|d}|ii|idS(Ni(R)tunlinkRH(RMRNROtt((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt UnlinkFuncs cCs2|d}|ip|ii|indS(Ni(texistsR)tmkdirRH(RMRNRORU((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt MkdirFuncs  tpresubcCsftdjoUddk}ddk}|iidtddddddd|iiddantS( NitactionROtexplaint is_explicitttarget_scannerR t MkdirBuilder(R_tNonet SCons.BuildertSCons.DefaultstBuildertMkdirtDefaultstDirEntryScanner(R>((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_MkdirBuilder s     t_NullcBseZRS((R R(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRhscCsWtdjoFddk}|iidd}|iid|ddddantS(Nis$SCCSCOMs $SCCSCOMSTRR[ROR tDefaultSCCSBuilder(RiR`RatActionRc(R>tact((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_DefaultSCCSBuilder!s   cCsWtdjoFddk}|iidd}|iid|ddddantS(Nis $RCS_COCOMs $RCS_COCOMSTRR[ROR tDefaultRCSBuilder(RmR`RaRjRc(R>Rk((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_DefaultRCSBuilder-s   tcygwintTeStcCs|S(N((tx((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt _my_normcase<scCs |iS(N(tupper(Rq((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRr?st DiskCheckercBs#eZdZdZdZRS(cCs(||_||_||_||_dS(N(ttypetdotignoreRF(RRuRvRw((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyREs   cOs|i||S(N(RF(Rtargstkw((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__call__JscCs0|i|jo|i|_n |i|_dS(N(RuRvRFRw(Rtlist((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytsetLs(R RRRzR|(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRtDs  cCsm|}y&|iddjo|id=nWnttfj onX|ot||indS(NR1(t_memoR`RtKeyErrort TypeErrorRH(tnodet predicateterrorfmttresult((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytdo_diskcheck_matchRs cCsdS(N((RRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytignore_diskcheck_matchbscCsry |i}WnEtj o9|ido|id}nd}||_nX|o|i|dSdS(NtRCSs,v(trcs_dirRtentry_exists_on_disktDirR`(RR R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytdo_diskcheck_rcses cCsdS(N(R`(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytignore_diskcheck_rcsrscCsry |i}WnEtj o9|ido|id}nd}||_nX|o|id|SdS(NtSCCSss.(tsccs_dirRRRR`(RR R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytdo_diskcheck_sccsus cCsdS(N(R`(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytignore_diskcheck_sccsstmatchtrcstsccscCs"xtD]}|i|qWdS(N(t diskcheckersR|(R{tdc((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt set_diskcheckscCs"g}tD]}||iq ~S(N(RRu(t_[1]R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytdiskcheck_typesst EntryProxycBseZeiidZdZdZdZdZ dZ dZ dZ dZ d Zd Zd Zd Zh e d 6e d6e d6e d6e d6ed6ed6ed6ed6ed6e d6ed6ed6ZdZRS(RcCs,|i}tii|i|idS(Nt_abspath(RR>tSubsttSpecialAttrWrappert get_abspathR (RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_abspaths cCs6|ii}tiitii|d|dS(Nit _filebase(RR R>RRtUtiltsplitext(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__get_filebasescCs6|ii}tiitii|d|dS(Nit_suffix(RR R>RRRR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_suffixscCs&|ii}tii||dS(Nt_file(RR R>RR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_filescCs<|i}tiitii|id|idS(sLReturn the file's directory and file name, with the suffix stripped.it_base(RR>RRRRtget_pathR (RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__get_base_paths "cCsZtidjo|S|i}|iitid}tii||idSdS(sMReturn the path with / as the path separator, regardless of platform.Rt_posixN( RRRRtreplaceR>RRR (RR tr((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__get_posix_paths  cCsZtidjo|S|i}|iitid}tii||idSdS(sMReturn the path with \ as the path separator, regardless of platform.s\t_windowsN( RRRRRR>RRR (RR R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__get_windows_paths  cCst|iiS(N(RRtsrcnode(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_srcnodescCst|iiiS(sReturns the directory containing the source node linked to this node via VariantDir(), or the directory of this node if not linked.(RRRRP(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_srcdirscCst|iiiS(N(RRRtrfile(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__get_rsrcnodescCst|iiiiS(sReturns the directory containing the source node linked to this node via VariantDir(), or the directory of this node if not linked.(RRRRRP(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_rsrcdirscCst|iiS(N(RRRP(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt __get_dirstbasetposixtwindowstwin32tsrcpathtsrcdirRPRHtfilebasetsuffixRQtrsrcpathtrsrcdircCsyy|i|}WnWtj oKytiii||}Wn$tj o}t||nX|SX||SdS(N(tdictSpecialAttrsR~R>RtProxyt __getattr__RR(RR t attr_functiontattrte((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs(R RR>RtDelegateRt_EntryProxy__get_abspatht_EntryProxy__get_filebaset_EntryProxy__get_suffixt_EntryProxy__get_filet_EntryProxy__get_base_patht_EntryProxy__get_posix_patht_EntryProxy__get_windows_patht_EntryProxy__get_srcnodet_EntryProxy__get_srcdirt_EntryProxy__get_rsrcnodet_EntryProxy__get_rsrcdirt_EntryProxy__get_dirRR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs6            tBasecBseZdZgZdZdZdZdZdZdZ dZ ei e i idd Zd Ze Zei e i id d Zd ZdZdZdZdZdZeedo dZn dZdZdZdZd'dZ dZ!dZ"dZ#dZ$dZ%e i&i'dZ(d Z)ei e i i*d!e)d"Z+d#Z,ei e i id$d%Z-e.e/e/d&Z0RS((s*A generic class for file system entries. This class is for when we don't know yet whether the entry being looked up is a file or a directory. Instances of this class can morph into either Dir or File objects by a later, more precise lookup. Note: this class does not define __cmp__ and __hash__ for efficiency reasons. SCons does a lot of comparing of Node.FS.{Base,Entry,File,Dir} objects, so those operations must be as fast as possible, which means we want to use Python's built-in object identity comparisons. cCsst|dtiii|tii||_tiitii|d|_||_ |p t dtii|i ||_ tii|i ||_|idjotii||_ntii|i||_|idjotii||_ntii|i||_|i|g|_||_d|_|i|_dS(sInitialize a generic Node.FS.Base object. Call the superclass initialization, take care of setting up our relative and absolute paths, identify our parent directory, and indicate that this node should use signatures.s Node.FS.BaseisA directory must be providedt.N(RR>tNodeRRt silent_internR RRR)tAssertionErrort entry_abspathRHtentry_labspathtlabspathRt entry_pathttpatht entry_tpatht path_elementsRPR`tcwdRD(RR t directoryR)((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR s$ %   cCsd|idS(Nt"(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytstr_for_display.scCsKt||p |tjodStd|ii|i|ifdS(s This node, which already existed, is being looked up as the specified klass. Raise an exception if it isn't. Ns Tried to lookup %s '%s' as a %s.(t isinstancetEntryRR R R(Rtklass((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt must_be_same1scCs|iS(N(RP(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_dir;scCs|iS(N(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt get_suffix>scCs|S(N((R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRAscCsto |iS|iS(sGA Node.FS.Base object's string representation is its path name.(Rt _save_strt_get_str(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRDs RcCsKy|idSWntj onXti|i}||id<|S(NR(R}R~tsystinternR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRNs cCs|ip |io |iS|i}|idjo#|idj o|i}n |i}tp]y|id=Wntj onX||j o(y|id=Wqtj oqXqn|S(NR1( RDt is_derivedRRR1R`RR}R~(RRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRWs"  &    R1c Csny|idSWntj onXy|ii|i}Wntij o d}nX||id<|S(NR1(R}R~R)R1RHRterrorR`(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR1ts  cCs|idj S(N(R1R`(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRW|scCs|iiS(N(RRW(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytrexistsscCs'|i}|o |tiSdSdS(N(R1tST_MTIMER`(RR7((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytgetmtimes  cCs'|i}|o |tiSdSdS(N(R1tST_SIZER`(RR7((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytgetsizes  cCs-|i}|dj oti|tiS(N(R1R`tS_ISDIRR4(RR7((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRIs cCs-|i}|dj oti|tiS(N(R1R`tS_ISREGR4(RR7((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytisfiles R-cCsGy|ii|i}Wntij odSXti|tiS(Ni(R)tlstatRHRRR1tS_ISLNKR4(RR7((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR$s cCsdS(Ni((R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR$scCs&||jodS|ii|SdS(Ni(RPtis_under(RRP((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs cCs d|_dS(Ni(t_local(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt set_localscCsE|ii}|o+|di|i}|i|i|S|S(sIf this node is in a build path, return the node corresponding to its source file. Otherwise, return ourself. i(RPt srcdir_listRR RR (RRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs cCs|p|ii}n||jodS|i}y|i|}Wntj onX||d}g}|D]}||iqw~}tii|S(sfReturn path relative to the current working directory of the Node.FS.Base object that owns us.Ri( R)tgetcwdRtindext ValueErrorR RRR'(RRPt path_elemstiRtn((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs  $cCs+||_|ip|i|ndS(s*Set the source code builder for this node.N(tsbuildert has_buildert builder_set(Rtbuilder((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytset_src_builders  cCs?y |i}Wn+tj o|ii}||_nX|S(sFetch the source code builder for this node. If there isn't one, we cache the source code builder specified for the directory (which in turn will cache the value from its parent directory, and so on up to the file system root). (RRRPt src_builder(Rtscb((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs  cCs|iS(s"Get the absolute path of the file.(RH(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|iS(N(R (R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt for_signaturescCs;y |iSWn)tj ot|}||_|SXdS(N(t_proxyRR(Rtret((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_subst_proxys    cCs%|ii|||id|S(s1 Generates a target entry that corresponds to this entry (usually a source file) with the specified prefix and suffix. Note that this method can be overridden dynamically for generated files that need different behavior. See Tool/swig.py for an example. i(RPRR (RtprefixRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyttarget_from_sources cCs|S(N((Rtpathlist((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_Rfindalldirs_keyst Rfindalldirsc Csy|id}Wn&tj oh}||idRRCtextendt get_all_rdirs(RRt memo_dicttcreate_dir_relative_to_selfRRRP((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs&     cCs#|ip |ii}|i|S(s8Search for a list of directories in the Repository list.(RR)t_cwdR(RRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytRDirsstrentryc Csy|idSWntj onX|}|ip~t|i}xl|iiD]W}y|i|}WqWtj o1|i|io|i |i}PqqWXqWWn||id<|S(NR( R}R~RWRrR RPRtentriesRR(RRt norm_nameRPR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs"  cCsgS(N((RR!tondiskRNtstrings((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_glob11sN(1R RRtmemoizer_countersRRRRRRRRCR>tMemoizet CountValueRRtrstrR1RWRRRRIRthasattrRR$RRRR`RRRRR R RRRRt CountDictRRRtTruetFalseR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRsR  "                         !  RcBseZdZdZddZdZdZdZdZ dZ dZ d Z d Z d Zeeed Zd ZRS(sUThis is the class for generic Node.FS entries--that is, things that could be a File or a Dir, but we're just not sure yet. Consequently, the methods in this class really exist just to transform their associated object into the right class when the time comes, and then call the same-named method in the transformed class.cCsdS(N((R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytdiskcheck_match<scCs|iot|_|in|io!t|_|i|in|ii}||ijo=|i |i o*|iiot|_|inH|o#d|i }t i i|nt|_|i|i|S(s sNo such file or directory: '%s'(RIRR t_morphRtFiletclearRPRRR RHR>R?t UserError(Rt must_existRtmsg((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt disambiguate?s(           cCs*t|_|i|iti|S(snWe're a generic Entry, but the caller is actually looking for a File at this point, so morph into one.(R)R R(R*R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRbs   cCs |iS(N(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt scanner_keyjscCsAy|idd}Wntiij odSX|iSdS(sXFetch the contents of the entry. Returns the exact binary contents of the file.R,itN(R.R>R?R+t get_contents(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR1ms cCsAy|idd}Wntiij odSX|iSdS(sFetch the decoded text contents of a Unicode encoded Entry. Since this should return the text contents from the file system, we check to see into what sort of subclass we should morph this Entry.R,iR0N(R.R>R?R+tget_text_contents(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR2|s cCs5|i|j o!||_|i|indS(sZCalled to make sure a Node is a Dir. Since we're an Entry, we can morph into one.N(R R(R*(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs  cCs|iiS(sReturn if the Entry exists. Check the file system to see what we should turn into first. Assume a file if there's no directory.(R.RW(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRWscCs9|i}|itjotdn|i|S(Ns*rel_path() could not disambiguate File/Dir(R.R Rt Exceptiontrel_path(Rtothertd((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR4s cCs|iiS(N(R.t new_ninfo(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR7scCs|ii||S(N(R.tchanged_since_last_build(RRMtprev_ni((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR8scCs|ii||||S(N(R.R(RR!RRNR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|iiS(N(R.R (R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR sN(R RRR'R`R.RR/R1R2RRWR4R7R8R%R&RR (((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR4s  #         tLocalFScBseZeiioeiiZndZdZdZ dZ dZ dZ dZ dZdZd Zd Zd Zd Zd ZdZdZdZdZeedo dZn dZeedo dZn dZRS(cCsti||S(N(RR2(RRtmode((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR2scCsti||S(N(R/R9(RR*R+((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR9scCsti||S(N(R/R0(RR*R+((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR0scCstii|S(N(RRRW(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRWscCstii|S(N(RRR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCstii|S(N(RRR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCstii|S(N(RRRI(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRIscCstii|S(N(RRR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCsti||S(N(RR#(RR*R+((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR#scCs ti|S(N(RR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs ti|S(N(Rtlistdir(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR<scCs ti|S(N(RRJ(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRJscCs ti|S(N(RRX(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRXscCsti||S(N(Rtrename(Rtoldtnew((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR=scCs ti|S(N(RR1(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR1scCsti||S(N(RR-(RR*R+((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR-scCs t|S(N(topen(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR@scCs ti|S(N(RRT(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRTsR-cCstii|S(N(RRR$(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR$scCsdS(Ni((RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR$sR%cCs ti|S(N(RR%(RRQ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR%scCsdS(NR0((RRQ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR%s(R RR>R t use_memoizertMemoized_Metaclasst __metaclass__R2R9R0RWRRRIRR#RR<RJRXR=R1R-R@RTR#RR$R%(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR:s4                      tFScBseZgZddZdZdZdZdZddZ dZ dd Z ddd Z ddd Z ded Zdd ZdZdZeeeddZRS(cCst|dh|_h|_d|_t|_d|_|djoti |_ n ||_ t ti i |i d|_|i|i |_d|i_ d|i_|i|_|t_|t_dS(sInitialize the Node.FS subsystem. The supplied path is the top of the source tree, where we expect to find the top-level build file. If no path is supplied, the current directory is the default. The path argument must be a valid absolute path. sNode.FSiRN(RR}tRootR`tSConstruct_dirtdefault_max_driftt max_drifttTopRRtpathTopRrRRt defaultDriveRRRt DirNodeInfoR)t FileNodeInfo(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs        "    cCs ||_dS(N(RF(RRP((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytset_SConstruct_dir4scCs|iS(N(RH(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt get_max_drift7scCs ||_dS(N(RH(RRH((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt set_max_drift:scCs|iS(N(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR=sicCsh|i}y9|dj o(||_|oti|iqAnWntj o||_nXdS(sChange the current working directory for lookups. If change_os_dir is true, we will also change the "real" cwd to match. N(RR`RtchdirRHRL(RRPt change_os_dirtcurr((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRQ@s    cCst|}y|i|SWnltj o`t||}||i|<|p||i|iRRRR?R+RR#(Rt variant_dirtsrc_dirRD((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt VariantDirs #cGsNxG|D]?}t|tiip|i|}n|ii|qWdS(s)Specify Repository directories to search.N(RR>RRRIt addRepository(RtdirsR6((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt Repositorys c Csg}d}d}|}x|oxg|iD]\}|i|o|g|t|fStii|i|} |i|i| q,W|i g|}|i }qW|o |dit t|}n||fS(saCreate targets in corresponding variant directories Climb the directory tree, and look up path names relative to any linked variant directories we find. Even though this loops and walks up the tree, we don't memoize the return value because this is really only used to process the command-line targets. s*building associated VariantDir targets: %st N( R`t variant_dirsRRXRRR'RCRR tuptmap( RtorigRPttailttargetstmessageRt start_dirtbdR[((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytvariant_dir_target_climbs"   cCs3|djo|i}n|i||||S(s= Globs This is mainly a shim layer N(R`Rtglob(RtpathnameRRNRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytGlobs N(R RRR`RRNRORPRRQRVRaRR)R%RRdRgRrR&Ru(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRDs        P     RLcBseZdZdZdZRS(icCs|ii}|i}to9tii|\}}|o|ii|}qUntii|p|i d|}n|i |t S(NR( R)RIRURRRRRVR&RRZR(RtsttopRUR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt str_to_nodes  N(R Rtcurrent_version_idR`R)Rx(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRL st DirBuildInfocBseZdZRS(i(R RRy(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRzss[*?[]cCsti|dj S(N(tglob_magic_checktsearchR`(Rv((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pythas_glob_magic#sRcBsgeZdZgZeZeZdZdZ dZ d6dZ dZ dZedZdZd d Zd Zd Zeieiid dZdZdZdZeieiidedZhdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*d Z+ei,i,i-Z.d!Z/d"Z0d#Z1d$Z2d%Z3d&Z4d'Z5d(Z6d)Z7d*Z8eieiid+d,Z9d-Z:d.Z;eieiid/e;d0Z<d1Z=d2Z>d3Z?ee@e@d4ZAee@e@d5ZBRS(7s.A class for directories in a file system. cCs1t|dti|||||idS(Ns Node.FS.Dir(RRRR((RR RR)((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR/s cCsg|_d|_h|_||id<|i|id<||_d|_d|_g|_|ii |_ t |_ |i i |i idS(sWTurn a file system Node (either a freshly initialized directory object or a separate Entry object) into a proper directory object. Set up this directory's entries and hook it into the file system tree. Specify that directories (this Node) don't use signatures for calculating whether they're current. Rs..iN(t repositoriesR`RRRPRtsearchedt _sconsignRiRURgRt get_executortset_action_listR[(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR(4s         cCst||iddS(Ns'File %s found where directory expected.(R'R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR'Os cCsx|iiD]}||ijov||jo!t|to|i|q|iy |`Wntj onX|dj o ||_ qqqWdS(sCalled when we change the repository(ies) for a directory. This clears any cached information that is invalidated by changing the repository.N( RtvaluesRPRRt_Dir__clearRepositoryCacheR*t_srcrepsRR`RD(RRDR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__clearRepositoryCacheSs   cCs'||jo|ii|_ndS(N(RRD(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt__resetDuplicatees cCs|ii||S(sd Looks up or creates an entry node named 'name' relative to this directory. (R)R(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRiscCs|ii|||S(sg Looks up or creates a directory node named 'name' relative to this directory. (R)R(RR R]((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRpscCs|ii||S(sb Looks up or creates a file node named 'name' relative to this directory. (R)R)(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR)wsicCs%|i|}|ii|||S(s( Looks up a *normalized* relative path name, relative to this directory. This method is intended for use by internal lookups with already-normalized path data. For general-purpose lookups, use the Entry(), Dir() and File() methods above. This method does *no* input checking and will die or give incorrect results if it's passed a non-normalized path name (e.g., a path containing '..'), an absolute path name, a top-relative ('#foo') path name, or any kind of object. (RRURZ(RR RR]((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt _lookup_rel~scCs3||_||_|i||ii|dS(sVSet this directory as the variant directory for the supplied source directory.N(RRDRRiRC(RRRD((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR#s   cCs1|io |i o|ii|iS|iS(s;Returns a list of repositories for this directory. (RRDRR~(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytgetRepositoriessRcCsyt|idSWntj onX|g}d}|}xs|okx*|iD]}|i|i|qWW|djo |i}n|iti|}|i }qCWt||id<|S(NRR( R{R}R~RRCRR RRRj(RRtfnameRPtrep((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs$    cCsH||jo7||ijo'|ii|d|_|indS(NR(R~RCRR(RRP((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRes cCs |idS(Ns..(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRjscCs t|S(N(RX(RR5((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt _rel_path_keysR4c Csy|id}Wn&tj oh}||id((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_env_scanners cCsddk}|iiS(Ni(RbReRf(RR>((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_target_scanners cCs&|pgS|i||||S(s7Return this directory's implicit dependencies. We don't bother caching the results because the scan typically shouldn't be requested more than once (as opposed to scanning .h file contents, which can be requested as many times as the files is #included by other files). (R*(RROtscannerR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_found_includess cCsdS(N((R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytpreparescKs.|itj otiii||ndS(s!A null "builder" for directories.N(RR_R>Rtbuild(RRy((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCsg}|}xc|o[|ioPn|i||i}|djotii|in|}qW|ixU|D]M}y1ti i i ||i i |i Wqtj oqXqWdS(smCreate this directory, silently and without worrying about whether the builder is the default or not.N(RWRCRjR`R>R?t StopErrorRtreverseRRRtnullifyR*RL(RtlistDirstparentR[tdirnode((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_create(s(      cCs|itj o |iS(N(RR_R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt multiple_side_effect_has_builderHscCs|ii||gS(sAReturn any corresponding targets in a variant directory. (R)Rr(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt alter_targetsLscCsdS(s!A directory does not get scanned.N(R`(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR/QscCs |iS(sJWe already emit things in text, so just return the binary version.(R1(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR2UscCsYg}xCt|iddD]&}|id|i|ifq"Wdi|S(syReturn content signatures and names of all our children separated by new-lines. Ensure that the nodes are sorted.tkeycSs|iS((R (RU((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt^ss%s %s R0(tsortedtchildrenRCtget_csigR R'(RtcontentsR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR1Zs $cCs|i}tii|S(s7Compute the content signature for Directory nodes. In general, this is not needed and the content signature is not stored in the DirNodeInfo. However, if get_contents on a Dir node is called which has a child directory, the child directory should return the hash of its contents.(R1R>Rt MD5signature(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRbs cCsdS(N((RR*((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt do_duplicatekscCsb|itj o|i odStii}x,|iD]}|i|jodSq<WdS(sJIf any child is not up-to-date, then this directory isn't, either.ii(RR_RWR>Rt up_to_dateRt get_state(RRtkid((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt is_up_to_dateps   cCs|ipt|i}x|iiD]x}y|i|}Wn%tj o|i|i}nX|o2|io%t|t pt|t o|Sq,Wn|S(N( RWRrR RPRRR~t dir_on_diskRRR(RRRPR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytrdir{s   cCs6|ip%ddk}|ii||_n|iS(sZReturn the .sconsign file info for this directory, creating it first if necessary.iN(RtSCons.SConsigntSConsignt ForDirectory(RR>((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytsconsigns  cCs|io|iSti|S(smDir has a special need for srcnode()...if we have a srcdir attribute set, then that *is* our srcnode.(RRR(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs cCsDd}x7|iD])}|i|jo|i}qqW|S(s3Return the latest timestamp from among our childreni(Rt get_timestamp(RtstampR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs  cCs|iti|S(N(RHRR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|id|S(NR(R(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|iti|S(N(RRR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|iti|S(N(RRR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCsy |i}Wnrtj ofh}yti|i}Wntj on&Xx!tt|D]}t||R R!RReRjRR$R4RRRRRRRRR/R2R1RRRtstate_has_changedR8RRRRRRRRRRRRRRRRRR&RsR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR&sr                6                      + 0RTcBs}eZdZdZdZddZdZdZdZdZ d Z d Z d Z d Z d ZRS(sA class for the root directory of a file system. This is the same as a Dir class, except that the path separator ('/' or '\') is actually part of the name, so we don't need to add a separator when creating the path names of entries within this directory. cCst|dd|_d|_d|_d|_g|_d|_||_ti |||||t i |_d|_|t i |_|t i |_|i h|_ ||i d<||i d<||i d<||i t i <||i t i t i R?R+RRRBRZRR)R'RR`timplicitR( RR[RR]RRR-tdir_namet file_nametdir_node((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRZs     cCs|iS(N(RH(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs |i|S(N(RH(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCsd|S(NR((RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs |i|S(N(R(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR!scCs |i|S(N(R(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR$scCs||jodSdSdS(Nii((RRP((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR's cCsdS(N(R`(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRj-scCsdS(N(R`(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR0scCstS(N(t_null(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR3s(R RRRRRZRRRRRRRjRR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRTs $  *        RMcBs,eZdZdddgZdZdZRS(itcsigt timestamptsizecCs|ii}|i}to9tii|\}}|o|ii|}qUntii|p|i d|}n|i |t S(NR( R)RIRURRRRRVR&RRZR(RRvRwRUR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRx>s  N(R RRyt field_listR`R)Rx(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRM6st FileBuildInfocBs5eZdZdZdZdZddZRS(ic Cstidjo t}n d}x_dddgD]N}yt||}Wntj oq3Xt||tt||q3WdS(s  Converts this FileBuildInfo object for writing to a .sconsign file This replaces each Node in our various dependency lists with its usual string representation: relative to the top-level SConstruct directory, or an absolute path if it's outside. RcSsHy |i}Wntj ot|}nX|itid}|S(NR(RRRXRRR(RRv((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt node_to_strWs  tbsourcestbdependst bimplicitN(RRRXtgetattrRtsetattrR{Rk(RRRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytconvert_to_sconsignLs  cCsdS(s Converts a newly-read FileBuildInfo object for in-SCons use For normal up-to-date checking, we don't have any conversion to perform--but we're leaving this method here to make that clear. N((RRPR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytconvert_from_sconsignfsc Csdd d g}x|D]\}}y"t||}t||}Wntj o qnXg}xSt||D]B\}}t|tiip|i|}n|i|qsWt|||qWdS( sP Prepares a FileBuildInfo object for explaining what changed The bsources, bdepends and bimplicit lists have all been stored on disk as paths relative to the top-level SConstruct directory. Convert the strings to actual Nodes (for use by the --debug=explain code and --implicit-cache). Rt bsourcesigsRt bdependsigsRt bimplicitsigsN(sbsourcess bsourcesigs(sbdependss bdependsigs(s bimplicits bimplicitsigs( RRtzipRR>RRxRCR( RtattrstnattrtsattrRt nodeinfostnodesRvtni((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytprepare_dependenciesns"    icCsg}|i|i|i}|i|i|i}xMt||D]<\}}|it|ddi |i d|qDW|id|i |i fdi |S(Ns: RhRs%s [%s]s ( RRRRRRRRCRXR'tformattbactsigtbact(RRRtbkidstbkidsigstbkidtbkidsig((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs !(R RRyRRRR(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRIs    R)cBseZdZgZeZeZdZdZ dZ dZ e dZ dZdZdZd Zd Zd Zd Zeieiid dZeieiiddZdZddddddgZdddgZdZeieiiddZdZ dZ!d Z"eieii#d!e"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.Z0eieiid/d0Z1d1Z2d2Z3d3Z4d4Z5d5Z6d6Z7d7Z8d8Z9d9Z:d:Z;e:Z<d;Z=eieiid<d=Z>d>Z?d?Z@d@ZARS(As(A class for files in a file system. i@cCst||iddS(Ns'Directory %s found where file expected.(R'RI(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR's cCs1t|dti|||||idS(Ns Node.FS.File(RRRR((RR RR)((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRs cCs|ii|S(sQCreate an entry node named 'name' relative to the directory of this file.(RPR(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs|ii|d|S(sTCreate a directory node named 'name' relative to the directory of this file.R](RPR(RR R]((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRscCs(g}|D]}||i|q ~S(sWCreate a list of directories relative to the SConscript directory of this file.(R(RRRR[((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytDirsscCs|ii|S(sOCreate a file node named 'name' relative to the directory of this file.(RPR)(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR)scCsGh|_t|dp d|_n|io|i|_ndS(s+Turn a file system node into a File object.RiN(t scanner_pathsR#RRt decide_targetR8(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR(s   cCs |iS(N(R(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR/scCsp|ipdS|ii}yt|di}Wn/tj o#}|ip ||_nnX|S(NR0trb(RRRHR@treadtEnvironmentErrorR(RRRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR1s   cCs|i}|itio|ttiidS|itio|ttiidS|itio|ttiidS|S(Nsutf-8s utf-16-les utf-16-be(R1t startswithtcodecstBOM_UTF8Rtdecodet BOM_UTF16_LEt BOM_UTF16_BE(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR2s cCs|iptiidS|ii}y,tii|dtiii i d}Wn/t j o#}|i p ||_ nnX|S(s@ Compute and return the MD5 hash for this file. R0t chunksizei( RR>RRRRHtMD5filesignatureRRDR)t md5_chunksizeRR(RRtcsR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_content_hashs   tget_sizecCs_y|idSWntj onX|io|ii}nd}||id<|S(NR i(R}R~RRR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR  s  RcCs_y|idSWntj onX|io|ii}nd}||id<|S(NRi(R}R~RRR(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR s  cCs+to |iii|i|ndS(N(t do_store_infoRPRt store_infoR (R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR ) sRRRRRtninfoRRRc CsJddk}|ii}|i|_|i}xZ|iD]O}yt||}Wntj o q=nXt|||t ||q=Wx|i D]}yt||}Wntj o qnXg}xP|D]H}|i } t |djo || _ n || _|i| qWt|||t ||qW|S(Nii (RRt SConsignEntryt new_binfotbinfotconvert_copy_attrsRRRtdelattrtconvert_sig_attrsR7RRRRC( Rt old_entryR>t new_entryRRtvaluetsig_listtsigR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytconvert_old_entryA s:D       tget_stored_infoc Csy|idSWntj onXy|iii|i}WnRttfj o@ddk}|ii }|i |_ |i |_ nOXt|to|i|}nyt|i dWntj onX||id<|S(NRitbsig(R}R~RPRt get_entryR RRRRRRR7R RRRRR(Rtsconsign_entryR>((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR s&  cCs?|ii}|iy |iSWntj odSXdS(N(RRRRRR`(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_stored_implicit s   cCs|ii|S(N(RPR4(RR5((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR4 scCst|t||fS(N(tid(RRORR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_get_found_includes_key sRc Cst|t||f}y|id}Wn&tj oh}||id((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytvisited s       cCs|iodS|ii}|tjoPt|i|io t}q~t|i|io t }q~d}n|dj oKy |i }Wnt j o d}nX|djo|i |qn|S(N( RR`RPRRRR RlRRnRRR(RR tb((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytfind_src_builder# s"         cCs@y |i}Wn&tj o|i}|_nX|dj S(sReturn whether this Node has a source builder or not. If this Node doesn't have an explicit source code builder, this is where we figure out, on the fly, if there's a transparent source code builder for it. Note that if we found a source builder, we also set the self.builder attribute, so that all of the methods that actually *build* this file don't have to do anything different. N(RRR4R`(RR ((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pythas_src_builder7 s  cCs7|io gdfS|ii||i|igS(sAReturn any corresponding targets in a variant directory. N(RR`R)RrRPR (R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRH s  cCs@|it|gd}t|tiio |ndS(N(R%tUnlinkR`RR>R?t BuildError(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt _rmv_existingO s cCs|i|idS(N(R5R/(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt make_readyY s cCstiii||itiijo|io*|io|i o|iqqy|i Wqti i j o+}d||f}ti i |qXndS(s$Prepare for this file to be created.sNo drive `%s' for target `%s'.N( R>RRRRRWRtpreciousR8R#R?R(RRtdesc((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR] s cCs6|ip |io|ii|idSdS(sRemove this file.iN(RWR$R)RTRR`(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRp scCs|it|ddt||d}t|tiio5d|i|i i|i f}tii |nd|_ |i dS(Ns"Cannot duplicate `%s' in `%s': %s.i(R#R6R`tLinkRR>R?R7RRPterrstrRtlinkedR*(RR*RR;((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRw s  RWcCsy|idSWntj onX|io|i o|i o|i}||j o|i}|i|ijog|io|i |qt i|p |i o|i i |ind|idRRRHRWRRR$R)RTRR`(RR*R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRW s$#      cCs|i}|i}|ii}|djonti||joSy9|i}|io"|io|i|jo|iSWqtj oqXqn6|djo(y|iiSWqtj oqXndS(s Returns the content signature currently stored for this node if it's been unmodified longer than the max_drift value, or the max_drift value is 0. Returns None otherwise. iN( RRR)RHttimeR RRRR`(RR>tmtimeRHR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR. s"     $    cCs|i}y |iSWntj onX|i}|djo|y?|itiii i jo|i }n |i }Wnt j o d}qX|ptii|}qn||_|S(s Generate a node's content signature, the digested signature of its content. node - the node cache - alternate node to use for the signature cache returns - the content signature R0N(R-RRR.R`R R>RRDR)RR1R RKRR(RR RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR s"      cCs&tiii|||i|_dS(N(R>RRRR8(RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR scCs8|i}y||ijSWntj odSXdS(Ni(RRR(RRMR9tcur_csig((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytchanged_content s  cCs|itiijS(N(tstateR>RR(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt changed_state scCsT|i||p1y|i|i_Wntj onXtS|i||S(N(tchanged_timestamp_matchRR-RR&RB(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytchanged_timestamp_then_content scCs5y|i|ijSWntj odSXdS(Ni(RR(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytchanged_timestamp_newer scCs2y|i|ijSWntj odSXdS(Ni(RRR(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRE scCs|ii|||S(N(R&t decide_source(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRH scCs|ii|||S(N(R&R(RRMR9((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR scCs:d}|otd|n|ip|otdn|i}||jo|i|pz|otd|n|io=t||d}t|ti i on|i n|otdndSn|i|otdndS|i}|otd|n| SdS( Nisis_up_to_date(%s):s not self.exists():s changed(%s):s 1 is None s self.exists(): %s ( RRWRtchangedRt LocalCopyR`RR>R?R7R (RtTRR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR s6       Rc Csy|idSWntj onX|}|ipt|i}x|iiD]}y|i|}Wn%tj o|i|i}nX|oR|ioEt |t pt |t p|i o|}|i |_ PqWqWWn||id<|S(NR(R}R~RWRrR RPRRRRR)RRt attributes(RRRRPR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR6 s*     cCst|iS(N(RXR(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR"V scCsy |iSWntj onX|iii|\}}|i oF|o?tii|o,ti i |ti i i id|_n|i|_|iS(s Fetch a Node's content signature for purposes of computing another Node's cachesig. This is a wrapper around the normal get_csig() method that handles the somewhat obscure case of using CacheDir with the -n option. Any files that don't exist would normally be "built" by fetching them from the cache, but the normal get_csig() method will try to open up the local file, which doesn't exist because the -n option meant we didn't actually pull the file from cachedir. But since the file *does* actually exist in the cachedir, we can use its contents for the csig. i(t cachedir_csigRR&R't cachepathRWRRR>RRRRDR)RR(Rtcachedirt cachefile((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_cachedir_csigY s !(  cCsy |iSWntj onX|i}|i}g}|D]}||iqD~}|itii|i |i|i tii |}|_|S(N( tcachesigRRRRQRCR>RRR1Rt MD5collect(RRtexecutorRRtsigsR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_cachedir_bsigt s   '(BR RRRRMRRRRR'RRR%RRR)R(R/R1R2R RCR>R R!R RR RRRRRR4R R$RR#R)R+R2R4R5RR8R9RRRRWR.RRRBRDRFRGRERHRR8RRR"RQRV(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR)s                `                 !  )          cCstp tantS(N(t default_fsRD(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytget_default_fs s t FileFindercBszeZdZeiioeiiZngZdZ ddZ ddZ ei eiide ddZRS(s cCs h|_dS(N(R}(R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR sc Cs|djo |i}ntii|\}}tii|\}}| o+|d dtifjo|ii|S|o"|i ||}|pdSnt |}y|i |}Wnt j o|i |SXt|to|St|to|it|SdS(s$ A helper method for find_file() that looks up a directory for a file we're trying to find. This only creates the Dir Node if it exists on-disk, since if the directory doesn't exist we know we won't find any files in it... :-) It would be more compact to just use this as a nested function with a default keyword argument (see the commented-out version below), but that doesn't work unless you have nested scopes, so we define it here just so this work under Python 1.5.2. iRN(R`tdefault_filedirRRRBRRR)RVtfiledir_lookupRrRR~RRRRR( RR[tfdRPR RR6RR((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR[ s*  "   cCs ||fS(N((RRtpathstverbose((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt_find_file_key st find_filec s|i||}y|id}Wn&tj oh}||id [nodes] filename - a filename to find paths - a list of directory path *nodes* to search in. Can be represented as a list, a tuple, or a callable that is called with no arguments and returns the list or tuple. returns - the node created from the found file. Find a node corresponding to either a derived file or a file that exists already. Only the first file found is returned, and none is returned if no file is found. R`u %s: cstii|S((Rtstdouttwrite(Rv(t_verbose(s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR sslooking for '%s' in '%s' ... s... FOUND '%s' in '%s' N(R_R}R~tcallableR>Rt is_StringRRRBRZRkR[R`R( RRR]R^R!RtfiledirRt_fRRPRR6((Rcs0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyR` s@    <  N(R RRR>R RARBRCRRR`R[R_RCR$R`(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyRY s   # c Csddkl}x@|D]1}|ddjo|dddjoPqqWdStii|p |g}nxY|D]Q}y|iWqztj o.ti|}|o|iqqzXqzWdS( s Invalidate the memoized values of all Nodes (files or directories) that are associated with the given entries. Has been added to clear the cache of nodes affected by a direct execution of an action (e.g. Delete/Copy/Chmod). Existing Node caches become inconsistent if the action is run through Execute(). The argument `targets` can be a single Node object or filename, or a sequence of Nodes/filenames. i(t extract_stackitExecuteiisEnvironment.pyN( t tracebackRhR>Rtis_ListR%RRXR(RnRhtfR R((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pytinvalidate_node_memos s  &  (hRt __revision__RRRR/R1RR?Rt SCons.ActionR>t SCons.DebugRt SCons.Errorst SCons.Memoizet SCons.NodetSCons.Node.Aliast SCons.Substt SCons.UtiltSCons.WarningsRR%R RRRGR`RRRRR R"R#R,R.R8R=RARGRRRjR<RSRJRVR6RYRdR_RgtobjectRhRRiRmRlRnRt _is_cygwinRtnormcaseRYRrRtRRRRRRR'RRRRRRRRRRRt _classEntryR:RDt NodeInfoBaseRLt BuildInfoBaseRzRR{R}RRTRMRR)RWRXRYR`Rm(((s0install/lib/scons-2.0.0.final.0/SCons/Node/FS.pyt s                              -         e8R yI