From b9774b44851780fc401a78e0e3da7ad8e76b7b54 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini <pbonzini@redhat.com> Date: Tue, 19 Mar 2019 11:49:11 +0100 Subject: [PATCH] generator: add dependency on generator in source tree If find_program() returns a file from the source directory, anything that uses it should add the file to the dependencies, so that they are rebuilt whenever the script changes. Generator is not doing that. While at it, I am doing two related fixes: - Generator is not checking whther the generator actually was found, resulting in a Python error involving NoneType if it isn't. To minimize backwards compatibility issues, I am only raising the error when g.process() is acutally called. - the error message for custom_target with a nonexisting program erroneously mention a not-found external program "nonexistingprogram". The new error is similar to the one I am adding for generators. --- mesonbuild/backend/ninjabackend.py | 2 +- mesonbuild/build.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index a3b9ce8b2..405bd26cd 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1757,7 +1757,7 @@ rule FORTRAN_DEP_HACK%s exe_arr = self.exe_object_to_cmd_array(exe) infilelist = genlist.get_inputs() outfilelist = genlist.get_outputs() - extra_dependencies = [os.path.join(self.build_to_src, i) for i in genlist.extra_depends] + extra_dependencies = self.get_custom_target_depend_files(genlist) for i in range(len(infilelist)): curfile = infilelist[i] if len(generator.outputs) == 1: diff --git a/mesonbuild/build.py b/mesonbuild/build.py index dae94b6ed..66f08d818 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1365,8 +1365,17 @@ class GeneratedList: self.outfilelist = [] self.outmap = {} self.extra_depends = [] + self.depend_files = [] self.preserve_path_from = preserve_path_from self.extra_args = extra_args + if isinstance(generator.exe, dependencies.ExternalProgram): + if not generator.exe.found(): + raise InvalidArguments('Tried to use not-found external program as generator') + path = generator.exe.get_path() + if os.path.isabs(path): + # Can only add a dependency on an external program which we + # know the absolute path of + self.depend_files.append(File.from_absolute_file(path)) def add_preserved_path_segment(self, infile, outfiles, state): result = [] @@ -1962,8 +1971,7 @@ class CustomTarget(Target): final_cmd.append(c) elif isinstance(c, dependencies.ExternalProgram): if not c.found(): - m = 'Tried to use not-found external program {!r} in "command"' - raise InvalidArguments(m.format(c.name)) + raise InvalidArguments('Tried to use not-found external program in "command"') path = c.get_path() if os.path.isabs(path): # Can only add a dependency on an external program which we