blob: f9fdcc7c257489690bef15391b0bae4ca36d1abf [file] [log] [blame]
akmhoquefa8ee9b2014-03-14 09:06:24 -05001#! /usr/bin/env python
2# encoding: utf-8
3# WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
5import copy,re,os
6from waflib import Logs,Utils
7re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M)
8class ConfigSet(object):
9 __slots__=('table','parent')
10 def __init__(self,filename=None):
11 self.table={}
12 if filename:
13 self.load(filename)
14 def __contains__(self,key):
15 if key in self.table:return True
16 try:return self.parent.__contains__(key)
17 except AttributeError:return False
18 def keys(self):
19 keys=set()
20 cur=self
21 while cur:
22 keys.update(cur.table.keys())
23 cur=getattr(cur,'parent',None)
24 keys=list(keys)
25 keys.sort()
26 return keys
27 def __str__(self):
28 return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in self.keys()])
29 def __getitem__(self,key):
30 try:
31 while 1:
32 x=self.table.get(key,None)
33 if not x is None:
34 return x
35 self=self.parent
36 except AttributeError:
37 return[]
38 def __setitem__(self,key,value):
39 self.table[key]=value
40 def __delitem__(self,key):
41 self[key]=[]
42 def __getattr__(self,name):
43 if name in self.__slots__:
44 return object.__getattr__(self,name)
45 else:
46 return self[name]
47 def __setattr__(self,name,value):
48 if name in self.__slots__:
49 object.__setattr__(self,name,value)
50 else:
51 self[name]=value
52 def __delattr__(self,name):
53 if name in self.__slots__:
54 object.__delattr__(self,name)
55 else:
56 del self[name]
57 def derive(self):
58 newenv=ConfigSet()
59 newenv.parent=self
60 return newenv
61 def detach(self):
62 tbl=self.get_merged_dict()
63 try:
64 delattr(self,'parent')
65 except AttributeError:
66 pass
67 else:
68 keys=tbl.keys()
69 for x in keys:
70 tbl[x]=copy.deepcopy(tbl[x])
71 self.table=tbl
72 def get_flat(self,key):
73 s=self[key]
74 if isinstance(s,str):return s
75 return' '.join(s)
76 def _get_list_value_for_modification(self,key):
77 try:
78 value=self.table[key]
79 except KeyError:
80 try:value=self.parent[key]
81 except AttributeError:value=[]
82 if isinstance(value,list):
83 value=value[:]
84 else:
85 value=[value]
86 else:
87 if not isinstance(value,list):
88 value=[value]
89 self.table[key]=value
90 return value
91 def append_value(self,var,val):
92 current_value=self._get_list_value_for_modification(var)
93 if isinstance(val,str):
94 val=[val]
95 current_value.extend(val)
96 def prepend_value(self,var,val):
97 if isinstance(val,str):
98 val=[val]
99 self.table[var]=val+self._get_list_value_for_modification(var)
100 def append_unique(self,var,val):
101 if isinstance(val,str):
102 val=[val]
103 current_value=self._get_list_value_for_modification(var)
104 for x in val:
105 if x not in current_value:
106 current_value.append(x)
107 def get_merged_dict(self):
108 table_list=[]
109 env=self
110 while 1:
111 table_list.insert(0,env.table)
112 try:env=env.parent
113 except AttributeError:break
114 merged_table={}
115 for table in table_list:
116 merged_table.update(table)
117 return merged_table
118 def store(self,filename):
119 try:
120 os.makedirs(os.path.split(filename)[0])
121 except OSError:
122 pass
123 buf=[]
124 merged_table=self.get_merged_dict()
125 keys=list(merged_table.keys())
126 keys.sort()
127 try:
128 fun=ascii
129 except NameError:
130 fun=repr
131 for k in keys:
132 if k!='undo_stack':
133 buf.append('%s = %s\n'%(k,fun(merged_table[k])))
134 Utils.writef(filename,''.join(buf))
135 def load(self,filename):
136 tbl=self.table
137 code=Utils.readf(filename,m='rU')
138 for m in re_imp.finditer(code):
139 g=m.group
140 tbl[g(2)]=eval(g(3))
141 Logs.debug('env: %s'%str(self.table))
142 def update(self,d):
143 for k,v in d.items():
144 self[k]=v
145 def stash(self):
146 orig=self.table
147 tbl=self.table=self.table.copy()
148 for x in tbl.keys():
149 tbl[x]=copy.deepcopy(tbl[x])
150 self.undo_stack=self.undo_stack+[orig]
151 def revert(self):
152 self.table=self.undo_stack.pop(-1)