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 "base/at_exit.h" 6 #include "base/command_line.h" 7 #include "base/strings/utf_string_conversions.h" 8 #include "tools/gn/commands.h" 9 #include "tools/gn/err.h" 10 #include "tools/gn/location.h" 11 #include "tools/gn/standard_out.h" 12 13 // Only the GN-generated build makes this header for now. 14 // TODO(brettw) consider adding this if we need it in GYP. 15 #if defined(GN_BUILD) 16 #include "build/util/last_change.h" 17 #else 18 #define LAST_CHANGE "UNKNOWN" 19 #endif 20 21 namespace { 22 23 std::vector<std::string> GetArgs(const CommandLine& cmdline) { 24 CommandLine::StringVector in_args = cmdline.GetArgs(); 25 #if defined(OS_WIN) 26 std::vector<std::string> out_args; 27 for (size_t i = 0; i < in_args.size(); i++) 28 out_args.push_back(base::WideToUTF8(in_args[i])); 29 return out_args; 30 #else 31 return in_args; 32 #endif 33 } 34 35 } // namespace 36 37 int main(int argc, char** argv) { 38 base::AtExitManager at_exit; 39 #if defined(OS_WIN) 40 CommandLine::set_slash_is_not_a_switch(); 41 #endif 42 CommandLine::Init(argc, argv); 43 44 const CommandLine& cmdline = *CommandLine::ForCurrentProcess(); 45 std::vector<std::string> args = GetArgs(cmdline); 46 47 std::string command; 48 if (cmdline.HasSwitch("help") || cmdline.HasSwitch("h")) { 49 // Make "-h" and "--help" default to help command. 50 command = commands::kHelp; 51 } else if (cmdline.HasSwitch("version")) { 52 // Make "--version" print the version and exit. 53 OutputString(std::string(LAST_CHANGE) + "\n"); 54 exit(0); 55 } else if (args.empty()) { 56 // No command, print error and exit. 57 Err(Location(), "No command specified.", 58 "Most commonly you want \"gn gen <out_dir>\" to make a build dir.\n" 59 "Or try \"gn help\" for more commands.").PrintToStdout(); 60 return 1; 61 } else { 62 command = args[0]; 63 args.erase(args.begin()); 64 } 65 66 const commands::CommandInfoMap& command_map = commands::GetCommands(); 67 commands::CommandInfoMap::const_iterator found_command = 68 command_map.find(command); 69 70 int retval; 71 if (found_command != command_map.end()) { 72 retval = found_command->second.runner(args); 73 } else { 74 Err(Location(), 75 "Command \"" + command + "\" unknown.").PrintToStdout(); 76 commands::RunHelp(std::vector<std::string>()); 77 retval = 1; 78 } 79 80 exit(retval); // Don't free memory, it can be really slow! 81 } 82