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 |