diff options
Diffstat (limited to 'Source/cmAddSubDirectoryCommand.cxx')
-rw-r--r-- | Source/cmAddSubDirectoryCommand.cxx | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/Source/cmAddSubDirectoryCommand.cxx b/Source/cmAddSubDirectoryCommand.cxx new file mode 100644 index 0000000..63a9051 --- /dev/null +++ b/Source/cmAddSubDirectoryCommand.cxx @@ -0,0 +1,111 @@ +/*============================================================================ + 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; +} |