summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2002-08-30 16:00:35 -0400
committerKen Martin <ken.martin@kitware.com>2002-08-30 16:00:35 -0400
commit3ffc4b2ee1cabf1815c6b615f43d92aefa9c2597 (patch)
tree03afb8b53f0c0c7aeb4822e296f611eaf2713563 /Source
parent31f80f19aec938a3109e6d8c17172a3538d0477f (diff)
downloadcmake-3ffc4b2ee1cabf1815c6b615f43d92aefa9c2597.tar.gz
in progress checkin
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalGenerator.cxx168
-rw-r--r--Source/cmGlobalGenerator.h105
-rw-r--r--Source/cmLocalGenerator.cxx36
-rw-r--r--Source/cmLocalGenerator.h71
4 files changed, 380 insertions, 0 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
new file mode 100644
index 0000000000..90d7c96695
--- /dev/null
+++ b/Source/cmGlobalGenerator.cxx
@@ -0,0 +1,168 @@
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Insight Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 "cmGlobalGenerator.h"
+#include "cmLocalGenerator.h"
+#include "cmake.h"
+#include "cmMakefile.h"
+
+cmGlobalGenerator::~cmGlobalGenerator()
+{
+ // Delete any existing cmLocalGenerators
+ int i;
+ for (i = 0; i < m_LocalGenerators.size(); ++i)
+ {
+ delete m_LocalGenerators[i];
+ }
+ m_LocalGenerators.clear();
+}
+
+void cmGlobalGenerator::SetLanguageEnabled(const char* l)
+{
+ m_LanguageEnabled[l] = true;
+}
+
+bool cmGlobalGenerator::GetLanguageEnabled(const char* l)
+{
+ return (m_LanguageEnabled.count(l) > 0);
+}
+
+void cmGlobalGenerator::ClearEnabledLanguages()
+{
+ m_LanguageEnabled.clear();
+}
+
+void cmGlobalGenerator::Configure()
+{
+ // Delete any existing cmLocalGenerators
+ int i;
+ for (i = 0; i < m_LocalGenerators.size(); ++i)
+ {
+ delete m_LocalGenerators[i];
+ }
+ m_LocalGenerators.clear();
+
+ // start with this directory
+ cmLocalGenerator *lg = this->CreateLocalGenerator();
+ m_LocalGenerators.push_back(lg);
+
+ // set the Start directories
+ lg->GetMakefile()->SetStartDirectory(m_CMakeInstance->GetHomeDirectory());
+ lg->GetMakefile()->SetStartOutputDirectory(m_CMakeInstance->GetHomeOutputDirectory());
+
+ // now do it
+ this->RecursiveConfigure(lg);
+}
+
+// loop through the directories creating cmLocalGenerators and Configure()
+void cmGlobalGenerator::RecursiveConfigure(cmLocalGenerator *lg)
+{
+ // configure the current directory
+ lg->Configure();
+
+ // get all the subdirectories
+ std::vector<std::string> subdirs = lg->GetMakefile()->GetSubDirectories();
+
+ // for each subdir recurse
+ int i;
+ for (i = 0; i < subdirs.size(); ++i)
+ {
+ cmLocalGenerator *lg2 = this->CreateLocalGenerator();
+ m_LocalGenerators.push_back(lg2);
+
+ // add the subdir to the start output directory
+ std::string outdir = lg->GetMakefile()->GetStartOutputDirectory();
+ outdir += "/";
+ outdir += subdirs[i];
+ lg2->GetMakefile()->SetStartOutputDirectory(outdir.c_str());
+
+ // add the subdir to the start source directory
+ std::string currentDir = lg->GetMakefile()->GetStartDirectory();
+ currentDir += "/";
+ currentDir += subdirs[i];
+ lg2->GetMakefile()->SetStartDirectory(currentDir.c_str());
+
+ this->RecursiveConfigure(lg2);
+ }
+}
+
+void cmGlobalGenerator::Generate()
+{
+ // For each existing cmLocalGenerator
+ int i;
+ for (i = 0; i < m_LocalGenerators.size(); ++i)
+ {
+ m_LocalGenerators[i]->Generate(true);
+ }
+}
+
+void cmGlobalGenerator::LocalGenerate()
+{
+ // for this case we create one LocalGenerator
+ // configure it, and then Generate it
+ // start with this directory
+ cmLocalGenerator *lg = this->CreateLocalGenerator();
+
+ // set the Start directories
+ lg->GetMakefile()->SetStartDirectory(m_CMakeInstance->GetHomeDirectory());
+ lg->GetMakefile()->SetStartOutputDirectory(m_CMakeInstance->GetHomeOutputDirectory());
+
+ // now do trhe configure
+ lg->Configure();
+ lg->Generate(false);
+ delete lg;
+}
+
+int cmGlobalGenerator::TryCompile(const char *, const char *bindir,
+ const char *)
+{
+ // now build the test
+ std::string makeCommand =
+ m_CMakeInstance->GetCacheManager()->GetCacheValue("CMAKE_MAKE_PROGRAM");
+ if(makeCommand.size() == 0)
+ {
+ cmSystemTools::Error(
+ "Generator cannot find the appropriate make command.");
+ return 1;
+ }
+ makeCommand = cmSystemTools::ConvertToOutputPath(makeCommand.c_str());
+
+ /**
+ * Run an executable command and put the stdout in output.
+ */
+ std::string output;
+ std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
+ cmSystemTools::ChangeDirectory(bindir);
+
+ // now build
+ makeCommand += " all";
+ if (!cmSystemTools::RunCommand(makeCommand.c_str(), output))
+ {
+ cmSystemTools::Error("Generator: execution of make failed.");
+ // return to the original directory
+ cmSystemTools::ChangeDirectory(cwd.c_str());
+ return 1;
+ }
+ cmSystemTools::ChangeDirectory(cwd.c_str());
+ return 0;
+}
+
+cmLocalGenerator *cmGlobalGenerator::CreateLocalGenerator()
+{
+ cmLocalGenerator *lg = new cmLocalGenerator;
+ lg->SetGlobalGenerator(this);
+ return lg;
+}
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
new file mode 100644
index 0000000000..6c660e4d37
--- /dev/null
+++ b/Source/cmGlobalGenerator.h
@@ -0,0 +1,105 @@
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Insight Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmGlobalGenerator_h
+#define cmGlobalGenerator_h
+
+#include "cmStandardIncludes.h"
+
+class cmake;
+class cmMakefile;
+class cmLocalGenerator;
+
+/** \class cmGlobalGenerator
+ * \brief Responable for overseeing the generation process for the entire tree
+ *
+ * Subclasses of this class generate makefiles for various
+ * platforms.
+ */
+class cmGlobalGenerator
+{
+public:
+ ///! Free any memory allocated with the GlobalGenerator
+ virtual ~cmGlobalGenerator();
+
+ ///! Create a local generator appropriate to this Global Generator
+ virtual cmLocalGenerator *CreateLocalGenerator();
+
+ ///! Get the name for this generator
+ virtual const char *GetName() { return "Generic"; };
+
+ /**
+ * Create LocalGenerators and process the CMakeLists files. This does not
+ * actually produce any makefiles, DSPs, etc.
+ */
+ virtual void Configure();
+
+ /**
+ * Generate the all required files for building this project/tree. This
+ * basically creates a series of LocalGenerators for each directory and
+ * requests that they Generate.
+ */
+ virtual void Generate();
+
+ /**
+ * Generate the required files for building this directory. This
+ * basically creates a single LocalGenerators and
+ * requests that it Generate.
+ */
+ virtual void LocalGenerate();
+
+ /**
+ * Set/Get and Clear the enabled languages.
+ */
+ void SetLanguageEnabled(const char*);
+ bool GetLanguageEnabled(const char*);
+ void ClearEnabledLanguages();
+
+ /**
+ * Try to determine system infomation such as shared library
+ * extension, pthreads, byte order etc.
+ */
+ virtual void EnableLanguage(const char*, cmMakefile *) {};
+
+ /**
+ * Try running cmake and building a file. This is used for dynalically
+ * loaded commands, not as part of the usual build process.
+ */
+ virtual int TryCompile(const char *srcdir, const char *bindir,
+ const char *projectName);
+
+ ///! Set the CMake instance
+ void SetCMakeInstance(cmake *cm) {
+ this->m_CMakeInstance = cm; };
+
+ ///! Get the CMake instance
+ cmake *GetCMakeInstance() {
+ return this->m_CMakeInstance; };
+
+protected:
+ bool m_LanguagesEnabled;
+ cmake *m_CMakeInstance;
+ std::vector<cmLocalGenerator *> m_LocalGenerators;
+
+ ///! used by Configure()
+ void RecursiveConfigure(cmLocalGenerator *lg);
+
+private:
+ std::map<cmStdString, bool> m_LanguageEnabled;
+};
+
+#endif
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
new file mode 100644
index 0000000000..258debd868
--- /dev/null
+++ b/Source/cmLocalGenerator.cxx
@@ -0,0 +1,36 @@
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Insight Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 "cmLocalGenerator.h"
+#include "cmMakefile.h"
+
+cmLocalGenerator::cmLocalGenerator()
+{
+ m_Makefile = new cmMakefile;
+}
+
+cmLocalGenerator::~cmLocalGenerator()
+{
+ delete m_Makefile;
+}
+
+void cmLocalGenerator::Configure()
+{
+ // find & read the list file
+ std::string currentStart = m_Makefile->GetStartDirectory();
+ currentStart += "/CMakeLists.txt";
+ m_Makefile->ReadListFile(currentStart.c_str());
+}
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
new file mode 100644
index 0000000000..24bcfa5f7b
--- /dev/null
+++ b/Source/cmLocalGenerator.h
@@ -0,0 +1,71 @@
+/*=========================================================================
+
+ Program: Insight Segmentation & Registration Toolkit
+ Module: $RCSfile$
+ Language: C++
+ Date: $Date$
+ Version: $Revision$
+
+ Copyright (c) 2002 Insight Consortium. All rights reserved.
+ See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 cmLocalGenerator_h
+#define cmLocalGenerator_h
+
+#include "cmStandardIncludes.h"
+
+class cmMakefile;
+class cmGlobalGenerator;
+
+/** \class cmLocalGenerator
+ * \brief Create required build files for a directory.
+ *
+ * Subclasses of this abstract class generate makefiles, DSP, etc for various
+ * platforms. This class should never be constructued directly. A
+ * GlobalGenerator will create it and invoke the appropriate commands on it.
+ */
+class cmLocalGenerator
+{
+public:
+ cmLocalGenerator();
+ ~cmLocalGenerator();
+
+ /**
+ * Generate the makefile for this directory. fromTheTop indicates if this
+ * is being invoked as part of a global Generate or specific to this
+ * directory. The difference is that when done from the Top we might skip
+ * some steps to save time, such as dependency generation for the
+ * makefiles. This is done by a direct invocation from make.
+ */
+ virtual void Generate(bool fromTheTop);
+
+ /**
+ * Process the CMakeLists files for this directory to fill in the
+ * m_Makefile ivar
+ */
+ virtual void Configure();
+
+ ///! Get the makefile for this generator
+ cmMakefile *GetMakefile() {
+ return this->m_Makefile; };
+
+ ///! Get the GlobalGenerator this is associated with
+ cmGlobalGenerator *GetGlobalGenerator() {
+ return m_GlobalGenerator; };
+
+ ///! Set the Global Generator, done on creation by the GlobalGenerator
+ void SetGlobalGenerator(cmGlobalGenerator *gg) {
+ m_GlobalGenerator = gg; };
+
+protected:
+ bool m_FromTheTop;
+ cmMakefile *m_Makefile;
+ cmGlobalGenerator *m_GlobalGenerator;
+};
+
+#endif