/*============================================================================
  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 "cmExternalMakefileProjectGenerator.h"

#include <assert.h>

void cmExternalMakefileProjectGenerator::EnableLanguage(
  std::vector<std::string> const&, cmMakefile*, bool)
{
}

std::string cmExternalMakefileProjectGenerator::CreateFullGeneratorName(
  const std::string& globalGenerator, const std::string& extraGenerator)
{
  std::string fullName;
  if (!globalGenerator.empty()) {
    if (!extraGenerator.empty()) {
      fullName = extraGenerator;
      fullName += " - ";
    }
    fullName += globalGenerator;
  }
  return fullName;
}

std::string cmExternalMakefileProjectGenerator::GetGlobalGeneratorName(
  const std::string& fullName)
{
  // at least one global generator must be supported
  assert(!this->SupportedGlobalGenerators.empty());

  if (fullName.empty()) {
    return "";
  }

  // if we get only the short name, take the first global generator as default
  if (fullName == this->GetName()) {
    return this->SupportedGlobalGenerators[0];
  }

  // otherwise search for the matching global generator
  for (std::vector<std::string>::const_iterator it =
         this->SupportedGlobalGenerators.begin();
       it != this->SupportedGlobalGenerators.end(); ++it) {
    if (this->CreateFullGeneratorName(*it, this->GetName()) == fullName) {
      return *it;
    }
  }
  return "";
}
