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