Просмотр исходного кода

ENH: add Use mangled mesa command

Bill Hoffman 24 лет назад
Родитель
Сommit
53dd41451d
3 измененных файлов с 222 добавлено и 0 удалено
  1. 2 0
      Source/cmCommands.cxx
  2. 154 0
      Source/cmUseMangledMesaCommand.cxx
  3. 66 0
      Source/cmUseMangledMesaCommand.h

+ 2 - 0
Source/cmCommands.cxx

@@ -51,6 +51,7 @@
 #include "cmSubdirCommand.cxx"
 #include "cmSubdirDependsCommand.cxx"
 #include "cmTargetLinkLibrariesCommand.cxx"
+#include "cmUseMangledMesaCommand.cxx"
 #include "cmUtilitySourceCommand.cxx"
 #include "cmVTKWrapJavaCommand.cxx"
 #include "cmVTKWrapPythonCommand.cxx"
@@ -107,6 +108,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands)
   commands.push_back(new cmSubdirCommand);
   commands.push_back(new cmSubdirDependsCommand);
   commands.push_back(new cmTargetLinkLibrariesCommand);
+  commands.push_back(new cmUseMangledMesaCommand);
   commands.push_back(new cmUtilitySourceCommand);
   commands.push_back(new cmVTKWrapJavaCommand);
   commands.push_back(new cmVTKWrapPythonCommand);

+ 154 - 0
Source/cmUseMangledMesaCommand.cxx

@@ -0,0 +1,154 @@
+/*=========================================================================
+
+  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 "cmUseMangledMesaCommand.h"
+#include "cmSystemTools.h"
+
+// cmUseMangledMesaCommand
+bool cmUseMangledMesaCommand::InitialPass(std::vector<std::string>& args)
+{ 
+  // expected two arguments:
+  // arguement one: the full path to gl_mangle.h
+  // arguement two : directory for output of edited headers
+  if(args.size() < 2)
+    {
+    this->SetError("called with incorrect number of arguments");
+    return false;
+    }
+  m_Makefile->ExpandVariablesInString(args[0]);
+  m_Makefile->ExpandVariablesInString(args[1]);
+  const char* inputFileName = args[0].c_str();
+  const char* destDir = args[1].c_str();
+  std::string dir, file;
+  cmSystemTools::SplitProgramPath(inputFileName, dir, file);
+  std::vector<std::string> files;
+  cmSystemTools::Glob(dir.c_str(), "\\.h$", files);
+  if(files.size() == 0)
+    {
+    cmSystemTools::Error("Could not open Mesa Directory ", dir.c_str());
+    return false;
+    }
+  cmSystemTools::MakeDirectory(destDir);
+  for(std::vector<std::string>::iterator i = files.begin();
+      i != files.end(); ++i)
+    {
+    std::string path = dir.c_str();
+    path += "/";
+    path += *i;
+    this->CopyAndFullPathMesaHeader(path.c_str(), destDir);
+    }
+  
+  return true;
+}
+
+void 
+cmUseMangledMesaCommand::
+CopyAndFullPathMesaHeader(const char* source,
+                          const char* outdir)
+{
+  std::string dir, file;
+  cmSystemTools::SplitProgramPath(source, dir, file);
+  std::string outFile = outdir;
+  outFile += "/";
+  outFile += file;
+  std::string tempOutputFile = outFile;
+  tempOutputFile += ".tmp";
+  std::ofstream fout(tempOutputFile.c_str());
+  if(!fout)
+    {
+    cmSystemTools::Error("Could not open file for write in copy operatation: ", 
+                         tempOutputFile.c_str(), outdir);
+    return;
+    }
+  std::ifstream fin(source);
+  if(!fin)
+    {
+    cmSystemTools::Error("Could not open file for read in copy operatation",
+                         source);
+    return;
+    }
+  // now copy input to output and expand varibles in the
+  // input file at the same time
+  const int bufSize = 4096;
+  char buffer[bufSize];
+  std::string inLine;  
+  // regular expression for any #include line
+  cmRegularExpression includeLine("^[ \t]*#[ \t]*include[ \t]*[<\"]([^\">]+)[\">]");
+  // regular expression for gl/ or GL/ in a file (match(1) of above)
+  cmRegularExpression glDirLine("(gl|GL)(/|\\\\)([^<\"]+)");
+  // regular expression for gl GL or xmesa in a file (match(1) of above)
+  cmRegularExpression glLine("(gl|GL|xmesa)");
+  while(fin)
+    {
+    fin.getline(buffer, bufSize);
+    if(fin)
+      {
+      inLine = buffer;
+      if(includeLine.find(inLine.c_str()))
+        {
+        std::string includeFile = includeLine.match(1);
+        if(glDirLine.find(includeFile.c_str()))
+          {
+          std::string file = glDirLine.match(3);
+          fout << "#include \"" << outdir << "/" << file.c_str() << "\"\n";
+          }
+        else if(glLine.find(includeFile.c_str()))
+          {
+          fout << "#include \"" << outdir << "/" << includeLine.match(1).c_str() << "\"\n";
+          }
+        else
+          {
+          fout << inLine << "\n";
+          }
+        }
+      else
+        {
+        fout << inLine << "\n";
+        }
+      }
+    }
+  // close the files before attempting to copy
+  fin.close();
+  fout.close();
+  cmSystemTools::CopyFileIfDifferent(tempOutputFile.c_str(),
+                                     outFile.c_str());
+  cmSystemTools::RemoveFile(tempOutputFile.c_str());
+}
+

+ 66 - 0
Source/cmUseMangledMesaCommand.h

@@ -0,0 +1,66 @@
+#ifndef cmUseMangledMesaCommand_h
+#define cmUseMangledMesaCommand_h
+
+#include "cmStandardIncludes.h"
+#include "cmCommand.h"
+
+/** \class cmUseMangledMesaCommand
+ * \brief Create Tcl Wrappers for VTK classes.
+ *
+ * cmUseMangledMesaCommand is used to define a CMake variable include
+ * path location by specifying a file and list of directories.
+ */
+class cmUseMangledMesaCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmUseMangledMesaCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string>& args);
+  
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() { return "USE_MANGLED_MESA";}
+
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Create copies of mesa headers for use in combination with system gl.";
+    }
+  
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "USE_MANGLED_MESA(\"path to gl_mangle.h\""
+      " \"directory for output\"  )";
+    }
+
+protected:
+  void CopyAndFullPathMesaHeader(const char* source,
+                                 const char* outdir);
+private:
+  std::vector<cmSourceFile> m_WrapClasses;
+  std::vector<std::string> m_WrapHeaders;
+  std::string m_LibraryName;
+  std::string m_SourceList;
+  std::vector<std::string> m_Commands;
+};
+
+
+
+#endif