| /*============================================================================ |
| 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.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.c_str())) |
| { |
| std::string error = "given source \""; |
| error += srcArg; |
| error += "\" which is not an existing directory."; |
| this->SetError(error); |
| return false; |
| } |
| srcPath = cmSystemTools::CollapseFullPath(srcPath.c_str()); |
| |
| // 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.c_str(), |
| 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.c_str()); |
| |
| // Add the subdirectory using the computed full paths. |
| this->Makefile->AddSubDirectory(srcPath, binPath, |
| excludeFromAll, false, true); |
| |
| return true; |
| } |