#! /usr/bin/env python # encoding: utf-8 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file import copy,re,os,functools from waflib import Task,Utils,Logs,Errors,ConfigSet,Node feats=Utils.defaultdict(set) HEADER_EXTS=['.h','.hpp','.hxx','.hh'] class task_gen(object): mappings=Utils.ordered_iter_dict() prec=Utils.defaultdict(set) def __init__(self,*k,**kw): self.source=[] self.target='' self.meths=[] self.features=[] self.tasks=[] if not'bld'in kw: self.env=ConfigSet.ConfigSet() self.idx=0 self.path=None else: self.bld=kw['bld'] self.env=self.bld.env.derive() self.path=self.bld.path path=self.path.abspath() try: self.idx=self.bld.idx[path]=self.bld.idx.get(path,0)+1 except AttributeError: self.bld.idx={} self.idx=self.bld.idx[path]=1 try: self.tg_idx_count=self.bld.tg_idx_count=self.bld.tg_idx_count+1 except AttributeError: self.tg_idx_count=self.bld.tg_idx_count=1 for key,val in kw.items(): setattr(self,key,val) def __str__(self): return""%(self.name,self.path.abspath()) def __repr__(self): lst=[] for x in self.__dict__: if x not in('env','bld','compiled_tasks','tasks'): lst.append("%s=%s"%(x,repr(getattr(self,x)))) return"bld(%s) in %s"%(", ".join(lst),self.path.abspath()) def get_cwd(self): return self.bld.bldnode def get_name(self): try: return self._name except AttributeError: if isinstance(self.target,list): lst=[str(x)for x in self.target] name=self._name=','.join(lst) else: name=self._name=str(self.target) return name def set_name(self,name): self._name=name name=property(get_name,set_name) def to_list(self,val): if isinstance(val,str): return val.split() else: return val def post(self): if getattr(self,'posted',None): return False self.posted=True keys=set(self.meths) keys.update(feats['*']) self.features=Utils.to_list(self.features) for x in self.features: st=feats[x] if st: keys.update(st) elif not x in Task.classes: Logs.warn('feature %r does not exist - bind at least one method to it?',x) prec={} prec_tbl=self.prec for x in prec_tbl: if x in keys: prec[x]=prec_tbl[x] tmp=[] for a in keys: for x in prec.values(): if a in x: break else: tmp.append(a) tmp.sort(reverse=True) out=[] while tmp: e=tmp.pop() if e in keys: out.append(e) try: nlst=prec[e] except KeyError: pass else: del prec[e] for x in nlst: for y in prec: if x in prec[y]: break else: tmp.append(x) tmp.sort(reverse=True) if prec: buf=['Cycle detected in the method execution:'] for k,v in prec.items(): buf.append('- %s after %s'%(k,[x for x in v if x in prec])) raise Errors.WafError('\n'.join(buf)) self.meths=out Logs.debug('task_gen: posting %s %d',self,id(self)) for x in out: try: v=getattr(self,x) except AttributeError: raise Errors.WafError('%r is not a valid task generator method'%x) Logs.debug('task_gen: -> %s (%d)',x,id(self)) v() Logs.debug('task_gen: posted %s',self.name) return True def get_hook(self,node): name=node.name for k in self.mappings: try: if name.endswith(k): return self.mappings[k] except TypeError: if k.match(name): return self.mappings[k] keys=list(self.mappings.keys()) raise Errors.WafError("File %r has no mapping in %r (load a waf tool?)"%(node,keys)) def create_task(self,name,src=None,tgt=None,**kw): task=Task.classes[name](env=self.env.derive(),generator=self) if src: task.set_inputs(src) if tgt: task.set_outputs(tgt) task.__dict__.update(kw) self.tasks.append(task) return task def clone(self,env): newobj=self.bld() for x in self.__dict__: if x in('env','bld'): continue elif x in('path','features'): setattr(newobj,x,getattr(self,x)) else: setattr(newobj,x,copy.copy(getattr(self,x))) newobj.posted=False if isinstance(env,str): newobj.env=self.bld.all_envs[env].derive() else: newobj.env=env.derive() return newobj def declare_chain(name='',rule=None,reentrant=None,color='BLUE',ext_in=[],ext_out=[],before=[],after=[],decider=None,scan=None,install_path=None,shell=False): ext_in=Utils.to_list(ext_in) ext_out=Utils.to_list(ext_out) if not name: name=rule cls=Task.task_factory(name,rule,color=color,ext_in=ext_in,ext_out=ext_out,before=before,after=after,scan=scan,shell=shell) def x_file(self,node): if ext_in: _ext_in=ext_in[0] tsk=self.create_task(name,node) cnt=0 ext=decider(self,node)if decider else cls.ext_out for x in ext: k=node.change_ext(x,ext_in=_ext_in) tsk.outputs.append(k) if reentrant!=None: if cnt