waf, waflib: import unpacked waf 1.7.13
[pd-aubio.git] / waflib / Node.py
diff --git a/waflib/Node.py b/waflib/Node.py
new file mode 100644 (file)
index 0000000..7729613
--- /dev/null
@@ -0,0 +1,467 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
+
+import os,re,sys,shutil
+from waflib import Utils,Errors
+exclude_regs='''
+**/*~
+**/#*#
+**/.#*
+**/%*%
+**/._*
+**/CVS
+**/CVS/**
+**/.cvsignore
+**/SCCS
+**/SCCS/**
+**/vssver.scc
+**/.svn
+**/.svn/**
+**/BitKeeper
+**/.git
+**/.git/**
+**/.gitignore
+**/.bzr
+**/.bzrignore
+**/.bzr/**
+**/.hg
+**/.hg/**
+**/_MTN
+**/_MTN/**
+**/.arch-ids
+**/{arch}
+**/_darcs
+**/_darcs/**
+**/.intlcache
+**/.DS_Store'''
+def split_path(path):
+       return path.split('/')
+def split_path_cygwin(path):
+       if path.startswith('//'):
+               ret=path.split('/')[2:]
+               ret[0]='/'+ret[0]
+               return ret
+       return path.split('/')
+re_sp=re.compile('[/\\\\]')
+def split_path_win32(path):
+       if path.startswith('\\\\'):
+               ret=re.split(re_sp,path)[2:]
+               ret[0]='\\'+ret[0]
+               return ret
+       return re.split(re_sp,path)
+if sys.platform=='cygwin':
+       split_path=split_path_cygwin
+elif Utils.is_win32:
+       split_path=split_path_win32
+class Node(object):
+       __slots__=('name','sig','children','parent','cache_abspath','cache_isdir','cache_sig')
+       def __init__(self,name,parent):
+               self.name=name
+               self.parent=parent
+               if parent:
+                       if name in parent.children:
+                               raise Errors.WafError('node %s exists in the parent files %r already'%(name,parent))
+                       parent.children[name]=self
+       def __setstate__(self,data):
+               self.name=data[0]
+               self.parent=data[1]
+               if data[2]is not None:
+                       self.children=data[2]
+               if data[3]is not None:
+                       self.sig=data[3]
+       def __getstate__(self):
+               return(self.name,self.parent,getattr(self,'children',None),getattr(self,'sig',None))
+       def __str__(self):
+               return self.name
+       def __repr__(self):
+               return self.abspath()
+       def __hash__(self):
+               return id(self)
+       def __eq__(self,node):
+               return id(self)==id(node)
+       def __copy__(self):
+               raise Errors.WafError('nodes are not supposed to be copied')
+       def read(self,flags='r',encoding='ISO8859-1'):
+               return Utils.readf(self.abspath(),flags,encoding)
+       def write(self,data,flags='w',encoding='ISO8859-1'):
+               Utils.writef(self.abspath(),data,flags,encoding)
+       def chmod(self,val):
+               os.chmod(self.abspath(),val)
+       def delete(self):
+               try:
+                       if hasattr(self,'children'):
+                               shutil.rmtree(self.abspath())
+                       else:
+                               os.remove(self.abspath())
+               except OSError:
+                       pass
+               self.evict()
+       def evict(self):
+               del self.parent.children[self.name]
+       def suffix(self):
+               k=max(0,self.name.rfind('.'))
+               return self.name[k:]
+       def height(self):
+               d=self
+               val=-1
+               while d:
+                       d=d.parent
+                       val+=1
+               return val
+       def listdir(self):
+               lst=Utils.listdir(self.abspath())
+               lst.sort()
+               return lst
+       def mkdir(self):
+               if getattr(self,'cache_isdir',None):
+                       return
+               try:
+                       self.parent.mkdir()
+               except OSError:
+                       pass
+               if self.name:
+                       try:
+                               os.makedirs(self.abspath())
+                       except OSError:
+                               pass
+                       if not os.path.isdir(self.abspath()):
+                               raise Errors.WafError('Could not create the directory %s'%self.abspath())
+                       try:
+                               self.children
+                       except AttributeError:
+                               self.children={}
+               self.cache_isdir=True
+       def find_node(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               cur=self
+               for x in lst:
+                       if x=='..':
+                               cur=cur.parent or cur
+                               continue
+                       try:
+                               ch=cur.children
+                       except AttributeError:
+                               cur.children={}
+                       else:
+                               try:
+                                       cur=cur.children[x]
+                                       continue
+                               except KeyError:
+                                       pass
+                       cur=self.__class__(x,cur)
+                       try:
+                               os.stat(cur.abspath())
+                       except OSError:
+                               cur.evict()
+                               return None
+               ret=cur
+               try:
+                       os.stat(ret.abspath())
+               except OSError:
+                       ret.evict()
+                       return None
+               try:
+                       while not getattr(cur.parent,'cache_isdir',None):
+                               cur=cur.parent
+                               cur.cache_isdir=True
+               except AttributeError:
+                       pass
+               return ret
+       def make_node(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               cur=self
+               for x in lst:
+                       if x=='..':
+                               cur=cur.parent or cur
+                               continue
+                       if getattr(cur,'children',{}):
+                               if x in cur.children:
+                                       cur=cur.children[x]
+                                       continue
+                       else:
+                               cur.children={}
+                       cur=self.__class__(x,cur)
+               return cur
+       def search_node(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               cur=self
+               for x in lst:
+                       if x=='..':
+                               cur=cur.parent or cur
+                       else:
+                               try:
+                                       cur=cur.children[x]
+                               except(AttributeError,KeyError):
+                                       return None
+               return cur
+       def path_from(self,node):
+               c1=self
+               c2=node
+               c1h=c1.height()
+               c2h=c2.height()
+               lst=[]
+               up=0
+               while c1h>c2h:
+                       lst.append(c1.name)
+                       c1=c1.parent
+                       c1h-=1
+               while c2h>c1h:
+                       up+=1
+                       c2=c2.parent
+                       c2h-=1
+               while id(c1)!=id(c2):
+                       lst.append(c1.name)
+                       up+=1
+                       c1=c1.parent
+                       c2=c2.parent
+               for i in range(up):
+                       lst.append('..')
+               lst.reverse()
+               return os.sep.join(lst)or'.'
+       def abspath(self):
+               try:
+                       return self.cache_abspath
+               except AttributeError:
+                       pass
+               if os.sep=='/':
+                       if not self.parent:
+                               val=os.sep
+                       elif not self.parent.name:
+                               val=os.sep+self.name
+                       else:
+                               val=self.parent.abspath()+os.sep+self.name
+               else:
+                       if not self.parent:
+                               val=''
+                       elif not self.parent.name:
+                               val=self.name+os.sep
+                       else:
+                               val=self.parent.abspath().rstrip(os.sep)+os.sep+self.name
+               self.cache_abspath=val
+               return val
+       def is_child_of(self,node):
+               p=self
+               diff=self.height()-node.height()
+               while diff>0:
+                       diff-=1
+                       p=p.parent
+               return id(p)==id(node)
+       def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True):
+               dircont=self.listdir()
+               dircont.sort()
+               try:
+                       lst=set(self.children.keys())
+               except AttributeError:
+                       self.children={}
+               else:
+                       if remove:
+                               for x in lst-set(dircont):
+                                       self.children[x].evict()
+               for name in dircont:
+                       npats=accept(name,pats)
+                       if npats and npats[0]:
+                               accepted=[]in npats[0]
+                               node=self.make_node([name])
+                               isdir=os.path.isdir(node.abspath())
+                               if accepted:
+                                       if isdir:
+                                               if dir:
+                                                       yield node
+                                       else:
+                                               if src:
+                                                       yield node
+                               if getattr(node,'cache_isdir',None)or isdir:
+                                       node.cache_isdir=True
+                                       if maxdepth:
+                                               for k in node.ant_iter(accept=accept,maxdepth=maxdepth-1,pats=npats,dir=dir,src=src,remove=remove):
+                                                       yield k
+               raise StopIteration
+       def ant_glob(self,*k,**kw):
+               src=kw.get('src',True)
+               dir=kw.get('dir',False)
+               excl=kw.get('excl',exclude_regs)
+               incl=k and k[0]or kw.get('incl','**')
+               reflags=kw.get('ignorecase',0)and re.I
+               def to_pat(s):
+                       lst=Utils.to_list(s)
+                       ret=[]
+                       for x in lst:
+                               x=x.replace('\\','/').replace('//','/')
+                               if x.endswith('/'):
+                                       x+='**'
+                               lst2=x.split('/')
+                               accu=[]
+                               for k in lst2:
+                                       if k=='**':
+                                               accu.append(k)
+                                       else:
+                                               k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+')
+                                               k='^%s$'%k
+                                               try:
+                                                       accu.append(re.compile(k,flags=reflags))
+                                               except Exception ,e:
+                                                       raise Errors.WafError("Invalid pattern: %s"%k,e)
+                               ret.append(accu)
+                       return ret
+               def filtre(name,nn):
+                       ret=[]
+                       for lst in nn:
+                               if not lst:
+                                       pass
+                               elif lst[0]=='**':
+                                       ret.append(lst)
+                                       if len(lst)>1:
+                                               if lst[1].match(name):
+                                                       ret.append(lst[2:])
+                                       else:
+                                               ret.append([])
+                               elif lst[0].match(name):
+                                       ret.append(lst[1:])
+                       return ret
+               def accept(name,pats):
+                       nacc=filtre(name,pats[0])
+                       nrej=filtre(name,pats[1])
+                       if[]in nrej:
+                               nacc=[]
+                       return[nacc,nrej]
+               ret=[x for x in self.ant_iter(accept=accept,pats=[to_pat(incl),to_pat(excl)],maxdepth=kw.get('maxdepth',25),dir=dir,src=src,remove=kw.get('remove',True))]
+               if kw.get('flat',False):
+                       return' '.join([x.path_from(self)for x in ret])
+               return ret
+       def is_src(self):
+               cur=self
+               x=id(self.ctx.srcnode)
+               y=id(self.ctx.bldnode)
+               while cur.parent:
+                       if id(cur)==y:
+                               return False
+                       if id(cur)==x:
+                               return True
+                       cur=cur.parent
+               return False
+       def is_bld(self):
+               cur=self
+               y=id(self.ctx.bldnode)
+               while cur.parent:
+                       if id(cur)==y:
+                               return True
+                       cur=cur.parent
+               return False
+       def get_src(self):
+               cur=self
+               x=id(self.ctx.srcnode)
+               y=id(self.ctx.bldnode)
+               lst=[]
+               while cur.parent:
+                       if id(cur)==y:
+                               lst.reverse()
+                               return self.ctx.srcnode.make_node(lst)
+                       if id(cur)==x:
+                               return self
+                       lst.append(cur.name)
+                       cur=cur.parent
+               return self
+       def get_bld(self):
+               cur=self
+               x=id(self.ctx.srcnode)
+               y=id(self.ctx.bldnode)
+               lst=[]
+               while cur.parent:
+                       if id(cur)==y:
+                               return self
+                       if id(cur)==x:
+                               lst.reverse()
+                               return self.ctx.bldnode.make_node(lst)
+                       lst.append(cur.name)
+                       cur=cur.parent
+               lst.reverse()
+               if lst and Utils.is_win32 and len(lst[0])==2 and lst[0].endswith(':'):
+                       lst[0]=lst[0][0]
+               return self.ctx.bldnode.make_node(['__root__']+lst)
+       def find_resource(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               node=self.get_bld().search_node(lst)
+               if not node:
+                       self=self.get_src()
+                       node=self.find_node(lst)
+               if node:
+                       if os.path.isdir(node.abspath()):
+                               return None
+               return node
+       def find_or_declare(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               node=self.get_bld().search_node(lst)
+               if node:
+                       if not os.path.isfile(node.abspath()):
+                               node.sig=None
+                               node.parent.mkdir()
+                       return node
+               self=self.get_src()
+               node=self.find_node(lst)
+               if node:
+                       if not os.path.isfile(node.abspath()):
+                               node.sig=None
+                               node.parent.mkdir()
+                       return node
+               node=self.get_bld().make_node(lst)
+               node.parent.mkdir()
+               return node
+       def find_dir(self,lst):
+               if isinstance(lst,str):
+                       lst=[x for x in split_path(lst)if x and x!='.']
+               node=self.find_node(lst)
+               try:
+                       if not os.path.isdir(node.abspath()):
+                               return None
+               except(OSError,AttributeError):
+                       return None
+               return node
+       def change_ext(self,ext,ext_in=None):
+               name=self.name
+               if ext_in is None:
+                       k=name.rfind('.')
+                       if k>=0:
+                               name=name[:k]+ext
+                       else:
+                               name=name+ext
+               else:
+                       name=name[:-len(ext_in)]+ext
+               return self.parent.find_or_declare([name])
+       def nice_path(self,env=None):
+               return self.path_from(self.ctx.launch_node())
+       def bldpath(self):
+               return self.path_from(self.ctx.bldnode)
+       def srcpath(self):
+               return self.path_from(self.ctx.srcnode)
+       def relpath(self):
+               cur=self
+               x=id(self.ctx.bldnode)
+               while cur.parent:
+                       if id(cur)==x:
+                               return self.bldpath()
+                       cur=cur.parent
+               return self.srcpath()
+       def bld_dir(self):
+               return self.parent.bldpath()
+       def bld_base(self):
+               s=os.path.splitext(self.name)[0]
+               return self.bld_dir()+os.sep+s
+       def get_bld_sig(self):
+               try:
+                       return self.cache_sig
+               except AttributeError:
+                       pass
+               if not self.is_bld()or self.ctx.bldnode is self.ctx.srcnode:
+                       self.sig=Utils.h_file(self.abspath())
+               self.cache_sig=ret=self.sig
+               return ret
+       search=search_node
+pickle_lock=Utils.threading.Lock()
+class Nod3(Node):
+       pass