From 72bc7951bececf61f259198dc42c2a5a41b19705 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Fri, 18 May 2001 15:25:08 -0400 Subject: [PATCH] new command --- Source/cmake.cxx | 250 +++++++++++++++++++++++++++++++++++++++++++++++ Source/cmake.h | 82 ++++++++++++++++ 2 files changed, 332 insertions(+) create mode 100644 Source/cmake.cxx create mode 100644 Source/cmake.h diff --git a/Source/cmake.cxx b/Source/cmake.cxx new file mode 100644 index 000000000..bb3a90d0d --- /dev/null +++ b/Source/cmake.cxx @@ -0,0 +1,250 @@ +/*========================================================================= + + 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 "cmake.h" +#include "cmCacheManager.h" + +// include the generator +#if defined(_WIN32) && !defined(__CYGWIN__) +#include "cmMSProjectGenerator.h" +#else +#include "cmUnixMakefileGenerator.h" +int main(int ac, char** av) +{ + cmake foo; + if(ac < 2) + { + foo.Usage(av[0]); + return -1; + } + return foo.Generate(ac,av); +} +#endif + +void cmake::Usage(const char* program) +{ + std::cerr << "Usage: " << program << " srcdir " + << "-Ssource_start_directory " + << "-Ooutput_start_directory " + << "-Hsource_home_directory " + << "-Boutput_home_directory\n" + << "Where start directories are the current place in the tree," + "and the home directories are the top.\n"; +} + +// Parse the args +void cmake::SetArgs(cmMakefile& builder, int ac, char** av) +{ + m_Local = false; + + // watch for cmake and cmake srcdir invocations + if (ac <= 2) + { + std::string ; + builder.SetHomeOutputDirectory + (cmSystemTools::GetCurrentWorkingDirectory().c_str()); + builder.SetStartOutputDirectory + (cmSystemTools::GetCurrentWorkingDirectory().c_str()); + if (ac == 2) + { + std::string hdir = cmSystemTools::GetCurrentWorkingDirectory() + + "/" + av[1]; + builder.SetHomeDirectory + (cmSystemTools::CollapseFullPath(hdir.c_str()).c_str()); + builder.SetStartDirectory + (cmSystemTools::CollapseFullPath(hdir.c_str()).c_str()); + } + else + { + builder.SetHomeDirectory + (cmSystemTools::GetCurrentWorkingDirectory().c_str()); + builder.SetStartDirectory + (cmSystemTools::GetCurrentWorkingDirectory().c_str()); + } + } + + for(int i =1; i < ac; i++) + { + std::string arg = av[i]; + if(arg.find("-H",0) != std::string::npos) + { + std::string path = arg.substr(2); + builder.SetHomeDirectory(path.c_str()); + } + if(arg.find("-S",0) != std::string::npos) + { + m_Local = true; + std::string path = arg.substr(2); + builder.SetStartDirectory(path.c_str()); + } + if(arg.find("-O",0) != std::string::npos) + { + std::string path = arg.substr(2); + builder.SetStartOutputDirectory(path.c_str()); + } + if(arg.find("-B",0) != std::string::npos) + { + std::string path = arg.substr(2); + builder.SetHomeOutputDirectory(path.c_str()); + } + if(arg.find("-D",0) == 0) + { + std::string value = arg.substr(2); + builder.AddDefinition(value.c_str(), true); + } + if(arg.find("-V",0) == 0) + { + m_Verbose = true; + } + } +} + +// at the end of this CMAKE_ROOT and CMAAKE_COMMAND should be added to the cache +void cmake::AddCMakePaths(char **av) +{ +// Find our own exectuable. +#if defined(_WIN32) && !defined(__CYGWIN__) + std::string cMakeSelf = "\""+cmSystemTools::FindProgram(av[0])+"\""; +#else + std::string cMakeSelf = cmSystemTools::FindProgram(av[0]); +#endif + + // Save the value in the cache + cmCacheManager::GetInstance()->AddCacheEntry("CMAKE_COMMAND", + cMakeSelf.c_str(), + "Path to CMake executable.", + cmCacheManager::INTERNAL); + + // do CMAKE_ROOT, look for the environment variable first + std::string cMakeRoot; + if (getenv("CMAKE_ROOT")) + { + cMakeRoot = getenv("CMAKE_ROOT"); + } + else + { + // next try exe/.. + cMakeRoot = cmSystemTools::GetProgramPath(cMakeSelf.c_str()); + std::string::size_type slashPos = cMakeRoot.rfind("/"); + if(slashPos != std::string::npos) + { + cMakeRoot = cMakeRoot.substr(0, slashPos); + } + // is there no Modules direcory there? + std::string modules = cMakeRoot + "/Modules"; + if (!cmSystemTools::FileIsDirectory(modules.c_str())) + { + // try exe/../share/cmake + modules = cMakeRoot + "/share/CMake/Modules"; +#if !defined(_WIN32) || defined(__CYGWIN__) + if (!cmSystemTools::FileIsDirectory(modules.c_str())) + { + // try compiled in value on UNIX + std::string cMakeRoot = CMAKE_ROOT_DIR; + modules = cMakeRoot + "/Modules"; + } +#endif + if (!cmSystemTools::FileIsDirectory(modules.c_str())) + { + // couldn't find modules + cmSystemTools::Error("Could nto find CMAKE_ROOT !!!"); + return; + } + } + } + + cmCacheManager::GetInstance()->AddCacheEntry + ("CMAKE_ROOT", cMakeRoot.c_str(), + "Path to CMake installation.", cmCacheManager::INTERNAL); +} + +int cmake::Generate(int ac, char **av) +{ + // Create a makefile + cmMakefile mf; + + // extract the directory arguments + cmake::SetArgs(mf, ac, av); + + // create the generator +#if defined(_WIN32) && !defined(__CYGWIN__) + cmMSProjectGenerator* gen = new cmMSProjectGenerator; +#else + cmUnixMakefileGenerator* gen = new cmUnixMakefileGenerator; +#endif + + gen->SetLocal(m_Local); + + // Read and parse the input makefile + mf.SetMakefileGenerator(gen); + mf.MakeStartDirectoriesCurrent(); + cmCacheManager::GetInstance()->LoadCache(&mf); + + // setup CMAKE_ROOT and CMAKE_COMMAND + this->AddCMakePaths(av); + + // compute system info + gen->ComputeSystemInfo(); + + // Transfer the cache into the makefile's definitions. + cmCacheManager::GetInstance()->DefineCache(&mf); + + std::string lf = mf.GetStartDirectory(); + lf += "/CMakeLists.txt"; + if(!mf.ReadListFile(lf.c_str())) + { + this->Usage(av[0]); + return -1; + } + mf.GenerateMakefile(); + cmCacheManager::GetInstance()->SaveCache(&mf); + + if(m_Verbose) + { + cmCacheManager::GetInstance()->PrintCache(std::cout); + } + + if(cmSystemTools::GetErrorOccuredFlag()) + { + return -1; + } + return 0; +} + diff --git a/Source/cmake.h b/Source/cmake.h new file mode 100644 index 000000000..fc65d3db2 --- /dev/null +++ b/Source/cmake.h @@ -0,0 +1,82 @@ +/*========================================================================= + + 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 "cmMakefile.h" +#include "cmStandardIncludes.h" + +class cmake +{ + public: + + /** + * Generate the SourceFilesList from the SourceLists. This should only be + * done once to be safe. + */ + void Usage(const char *program); + + /** + * Generate the SourceFilesList from the SourceLists. This should only be + * done once to be safe. + */ + int Generate(int ac, char **av); + + /** + * Generate the SourceFilesList from the SourceLists. This should only be + * done once to be safe. + */ + void SetArgs(cmMakefile& builder, int ac, char** av); + + /** + * Generate CMAKE_ROOT and CMAKE_COMMAND cache entries + */ + void AddCMakePaths(char **av); + + /** + * constructor + */ + cmake() {m_Verbose = false;} + + private: + bool m_Verbose; + bool m_Local; +}; +