summaryrefslogtreecommitdiffstats
path: root/Source/cmAddSubDirectoryCommand.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmAddSubDirectoryCommand.cxx')
-rw-r--r--Source/cmAddSubDirectoryCommand.cxx111
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;
+}