From 1f9df24ba7e76cbd7ecc1816a9f8d46b61816e95 Mon Sep 17 00:00:00 2001 From: Ken Martin 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 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::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 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