Package linda :: Package parser :: Module makefile
[hide private]

Source Code for Module linda.parser.makefile

 1  import re 
 2   
3 -class MakefileParser:
4 - def __init__(self, file):
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
14 - def read(self):
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
24 - def parse(self):
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
51 - def targets(self):
52 return self.key_info['targets']
53
54 - def variables(self):
55 return self.key_info['vars']
56
57 - def keys(self):
58 return self.data.keys()
59
60 - def __getitem__(self, key):
61 return self.data[key]
62