diff options
Diffstat (limited to 'backends.py')
-rwxr-xr-x | backends.py | 82 |
1 files changed, 43 insertions, 39 deletions
diff --git a/backends.py b/backends.py index 53b7b4d..54d0570 100755 --- a/backends.py +++ b/backends.py @@ -97,8 +97,8 @@ class Backend(): for src in genlist.get_outfilelist(): if not self.environment.is_header(src): obj_list.append(self.generate_single_compile(target, outfile, src, True)) - self.generate_link(target, outfile, outname, obj_list) - self.generate_shlib_aliases(target, self.get_target_dir(target), outfile) + elem = self.generate_link(target, outfile, outname, obj_list) + self.generate_shlib_aliases(target, self.get_target_dir(target), outfile, elem) self.processed_targets[name] = True def process_target_dependencies(self, target, outfile): @@ -159,10 +159,13 @@ class Backend(): do_conf_file(infile, outfile, self.interpreter.get_variables()) class NinjaBuildElement(): - def __init__(self, infilename, rule, outfilename): + def __init__(self, infilename, rule, outfilenames): self.infilename = infilename self.rule = rule - self.outfilename = outfilename + if isinstance(outfilenames, str): + self.outfilenames = [outfilenames] + else: + self.outfilenames = outfilenames self.deps = [] self.orderdeps = [] self.elems = [] @@ -186,7 +189,7 @@ class NinjaBuildElement(): def write(self, outfile): line = 'build %s: %s %s' % (ninja_quote(self.infilename), self.rule, - ninja_quote(self.outfilename)) + ' '.join([ninja_quote(i) for i in self.outfilenames])) if len(self.deps) > 0: line += ' | ' + ' '.join([ninja_quote(x) for x in self.deps]) if len(self.orderdeps) > 0: @@ -200,11 +203,16 @@ class NinjaBuildElement(): 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]) + q_templ = "'%s'" + noq_templ = "%s" + newelems = [] + for i in elems: + if not should_quote or i == '&&': # Hackety hack hack + templ = noq_templ + else: + templ = q_templ + newelems.append(templ % ninja_quote(i)) + line += ' '.join(newelems) line += '\n' outfile.write(line) outfile.write('\n') @@ -421,12 +429,10 @@ class NinjaBackend(Backend): args = [x.replace("@INPUT@", infilename).replace('@OUTPUT@', outfilename)\ for x in base_args] cmdlist = [exe_file] + args - build = 'build %s: CUSTOM_COMMAND %s | %s\n' % \ - (ninja_quote(outfilename), ninja_quote(infilename), ninja_quote(self.get_target_filename(exe))) - command = ' COMMAND = %s\n\n' % \ - ' '.join(["'%s'" % ninja_quote(i) for i in cmdlist]) - outfile.write(build) - outfile.write(command) + elem = NinjaBuildElement(outfilename, 'CUSTOM_COMMAND', infilename) + elem.add_dep(self.get_target_filename(exe)) + elem.add_item('COMMAND', cmdlist) + elem.write(outfile) def generate_single_compile(self, target, outfile, src, is_generated=False): compiler = self.get_compiler_for_source(src) @@ -478,14 +484,10 @@ class NinjaBackend(Backend): dst = os.path.join(self.get_target_private_dir(target), os.path.split(pch)[-1] + '.' + compiler.get_pch_suffix()) dep = dst + '.' + compiler.get_depfile_suffix() - build = 'build %s: %s %s\n' % (ninja_quote(dst), - ninja_quote(compiler.get_language() + '_COMPILER'), - ninja_quote(src)) - flags = ' FLAGS = %s\n' % ' '.join([ninja_quote(t) for t in commands]) - depfile = ' DEPFILE = %s\n\n' % ninja_quote(dep) - outfile.write(build) - outfile.write(flags) - outfile.write(depfile) + elem = NinjaBuildElement(dst, compiler.get_language() + '_COMPILER', src) + elem.add_item('FLAGS', commands) + elem.add_item('DEPFILE', dep) + elem.write(outfile) def generate_link(self, target, outfile, outname, obj_list): if isinstance(target, interpreter.StaticLibrary): @@ -511,26 +513,28 @@ class NinjaBackend(Backend): commands += self.build_target_link_arguments(dependencies) if self.environment.new_coredata.coverage: commands += linker.get_coverage_link_flags() - if len(dependencies) == 0: - dep_targets = '' - else: - dep_targets = '| ' + ' '.join([ninja_quote(self.get_target_filename(t)) for t in dependencies]) - build = 'build %s: %s %s %s\n' % \ - (ninja_quote(outname), linker_rule, ' '.join([ninja_quote(i) for i in obj_list]), - dep_targets) - flags = ' LINK_FLAGS = %s\n' % ' '.join([ninja_quote(a) for a in commands]) - outfile.write(build) - outfile.write(flags) - - def generate_shlib_aliases(self, target, outdir, outfile): + dep_targets = [self.get_target_filename(t) for t in dependencies] + elem = NinjaBuildElement(outname, linker_rule, obj_list) + elem.add_dep(dep_targets) + elem.add_item('LINK_FLAGS', commands) + return elem + #build = 'build %s: %s %s %s\n' % \ + #(ninja_quote(outname), linker_rule, ' '.join([ninja_quote(i) for i in obj_list]), + # dep_targets) + #flags = ' LINK_FLAGS = %s\n' % ' '.join([ninja_quote(a) for a in commands]) + #outfile.write(build) + #outfile.write(flags) + + def generate_shlib_aliases(self, target, outdir, outfile, elem): basename = target.get_filename() aliases = target.get_aliaslist() - aliascmd = '' + aliascmd = [] for alias in aliases: aliasfile = os.path.join(outdir, alias) - cmd = " && ln -s -f '%s' '%s'" % (ninja_quote(basename), ninja_quote(aliasfile)) + cmd = ["&&", 'ln', '-s', '-f', basename, aliasfile] aliascmd += cmd - outfile.write(' aliasing =%s\n\n' % aliascmd) + elem.add_item('aliasing', aliascmd) + elem.write(outfile) def generate_ending(self, outfile): targetlist = [self.get_target_filename(t) for t in self.build.get_targets().values()] |