Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / tools / gn / commands.cc
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.
4
5 #include "tools/gn/commands.h"
6 #include "tools/gn/filesystem_utils.h"
7 #include "tools/gn/item.h"
8 #include "tools/gn/label.h"
9 #include "tools/gn/label_pattern.h"
10 #include "tools/gn/setup.h"
11 #include "tools/gn/standard_out.h"
12 #include "tools/gn/target.h"
13
14 namespace commands {
15
16 CommandInfo::CommandInfo()
17     : help_short(NULL),
18       help(NULL),
19       runner(NULL) {
20 }
21
22 CommandInfo::CommandInfo(const char* in_help_short,
23                          const char* in_help,
24                          CommandRunner in_runner)
25     : help_short(in_help_short),
26       help(in_help),
27       runner(in_runner) {
28 }
29
30 const CommandInfoMap& GetCommands() {
31   static CommandInfoMap info_map;
32   if (info_map.empty()) {
33     #define INSERT_COMMAND(cmd) \
34         info_map[k##cmd] = CommandInfo(k##cmd##_HelpShort, \
35                                        k##cmd##_Help, \
36                                        &Run##cmd);
37
38     INSERT_COMMAND(Args)
39     INSERT_COMMAND(Check)
40     INSERT_COMMAND(Desc)
41     INSERT_COMMAND(Gen)
42     INSERT_COMMAND(Format)
43     INSERT_COMMAND(Help)
44     INSERT_COMMAND(Ls)
45     INSERT_COMMAND(Refs)
46
47     #undef INSERT_COMMAND
48   }
49   return info_map;
50 }
51
52 const Target* ResolveTargetFromCommandLineString(
53     Setup* setup,
54     const std::string& label_string) {
55   // Need to resolve the label after we know the default toolchain.
56   Label default_toolchain = setup->loader()->default_toolchain_label();
57   Value arg_value(NULL, label_string);
58   Err err;
59   Label label = Label::Resolve(SourceDirForCurrentDirectory(
60                                    setup->build_settings().root_path()),
61                                default_toolchain, arg_value, &err);
62   if (err.has_error()) {
63     err.PrintToStdout();
64     return NULL;
65   }
66
67   const Item* item = setup->builder()->GetItem(label);
68   if (!item) {
69     Err(Location(), "Label not found.",
70         label.GetUserVisibleName(false) + " not found.").PrintToStdout();
71     return NULL;
72   }
73
74   const Target* target = item->AsTarget();
75   if (!target) {
76     Err(Location(), "Not a target.",
77         "The \"" + label.GetUserVisibleName(false) + "\" thing\n"
78         "is not a target. Somebody should probably implement this command for "
79         "other\nitem types.");
80     return NULL;
81   }
82
83   return target;
84 }
85
86 bool ResolveTargetsFromCommandLinePattern(
87     Setup* setup,
88     const std::string& label_pattern,
89     bool all_toolchains,
90     std::vector<const Target*>* matches) {
91   Value pattern_value(NULL, label_pattern);
92
93   Err err;
94   LabelPattern pattern = LabelPattern::GetPattern(
95       SourceDirForCurrentDirectory(setup->build_settings().root_path()),
96       pattern_value,
97       &err);
98   if (err.has_error()) {
99     err.PrintToStdout();
100     return false;
101   }
102
103   if (!all_toolchains) {
104     // By default a pattern with an empty toolchain will match all toolchains.
105     // IF the caller wants to default to the main toolchain only, set it
106     // explicitly.
107     if (pattern.toolchain().is_null()) {
108       // No explicit toolchain set.
109       pattern.set_toolchain(setup->loader()->default_toolchain_label());
110     }
111   }
112
113   std::vector<const Target*> all_targets =
114       setup->builder()->GetAllResolvedTargets();
115
116   for (size_t i = 0; i < all_targets.size(); i++) {
117     if (pattern.Matches(all_targets[i]->label()))
118       matches->push_back(all_targets[i]);
119   }
120   return true;
121 }
122
123 }  // namespace commands