Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: tools/gn/command_args.cc

Issue 2651023004: Display override values in GN args help. (Closed)
Patch Set: Spellinc Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/args.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/command_args.cc
diff --git a/tools/gn/command_args.cc b/tools/gn/command_args.cc
index 1b81135be3d9ff23e632380568d956c8ec4661b5..98283f298148676f7ebefc4e78ffa29832e87851 100644
--- a/tools/gn/command_args.cc
+++ b/tools/gn/command_args.cc
@@ -102,62 +102,91 @@ void GetContextForValue(const Value& value,
}
}
-void PrintArgHelp(const base::StringPiece& name, const Value& value) {
- OutputString(name.as_string(), DECORATION_YELLOW);
- OutputString(" Default = " + value.ToString(true) + "\n");
-
+// Prints the value and origin for a default value. Default values always list
+// an origin and if there is no origin, print a message about it being
+// internally set. Overrides can't be internally set so the location handling
+// is a bit different.
+//
+// The default value also contains the docstring.
+void PrintDefaultValueInfo(base::StringPiece name, const Value& value) {
+ OutputString(value.ToString(true) + "\n");
if (value.origin()) {
std::string location, comment;
GetContextForValue(value, &location, &comment);
- OutputString(" " + location + "\n" + comment);
+ OutputString(" From " + location + "\n");
+ if (!comment.empty())
+ OutputString("\n" + comment);
} else {
- OutputString(" (Internally set; try `gn help " + name.as_string() +
+ OutputString(" (Internally set; try `gn help " + name.as_string() +
"`.)\n");
}
}
+// Override value is null if there is no override.
+void PrintArgHelp(const base::StringPiece& name,
+ const Args::ValueWithOverride& val) {
+ OutputString(name.as_string(), DECORATION_YELLOW);
+ OutputString("\n");
+
+ if (val.has_override) {
+ // Override present, print both it and the default.
+ OutputString(" Current value = " + val.override_value.ToString(true) +
+ "\n");
+ if (val.override_value.origin()) {
+ std::string location, comment;
+ GetContextForValue(val.override_value, &location, &comment);
+ OutputString(" From " + location + "\n");
+ }
+ OutputString(" Overridden from the default = ");
+ PrintDefaultValueInfo(name, val.default_value);
+ } else {
+ // No override.
+ OutputString(" Current value (from the default) = ");
+ PrintDefaultValueInfo(name, val.default_value);
+ }
+}
+
int ListArgs(const std::string& build_dir) {
Setup* setup = new Setup;
if (!setup->DoSetup(build_dir, false) || !setup->Run())
return 1;
- Scope::KeyValueMap build_args;
- setup->build_settings().build_args().MergeDeclaredArguments(&build_args);
-
- // Find all of the arguments we care about. Use a regular map so they're
- // sorted nicely when we write them out.
- std::map<base::StringPiece, Value> sorted_args;
+ Args::ValueWithOverrideMap args =
+ setup->build_settings().build_args().GetAllArguments();
std::string list_value =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(kSwitchList);
- if (list_value.empty()) {
- // List all values.
- for (const auto& arg : build_args)
- sorted_args.insert(arg);
- } else {
+ if (!list_value.empty()) {
// List just the one specified as the parameter to --list.
- Scope::KeyValueMap::const_iterator found_arg = build_args.find(list_value);
- if (found_arg == build_args.end()) {
+ auto found = args.find(list_value);
+ if (found == args.end()) {
Err(Location(), "Unknown build argument.",
"You asked for \"" + list_value + "\" which I didn't find in any "
"build file\nassociated with this build.").PrintToStdout();
return 1;
}
- sorted_args.insert(*found_arg);
+
+ // Delete everything from the map except the one requested.
+ Args::ValueWithOverrideMap::value_type preserved = *found;
+ args.clear();
+ args.insert(preserved);
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchShort)) {
- // Short key=value output.
- for (const auto& arg : sorted_args) {
+ // Short <key>=<current_value> output.
+ for (const auto& arg : args) {
OutputString(arg.first.as_string());
OutputString(" = ");
- OutputString(arg.second.ToString(true));
+ if (arg.second.has_override)
+ OutputString(arg.second.override_value.ToString(true));
+ else
+ OutputString(arg.second.default_value.ToString(true));
OutputString("\n");
}
return 0;
}
// Long output.
- for (const auto& arg : sorted_args) {
+ for (const auto& arg : args) {
PrintArgHelp(arg.first, arg.second);
OutputString("\n");
}
@@ -199,9 +228,9 @@ bool RunEditor(const base::FilePath& file_to_edit) {
#else // POSIX
bool RunEditor(const base::FilePath& file_to_edit) {
- const char* editor_ptr = getenv("VISUAL");
+ const char* editor_ptr = getenv("GN_EDITOR");
if (!editor_ptr)
- editor_ptr = getenv("GN_EDITOR");
+ editor_ptr = getenv("VISUAL");
if (!editor_ptr)
editor_ptr = getenv("EDITOR");
if (!editor_ptr)
@@ -284,15 +313,19 @@ extern const char kArgs_Help[] =
build arguments work.
Usage
+
gn args <out_dir>
- Open the arguments for the given build directory in an editor (as
- specified by the EDITOR environment variable). If the given build
- directory doesn't exist, it will be created and an empty args file will
- be opened in the editor. You would type something like this into that
- file:
+ Open the arguments for the given build directory in an editor. If the
+ given build directory doesn't exist, it will be created and an empty args
+ file will be opened in the editor. You would type something like this
+ into that file:
enable_doom_melon=false
os="android"
+ To find your editor on Posix, GN will search the environment variables in
+ order: GN_EDITOR, VISUAL, and EDITOR. On Windows GN will open the command
+ associated with .txt files.
+
Note: you can edit the build args manually by editing the file "args.gn"
in the build directory and then running "gn gen <out_dir>".
@@ -301,20 +334,12 @@ Usage
an exact_arg is specified for the list flag, just that one build
argument.
- The output will list the declaration location, default value, and comment
- preceeding the declaration. If --short is specified, only the names and
- values will be printed.
-
- If the out_dir is specified, the build configuration will be taken from
- that build directory. The reason this is needed is that the definition of
- some arguments is dependent on the build configuration, so setting some
- values might add, remove, or change the default values for other
- arguments. Specifying your exact configuration allows the proper
- arguments to be displayed.
+ The output will list the declaration location, current value for the
+ build, default value (if different than the current value), and comment
+ preceeding the declaration.
- Instead of specifying the out_dir, you can also use the command-line flag
- to specify the build configuration:
- --args=<exact list of args to use>
+ If --short is specified, only the names and current values will be
+ printed.
Examples
« no previous file with comments | « tools/gn/args.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698