diff --git a/Source/cmCommands.cxx b/Source/cmCommands.cxx index c4a6fadc6..9f9f64eec 100644 --- a/Source/cmCommands.cxx +++ b/Source/cmCommands.cxx @@ -58,6 +58,7 @@ #include "cmVTKWrapPythonCommand.cxx" #include "cmVTKWrapTclCommand.cxx" #include "cmQTWrapCPPCommand.cxx" +#include "cmQTWrapUICommand.cxx" #include "cmWrapExcludeFilesCommand.cxx" #include "cmAddCustomCommandCommand.cxx" @@ -118,6 +119,7 @@ void GetPredefinedCommands(std::list& commands) commands.push_back(new cmVTKWrapPythonCommand); commands.push_back(new cmVTKWrapTclCommand); commands.push_back(new cmQTWrapCPPCommand); + commands.push_back(new cmQTWrapUICommand); commands.push_back(new cmWrapExcludeFilesCommand); commands.push_back(new cmAddCustomCommandCommand); } diff --git a/Source/cmQTWrapUICommand.cxx b/Source/cmQTWrapUICommand.cxx new file mode 100644 index 000000000..a8d1a0c94 --- /dev/null +++ b/Source/cmQTWrapUICommand.cxx @@ -0,0 +1,195 @@ +/*========================================================================= + + Program: Insight Segmentation & Registration Toolkit + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + Author: Franck Bettinger. + +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 "cmQTWrapUICommand.h" + +// cmQTWrapUICommand +bool cmQTWrapUICommand::InitialPass(std::vector const& args) +{ + if(args.size() < 4 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // Now check and see if the value has been stored in the cache + // already, if so use that value and don't look for the program + const char* QT_WRAP_UI_value = m_Makefile->GetDefinition("QT_WRAP_UI"); + if (QT_WRAP_UI_value==0) + { + this->SetError("called with QT_WRAP_UI undefined"); + return false; + } + + if(cmSystemTools::IsOff(QT_WRAP_UI_value)) + { + this->SetError("called with QT_WRAP_UI off : "); + return false; + } + + // what is the current source dir + std::string cdir = m_Makefile->GetCurrentDirectory(); + + // keep the library name + m_LibraryName = args[0]; + m_HeaderList = args[1]; + m_SourceList = args[2]; + + // get the list of classes for this library + cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); + + + for(std::vector::const_iterator j = (args.begin() + 3); + j != args.end(); ++j) + { + cmMakefile::SourceMap::iterator l = Classes.find(*j); + if (l == Classes.end()) + { + this->SetError("bad source list passed to QTWrapUICommand"); + return false; + } + for(std::vector::iterator i = l->second.begin(); + i != l->second.end(); i++) + { + cmSourceFile &curr = *i; + // if we should wrap the class + if (!curr.GetWrapExclude()) + { + cmSourceFile header_file; + cmSourceFile source_file; + header_file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); + source_file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); + header_file.SetName(curr.GetSourceName().c_str(), + m_Makefile->GetCurrentOutputDirectory(), + "h",false); + source_file.SetName(curr.GetSourceName().c_str(), + m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string origname = cdir + "/" + curr.GetSourceName() + "." + + curr.GetSourceExtension(); + std::string hname = cdir + "/" + header_file.GetSourceName() + "." + + header_file.GetSourceExtension(); + m_WrapUserInterface.push_back(origname); + // add starting depends + source_file.GetDepends().push_back(hname); + source_file.GetDepends().push_back(origname); + header_file.GetDepends().push_back(origname); + m_WrapHeadersClasses.push_back(header_file); + m_WrapSourcesClasses.push_back(source_file); + unsigned int last_files=m_WrapSourcesClasses.size()-1; + m_Makefile->AddSource(m_WrapHeadersClasses[last_files], + m_HeaderList.c_str()); + m_Makefile->AddSource(m_WrapSourcesClasses[last_files], + m_SourceList.c_str()); + } + } + } + + return true; +} + +void cmQTWrapUICommand::FinalPass() +{ + + // first we add the rules for all the .ui to .h and .cxx files + int lastHeadersClass = m_WrapHeadersClasses.size(); + std::vector depends; + std::string uic_exe = "${QT_UIC_EXE}"; + + + // wrap all the .h files + depends.push_back(uic_exe); + + const char * GENERATED_QT_FILES_value= + m_Makefile->GetDefinition("GENERATED_QT_FILES"); + std::string ui_list(""); + if (GENERATED_QT_FILES_value!=0) + { + ui_list=ui_list+GENERATED_QT_FILES_value; + } + + for(int classNum = 0; classNum < lastHeadersClass; classNum++) + { + // Add output to build list + + // set up .ui to .h and .cxx command + std::string hres = m_Makefile->GetCurrentOutputDirectory(); + hres += "/"; + hres += m_WrapHeadersClasses[classNum].GetSourceName() + "." + + m_WrapHeadersClasses[classNum].GetSourceExtension(); + + std::string cxxres = m_Makefile->GetCurrentOutputDirectory(); + cxxres += "/"; + cxxres += m_WrapSourcesClasses[classNum].GetSourceName() + "." + + m_WrapSourcesClasses[classNum].GetSourceExtension(); + + ui_list = ui_list + " " + hres + " " + cxxres; + + std::vector hargs; + hargs.push_back("-o"); + hargs.push_back(hres); + hargs.push_back(m_WrapUserInterface[classNum]); + + std::vector cxxargs; + cxxargs.push_back("-impl"); + cxxargs.push_back(hres); + cxxargs.push_back("-o"); + cxxargs.push_back(cxxres); + cxxargs.push_back(m_WrapUserInterface[classNum]); + + m_Makefile->AddCustomCommand(m_WrapUserInterface[classNum].c_str(), + uic_exe.c_str(), hargs, depends, + hres.c_str(), m_LibraryName.c_str()); + + depends.push_back(hres); + + m_Makefile->AddCustomCommand(m_WrapUserInterface[classNum].c_str(), + uic_exe.c_str(), cxxargs, depends, + cxxres.c_str(), m_LibraryName.c_str()); + + } + + m_Makefile->AddDefinition("GENERATED_QT_FILES",ui_list.c_str()); + +} + + + diff --git a/Source/cmQTWrapUICommand.h b/Source/cmQTWrapUICommand.h new file mode 100644 index 000000000..0daad14ed --- /dev/null +++ b/Source/cmQTWrapUICommand.h @@ -0,0 +1,83 @@ +#ifndef cmQTWrapUICommand_h +#define cmQTWrapUICommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +/** \class cmQTWrapUICommand + * \brief Create .h and .cxx files rules for QT user interfaces files + * + * cmQTWrapUICommand is used to create wrappers for QT classes into normal C++ + */ +class cmQTWrapUICommand : public cmCommand +{ +public: + /** + * This is a virtual constructor for the command. + */ + virtual cmCommand* Clone() + { + return new cmQTWrapUICommand; + } + + /** + * This is called when the command is first encountered in + * the CMakeLists.txt file. + */ + virtual bool InitialPass(std::vector const& args); + + /** + * This is called at the end after all the information + * specified by the command is accumulated. Most commands do + * not implement this method. At this point, reading and + * writing to the cache can be done. + */ + virtual void FinalPass(); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "QT_WRAP_UI";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Create QT user interfaces Wrappers."; + } + + /** + * More documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "QT_WRAP_UI(resultingLibraryName HeadersDestName SourcesDestName " + "SourceLists ...)\n" + "Produce .h and .cxx files for all the .ui file listed " + "in the SourceLists.\n" + "The .h files will be added to the library using the HeadersDestName\n" + "source list.\n" + "The .cxx files will be added to the library using the SourcesDestName\n" + "source list."; + } + +private: + /** + * List of produced files. + */ + std::vector m_WrapSourcesClasses; + std::vector m_WrapHeadersClasses; + /** + * List of header files that pprovide the source for m_WrapClasses. + */ + std::vector m_WrapUserInterface; + std::string m_LibraryName; + std::string m_HeaderList; + std::string m_SourceList; +}; + + + +#endif diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index 5229f3f75..dad712e22 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -1316,7 +1316,7 @@ void cmUnixMakefileGenerator::OutputMakeRules(std::ostream& fout) "all", "cmake.depends $(TARGETS) $(SUBDIR_BUILD)", 0); - if (m_Makefile->IsOn("QT_WRAP_CPP")) + if (m_Makefile->IsOn("QT_WRAP_CPP") || m_Makefile->IsOn("QT_WRAP_UI")) { this->OutputMakeRule(fout, "remove generated files", @@ -1357,7 +1357,7 @@ void cmUnixMakefileGenerator::OutputMakeRules(std::ostream& fout) this->OutputMakeRule(fout, "Create CMakeCache.txt file", "${CMAKE_BINARY_DIR}/CMakeCache.txt", - 0, + 0, "$(CMAKE_COMMAND) " "-H${CMAKE_SOURCE_DIR} -B${CMAKE_BINARY_DIR}");