diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 6a8a2ec43..ef3fc45b6 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -99,14 +99,18 @@ class NinjaRule: self.extra = extra self.rspable = rspable # if a rspfile can be used self.refcount = 0 + self.rsprefcount = 0 def write(self, outfile): - if not self.refcount: - return + def rule_iter(): + if self.refcount: + yield '' + if self.rsprefcount: + yield '_RSP' - for rsp in [''] + (['_RSP'] if self.rspable else []): + for rsp in rule_iter(): outfile.write('rule {}{}\n'.format(self.name, rsp)) - if self.rspable: + if rsp == '_RSP': outfile.write(' command = {} @$out.rsp\n'.format(' '.join(self.command))) outfile.write(' rspfile = $out.rsp\n') outfile.write(' rspfile_content = {}\n'.format(' '.join(self.args))) @@ -192,7 +196,7 @@ class NinjaBuildElement: elems = [elems] self.elems.append((name, elems)) - def _should_use_rspfile(self, infiles, outfiles): + def _should_use_rspfile(self): # 'phony' is a rule built-in to ninja if self.rulename == 'phony': return False @@ -200,9 +204,20 @@ class NinjaBuildElement: if not self.rule.rspable: return False - return self.rule.length_estimate(infiles, outfiles, + infilenames = ' '.join([ninja_quote(i, True) for i in self.infilenames]) + outfilenames = ' '.join([ninja_quote(i, True) for i in self.outfilenames]) + + return self.rule.length_estimate(infilenames, + outfilenames, self.elems) >= rsp_threshold + def count_rule_references(self): + if self.rulename != 'phony': + if self._should_use_rspfile(): + self.rule.rsprefcount += 1 + else: + self.rule.refcount += 1 + def write(self, outfile): self.check_outputs() ins = ' '.join([ninja_quote(i, True) for i in self.infilenames]) @@ -210,7 +225,7 @@ class NinjaBuildElement: implicit_outs = ' '.join([ninja_quote(i, True) for i in self.implicit_outfilenames]) if implicit_outs: implicit_outs = ' | ' + implicit_outs - if self._should_use_rspfile(ins, outs): + if self._should_use_rspfile(): rulename = self.rulename + '_RSP' mlog.log("Command line for building %s is long, using a response file" % self.outfilenames) else: @@ -954,13 +969,14 @@ int dummy; self.build_elements.append(build) if build.rulename != 'phony': - # increment rule refcount - self.ruledict[build.rulename].refcount += 1 - # reference rule build.rule = self.ruledict[build.rulename] def write_rules(self, outfile): + for b in self.build_elements: + if isinstance(b, NinjaBuildElement): + b.count_rule_references() + for r in self.rules: r.write(outfile)