1 """scons.Node.Python
2
3 Python nodes.
4
5 """
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 __revision__ = "src/engine/SCons/Node/Python.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
31
32 import SCons.Node
33
35 __slots__ = ('csig',)
36 current_version_id = 2
37
38 field_list = ['csig']
39
42
44 """
45 Return all fields that shall be pickled. Walk the slots in the class
46 hierarchy and add those to the state dictionary. If a '__dict__' slot is
47 available, copy all entries to the dictionary. Also include the version
48 id, which is fixed for all instances of a class.
49 """
50 state = getattr(self, '__dict__', {}).copy()
51 for obj in type(self).mro():
52 for name in getattr(obj,'__slots__',()):
53 if hasattr(self, name):
54 state[name] = getattr(self, name)
55
56 state['_version_id'] = self.current_version_id
57 try:
58 del state['__weakref__']
59 except KeyError:
60 pass
61
62 return state
63
65 """
66 Restore the attributes from a pickled state.
67 """
68
69 del state['_version_id']
70 for key, value in state.items():
71 if key not in ('__weakref__',):
72 setattr(self, key, value)
73
74
78
79 -class Value(SCons.Node.Node):
80 """A class for Python variables, typically passed on the command line
81 or generated by a script, but not from a file or some other source.
82 """
83
84 NodeInfo = ValueNodeInfo
85 BuildInfo = ValueBuildInfo
86
87 - def __init__(self, value, built_value=None):
94
96 return repr(self.value)
97
99 return str(self.value)
100
103
107
108 is_up_to_date = SCons.Node.Node.children_are_up_to_date
109
115
116 - def write(self, built_value):
117 """Set the value of the node."""
118 self.built_value = built_value
119
121 """Return the value. If necessary, the value is built."""
122 self.build()
123 if not hasattr(self, 'built_value'):
124 self.built_value = self.value
125 return self.built_value
126
128 """By the assumption that the node.built_value is a
129 deterministic product of the sources, the contents of a Value
130 are the concatenation of all the contents of its sources. As
131 the value need not be built when get_contents() is called, we
132 cannot use the actual node.built_value."""
133
134 contents = str(self.value)
135 for kid in self.children(None):
136 contents = contents + kid.get_contents()
137 return contents
138
139 get_contents = get_text_contents
140
142 cur_csig = self.get_csig()
143 try:
144 return cur_csig != prev_ni.csig
145 except AttributeError:
146 return 1
147
149 """Because we're a Python value node and don't have a real
150 timestamp, we get to ignore the calculator and just use the
151 value contents."""
152 try:
153 return self.ninfo.csig
154 except AttributeError:
155 pass
156 contents = self.get_contents()
157 self.get_ninfo().csig = contents
158 return contents
159
160
161
162
163
164
165