4 # Simple meta-build system.
8 self.output = open(self.output_filename(), 'w')
12 self.default_targets = []
14 self.distclean_files = []
15 self.output.write("""all::
23 def output_filename(self):
26 def rule(self, name, command, description=None, depfile=None,
28 self.rules[name] = {'command': command, 'description': description,
29 'depfile': depfile, 'generator': generator}
31 def build(self, output, rule, inputs=[], implicit=[], order_only=[]):
32 inputs = self._as_list(inputs)
33 implicit = self._as_list(implicit)
34 order_only = self._as_list(order_only)
36 output_dir = os.path.dirname(output)
37 if output_dir != '' and not os.path.isdir(output_dir):
38 os.makedirs(output_dir)
40 dollar_in = ' '.join(inputs)
41 subst = lambda text: text.replace('$in', dollar_in).replace('$out', output)
43 deps = ' '.join(inputs + implicit)
46 deps += ' '.join(order_only)
47 self.output.write('%s: %s\n' % (output, deps))
50 command = subst(r['command'])
52 desc = subst(r['description'])
53 self.output.write('\t@echo %s\n\t$(Verb) %s\n' % (desc, command))
55 self.output.write('\t%s\n' % command)
57 depfile = subst(r['depfile'])
58 self.output.write('-include '+depfile+'\n')
59 self.output.write('\n')
61 self.all_targets.append(output)
63 self.distclean_files.append(output)
65 self.clean_files.append(output)
67 def _as_list(self, input):
68 if isinstance(input, list):
72 def default(self, paths):
73 self.default_targets += self._as_list(paths)
76 self.output.write('all:: %s\n\n' % ' '.join(self.default_targets or self.all_targets))
77 self.output.write('clean: \n\trm -f %s\n\n' % ' '.join(self.clean_files))
78 self.output.write('distclean: clean\n\trm -f %s\n' % ' '.join(self.distclean_files))
80 class Ninja(ninja_syntax.Writer):
82 ninja_syntax.Writer.__init__(self, open(self.output_filename(), 'w'))
84 def output_filename(self):
95 raise LookupError, 'unknown generator: %s; supported generators are make and ninja' % name