diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index 6c2dc2478..4c53dc4f2 100644 --- a/Source/cmCommands.cxx +++ b/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& 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); diff --git a/Source/cmUseMangledMesaCommand.cxx b/Source/cmUseMangledMesaCommand.cxx new file mode 100644 index 000000000..1422db524 --- /dev/null +++ b/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& 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 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::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()); +} + diff --git a/Source/cmUseMangledMesaCommand.h b/Source/cmUseMangledMesaCommand.h new file mode 100644 index 000000000..4fbf1e4bd --- /dev/null +++ b/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& 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 m_WrapClasses; + std::vector m_WrapHeaders; + std::string m_LibraryName; + std::string m_SourceList; + std::vector m_Commands; +}; + + + +#endif