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")) { 49 // Make "--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 command = commands::kGen; 57 } else { 58 command = args[0]; 59 args.erase(args.begin()); 60 } 61 62 const commands::CommandInfoMap& command_map = commands::GetCommands(); 63 commands::CommandInfoMap::const_iterator found_command = 64 command_map.find(command); 65 66 int retval; 67 if (found_command != command_map.end()) { 68 retval = found_command->second.runner(args); 69 } else { 70 Err(Location(), 71 "Command \"" + command + "\" unknown.").PrintToStdout(); 72 commands::RunHelp(std::vector<std::string>()); 73 retval = 1; 74 } 75 76 exit(retval); // Don't free memory, it can be really slow! 77 return retval; 78 } 79