Ver Fonte

in progress checkin

Ken Martin há 23 anos atrás
pai
commit
3ffc4b2ee1

+ 168 - 0
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;
+}

+ 105 - 0
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

+ 36 - 0
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());
+}

+ 71 - 0
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