#! /usr/bin/env python # encoding: utf-8 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file import os,re,sys,shutil from waflib import Utils,Errors exclude_regs=''' **/*~ **/#*# **/.#* **/%*% **/._* **/*.swp **/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 ant_matcher(s,ignorecase): reflags=re.I if ignorecase else 0 ret=[] for x in Utils.to_list(s): x=x.replace('\\','/').replace('//','/') if x.endswith('/'): x+='**' accu=[] for k in x.split('/'): if k=='**': accu.append(k) else: k=k.replace('.','[.]').replace('*','.*').replace('?','.').replace('+','\\+') k='^%s$'%k try: exp=re.compile(k,flags=reflags) except Exception ,e: raise Errors.WafError('Invalid pattern: %s'%k,e) else: accu.append(exp) ret.append(accu) return ret def ant_sub_filter(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 ant_sub_matcher(name,pats): nacc=ant_sub_filter(name,pats[0]) nrej=ant_sub_filter(name,pats[1]) if[]in nrej: nacc=[] return[nacc,nrej] class Node(object): dict_class=dict __slots__=('name','parent','children','cache_abspath','cache_isdir') 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=self.dict_class(data[2]) def __getstate__(self): return(self.name,self.parent,getattr(self,'children',None)) def __str__(self): return self.abspath() def __repr__(self): return self.abspath() def __copy__(self): raise Errors.WafError('nodes are not supposed to be copied') def read(self,flags='r',encoding='latin-1'): return Utils.readf(self.abspath(),flags,encoding) def write(self,data,flags='w',encoding='latin-1'): Utils.writef(self.abspath(),data,flags,encoding) def read_json(self,convert=True,encoding='utf-8'): import json object_pairs_hook=None if convert and sys.hexversion<0x3000000: try: _type=unicode except NameError: _type=str def convert(value): if isinstance(value,list): return[convert(element)for element in value] elif isinstance(value,_type): return str(value) else: return value def object_pairs(pairs): return dict((str(pair[0]),convert(pair[1]))for pair in pairs) object_pairs_hook=object_pairs return json.loads(self.read(encoding=encoding),object_pairs_hook=object_pairs_hook) def write_json(self,data,pretty=True): import json indent=2 separators=(',',': ') sort_keys=pretty newline=os.linesep if not pretty: indent=None separators=(',',':') newline='' output=json.dumps(data,indent=indent,separators=separators,sort_keys=sort_keys)+newline self.write(output,encoding='utf-8') def exists(self): return os.path.exists(self.abspath()) def isdir(self): return os.path.isdir(self.abspath()) def chmod(self,val): os.chmod(self.abspath(),val) def delete(self,evict=True): try: try: if os.path.isdir(self.abspath()): shutil.rmtree(self.abspath()) else: os.remove(self.abspath()) except OSError: if os.path.exists(self.abspath()): raise finally: if evict: 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 self.isdir(): return try: self.parent.mkdir() except OSError: pass if self.name: try: os.makedirs(self.abspath()) except OSError: pass if not self.isdir(): raise Errors.WafError('Could not create the directory %r'%self) try: self.children except AttributeError: self.children=self.dict_class() def find_node(self,lst): if isinstance(lst,str): lst=[x for x in Utils.split_path(lst)if x and x!='.'] if lst and lst[0].startswith('\\\\')and not self.parent: node=self.ctx.root.make_node(lst[0]) node.cache_isdir=True return node.find_node(lst[1:]) cur=self for x in lst: if x=='..': cur=cur.parent or cur continue try: ch=cur.children except AttributeError: cur.children=self.dict_class() else: try: cur=ch[x] continue except KeyError: pass cur=self.__class__(x,cur) if not cur.exists(): cur.evict() return None if not cur.exists(): cur.evict() return None return cur def make_node(self,lst): if isinstance(lst,str): lst=[x for x in Utils.split_path(lst)if x and x!='.'] cur=self for x in lst: if x=='..': cur=cur.parent or cur continue try: cur=cur.children[x] except AttributeError: cur.children=self.dict_class() except KeyError: pass else: continue cur=self.__class__(x,cur) return cur def search_node(self,lst): if isinstance(lst,str): lst=[x for x in Utils.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 not c1 is c2: lst.append(c1.name) up+=1 c1=c1.parent c2=c2.parent if c1.parent: lst.extend(['..']*up) lst.reverse() return os.sep.join(lst)or'.' else: return self.abspath() def abspath(self): try: return self.cache_abspath except AttributeError: pass 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 self.cache_abspath=val return val if Utils.is_win32: def abspath(self): try: return self.cache_abspath except AttributeError: pass 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 p is node def ant_iter(self,accept=None,maxdepth=25,pats=[],dir=False,src=True,remove=True,quiet=False): dircont=self.listdir() dircont.sort() try: lst=set(self.children.keys()) except AttributeError: self.children=self.dict_class() 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=node.isdir() if accepted: if isdir: if dir: yield node elif src: yield node if 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,quiet=quiet): yield k def ant_glob(self,*k,**kw): src=kw.get('src',True) dir=kw.get('dir') excl=kw.get('excl',exclude_regs) incl=k and k[0]or kw.get('incl','**') remove=kw.get('remove',True) maxdepth=kw.get('maxdepth',25) ignorecase=kw.get('ignorecase',False) quiet=kw.get('quiet',False) pats=(ant_matcher(incl,ignorecase),ant_matcher(excl,ignorecase)) if kw.get('generator'): return Utils.lazy_generator(self.ant_iter,(ant_sub_matcher,maxdepth,pats,dir,src,remove,quiet)) it=self.ant_iter(ant_sub_matcher,maxdepth,pats,dir,src,remove,quiet) if kw.get('flat'): return' '.join(x.path_from(self)for x in it) return list(it) def is_src(self): cur=self x=self.ctx.srcnode y=self.ctx.bldnode while cur.parent: if cur is y: return False if cur is x: return True cur=cur.parent return False def is_bld(self): cur=self y=self.ctx.bldnode while cur.parent: if cur is y: return True cur=cur.parent return False def get_src(self): cur=self x=self.ctx.srcnode y=self.ctx.bldnode lst=[] while cur.parent: if cur is y: lst.reverse() return x.make_node(lst) if cur is x: return self lst.append(cur.name) cur=cur.parent return self def get_bld(self): cur=self x=self.ctx.srcnode y=self.ctx.bldnode lst=[] while cur.parent: if cur is y: return self if cur is 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 Utils.split_path(lst)if x and x!='.'] node=self.get_bld().search_node(lst) if not node: node=self.get_src().find_node(lst) if node and node.isdir(): return None return node def find_or_declare(self,lst): if isinstance(lst,str)and os.path.isabs(lst): node=self.ctx.root.make_node(lst) else: 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 Utils.split_path(lst)if x and x!='.'] node=self.find_node(lst) if node and not node.isdir(): 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 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=self.ctx.bldnode while cur.parent: if cur is x: return self.bldpath() cur=cur.parent return self.srcpath() def bld_dir(self): return self.parent.bldpath() def h_file(self): return Utils.h_file(self.abspath()) def get_bld_sig(self): try: cache=self.ctx.cache_sig except AttributeError: cache=self.ctx.cache_sig={} try: ret=cache[self] except KeyError: p=self.abspath() try: ret=cache[self]=self.h_file() except EnvironmentError: if self.isdir(): st=os.stat(p) ret=cache[self]=Utils.h_list([p,st.st_ino,st.st_mode]) return ret raise return ret pickle_lock=Utils.threading.Lock() class Nod3(Node): pass