Ensure rules in the generated build.ninja file are in a stable order

Previously, two functionally identical builds could produce different
build.ninja files.  The ordering of the rules themselves doesn't affect
behaviour, but unnecessary changes in commandline arguments can cause
spurious rebuilds and if the ordering of the overall file is stable
than it's easy to use `diff` to compare different build.ninja files
and spot the differences in ordering that are triggering the unnecessary
rebuilds.
pull/1548/head
Sam Thursfield 8 years ago
parent c7f66c3a9e
commit f5b7cfdbf0
  1. 3
      mesonbuild/backend/backends.py
  2. 15
      mesonbuild/build.py

@ -22,6 +22,7 @@ import json
import subprocess
from ..mesonlib import MesonException, get_compiler_for_source, classify_unity_sources
from ..compilers import CompilerArgs
from collections import OrderedDict
class CleanTrees:
'''
@ -542,7 +543,7 @@ class Backend:
return newargs
def get_build_by_default_targets(self):
result = {}
result = OrderedDict()
# Get all build and custom targets that must be built by default
for name, t in self.build.get_targets().items():
if t.build_by_default or t.install or t.build_always:

@ -82,9 +82,9 @@ class Build:
self.project_version = None
self.environment = environment
self.projects = {}
self.targets = {}
self.compilers = {}
self.cross_compilers = {}
self.targets = OrderedDict()
self.compilers = OrderedDict()
self.cross_compilers = OrderedDict()
self.global_args = {}
self.projects_args = {}
self.global_link_args = {}
@ -326,6 +326,9 @@ class BuildTarget(Target):
self.validate_sources()
self.validate_cross_install(environment)
def __lt__(self, other):
return self.get_id() < other.get_id()
def __repr__(self):
repr_str = "<{0} {1}: {2}>"
return repr_str.format(self.__class__.__name__, self.get_id(), self.filename)
@ -1257,6 +1260,9 @@ class CustomTarget(Target):
mlog.warning('Unknown keyword arguments in target %s: %s' %
(self.name, ', '.join(unknowns)))
def __lt__(self, other):
return self.get_id() < other.get_id()
def __repr__(self):
repr_str = "<{0} {1}: {2}>"
return repr_str.format(self.__class__.__name__, self.get_id(), self.command)
@ -1417,6 +1423,9 @@ class RunTarget(Target):
self.args = args
self.dependencies = dependencies
def __lt__(self, other):
return self.get_id() < other.get_id()
def __repr__(self):
repr_str = "<{0} {1}: {2}>"
return repr_str.format(self.__class__.__name__, self.get_id(), self.command)

Loading…
Cancel
Save