gn_main.cc revision f2477e01787aa58f445919b809d89e252beef54f
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 21namespace { 22 23std::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 37int 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