diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2020-02-16 14:45:29 +0100 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2020-02-19 11:52:22 +0100 |
commit | 4ec6918cd59d0fbf6cd3e93c7f5d86d43a4f44e8 (patch) | |
tree | e606a70c11c92fd3c11d22d8d8da61bbdc9e1ff9 /mesonbuild/cmake/interpreter.py | |
parent | 73ddc014774102b378bb89bf9d4801d7b231b745 (diff) | |
download | meson-4ec6918cd59d0fbf6cd3e93c7f5d86d43a4f44e8.zip meson-4ec6918cd59d0fbf6cd3e93c7f5d86d43a4f44e8.tar.gz meson-4ec6918cd59d0fbf6cd3e93c7f5d86d43a4f44e8.tar.bz2 |
cmake: Fix dependency loops in custom targets (fixes #6632)
Diffstat (limited to 'mesonbuild/cmake/interpreter.py')
-rw-r--r-- | mesonbuild/cmake/interpreter.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index 81844a0..82e1ab3 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -26,6 +26,7 @@ from ..mesonlib import MachineChoice, version_compare from ..compilers.compilers import lang_suffixes, header_suffixes, obj_suffixes, lib_suffixes, is_header from enum import Enum from functools import lru_cache +from pathlib import Path import typing as T import os, re @@ -659,23 +660,35 @@ class ConverterCustomTarget: self.outputs = [self.name + '.h'] # Check dependencies and input files + root = Path(root_src_dir) for i in self.depends_raw: if not i: continue + raw = Path(i) art = output_target_map.artifact(i) tgt = output_target_map.target(i) gen = output_target_map.generated(i) - if art: + rel_to_root = None + try: + rel_to_root = raw.relative_to(root) + except ValueError: + rel_to_root = None + + # First check for existing files. Only then check for existing + # targets, etc. This reduces the chance of misdetecting input files + # as outputs from other targets. + # See https://github.com/mesonbuild/meson/issues/6632 + if not raw.is_absolute() and (root / raw).exists(): + self.inputs += [raw.as_posix()] + elif raw.is_absolute() and raw.exists() and rel_to_root is not None: + self.inputs += [rel_to_root.as_posix()] + elif art: self.depends += [art] elif tgt: self.depends += [tgt] elif gen: self.inputs += [gen.get_ref(i)] - elif not os.path.isabs(i) and os.path.exists(os.path.join(root_src_dir, i)): - self.inputs += [i] - elif os.path.isabs(i) and os.path.exists(i) and os.path.commonpath([i, root_src_dir]) == root_src_dir: - self.inputs += [os.path.relpath(i, root_src_dir)] def process_inter_target_dependencies(self): # Move the dependencies from all transfer_dependencies_from to the target |