pw_build: Dependency fixes

- Handle public_deps as well as deps in pw_mirror_tree.
- Have the Python .install target avoid unnecessary reinstalls, but
  have dependents re-run when any files change. This is done by
  splitting the installs into a separate target and having .install
  depend on it and the target that represents the source files.

Change-Id: Ie41de8cfdb84fff691e183a346465099d98c609f
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/39202
Commit-Queue: Wyatt Hepler <hepler@google.com>
Reviewed-by: Armando Montanez <amontanez@google.com>
diff --git a/pw_build/mirror_tree.gni b/pw_build/mirror_tree.gni
index dc27b66..5e78de8 100644
--- a/pw_build/mirror_tree.gni
+++ b/pw_build/mirror_tree.gni
@@ -57,15 +57,20 @@
     _deps += invoker.deps
   }
 
-  if (defined(invoker.path_data_keys)) {
-    assert(_deps != [],
-           "'path_data_keys' requires at least one dependency in 'deps'")
+  _public_deps = []
+  if (defined(invoker.public_deps)) {
+    _public_deps += invoker.public_deps
+  }
 
+  if (defined(invoker.path_data_keys)) {
     generated_file("$target_name._path_list") {
       data_keys = invoker.path_data_keys
       rebase = root_build_dir
-      deps = _deps
       outputs = [ "$target_gen_dir/$target_name.txt" ]
+      deps = _deps + _public_deps
+
+      assert(deps != [],
+             "'path_data_keys' requires at least one dependency in 'deps'")
     }
 
     _deps += [ ":$target_name._path_list" ]
@@ -93,13 +98,15 @@
     }
 
     deps = _deps
+    public_deps = _public_deps
 
     _ignore_args = [
       "script",
       "args",
       "outputs",
-      "deps",
       "directory",
+      "deps",
+      "public_deps",
     ]
     forward_variables_from(invoker, "*", _ignore_args)
   }