1 import re
2
5 self.file = file
6 self.data = {}
7 self.parsed_data = []
8 self.includes = []
9 self.key_info = {'vars': [], 'targets': []}
10 self.linep = re.compile(r'^([^\t]+).*\w:')
11 self.read()
12 self.parse()
13
15 try:
16 f = open(self.file)
17 except IOError, e:
18 raise IOError('failed to parse %s, due to %s.' % (self.file, e))
19 for x in f:
20 if x == '\n' or re.match(r'^(\t+)?#', x):
21 continue
22 self.parsed_data.append(x)
23
25 tag = ''
26 for line in self.parsed_data:
27 if line.startswith('include'):
28 self.includes.append(re.split(r'\s+', line[:-1])[1])
29 if re.search(self.linep, line) and line.find('=') == -1:
30 splitted_line = re.split(r'\s+', line[:-1])
31 tag = splitted_line[0][:-1]
32 self.data[tag] = {'depends': splitted_line[1:], 'commands': []}
33 elif line.startswith('\t') and tag:
34 untabbed = re.sub(r'\t+', '', line[:-1])
35 self.data[tag]['commands'].append(untabbed)
36 elif line.find('=') != -1 and not line.startswith('\t') and not \
37 tag:
38 if line.startswith('export '):
39 line = line[len('export '):]
40 split_line = line[:-1].split('=')
41 if re.search(r'(\?|:)$', split_line[0]):
42 split_line[0] = split_line[0][:-1]
43 self.data[split_line[0].strip()] = {'data': \
44 split_line[1].strip()}
45 for key in self.keys():
46 if self[key].has_key('depends'):
47 self.key_info['targets'].append(key)
48 elif self[key].has_key('data'):
49 self.key_info['vars'].append(key)
50
52 return self.key_info['targets']
53
55 return self.key_info['vars']
56
59
62