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

// cmAddSubDirectoryCommand
bool cmAddSubDirectoryCommand::InitialPass
(std::vector<std::string> const& args, cmExecutionStatus &)
{
  if(args.size() < 1 )
    {
    this->SetError("called with incorrect number of arguments");
    return false;
    }

  // store the binpath
  std::string srcArg = args[0];
  std::string binArg;

  bool excludeFromAll = false;

  // process the rest of the arguments looking for optional args
  std::vector<std::string>::const_iterator i = args.begin();
  ++i;
  for(;i != args.end(); ++i)
    {
    if(*i == "EXCLUDE_FROM_ALL")
      {
      excludeFromAll = true;
      continue;
      }
    else if (binArg.empty())
      {
      binArg = *i;
      }
    else
      {
      this->SetError("called with incorrect number of arguments");
      return false;
      }
    }

  // Compute the full path to the specified source directory.
  // Interpret a relative path with respect to the current source directory.
  std::string srcPath;
  if(cmSystemTools::FileIsFullPath(srcArg.c_str()))
    {
    srcPath = srcArg;
    }
  else
    {
    srcPath = this->Makefile->GetCurrentSourceDirectory();
    srcPath += "/";
    srcPath += srcArg;
    }
  if(!cmSystemTools::FileIsDirectory(srcPath))
    {
    std::string error = "given source \"";
    error += srcArg;
    error += "\" which is not an existing directory.";
    this->SetError(error);
    return false;
    }
  srcPath = cmSystemTools::CollapseFullPath(srcPath);

  // Compute the full path to the binary directory.
  std::string binPath;
  if(binArg.empty())
    {
    // No binary directory was specified.  If the source directory is
    // not a subdirectory of the current directory then it is an
    // error.
    if(!cmSystemTools::IsSubDirectory(srcPath,
          this->Makefile->GetCurrentSourceDirectory()))
      {
      std::ostringstream e;
      e << "not given a binary directory but the given source directory "
        << "\"" << srcPath << "\" is not a subdirectory of \""
        << this->Makefile->GetCurrentSourceDirectory() << "\".  "
        << "When specifying an out-of-tree source a binary directory "
        << "must be explicitly specified.";
      this->SetError(e.str());
      return false;
      }

    // Remove the CurrentDirectory from the srcPath and replace it
    // with the CurrentOutputDirectory.
    const char* src = this->Makefile->GetCurrentSourceDirectory();
    const char* bin = this->Makefile->GetCurrentBinaryDirectory();
    size_t srcLen = strlen(src);
    size_t binLen = strlen(bin);
    if(srcLen > 0 && src[srcLen-1] == '/')
      { --srcLen; }
    if(binLen > 0 && bin[binLen-1] == '/')
      { --binLen; }
    binPath = std::string(bin, binLen) + srcPath.substr(srcLen);
    }
  else
    {
    // Use the binary directory specified.
    // Interpret a relative path with respect to the current binary directory.
    if(cmSystemTools::FileIsFullPath(binArg.c_str()))
      {
      binPath = binArg;
      }
    else
      {
      binPath = this->Makefile->GetCurrentBinaryDirectory();
      binPath += "/";
      binPath += binArg;
      }
    }
  binPath = cmSystemTools::CollapseFullPath(binPath);

  // Add the subdirectory using the computed full paths.
  this->Makefile->AddSubDirectory(srcPath, binPath,
                                  excludeFromAll, true);

  return true;
}
