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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « tools/gn/args.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <map> 10 #include <map>
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 base::StringPiece line(&data[previous_line_offset], 95 base::StringPiece line(&data[previous_line_offset],
96 line_off - previous_line_offset + 1); 96 line_off - previous_line_offset + 1);
97 if (!DoesLineBeginWithComment(line)) 97 if (!DoesLineBeginWithComment(line))
98 break; 98 break;
99 99
100 comment->insert(0, StripHashFromLine(line) + "\n"); 100 comment->insert(0, StripHashFromLine(line) + "\n");
101 line_off = previous_line_offset; 101 line_off = previous_line_offset;
102 } 102 }
103 } 103 }
104 104
105 void PrintArgHelp(const base::StringPiece& name, const Value& value) { 105 // Prints the value and origin for a default value. Default values always list
106 OutputString(name.as_string(), DECORATION_YELLOW); 106 // an origin and if there is no origin, print a message about it being
107 OutputString(" Default = " + value.ToString(true) + "\n"); 107 // internally set. Overrides can't be internally set so the location handling
108 108 // is a bit different.
109 //
110 // The default value also contains the docstring.
111 void PrintDefaultValueInfo(base::StringPiece name, const Value& value) {
112 OutputString(value.ToString(true) + "\n");
109 if (value.origin()) { 113 if (value.origin()) {
110 std::string location, comment; 114 std::string location, comment;
111 GetContextForValue(value, &location, &comment); 115 GetContextForValue(value, &location, &comment);
112 OutputString(" " + location + "\n" + comment); 116 OutputString(" From " + location + "\n");
117 if (!comment.empty())
118 OutputString("\n" + comment);
113 } else { 119 } else {
114 OutputString(" (Internally set; try `gn help " + name.as_string() + 120 OutputString(" (Internally set; try `gn help " + name.as_string() +
115 "`.)\n"); 121 "`.)\n");
116 } 122 }
117 } 123 }
118 124
125 // Override value is null if there is no override.
126 void PrintArgHelp(const base::StringPiece& name,
127 const Args::ValueWithOverride& val) {
128 OutputString(name.as_string(), DECORATION_YELLOW);
129 OutputString("\n");
130
131 if (val.has_override) {
132 // Override present, print both it and the default.
133 OutputString(" Current value = " + val.override_value.ToString(true) +
134 "\n");
135 if (val.override_value.origin()) {
136 std::string location, comment;
137 GetContextForValue(val.override_value, &location, &comment);
138 OutputString(" From " + location + "\n");
139 }
140 OutputString(" Overridden from the default = ");
141 PrintDefaultValueInfo(name, val.default_value);
142 } else {
143 // No override.
144 OutputString(" Current value (from the default) = ");
145 PrintDefaultValueInfo(name, val.default_value);
146 }
147 }
148
119 int ListArgs(const std::string& build_dir) { 149 int ListArgs(const std::string& build_dir) {
120 Setup* setup = new Setup; 150 Setup* setup = new Setup;
121 if (!setup->DoSetup(build_dir, false) || !setup->Run()) 151 if (!setup->DoSetup(build_dir, false) || !setup->Run())
122 return 1; 152 return 1;
123 153
124 Scope::KeyValueMap build_args; 154 Args::ValueWithOverrideMap args =
125 setup->build_settings().build_args().MergeDeclaredArguments(&build_args); 155 setup->build_settings().build_args().GetAllArguments();
126
127 // Find all of the arguments we care about. Use a regular map so they're
128 // sorted nicely when we write them out.
129 std::map<base::StringPiece, Value> sorted_args;
130 std::string list_value = 156 std::string list_value =
131 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(kSwitchList); 157 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(kSwitchList);
132 if (list_value.empty()) { 158 if (!list_value.empty()) {
133 // List all values.
134 for (const auto& arg : build_args)
135 sorted_args.insert(arg);
136 } else {
137 // List just the one specified as the parameter to --list. 159 // List just the one specified as the parameter to --list.
138 Scope::KeyValueMap::const_iterator found_arg = build_args.find(list_value); 160 auto found = args.find(list_value);
139 if (found_arg == build_args.end()) { 161 if (found == args.end()) {
140 Err(Location(), "Unknown build argument.", 162 Err(Location(), "Unknown build argument.",
141 "You asked for \"" + list_value + "\" which I didn't find in any " 163 "You asked for \"" + list_value + "\" which I didn't find in any "
142 "build file\nassociated with this build.").PrintToStdout(); 164 "build file\nassociated with this build.").PrintToStdout();
143 return 1; 165 return 1;
144 } 166 }
145 sorted_args.insert(*found_arg); 167
168 // Delete everything from the map except the one requested.
169 Args::ValueWithOverrideMap::value_type preserved = *found;
170 args.clear();
171 args.insert(preserved);
146 } 172 }
147 173
148 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchShort)) { 174 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchShort)) {
149 // Short key=value output. 175 // Short <key>=<current_value> output.
150 for (const auto& arg : sorted_args) { 176 for (const auto& arg : args) {
151 OutputString(arg.first.as_string()); 177 OutputString(arg.first.as_string());
152 OutputString(" = "); 178 OutputString(" = ");
153 OutputString(arg.second.ToString(true)); 179 if (arg.second.has_override)
180 OutputString(arg.second.override_value.ToString(true));
181 else
182 OutputString(arg.second.default_value.ToString(true));
154 OutputString("\n"); 183 OutputString("\n");
155 } 184 }
156 return 0; 185 return 0;
157 } 186 }
158 187
159 // Long output. 188 // Long output.
160 for (const auto& arg : sorted_args) { 189 for (const auto& arg : args) {
161 PrintArgHelp(arg.first, arg.second); 190 PrintArgHelp(arg.first, arg.second);
162 OutputString("\n"); 191 OutputString("\n");
163 } 192 }
164 193
165 return 0; 194 return 0;
166 } 195 }
167 196
168 #if defined(OS_WIN) 197 #if defined(OS_WIN)
169 198
170 bool RunEditor(const base::FilePath& file_to_edit) { 199 bool RunEditor(const base::FilePath& file_to_edit) {
(...skipping 21 matching lines...) Expand all
192 "\"...\n"); 221 "\"...\n");
193 ::WaitForSingleObject(info.hProcess, INFINITE); 222 ::WaitForSingleObject(info.hProcess, INFINITE);
194 ::CloseHandle(info.hProcess); 223 ::CloseHandle(info.hProcess);
195 } 224 }
196 return true; 225 return true;
197 } 226 }
198 227
199 #else // POSIX 228 #else // POSIX
200 229
201 bool RunEditor(const base::FilePath& file_to_edit) { 230 bool RunEditor(const base::FilePath& file_to_edit) {
202 const char* editor_ptr = getenv("VISUAL"); 231 const char* editor_ptr = getenv("GN_EDITOR");
203 if (!editor_ptr) 232 if (!editor_ptr)
204 editor_ptr = getenv("GN_EDITOR"); 233 editor_ptr = getenv("VISUAL");
205 if (!editor_ptr) 234 if (!editor_ptr)
206 editor_ptr = getenv("EDITOR"); 235 editor_ptr = getenv("EDITOR");
207 if (!editor_ptr) 236 if (!editor_ptr)
208 editor_ptr = "vi"; 237 editor_ptr = "vi";
209 238
210 std::string cmd(editor_ptr); 239 std::string cmd(editor_ptr);
211 cmd.append(" \""); 240 cmd.append(" \"");
212 241
213 // Its impossible to do this properly since we don't know the user's shell, 242 // Its impossible to do this properly since we don't know the user's shell,
214 // but quoting and escaping internal quotes should handle 99.999% of all 243 // but quoting and escaping internal quotes should handle 99.999% of all
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 extern const char kArgs[] = "args"; 306 extern const char kArgs[] = "args";
278 extern const char kArgs_HelpShort[] = 307 extern const char kArgs_HelpShort[] =
279 "args: Display or configure arguments declared by the build."; 308 "args: Display or configure arguments declared by the build.";
280 extern const char kArgs_Help[] = 309 extern const char kArgs_Help[] =
281 R"(gn args <out_dir> [--list] [--short] [--args] 310 R"(gn args <out_dir> [--list] [--short] [--args]
282 311
283 See also "gn help buildargs" for a more high-level overview of how 312 See also "gn help buildargs" for a more high-level overview of how
284 build arguments work. 313 build arguments work.
285 314
286 Usage 315 Usage
316
287 gn args <out_dir> 317 gn args <out_dir>
288 Open the arguments for the given build directory in an editor (as 318 Open the arguments for the given build directory in an editor. If the
289 specified by the EDITOR environment variable). If the given build 319 given build directory doesn't exist, it will be created and an empty args
290 directory doesn't exist, it will be created and an empty args file will 320 file will be opened in the editor. You would type something like this
291 be opened in the editor. You would type something like this into that 321 into that file:
292 file:
293 enable_doom_melon=false 322 enable_doom_melon=false
294 os="android" 323 os="android"
295 324
325 To find your editor on Posix, GN will search the environment variables in
326 order: GN_EDITOR, VISUAL, and EDITOR. On Windows GN will open the command
327 associated with .txt files.
328
296 Note: you can edit the build args manually by editing the file "args.gn" 329 Note: you can edit the build args manually by editing the file "args.gn"
297 in the build directory and then running "gn gen <out_dir>". 330 in the build directory and then running "gn gen <out_dir>".
298 331
299 gn args <out_dir> --list[=<exact_arg>] [--short] 332 gn args <out_dir> --list[=<exact_arg>] [--short]
300 Lists all build arguments available in the current configuration, or, if 333 Lists all build arguments available in the current configuration, or, if
301 an exact_arg is specified for the list flag, just that one build 334 an exact_arg is specified for the list flag, just that one build
302 argument. 335 argument.
303 336
304 The output will list the declaration location, default value, and comment 337 The output will list the declaration location, current value for the
305 preceeding the declaration. If --short is specified, only the names and 338 build, default value (if different than the current value), and comment
306 values will be printed. 339 preceeding the declaration.
307 340
308 If the out_dir is specified, the build configuration will be taken from 341 If --short is specified, only the names and current values will be
309 that build directory. The reason this is needed is that the definition of 342 printed.
310 some arguments is dependent on the build configuration, so setting some
311 values might add, remove, or change the default values for other
312 arguments. Specifying your exact configuration allows the proper
313 arguments to be displayed.
314
315 Instead of specifying the out_dir, you can also use the command-line flag
316 to specify the build configuration:
317 --args=<exact list of args to use>
318 343
319 Examples 344 Examples
320 345
321 gn args out/Debug 346 gn args out/Debug
322 Opens an editor with the args for out/Debug. 347 Opens an editor with the args for out/Debug.
323 348
324 gn args out/Debug --list --short 349 gn args out/Debug --list --short
325 Prints all arguments with their default values for the out/Debug 350 Prints all arguments with their default values for the out/Debug
326 build. 351 build.
327 352
(...skipping 15 matching lines...) Expand all
343 "Or see \"gn help args\" for more variants.").PrintToStdout(); 368 "Or see \"gn help args\" for more variants.").PrintToStdout();
344 return 1; 369 return 1;
345 } 370 }
346 371
347 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchList)) 372 if (base::CommandLine::ForCurrentProcess()->HasSwitch(kSwitchList))
348 return ListArgs(args[0]); 373 return ListArgs(args[0]);
349 return EditArgsFile(args[0]); 374 return EditArgsFile(args[0]);
350 } 375 }
351 376
352 } // namespace commands 377 } // namespace commands
OLDNEW
« 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