1
0
Эх сурвалжийг харах

ENH: Added SUBDIR_DEPENDS command and corresponding support code. This command allows specification that a set of subdirectories be built before a particular directory.

Brad King 24 жил өмнө
parent
commit
8a03ccda07

+ 2 - 0
Source/cmCommands.cxx

@@ -49,6 +49,7 @@
 #include "cmSourceFilesRemoveCommand.cxx"
 #include "cmSourceFilesRemoveCommand.cxx"
 #include "cmSourceGroupCommand.cxx"
 #include "cmSourceGroupCommand.cxx"
 #include "cmSubdirCommand.cxx"
 #include "cmSubdirCommand.cxx"
+#include "cmSubdirDependsCommand.cxx"
 #include "cmTargetLinkLibrariesCommand.cxx"
 #include "cmTargetLinkLibrariesCommand.cxx"
 #include "cmUtilitySourceCommand.cxx"
 #include "cmUtilitySourceCommand.cxx"
 #include "cmVTKWrapJavaCommand.cxx"
 #include "cmVTKWrapJavaCommand.cxx"
@@ -104,6 +105,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands)
   commands.push_back(new cmSourceFilesRemoveCommand);
   commands.push_back(new cmSourceFilesRemoveCommand);
   commands.push_back(new cmSourceGroupCommand);
   commands.push_back(new cmSourceGroupCommand);
   commands.push_back(new cmSubdirCommand);
   commands.push_back(new cmSubdirCommand);
+  commands.push_back(new cmSubdirDependsCommand);
   commands.push_back(new cmTargetLinkLibrariesCommand);
   commands.push_back(new cmTargetLinkLibrariesCommand);
   commands.push_back(new cmUtilitySourceCommand);
   commands.push_back(new cmUtilitySourceCommand);
   commands.push_back(new cmVTKWrapJavaCommand);
   commands.push_back(new cmVTKWrapJavaCommand);

+ 6 - 0
Source/cmMakefile.cxx

@@ -552,6 +552,12 @@ void cmMakefile::AddSubDirectory(const char* sub)
   m_SubDirectories.push_back(sub);
   m_SubDirectories.push_back(sub);
 }
 }
 
 
+void cmMakefile::AddSubdirDependency(const char* subdir,
+                                     const char* dependency)
+{
+  m_SubdirDepends[subdir].insert(dependency);
+}
+
 void cmMakefile::AddIncludeDirectory(const char* inc)
 void cmMakefile::AddIncludeDirectory(const char* inc)
 {
 {
   // Don't add an include directory that is already present.  Yes,
   // Don't add an include directory that is already present.  Yes,

+ 14 - 0
Source/cmMakefile.h

@@ -198,6 +198,11 @@ public:
    */
    */
   void AddSubDirectory(const char*);
   void AddSubDirectory(const char*);
 
 
+  /**
+   * Add a subdirectory dependency.
+   */
+  void AddSubdirDependency(const char* subdir, const char* dependency);
+
   /**
   /**
    * Add an include directory to the build.
    * Add an include directory to the build.
    */
    */
@@ -380,6 +385,14 @@ public:
     return m_SubDirectories;
     return m_SubDirectories;
     }
     }
 
 
+  /**
+   * Get the subdirectory dependencies for the given subdirectory.
+   */
+  const std::set<std::string>& GetSubdirDepends(const char* subdir)
+    { 
+    return m_SubdirDepends[subdir];
+    }
+
   /**
   /**
    * Get a list of include directories in the build.
    * Get a list of include directories in the build.
    */
    */
@@ -523,6 +536,7 @@ protected:
   SourceMap m_Sources; 
   SourceMap m_Sources; 
 
 
   std::vector<std::string> m_SubDirectories; // list of sub directories
   std::vector<std::string> m_SubDirectories; // list of sub directories
+  std::map<std::string, std::set<std::string> >  m_SubdirDepends;
   
   
   // The include and link-library paths.  These may have order
   // The include and link-library paths.  These may have order
   // dependency, so they must be vectors (not set).
   // dependency, so they must be vectors (not set).

+ 60 - 0
Source/cmSubdirDependsCommand.cxx

@@ -0,0 +1,60 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+Copyright (c) 2001 Insight Consortium
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+ * The name of the Insight Consortium, nor the names of any consortium members,
+   nor of any contributors, may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+  * Modified source versions must be plainly marked as such, and must not be
+    misrepresented as being the original software.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+=========================================================================*/
+#include "cmSubdirDependsCommand.h"
+
+// cmSubdirDependsCommand
+bool cmSubdirDependsCommand::InitialPass(std::vector<std::string>& args)
+{
+  if(args.size() < 2)
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  std::vector<std::string>::const_iterator i = args.begin();
+  std::string subdir = *i;
+  
+  for(++i; i != args.end(); ++i)
+    {
+    m_Makefile->AddSubdirDependency(subdir.c_str(), i->c_str());
+    }
+  return true;
+}
+

+ 105 - 0
Source/cmSubdirDependsCommand.h

@@ -0,0 +1,105 @@
+/*=========================================================================
+
+  Program:   Insight Segmentation & Registration Toolkit
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+Copyright (c) 2001 Insight Consortium
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+ * The name of the Insight Consortium, nor the names of any consortium members,
+   nor of any contributors, may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+  * Modified source versions must be plainly marked as such, and must not be
+    misrepresented as being the original software.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+=========================================================================*/
+#ifndef cmSubdirDependsCommand_h
+#define cmSubdirDependsCommand_h
+
+#include "cmStandardIncludes.h"
+#include "cmCommand.h"
+
+/** \class cmSubdirDependsCommand
+ * \brief Specify a set of subdirectories which must be built before the
+ * given subdirectory.
+ *
+ * cmSubdirDependsCommand specifies for one entry of a SUBDIRS command
+ * a set of the other entries that must be built before it.  CMake
+ * will still walk the subdirectories in the order in which they
+ * appear in a SUBDIRS command, but the generated makefiles will be
+ * setup to be sure one directory is finished before another begins.
+ * This allows parallel builds to work correctly.
+ */
+class cmSubdirDependsCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmSubdirDependsCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string>& args);
+
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() { return "SUBDIR_DEPENDS";}
+
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Add a set of subdirectories on which another subdirectory depends.";
+    }
+  
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "SUBDIR_DEPENDS(subdir dep1 dep2 ...)\n"
+      "Add a set of subdirectories on which \"subdir\" depends.\n"
+      "This sets up the generated makefiles to build the subdirectries dep1, "
+      "dep2, ... before \"subdir\" itself.";
+    }
+  
+  cmTypeMacro(cmSubdirDependsCommand, cmCommand);
+};
+
+
+
+#endif

+ 9 - 1
Source/cmUnixMakefileGenerator.cxx

@@ -723,7 +723,15 @@ OutputSubDirectoryVars(std::ostream& fout,
   for(unsigned int i =0; i < SubDirectories.size(); i++)
   for(unsigned int i =0; i < SubDirectories.size(); i++)
     {
     {
     std::string subdir = FixDirectoryName(SubDirectories[i].c_str());
     std::string subdir = FixDirectoryName(SubDirectories[i].c_str());
-    fout << target << "_" << subdir.c_str() << ":\n";
+    fout << target << "_" << subdir.c_str() << ":";
+    const std::set<std::string>& subdirDepends = m_Makefile->GetSubdirDepends(SubDirectories[i].c_str());
+    for(std::set<std::string>::const_iterator d = subdirDepends.begin();
+        d != subdirDepends.end(); ++d)
+      {
+      std::string fixed_d = FixDirectoryName(d->c_str());
+      fout << " " << target << "_" << fixed_d.c_str();
+      }
+    fout << "\n";
     if(target1)
     if(target1)
       {
       {
 	fout << "\t@if test ! -d " << SubDirectories[i].c_str() << "; then ${MAKE} rebuild_cache; fi\n"
 	fout << "\t@if test ! -d " << SubDirectories[i].c_str() << "; then ${MAKE} rebuild_cache; fi\n"