summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2024-03-28 16:38:14 -0700
committerDylan Baker <dylan@pnwbakers.com>2024-03-29 13:06:54 -0700
commit2171a017be671283c7d68b60efba4404bedf5e64 (patch)
tree862d755e1c965d61e6047e5e064586d1fa7b3587
parent2f8d51c833546b048f453947278fe03f33b26e59 (diff)
downloadmeson-2171a017be671283c7d68b60efba4404bedf5e64.tar.gz
backend/ninja: Don't run -t cleandead when using dyndeps
There's a known ninja bug (https://github.com/ninja-build/ninja/issues/1952) that running this with dyndeps will result in Ninja deleting implicit outputs from the dyndeps, leading to pointless rebuilds. For reference, this is what CMake does as well.
-rw-r--r--mesonbuild/backend/ninjabackend.py5
1 files changed, 4 insertions, 1 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index a2e7c2bf5..88e880bca 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -494,6 +494,7 @@ class NinjaBackend(backends.Backend):
self.created_llvm_ir_rule = PerMachine(False, False)
self.rust_crates: T.Dict[str, RustCrate] = {}
self.implicit_meson_outs = []
+ self._uses_dyndeps = False
def create_phony_target(self, dummy_outfile: str, rulename: str, phony_infilename: str) -> NinjaBuildElement:
'''
@@ -669,7 +670,8 @@ class NinjaBackend(backends.Backend):
os.replace(tempfilename, outfilename)
mlog.cmd_ci_include(outfilename) # For CI debugging
# Refresh Ninja's caches. https://github.com/ninja-build/ninja/pull/1685
- if mesonlib.version_compare(self.ninja_version, '>=1.10.0') and os.path.exists(os.path.join(self.environment.build_dir, '.ninja_log')):
+ # Cannot use when running with dyndeps: https://github.com/ninja-build/ninja/issues/1952
+ if mesonlib.version_compare(self.ninja_version, '>=1.10.0') and os.path.exists(os.path.join(self.environment.build_dir, '.ninja_log')) and not self._uses_dyndeps:
subprocess.call(self.ninja_command + ['-t', 'restat'], cwd=self.environment.build_dir)
subprocess.call(self.ninja_command + ['-t', 'cleandead'], cwd=self.environment.build_dir)
self.generate_compdb()
@@ -1094,6 +1096,7 @@ class NinjaBackend(backends.Backend):
object_deps: T.List['mesonlib.FileOrString']) -> None:
if not self.should_use_dyndeps_for_target(target):
return
+ self._uses_dyndeps = True
depscan_file = self.get_dep_scan_file_for(target)
pickle_base = target.name + '.dat'
pickle_file = os.path.join(self.get_target_private_dir(target), pickle_base).replace('\\', '/')