gn: Allow configs to specify and apply `inputs`.

Commonly used config options (cflags, ldflags, ...) can be used to add
arbitrary dependencies on files. For example, if
`-fprofile-sample-use=/tmp/foo` is added to cflags, we need to rebuild
all targets with this flag when /tmp/foo gets modified.

Allowing configs to add to `inputs` seems like the best way to handle
this.

Bug: 794750
Test: Ran gn_unittests; added an `input` on the
build/config/compiler:compiler config, and verified that it showed up
in ninja files/that lots of targets are rebuilt when the input was
touched; ran `gn desc` to manually verify that the input file showed up
on an arbitrary target.

Change-Id: Id1cf03d62589ce77296b2a26a07380e29774ed98
Reviewed-on: https://chromium-review.googlesource.com/827560
Commit-Queue: George Burgess <gbiv@chromium.org>
Reviewed-by: Brett Wilson <brettw@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#528762}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 25e26d931f7c4237ab06051b1439a34e0af81326
diff --git a/tools/gn/action_target_generator.cc b/tools/gn/action_target_generator.cc
index 82cb95f..ca3986e 100644
--- a/tools/gn/action_target_generator.cc
+++ b/tools/gn/action_target_generator.cc
@@ -206,3 +206,16 @@
   }
   return true;
 }
+
+bool ActionTargetGenerator::FillInputs() {
+  const Value* value = scope_->GetValue(variables::kInputs, true);
+  if (!value)
+    return true;
+
+  Target::FileList dest_inputs;
+  if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
+                                  scope_->GetSourceDir(), &dest_inputs, err_))
+    return false;
+  target_->config_values().inputs().swap(dest_inputs);
+  return true;
+}
diff --git a/tools/gn/action_target_generator.h b/tools/gn/action_target_generator.h
index 3833b81..0ea3cbb 100644
--- a/tools/gn/action_target_generator.h
+++ b/tools/gn/action_target_generator.h
@@ -28,6 +28,7 @@
   bool FillResponseFileContents();
   bool FillDepfile();
   bool FillPool();
+  bool FillInputs();
 
   // Checks for errors in the outputs variable.
   bool CheckOutputs();
diff --git a/tools/gn/analyzer.cc b/tools/gn/analyzer.cc
index 36c8d49..c5158c5 100644
--- a/tools/gn/analyzer.cc
+++ b/tools/gn/analyzer.cc
@@ -16,6 +16,7 @@
 #include "base/values.h"
 #include "tools/gn/builder.h"
 #include "tools/gn/config.h"
+#include "tools/gn/config_values_extractors.h"
 #include "tools/gn/deps_iterator.h"
 #include "tools/gn/err.h"
 #include "tools/gn/filesystem_utils.h"
@@ -416,9 +417,11 @@
     if (cur_file == *file)
       return true;
   }
-  for (const auto& cur_file : target->inputs()) {
-    if (cur_file == *file)
-      return true;
+  for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) {
+    for (const auto& cur_file : iter.cur().inputs()) {
+      if (cur_file == *file)
+        return true;
+    }
   }
   for (const auto& cur_file : target->data()) {
     if (cur_file == file->value())
diff --git a/tools/gn/analyzer_unittest.cc b/tools/gn/analyzer_unittest.cc
index 5c299d1..b8188d8 100644
--- a/tools/gn/analyzer_unittest.cc
+++ b/tools/gn/analyzer_unittest.cc
@@ -171,7 +171,26 @@
       R"("test_targets":[])"
       "}");
 
-  t->inputs().push_back(SourceFile("//dir/extra_input.cc"));
+  SourceFile extra_input(SourceFile("//dir/extra_input.cc"));
+  t->config_values().inputs().push_back(extra_input);
+  RunAnalyzerTest(
+      R"({
+       "files": [ "//dir/extra_input.cc" ],
+       "additional_compile_targets": [ "all" ],
+       "test_targets": [ "//dir:target_name" ]
+       })",
+      "{"
+      R"("compile_targets":["all"],)"
+      R"/("status":"Found dependency",)/"
+      R"("test_targets":["//dir:target_name"])"
+      "}");
+
+  t->config_values().inputs().clear();
+  Config* c = MakeConfig("//dir", "config_name");
+  builder_.ItemDefined(std::unique_ptr<Item>(c));
+  c->own_values().inputs().push_back(extra_input);
+  t->configs().push_back(LabelConfigPair(c));
+
   RunAnalyzerTest(
       R"({
        "files": [ "//dir/extra_input.cc" ],
diff --git a/tools/gn/binary_target_generator.cc b/tools/gn/binary_target_generator.cc
index b6c19fb..8659306 100644
--- a/tools/gn/binary_target_generator.cc
+++ b/tools/gn/binary_target_generator.cc
@@ -50,9 +50,6 @@
   if (!FillCheckIncludes())
     return;
 
-  if (!FillInputs())
-    return;
-
   if (!FillConfigs())
     return;
 
diff --git a/tools/gn/command_desc.cc b/tools/gn/command_desc.cc
index 76ba21c..9a9b243 100644
--- a/tools/gn/command_desc.cc
+++ b/tools/gn/command_desc.cc
@@ -272,6 +272,7 @@
   HANDLER(variables::kCflagsObjCC, DefaultHandler);
   HANDLER(variables::kDefines, DefaultHandler);
   HANDLER(variables::kIncludeDirs, DefaultHandler);
+  HANDLER(variables::kInputs, DefaultHandler);
   HANDLER(variables::kLdflags, DefaultHandler);
   HANDLER(variables::kLibs, DefaultHandler);
   HANDLER(variables::kLibDirs, DefaultHandler);
diff --git a/tools/gn/command_refs.cc b/tools/gn/command_refs.cc
index 4d7ad7b..ee0a40f 100644
--- a/tools/gn/command_refs.cc
+++ b/tools/gn/command_refs.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "tools/gn/commands.h"
+#include "tools/gn/config_values_extractors.h"
 #include "tools/gn/deps_iterator.h"
 #include "tools/gn/filesystem_utils.h"
 #include "tools/gn/input_file.h"
@@ -137,9 +138,11 @@
     if (cur_file == file)
       return true;
   }
-  for (const auto& cur_file : target->inputs()) {
-    if (cur_file == file)
-      return true;
+  for (ConfigValuesIterator iter(target); !iter.done(); iter.Next()) {
+    for (const auto& cur_file : iter.cur().inputs()) {
+      if (cur_file == file)
+        return true;
+    }
   }
   for (const auto& cur_file : target->data()) {
     if (cur_file == file.value())
diff --git a/tools/gn/config_values.cc b/tools/gn/config_values.cc
index eb330a2..b3e9f6f 100644
--- a/tools/gn/config_values.cc
+++ b/tools/gn/config_values.cc
@@ -30,6 +30,7 @@
   VectorAppend(&cflags_objcc_, append.cflags_objcc_);
   VectorAppend(&defines_,      append.defines_);
   VectorAppend(&include_dirs_, append.include_dirs_);
+  VectorAppend(&inputs_,       append.inputs_);
   VectorAppend(&ldflags_,      append.ldflags_);
   VectorAppend(&lib_dirs_,     append.lib_dirs_);
   VectorAppend(&libs_,         append.libs_);
diff --git a/tools/gn/config_values.h b/tools/gn/config_values.h
index af97c2b..0099e81 100644
--- a/tools/gn/config_values.h
+++ b/tools/gn/config_values.h
@@ -53,6 +53,9 @@
 #undef STRING_VALUES_ACCESSOR
 #undef DIR_VALUES_ACCESSOR
 
+  const std::vector<SourceFile>& inputs() const { return inputs_; }
+  std::vector<SourceFile>& inputs() { return inputs_; }
+
   const std::vector<LibFile>& libs() const { return libs_; }
   std::vector<LibFile>& libs() { return libs_; }
 
@@ -82,6 +85,7 @@
   std::vector<std::string> cflags_objcc_;
   std::vector<std::string> defines_;
   std::vector<SourceDir>   include_dirs_;
+  std::vector<SourceFile>  inputs_;
   std::vector<std::string> ldflags_;
   std::vector<SourceDir>   lib_dirs_;
   std::vector<LibFile>     libs_;
diff --git a/tools/gn/config_values_generator.cc b/tools/gn/config_values_generator.cc
index aa42666..97888ac 100644
--- a/tools/gn/config_values_generator.cc
+++ b/tools/gn/config_values_generator.cc
@@ -81,6 +81,14 @@
 #undef FILL_STRING_CONFIG_VALUE
 #undef FILL_DIR_CONFIG_VALUE
 
+  // Inputs
+  const Value* inputs_value = scope_->GetValue(variables::kInputs, true);
+  if (inputs_value) {
+    ExtractListOfRelativeFiles(scope_->settings()->build_settings(),
+                               *inputs_value, input_dir_,
+                               &config_values_->inputs(), err_);
+  }
+
   // Libs
   const Value* libs_value = scope_->GetValue("libs", true);
   if (libs_value) {
diff --git a/tools/gn/config_values_generator.h b/tools/gn/config_values_generator.h
index 7fd803c..165f41a 100644
--- a/tools/gn/config_values_generator.h
+++ b/tools/gn/config_values_generator.h
@@ -37,9 +37,9 @@
 };
 
 // For using in documentation for functions which use this.
-#define CONFIG_VALUES_VARS_HELP \
-    "  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,\n" \
-    "         asmflags, defines, include_dirs, ldflags, lib_dirs, libs,\n" \
-    "         precompiled_header, precompiled_source\n"
+#define CONFIG_VALUES_VARS_HELP                                            \
+  "  Flags: cflags, cflags_c, cflags_cc, cflags_objc, cflags_objcc,\n"     \
+  "         asmflags, defines, include_dirs, inputs, ldflags, lib_dirs,\n" \
+  "         libs, precompiled_header, precompiled_source\n"
 
 #endif  // TOOLS_GN_CONFIG_VALUES_GENERATOR_H_
diff --git a/tools/gn/desc_builder.cc b/tools/gn/desc_builder.cc
index ba5291e..b2fd716 100644
--- a/tools/gn/desc_builder.cc
+++ b/tools/gn/desc_builder.cc
@@ -136,6 +136,8 @@
                        : ValuePtr(new base::Value(f.value()));
   }
 
+  ValuePtr RenderValue(const SourceFile* f) { return RenderValue(*f); }
+
   ValuePtr RenderValue(const LibFile& lib) {
     if (lib.is_source_file())
       return RenderValue(lib.source_file());
@@ -214,6 +216,7 @@
     CONFIG_VALUE_ARRAY_HANDLER(cflags_objcc, std::string)
     CONFIG_VALUE_ARRAY_HANDLER(defines, std::string)
     CONFIG_VALUE_ARRAY_HANDLER(include_dirs, SourceDir)
+    CONFIG_VALUE_ARRAY_HANDLER(inputs, SourceFile)
     CONFIG_VALUE_ARRAY_HANDLER(ldflags, std::string)
     CONFIG_VALUE_ARRAY_HANDLER(lib_dirs, SourceDir)
     CONFIG_VALUE_ARRAY_HANDLER(libs, LibFile)
@@ -315,9 +318,15 @@
                                      RenderValue(target_->public_headers()));
     }
 
-    if (what(variables::kInputs) && !target_->inputs().empty())
-      res->SetWithoutPathExpansion(variables::kInputs,
-                                   RenderValue(target_->inputs()));
+    if (what(variables::kInputs)) {
+      std::vector<const SourceFile*> inputs;
+      for (ConfigValuesIterator iter(target_); !iter.done(); iter.Next()) {
+        for (const auto& input : iter.cur().inputs())
+          inputs.push_back(&input);
+      }
+      if (!inputs.empty())
+        res->SetWithoutPathExpansion(variables::kInputs, RenderValue(inputs));
+    }
 
     if (is_binary_output && what(variables::kConfigs) &&
         !target_->configs().empty()) {
@@ -393,6 +402,7 @@
       CONFIG_VALUE_ARRAY_HANDLER(cflags_objcc, std::string)
       CONFIG_VALUE_ARRAY_HANDLER(defines, std::string)
       CONFIG_VALUE_ARRAY_HANDLER(include_dirs, SourceDir)
+      CONFIG_VALUE_ARRAY_HANDLER(inputs, SourceFile)
       CONFIG_VALUE_ARRAY_HANDLER(ldflags, std::string)
 #undef CONFIG_VALUE_ARRAY_HANDLER
 
diff --git a/tools/gn/ninja_action_target_writer_unittest.cc b/tools/gn/ninja_action_target_writer_unittest.cc
index e73f0ab..159c29c 100644
--- a/tools/gn/ninja_action_target_writer_unittest.cc
+++ b/tools/gn/ninja_action_target_writer_unittest.cc
@@ -45,7 +45,7 @@
   target.set_output_type(Target::ACTION);
 
   target.action_values().set_script(SourceFile("//foo/script.py"));
-  target.inputs().push_back(SourceFile("//foo/included.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
 
   target.action_values().outputs() =
       SubstitutionList::MakeForTest("//out/Debug/foo.out");
@@ -84,7 +84,7 @@
   target.set_output_type(Target::ACTION);
 
   target.action_values().set_script(SourceFile("//foo/script.py"));
-  target.inputs().push_back(SourceFile("//foo/included.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
 
   target.action_values().outputs() =
       SubstitutionList::MakeForTest("//out/Debug/foo.out");
@@ -132,7 +132,7 @@
   target.action_values().set_script(SourceFile("//foo/script.py"));
 
   target.sources().push_back(SourceFile("//foo/source.txt"));
-  target.inputs().push_back(SourceFile("//foo/included.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
 
   target.action_values().outputs() =
       SubstitutionList::MakeForTest("//out/Debug/foo.out");
@@ -198,7 +198,7 @@
   target.action_values().outputs() = SubstitutionList::MakeForTest(
       "//out/Debug/{{source_name_part}}.out");
 
-  target.inputs().push_back(SourceFile("//foo/included.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
 
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
@@ -268,7 +268,7 @@
   target.action_values().outputs() = SubstitutionList::MakeForTest(
       "//out/Debug/{{source_name_part}}.out");
 
-  target.inputs().push_back(SourceFile("//foo/included.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/included.txt"));
 
   setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
       "/usr/bin/python")));
diff --git a/tools/gn/ninja_binary_target_writer.cc b/tools/gn/ninja_binary_target_writer.cc
index 88ef860..14a630c 100644
--- a/tools/gn/ninja_binary_target_writer.cc
+++ b/tools/gn/ninja_binary_target_writer.cc
@@ -406,13 +406,20 @@
       << "Toolchain not set on target "
       << target_->label().GetUserVisibleName(true);
 
-  if (target_->inputs().size() == 0)
+  std::vector<const SourceFile*> inputs;
+  for (ConfigValuesIterator iter(target_); !iter.done(); iter.Next()) {
+    for (const auto& input : iter.cur().inputs()) {
+      inputs.push_back(&input);
+    }
+  }
+
+  if (inputs.size() == 0)
     return OutputFile();  // No inputs
 
   // If we only have one input, return it directly instead of writing a stamp
   // file for it.
-  if (target_->inputs().size() == 1)
-    return OutputFile(settings_->build_settings(), target_->inputs()[0]);
+  if (inputs.size() == 1)
+    return OutputFile(settings_->build_settings(), *inputs[0]);
 
   // Make a stamp file.
   OutputFile input_stamp_file =
@@ -427,9 +434,9 @@
        << Toolchain::ToolTypeToName(Toolchain::TYPE_STAMP);
 
   // File inputs.
-  for (const auto& input : target_->inputs()) {
+  for (const auto* input : inputs) {
     out_ << " ";
-    path_output_.WriteFile(out_, input);
+    path_output_.WriteFile(out_, *input);
   }
 
   out_ << "\n";
diff --git a/tools/gn/ninja_binary_target_writer_unittest.cc b/tools/gn/ninja_binary_target_writer_unittest.cc
index 71804ef..8700869 100644
--- a/tools/gn/ninja_binary_target_writer_unittest.cc
+++ b/tools/gn/ninja_binary_target_writer_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "tools/gn/config.h"
 #include "tools/gn/scheduler.h"
 #include "tools/gn/target.h"
 #include "tools/gn/test_with_scope.h"
@@ -852,7 +853,7 @@
     target.visibility().SetPublic();
     target.sources().push_back(SourceFile("//foo/input1.cc"));
     target.sources().push_back(SourceFile("//foo/input2.cc"));
-    target.inputs().push_back(SourceFile("//foo/input.data"));
+    target.config_values().inputs().push_back(SourceFile("//foo/input.data"));
     target.SetToolchain(setup.toolchain());
     ASSERT_TRUE(target.OnResolved(&err));
 
@@ -887,8 +888,8 @@
     target.visibility().SetPublic();
     target.sources().push_back(SourceFile("//foo/input1.cc"));
     target.sources().push_back(SourceFile("//foo/input2.cc"));
-    target.inputs().push_back(SourceFile("//foo/input1.data"));
-    target.inputs().push_back(SourceFile("//foo/input2.data"));
+    target.config_values().inputs().push_back(SourceFile("//foo/input1.data"));
+    target.config_values().inputs().push_back(SourceFile("//foo/input2.data"));
     target.SetToolchain(setup.toolchain());
     ASSERT_TRUE(target.OnResolved(&err));
 
@@ -917,4 +918,52 @@
 
     EXPECT_EQ(expected, out.str());
   }
+
+  // This target has one input itself, one from an immediate config, and one
+  // from a config tacked on to said config.
+  {
+    Config far_config(setup.settings(), Label(SourceDir("//foo/"), "qux"));
+    far_config.own_values().inputs().push_back(SourceFile("//foo/input3.data"));
+    ASSERT_TRUE(far_config.OnResolved(&err));
+
+    Config config(setup.settings(), Label(SourceDir("//foo/"), "baz"));
+    config.own_values().inputs().push_back(SourceFile("//foo/input2.data"));
+    config.configs().push_back(LabelConfigPair(&far_config));
+    ASSERT_TRUE(config.OnResolved(&err));
+
+    Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
+    target.set_output_type(Target::SOURCE_SET);
+    target.visibility().SetPublic();
+    target.sources().push_back(SourceFile("//foo/input1.cc"));
+    target.sources().push_back(SourceFile("//foo/input2.cc"));
+    target.config_values().inputs().push_back(SourceFile("//foo/input1.data"));
+    target.configs().push_back(LabelConfigPair(&config));
+    target.SetToolchain(setup.toolchain());
+    ASSERT_TRUE(target.OnResolved(&err));
+
+    std::ostringstream out;
+    NinjaBinaryTargetWriter writer(&target, out);
+    writer.Run();
+
+    const char expected[] =
+        "defines =\n"
+        "include_dirs =\n"
+        "cflags =\n"
+        "cflags_cc =\n"
+        "root_out_dir = .\n"
+        "target_out_dir = obj/foo\n"
+        "target_output_name = bar\n"
+        "\n"
+        "build obj/foo/bar.inputs.stamp: stamp"
+          " ../../foo/input1.data ../../foo/input2.data ../../foo/input3.data\n"
+        "build obj/foo/bar.input1.o: cxx ../../foo/input1.cc"
+          " | obj/foo/bar.inputs.stamp\n"
+        "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc"
+          " | obj/foo/bar.inputs.stamp\n"
+        "\n"
+        "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+            "obj/foo/bar.input2.o\n";
+
+    EXPECT_EQ(expected, out.str());
+  }
 }
diff --git a/tools/gn/ninja_copy_target_writer_unittest.cc b/tools/gn/ninja_copy_target_writer_unittest.cc
index 44973a7..b00a644 100644
--- a/tools/gn/ninja_copy_target_writer_unittest.cc
+++ b/tools/gn/ninja_copy_target_writer_unittest.cc
@@ -77,7 +77,7 @@
   target.sources().push_back(SourceFile("//foo/input1.txt"));
   target.action_values().outputs() =
       SubstitutionList::MakeForTest("//out/Debug/{{source_name_part}}.out");
-  target.inputs().push_back(SourceFile("//foo/script.py"));
+  target.config_values().inputs().push_back(SourceFile("//foo/script.py"));
   target.SetToolchain(setup.toolchain());
   ASSERT_TRUE(target.OnResolved(&err));
 
diff --git a/tools/gn/ninja_target_writer.cc b/tools/gn/ninja_target_writer.cc
index 4d36711..77af7a1 100644
--- a/tools/gn/ninja_target_writer.cc
+++ b/tools/gn/ninja_target_writer.cc
@@ -8,6 +8,7 @@
 
 #include "base/files/file_util.h"
 #include "base/strings/string_util.h"
+#include "tools/gn/config_values_extractors.h"
 #include "tools/gn/err.h"
 #include "tools/gn/escape.h"
 #include "tools/gn/filesystem_utils.h"
@@ -200,8 +201,10 @@
   // implicit dependency instead. The implicit depedency in this case is
   // handled separately by the binary target writer.
   if (!target_->IsBinary()) {
-    for (const auto& input : target_->inputs())
-      input_deps_sources.push_back(&input);
+    for (ConfigValuesIterator iter(target_); !iter.done(); iter.Next()) {
+      for (const auto& input : iter.cur().inputs())
+        input_deps_sources.push_back(&input);
+    }
   }
 
   // For an action (where we run a script only once) the sources are the same
diff --git a/tools/gn/ninja_target_writer_unittest.cc b/tools/gn/ninja_target_writer_unittest.cc
index 55bbde0..0ffda3b 100644
--- a/tools/gn/ninja_target_writer_unittest.cc
+++ b/tools/gn/ninja_target_writer_unittest.cc
@@ -47,7 +47,7 @@
   target.set_output_type(Target::EXECUTABLE);
   target.visibility().SetPublic();
   target.SetToolchain(setup.toolchain());
-  target.inputs().push_back(SourceFile("//foo/input.txt"));
+  target.config_values().inputs().push_back(SourceFile("//foo/input.txt"));
   target.sources().push_back(SourceFile("//foo/source.txt"));
   target.public_deps().push_back(LabelTargetPair(&base_target));
 
diff --git a/tools/gn/qt_creator_writer.cc b/tools/gn/qt_creator_writer.cc
index b9b6247..687bff2 100644
--- a/tools/gn/qt_creator_writer.cc
+++ b/tools/gn/qt_creator_writer.cc
@@ -121,9 +121,11 @@
 
   AddToSources(target->sources());
   AddToSources(target->public_headers());
-  AddToSources(target->inputs());
 
   for (ConfigValuesIterator it(target); !it.done(); it.Next()) {
+    for (const auto& input : it.cur().inputs())
+      sources_.insert(FilePathToUTF8(build_settings_->GetFullPath(input)));
+
     SourceFile precompiled_source = it.cur().precompiled_source();
     if (!precompiled_source.is_null()) {
       sources_.insert(
diff --git a/tools/gn/target.cc b/tools/gn/target.cc
index 5c5ff5c..7c810b5 100644
--- a/tools/gn/target.cc
+++ b/tools/gn/target.cc
@@ -827,8 +827,10 @@
   // See Scheduler::AddUnknownGeneratedInput's declaration for more.
   for (const SourceFile& file : sources_)
     CheckSourceGenerated(file);
-  for (const SourceFile& file : inputs_)
-    CheckSourceGenerated(file);
+  for (ConfigValuesIterator iter(this); !iter.done(); iter.Next()) {
+    for (const SourceFile& file : iter.cur().inputs())
+      CheckSourceGenerated(file);
+  }
   // TODO(agrieve): Check all_libs_ here as well (those that are source files).
   // http://crbug.com/571731
 }
diff --git a/tools/gn/target.h b/tools/gn/target.h
index 2c9dc35..de5c13d 100644
--- a/tools/gn/target.h
+++ b/tools/gn/target.h
@@ -156,10 +156,6 @@
     write_runtime_deps_output_ = value;
   }
 
-  // Compile-time extra dependencies.
-  const FileList& inputs() const { return inputs_; }
-  FileList& inputs() { return inputs_; }
-
   // Runtime dependencies. These are "file-like things" that can either be
   // directories or files. They do not need to exist, these are just passed as
   // runtime dependencies to external test systems as necessary.
@@ -350,7 +346,6 @@
   bool check_includes_;
   bool complete_static_lib_;
   bool testonly_;
-  FileList inputs_;
   std::vector<std::string> data_;
   BundleData bundle_data_;
   OutputFile write_runtime_deps_output_;
@@ -381,9 +376,9 @@
 
   std::vector<LabelPattern> assert_no_deps_;
 
-  // Used for all binary targets. The precompiled header values in this struct
-  // will be resolved to the ones to use for this target, if precompiled
-  // headers are used.
+  // Used for all binary targets, and for inputs in regular targets. The
+  // precompiled header values in this struct will be resolved to the ones to
+  // use for this target, if precompiled headers are used.
   ConfigValues config_values_;
 
   // Used for action[_foreach] targets.
diff --git a/tools/gn/target_generator.cc b/tools/gn/target_generator.cc
index c441f04..bbc9793 100644
--- a/tools/gn/target_generator.cc
+++ b/tools/gn/target_generator.cc
@@ -187,19 +187,6 @@
   return true;
 }
 
-bool TargetGenerator::FillInputs() {
-  const Value* value = scope_->GetValue(variables::kInputs, true);
- if (!value)
-   return true;
-
-  Target::FileList dest_inputs;
-  if (!ExtractListOfRelativeFiles(scope_->settings()->build_settings(), *value,
-                                  scope_->GetSourceDir(), &dest_inputs, err_))
-    return false;
-  target_->inputs().swap(dest_inputs);
-  return true;
-}
-
 bool TargetGenerator::FillConfigs() {
   return FillGenericConfigs(variables::kConfigs, &target_->configs());
 }
diff --git a/tools/gn/target_generator.h b/tools/gn/target_generator.h
index a3bdd58..549f2cd 100644
--- a/tools/gn/target_generator.h
+++ b/tools/gn/target_generator.h
@@ -49,7 +49,6 @@
 
   bool FillSources();
   bool FillPublic();
-  bool FillInputs();
   bool FillConfigs();
   bool FillOutputs(bool allow_substitutions);
   bool FillCheckIncludes();
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc
index bf943e8..bee46f1 100644
--- a/tools/gn/target_unittest.cc
+++ b/tools/gn/target_unittest.cc
@@ -862,7 +862,7 @@
   SourceFile object_file("//out/Debug/obj/source_target.source.o");
 
   TestTarget final_target(setup, "//:final", Target::ACTION);
-  final_target.inputs().push_back(object_file);
+  final_target.config_values().inputs().push_back(object_file);
   EXPECT_TRUE(final_target.OnResolved(&err));
 
   AssertSchedulerHasOneUnknownFileMatching(&final_target, object_file);