From 1f9df24ba7e76cbd7ecc1816a9f8d46b61816e95 Mon Sep 17 00:00:00 2001
From: Ken Martin <ken.martin@kitware.com>
Date: Fri, 18 Mar 2005 10:39:21 -0500
Subject: ENH: added immediate subdirectory command

---
 Source/cmAddSubDirectoryCommand.cxx | 96 +++++++++++++++++++++++++++++++++++++
 Source/cmAddSubDirectoryCommand.h   | 88 ++++++++++++++++++++++++++++++++++
 2 files changed, 184 insertions(+)
 create mode 100644 Source/cmAddSubDirectoryCommand.cxx
 create mode 100644 Source/cmAddSubDirectoryCommand.h

diff --git a/Source/cmAddSubDirectoryCommand.cxx b/Source/cmAddSubDirectoryCommand.cxx
new file mode 100644
index 0000000..56d28a6
--- /dev/null
+++ b/Source/cmAddSubDirectoryCommand.cxx
@@ -0,0 +1,96 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmAddSubDirectoryCommand.h"
+
+// cmAddSubDirectoryCommand
+bool cmAddSubDirectoryCommand::InitialPass(std::vector<std::string> const& args)
+{
+  if(args.size() < 1 )
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  
+  // store the binpath
+  std::string binArg = args[0];
+  std::string srcArg;
+  
+  bool intoplevel = true;
+  bool preorder = 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")
+      {
+      intoplevel = false;
+      continue;
+      }
+    else if(*i == "PREORDER")
+      {
+      preorder = true;
+      continue;
+      }
+    else if (!srcArg.size())
+      {
+      srcArg = *i;
+      }
+    else
+      {
+      this->SetError("called with incorrect number of arguments");
+      return false;
+      }
+    }
+
+  // if srcArg not provided use binArg
+  if (!srcArg.size())
+    {
+    srcArg = binArg;
+    }
+    
+  // now we have all the arguments
+  
+  // if they specified a relative path then compute the full
+  std::string srcPath = std::string(m_Makefile->GetCurrentDirectory()) + 
+    "/" + srcArg;
+  if (!cmSystemTools::FileIsDirectory(srcPath.c_str()))
+    {
+    srcPath = srcArg;
+    if (!cmSystemTools::FileIsDirectory(srcPath.c_str()))
+      {
+      std::string error = "Incorrect ADD_SUBDIRECTORY command. Directory: ";
+      error += srcArg + " does not exists.";
+      this->SetError(error.c_str());   
+      return false;
+      }
+    }
+  
+  std::string binPath = binArg;
+  if (!cmSystemTools::FileIsFullPath(binPath.c_str()))
+    {
+    binPath = std::string(m_Makefile->GetCurrentOutputDirectory()) + 
+      "/" + binArg.c_str();
+    }
+  
+  m_Makefile->AddSubDirectory(srcPath.c_str(), binPath.c_str(),
+                              intoplevel, preorder, true);
+
+  return true;
+}
+
diff --git a/Source/cmAddSubDirectoryCommand.h b/Source/cmAddSubDirectoryCommand.h
new file mode 100644
index 0000000..590158f
--- /dev/null
+++ b/Source/cmAddSubDirectoryCommand.h
@@ -0,0 +1,88 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmAddSubDirectoryCommand_h
+#define cmAddSubDirectoryCommand_h
+
+#include "cmCommand.h"
+
+/** \class cmAddSubDirectoryCommand
+ * \brief Specify a subdirectory to build
+ *
+ * cmAddSubDirectoryCommand specifies a subdirectory to process
+ * by CMake. CMake will descend
+ * into the specified source directory and process any CMakeLists.txt found.
+ */
+class cmAddSubDirectoryCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmAddSubDirectoryCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string> const& args);
+
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() { return "ADD_SUBDIRECTORY";}
+
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Add a subdirectory to the build.";
+    }
+  
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "  ADD_SUBDIRECTORY(binary_dir [source_dir] [EXCLUDE_FROM_ALL] [PREORDER] )\n"
+      "Add a subdirectory to the build. The binary_dir specified can be "
+      "relative to the current otuput directory (the typical usage) or "
+      "absolute. If the source dir is not specified it "
+      "will be set to the same value as the binary_dir. "
+      "This will cause any CMakeLists.txt files in the sub directories "
+      "to be processed by CMake.  If the PREORDER flag "
+      "is specified then this directory will be traversed first by makefile "
+      "builds, the PRORDER flag has no effect on IDE projects. " 
+      "If the EXCLUDE_FROM_ALL argument is provided then this subdirectory "
+      "will not be included in the top level makefile or project file.  "
+      "This is useful for having cmake create makefiles or projects for a "
+      "set of examples in a project. You would want cmake to generated "
+      "makefiles or project files for all the examples at the same time, "
+      "but you would not want them to show up in the top level project or "
+      "be built each time make is run from the top.";
+    }
+  
+  cmTypeMacro(cmAddSubDirectoryCommand, cmCommand);
+};
+
+
+
+#endif
-- 
cgit v0.12