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

// cmLinkDirectoriesCommand
bool cmLinkDirectoriesCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
 if(args.size() < 1 )
    {
    return true;
    }

  for(std::vector<std::string>::const_iterator i = args.begin();
      i != args.end(); ++i)
    {
    this->AddLinkDir(*i);
    }
  return true;
}

//----------------------------------------------------------------------------
void cmLinkDirectoriesCommand::AddLinkDir(std::string const& dir)
{
  std::string unixPath = dir;
  cmSystemTools::ConvertToUnixSlashes(unixPath);
  if(!cmSystemTools::FileIsFullPath(unixPath.c_str()))
    {
    bool convertToAbsolute = false;
    cmOStringStream e;
    e << "This command specifies the relative path\n"
      << "  " << unixPath << "\n"
      << "as a link directory.\n";
    cmPolicies* policies = this->Makefile->GetPolicies();
    switch (this->Makefile->GetPolicyStatus(cmPolicies::CMP0015))
      {
      case cmPolicies::WARN:
        e << policies->GetPolicyWarning(cmPolicies::CMP0015);
        this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, e.str());
      case cmPolicies::OLD:
        // OLD behavior does not convert
        break;
      case cmPolicies::REQUIRED_IF_USED:
      case cmPolicies::REQUIRED_ALWAYS:
        e << policies->GetRequiredPolicyError(cmPolicies::CMP0015);
        this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
      case cmPolicies::NEW:
        // NEW behavior converts
        convertToAbsolute = true;
        break;
      }
    if (convertToAbsolute)
      {
      std::string tmp = this->Makefile->GetStartDirectory();
      tmp += "/";
      tmp += unixPath;
      unixPath = tmp;
      }
    }
  this->Makefile->AddLinkDirectory(unixPath.c_str());
}
