Some more NinjaBuildElement using.

pull/15/head
Jussi Pakkanen 12 years ago
parent 1b5168a1f8
commit 6247fe8bb2
  1. 82
      backends.py

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

Loading…
Cancel
Save