From dd00a64b9da83e4765dd4fdf86ef9f4533a36687 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Fri, 1 Mar 2013 21:20:25 +0200 Subject: [PATCH] Created a helper class to build Ninja build directives. --- backends.py | 68 ++++++++++++++++++++++++++++++++++++++++++-------- interpreter.py | 1 - 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/backends.py b/backends.py index f5b2f4c83..ea8cc032f 100755 --- a/backends.py +++ b/backends.py @@ -158,6 +158,56 @@ class Backend(): outfile = os.path.join(outdir, cf.get_target_name()) do_conf_file(infile, outfile, self.interpreter.get_variables()) +class NinjaBuildElement(): + def __init__(self, infilename, rule, outfilename): + self.infilename = infilename + self.rule = rule + self.outfilename = outfilename + self.deps = [] + self.orderdeps = [] + self.elems = [] + + def add_dep(self, dep): + if isinstance(dep, list): + self.deps += dep + else: + self.deps.append(dep) + + def add_orderdep(self, dep): + if isinstance(dep, list): + self.orderdeps += dep + else: + self.orderdeps.append(dep) + + def add_item(self, name, elems): + if isinstance(elems, str): + elems = [elems] + self.elems.append((name, elems)) + + def write(self, outfile): + line = 'build %s: %s %s' % (ninja_quote(self.infilename), self.rule, + ninja_quote(self.outfilename)) + if len(self.deps) > 0: + line += ' | ' + ' '.join([ninja_quote(x) for x in self.deps]) + if len(self.orderdeps) > 0: + line += ' || ' + ' '.join([ninja_quote(x) for x in self.orderdeps]) + line += '\n' + outfile.write(line) + + for e in self.elems: + (name, elems) = e + should_quote = True + if name == 'DEPFILE': + should_quote = False + line = ' %s = ' % name + if should_quote: + templ = "'%s'" + else: + templ = "%s" + line += ' '.join([templ % ninja_quote(i) for i in elems]) + line += '\n' + outfile.write(line) + outfile.write('\n') class NinjaBackend(Backend): def __init__(self, build, interp): @@ -385,14 +435,14 @@ class NinjaBackend(Backend): dep_file = abs_obj + '.' + compiler.get_depfile_suffix() pchlist = target.get_pch() if len(pchlist) == 0: - pch_dep = '' + pch_dep = [] else: arr = [] for pch in pchlist: i = os.path.join(self.get_target_private_dir(target), os.path.split(pch)[-1] + '.' + compiler.get_pch_suffix()) arr.append(i) - pch_dep = '|| ' + ' '.join([ninja_quote(i) for i in arr]) + pch_dep = arr for i in target.get_include_dirs(): basedir = i.get_curdir() for d in i.get_incdirs(): @@ -404,14 +454,12 @@ class NinjaBackend(Backend): commands.append(sarg) commands += self.get_pch_include_args(compiler, target) compiler_name = '%s_COMPILER' % compiler.get_language() - build = 'build %s: %s %s %s\n' % \ - (ninja_quote(abs_obj), compiler_name, ninja_quote(abs_src), - pch_dep) - dep = ' DEPFILE = %s\n' % dep_file - flags = ' FLAGS = %s\n\n' % ' '.join(["'" + ninja_quote(t) + "'" for t in commands]) - outfile.write(build) - outfile.write(dep) - outfile.write(flags) + + element = NinjaBuildElement(abs_obj, compiler_name, abs_src) + element.add_orderdep(pch_dep) + element.add_item('DEPFILE', dep_file) + element.add_item('FLAGS', commands) + element.write(outfile) return abs_obj def generate_pch(self, target, outfile): diff --git a/interpreter.py b/interpreter.py index 37b951fe0..d2c65e1a3 100755 --- a/interpreter.py +++ b/interpreter.py @@ -705,7 +705,6 @@ class Interpreter(): def build_target(self, node, args, kwargs, targetclass): args = self.flatten(args) - print(args) name = args[0] sources = args[1:] try: