/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmBuildCommand.h"

#include "cmGlobalGenerator.h"

bool cmBuildCommand::InitialPass(std::vector<std::string> const& args,
                                 cmExecutionStatus&)
{
  // Support the legacy signature of the command:
  //
  if (2 == args.size()) {
    return this->TwoArgsSignature(args);
  }

  return this->MainSignature(args);
}

bool cmBuildCommand::MainSignature(std::vector<std::string> const& args)
{
  if (args.size() < 1) {
    this->SetError("requires at least one argument naming a CMake variable");
    return false;
  }

  // The cmake variable in which to store the result.
  const char* variable = args[0].c_str();

  // Parse remaining arguments.
  const char* configuration = 0;
  const char* project_name = 0;
  std::string target;
  enum Doing
  {
    DoingNone,
    DoingConfiguration,
    DoingProjectName,
    DoingTarget
  };
  Doing doing = DoingNone;
  for (unsigned int i = 1; i < args.size(); ++i) {
    if (args[i] == "CONFIGURATION") {
      doing = DoingConfiguration;
    } else if (args[i] == "PROJECT_NAME") {
      doing = DoingProjectName;
    } else if (args[i] == "TARGET") {
      doing = DoingTarget;
    } else if (doing == DoingConfiguration) {
      doing = DoingNone;
      configuration = args[i].c_str();
    } else if (doing == DoingProjectName) {
      doing = DoingNone;
      project_name = args[i].c_str();
    } else if (doing == DoingTarget) {
      doing = DoingNone;
      target = args[i];
    } else {
      std::ostringstream e;
      e << "unknown argument \"" << args[i] << "\"";
      this->SetError(e.str());
      return false;
    }
  }

  // If null/empty CONFIGURATION argument, cmake --build uses 'Debug'
  // in the currently implemented multi-configuration global generators...
  // so we put this code here to end up with the same default configuration
  // as the original 2-arg build_command signature:
  //
  if (!configuration || !*configuration) {
    configuration = getenv("CMAKE_CONFIG_TYPE");
  }
  if (!configuration || !*configuration) {
    configuration = "Release";
  }

  if (project_name && *project_name) {
    this->Makefile->IssueMessage(
      cmake::AUTHOR_WARNING,
      "Ignoring PROJECT_NAME option because it has no effect.");
  }

  std::string makecommand =
    this->Makefile->GetGlobalGenerator()->GenerateCMakeBuildCommand(
      target, configuration, "", this->Makefile->IgnoreErrorsCMP0061());

  this->Makefile->AddDefinition(variable, makecommand.c_str());

  return true;
}

bool cmBuildCommand::TwoArgsSignature(std::vector<std::string> const& args)
{
  if (args.size() < 2) {
    this->SetError("called with less than two arguments");
    return false;
  }

  const char* define = args[0].c_str();
  const char* cacheValue = this->Makefile->GetDefinition(define);

  std::string configType = "Release";
  const char* cfg = getenv("CMAKE_CONFIG_TYPE");
  if (cfg && *cfg) {
    configType = cfg;
  }

  std::string makecommand =
    this->Makefile->GetGlobalGenerator()->GenerateCMakeBuildCommand(
      "", configType, "", this->Makefile->IgnoreErrorsCMP0061());

  if (cacheValue) {
    return true;
  }
  this->Makefile->AddCacheDefinition(define, makecommand.c_str(),
                                     "Command used to build entire project "
                                     "from the command line.",
                                     cmState::STRING);
  return true;
}
