gn: make gn gen preserve import statements passed in --args
Previously, gn gen would expand all imports and only record the final
arg keyvalue pairs in args.gn, if called as gn gen --args='import...'.
Now the actual import statement will be recorded. This allows avoiding
a manual args.gn edit of you want an actual import statement there, for
example if the imported gni houses a predefined set of default args
that you want to follow, and want to re-gn when it changes.
R=brettw@chromium.org,dpranke@chromium.org
BUG=588513
Review-Url: https://codereview.chromium.org/2250623004
Cr-Original-Commit-Position: refs/heads/master@{#412687}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 9f58d6d943aa2c6bd32be6dbe85a130b8c75efe5
diff --git a/tools/gn/command_format.cc b/tools/gn/command_format.cc
index 3106b2c..dafba6e 100644
--- a/tools/gn/command_format.cc
+++ b/tools/gn/command_format.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "tools/gn/command_format.h"
+
#include <stddef.h>
#include <sstream>
diff --git a/tools/gn/command_format.h b/tools/gn/command_format.h
new file mode 100644
index 0000000..97c3e4c
--- /dev/null
+++ b/tools/gn/command_format.h
@@ -0,0 +1,27 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TOOLS_GN_COMAND_FORMAT_H_
+#define TOOLS_GN_COMAND_FORMAT_H_
+
+#include <string>
+
+class Setup;
+class SourceFile;
+
+namespace commands {
+
+bool FormatFileToString(Setup* setup,
+ const SourceFile& file,
+ bool dump_tree,
+ std::string* output);
+
+bool FormatStringToString(const std::string& input,
+ bool dump_tree,
+ std::string* output);
+
+} // namespace commands
+
+#endif // TOOLS_GN_COMAND_FORMAT_H_
+
diff --git a/tools/gn/command_format_unittest.cc b/tools/gn/command_format_unittest.cc
index d753b33..802dfbd 100644
--- a/tools/gn/command_format_unittest.cc
+++ b/tools/gn/command_format_unittest.cc
@@ -6,16 +6,10 @@
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "tools/gn/command_format.h"
#include "tools/gn/commands.h"
#include "tools/gn/setup.h"
-namespace commands {
-bool FormatFileToString(Setup* setup,
- const SourceFile& file,
- bool dump_tree,
- std::string* output);
-} // namespace commands
-
#define FORMAT_TEST(n) \
TEST(Format, n) { \
::Setup setup; \
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index 490204d..240c11f 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -21,6 +21,7 @@
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
+#include "tools/gn/command_format.h"
#include "tools/gn/commands.h"
#include "tools/gn/filesystem_utils.h"
#include "tools/gn/input_file.h"
@@ -261,6 +262,7 @@
dotfile_scope_(&dotfile_settings_),
fill_arguments_(true) {
dotfile_settings_.set_toolchain_label(Label());
+
build_settings_.set_item_defined_callback(
base::Bind(&ItemDefinedCallback, scheduler_.task_runner(), &builder_));
@@ -440,6 +442,10 @@
}
Scope arg_scope(&dotfile_settings_);
+ // Set soure dir so relative imports in args work.
+ SourceDir root_source_dir =
+ SourceDirForCurrentDirectory(build_settings_.root_path());
+ arg_scope.set_source_dir(root_source_dir);
args_root_->Execute(&arg_scope, &err);
if (err.has_error()) {
err.PrintToStdout();
@@ -456,12 +462,6 @@
bool Setup::SaveArgsToFile() {
ScopedTrace setup_trace(TraceItem::TRACE_SETUP, "Save args file");
- std::ostringstream stream;
- for (const auto& pair : build_settings_.build_args().GetAllOverrides()) {
- stream << pair.first.as_string() << " = " << pair.second.ToString(true);
- stream << std::endl;
- }
-
// For the first run, the build output dir might not be created yet, so do
// that so we can write a file into it. Ignore errors, we'll catch the error
// when we try to write a file to it below.
@@ -469,7 +469,8 @@
build_settings_.GetFullPath(GetBuildArgFile());
base::CreateDirectory(build_arg_file.DirName());
- std::string contents = stream.str();
+ std::string contents = args_input_file_->contents();
+ commands::FormatStringToString(contents, false, &contents);
#if defined(OS_WIN)
// Use Windows lineendings for this file since it will often open in
// Notepad which can't handle Unix ones.