From 8a03ccda075da86e9dcfc3ad5286aa0793d87619 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 1 Aug 2001 16:14:16 -0400 Subject: [PATCH] ENH: Added SUBDIR_DEPENDS command and corresponding support code. This command allows specification that a set of subdirectories be built before a particular directory. --- Source/cmCommands.cxx | 2 + Source/cmMakefile.cxx | 6 ++ Source/cmMakefile.h | 14 ++++ Source/cmSubdirDependsCommand.cxx | 60 +++++++++++++++++ Source/cmSubdirDependsCommand.h | 105 +++++++++++++++++++++++++++++ Source/cmUnixMakefileGenerator.cxx | 10 ++- 6 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 Source/cmSubdirDependsCommand.cxx create mode 100644 Source/cmSubdirDependsCommand.h diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index bebf2cab2..6c2dc2478 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -49,6 +49,7 @@ #include "cmSourceFilesRemoveCommand.cxx" #include "cmSourceGroupCommand.cxx" #include "cmSubdirCommand.cxx" +#include "cmSubdirDependsCommand.cxx" #include "cmTargetLinkLibrariesCommand.cxx" #include "cmUtilitySourceCommand.cxx" #include "cmVTKWrapJavaCommand.cxx" @@ -104,6 +105,7 @@ void GetPredefinedCommands(std::list& commands) commands.push_back(new cmSourceFilesRemoveCommand); commands.push_back(new cmSourceGroupCommand); commands.push_back(new cmSubdirCommand); + commands.push_back(new cmSubdirDependsCommand); commands.push_back(new cmTargetLinkLibrariesCommand); commands.push_back(new cmUtilitySourceCommand); commands.push_back(new cmVTKWrapJavaCommand); diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index a509de883..f1187f9b1 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -552,6 +552,12 @@ void cmMakefile::AddSubDirectory(const char* 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) { // Don't add an include directory that is already present. Yes, diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 88acddba0..78e42c7df 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -198,6 +198,11 @@ public: */ void AddSubDirectory(const char*); + /** + * Add a subdirectory dependency. + */ + void AddSubdirDependency(const char* subdir, const char* dependency); + /** * Add an include directory to the build. */ @@ -380,6 +385,14 @@ public: return m_SubDirectories; } + /** + * Get the subdirectory dependencies for the given subdirectory. + */ + const std::set& GetSubdirDepends(const char* subdir) + { + return m_SubdirDepends[subdir]; + } + /** * Get a list of include directories in the build. */ @@ -523,6 +536,7 @@ protected: SourceMap m_Sources; std::vector m_SubDirectories; // list of sub directories + std::map > m_SubdirDepends; // The include and link-library paths. These may have order // dependency, so they must be vectors (not set). diff --git a/Source/cmSubdirDependsCommand.cxx b/Source/cmSubdirDependsCommand.cxx new file mode 100644 index 000000000..2060e1c12 --- /dev/null +++ b/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& args) +{ + if(args.size() < 2) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + std::vector::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; +} + diff --git a/Source/cmSubdirDependsCommand.h b/Source/cmSubdirDependsCommand.h new file mode 100644 index 000000000..29c235e7f --- /dev/null +++ b/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& 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 diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 225cd338d..24f403621 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -723,7 +723,15 @@ OutputSubDirectoryVars(std::ostream& fout, for(unsigned int i =0; i < SubDirectories.size(); i++) { std::string subdir = FixDirectoryName(SubDirectories[i].c_str()); - fout << target << "_" << subdir.c_str() << ":\n"; + fout << target << "_" << subdir.c_str() << ":"; + const std::set& subdirDepends = m_Makefile->GetSubdirDepends(SubDirectories[i].c_str()); + for(std::set::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) { fout << "\t@if test ! -d " << SubDirectories[i].c_str() << "; then ${MAKE} rebuild_cache; fi\n"