Correct blacklist entry message
[chromium-blink-merge.git] / tools / gn / commands.cc
blobe600872c431c56751a9723cbd7beba07e64f28fc
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
3 // found in the LICENSE file.
5 #include "tools/gn/commands.h"
6 #include "tools/gn/item.h"
7 #include "tools/gn/item_node.h"
8 #include "tools/gn/label.h"
9 #include "tools/gn/setup.h"
10 #include "tools/gn/standard_out.h"
11 #include "tools/gn/target.h"
13 namespace commands {
15 CommandInfo::CommandInfo()
16 : help_short(NULL),
17 help(NULL),
18 runner(NULL) {
21 CommandInfo::CommandInfo(const char* in_help_short,
22 const char* in_help,
23 CommandRunner in_runner)
24 : help_short(in_help_short),
25 help(in_help),
26 runner(in_runner) {
29 const CommandInfoMap& GetCommands() {
30 static CommandInfoMap info_map;
31 if (info_map.empty()) {
32 #define INSERT_COMMAND(cmd) \
33 info_map[k##cmd] = CommandInfo(k##cmd##_HelpShort, \
34 k##cmd##_Help, \
35 &Run##cmd);
37 INSERT_COMMAND(Args)
38 INSERT_COMMAND(Desc)
39 INSERT_COMMAND(Gen)
40 INSERT_COMMAND(Gyp)
41 INSERT_COMMAND(Help)
42 INSERT_COMMAND(Refs)
44 #undef INSERT_COMMAND
46 return info_map;
49 const Target* GetTargetForDesc(const std::vector<std::string>& args) {
50 // Deliberately leaked to avoid expensive process teardown.
51 Setup* setup = new Setup;
52 if (!setup->DoSetup())
53 return NULL;
55 // FIXME(brettw): set the output dir to be a sandbox one to avoid polluting
56 // the real output dir with files written by the build scripts.
58 // Do the actual load. This will also write out the target ninja files.
59 if (!setup->Run())
60 return NULL;
62 // Need to resolve the label after we know the default toolchain.
63 // TODO(brettw) find the current directory and resolve the input label
64 // relative to that.
65 Label default_toolchain = setup->build_settings().toolchain_manager()
66 .GetDefaultToolchainUnlocked();
67 Value arg_value(NULL, args[0]);
68 Err err;
69 Label label =
70 Label::Resolve(SourceDir("//"), default_toolchain, arg_value, &err);
71 if (err.has_error()) {
72 err.PrintToStdout();
73 return NULL;
76 ItemNode* node;
78 base::AutoLock lock(setup->build_settings().item_tree().lock());
79 node = setup->build_settings().item_tree().GetExistingNodeLocked(label);
81 if (!node) {
82 Err(Location(), "",
83 "I don't know about this \"" + label.GetUserVisibleName(false) +
84 "\"").PrintToStdout();
85 return NULL;
88 const Target* target = node->item()->AsTarget();
89 if (!target) {
90 Err(Location(), "Not a target.",
91 "The \"" + label.GetUserVisibleName(false) + "\" thing\n"
92 "is not a target. Somebody should probably implement this command for "
93 "other\nitem types.");
94 return NULL;
97 return target;
100 } // namespace commands