| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 | /*============================================================================  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"// cmAddSubDirectoryCommandbool 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.size())      {      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->GetCurrentDirectory();    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->GetCurrentDirectory()))      {      cmOStringStream e;      e << "not given a binary directory but the given source directory "        << "\"" << srcPath << "\" is not a subdirectory of \""        << this->Makefile->GetCurrentDirectory() << "\".  "        << "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->GetCurrentDirectory();    const char* bin = this->Makefile->GetCurrentOutputDirectory();    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->GetCurrentOutputDirectory();      binPath += "/";      binPath += binArg;      }    }  binPath = cmSystemTools::CollapseFullPath(binPath);  // Add the subdirectory using the computed full paths.  this->Makefile->AddSubDirectory(srcPath, binPath,                                  excludeFromAll, false, true);  return true;}
 |