diff options
-rw-r--r-- | Source/cmVTKMakeInstantiatorCommand.cxx | 136 | ||||
-rw-r--r-- | Source/cmVTKMakeInstantiatorCommand.h | 22 |
2 files changed, 94 insertions, 64 deletions
diff --git a/Source/cmVTKMakeInstantiatorCommand.cxx b/Source/cmVTKMakeInstantiatorCommand.cxx index b445b53..79e6544 100644 --- a/Source/cmVTKMakeInstantiatorCommand.cxx +++ b/Source/cmVTKMakeInstantiatorCommand.cxx @@ -52,78 +52,108 @@ cmVTKMakeInstantiatorCommand return false; } - std::string libName = args[0]; - std::string srcListName = args[1]; - m_ExportMacro = args[2]; + m_ClassName = args[0]; + m_Makefile->ExpandVariablesInString(m_ClassName); + + std::string outSourceList = args[1]; + m_Makefile->ExpandVariablesInString(outSourceList); + + std::vector<cmStdString> inSourceLists; + m_ExportMacro = "-"; unsigned int groupSize = 10; // Find the path of the files to be generated. std::string filePath = m_Makefile->GetCurrentOutputDirectory(); std::string headerPath = filePath; - if(args.size() > 3) + for(unsigned int i=2;i < args.size();++i) { - for(unsigned int i=3;i < args.size();++i) + if(args[i] == "GROUP_SIZE") + { + if(++i < args.size()) + { + std::string gSize = args[i].c_str(); + m_Makefile->ExpandVariablesInString(gSize); + groupSize = atoi(gSize.c_str()); + } + else + { + this->SetError("GROUP_SIZE option used without value."); + return false; + } + } + else if(args[i] == "HEADER_LOCATION") + { + if(++i < args.size()) + { + headerPath = args[i]; + m_Makefile->ExpandVariablesInString(headerPath); + } + else + { + this->SetError("HEADER_LOCATION option used without value."); + return false; + } + } + else if(args[i] == "EXPORT_MACRO") { - if(args[i] == "GROUP_SIZE") + if(++i < args.size()) { - if(++i < args.size()) - { - groupSize = atoi(args[i].c_str()); - } - else - { - this->SetError("GROUP_SIZE option used without value."); - return false; - } + m_ExportMacro = args[i]; + m_Makefile->ExpandVariablesInString(m_ExportMacro); } - else if(args[i] == "HEADER_LOCATION") + else { - if(++i < args.size()) - { - headerPath = args[i]; - m_Makefile->ExpandVariablesInString(headerPath); - } - else - { - this->SetError("HEADER_LOCATION option used without value."); - return false; - } + this->SetError("EXPORT_MACRO option used without value."); + return false; } } + // If not an option, it must be another input source list name. + else + { + std::string s = args[i]; + m_Makefile->ExpandVariablesInString(s); + inSourceLists.push_back(s); + } } - m_Makefile->ExpandVariablesInString(srcListName); - - // Find the source list specified. - cmMakefile::SourceMap::iterator srcListIter = - m_Makefile->GetSources().find(srcListName); - - if(srcListIter == m_Makefile->GetSources().end()) + if(m_ExportMacro == "-") { - std::string errStr = "No source list named " + srcListName; - this->SetError(errStr.c_str()); + this->SetError("No EXPORT_MACRO option given."); return false; } - m_ClassName = libName+"Instantiator"; - - std::vector<cmSourceFile>& srcList = srcListIter->second; - - // Collect the names of the classes. - for(std::vector<cmSourceFile>::iterator src = srcList.begin(); - src != srcList.end();++src) + for(std::vector<cmStdString>::const_iterator s = inSourceLists.begin(); + s != inSourceLists.end(); ++s) { - // Wrap-excluded and abstract classes do not have a New() method. - // vtkIndent and vtkTimeStamp are special cases and are not - // vtkObject subclasses. - if(!src->GetWrapExclude() && !src->GetIsAnAbstractClass() - && (src->GetSourceName() != "vtkIndent") - && (src->GetSourceName() != "vtkTimeStamp")) + // Find the source list specified. + cmMakefile::SourceMap::iterator srcListIter = + m_Makefile->GetSources().find(*s); + + if(srcListIter == m_Makefile->GetSources().end()) { - m_Classes.push_back(src->GetSourceName()); + std::string errStr = "No source list named " + *s; + this->SetError(errStr.c_str()); + return false; } - } + + std::vector<cmSourceFile>& srcList = srcListIter->second; + + // Collect the names of the classes. + for(std::vector<cmSourceFile>::iterator src = srcList.begin(); + src != srcList.end();++src) + { + // Wrap-excluded and abstract classes do not have a New() method. + // vtkIndent and vtkTimeStamp are special cases and are not + // vtkObject subclasses. + if(!src->GetWrapExclude() && !src->GetIsAnAbstractClass() + && (src->GetSourceName() != "vtkIndent") + && (src->GetSourceName() != "vtkTimeStamp")) + { + m_Classes.push_back(src->GetSourceName()); + } + } + } // Generate the header with the class declaration. { @@ -157,7 +187,7 @@ cmVTKMakeInstantiatorCommand file.SetName(fileName.c_str(), filePath.c_str(), m_Makefile->GetSourceExtensions(), m_Makefile->GetHeaderExtensions()); - m_Makefile->AddSource(file, srcListName.c_str()); + m_Makefile->AddSource(file, outSourceList.c_str()); } unsigned int numClasses = m_Classes.size(); @@ -190,8 +220,8 @@ cmVTKMakeInstantiatorCommand file.SetIsAnAbstractClass(false); file.SetName(fileName.c_str(), filePath.c_str(), m_Makefile->GetSourceExtensions(), - m_Makefile->GetHeaderExtensions()); - m_Makefile->AddSource(file, srcListName.c_str()); + m_Makefile->GetHeaderExtensions()); + m_Makefile->AddSource(file, outSourceList.c_str()); } return true; diff --git a/Source/cmVTKMakeInstantiatorCommand.h b/Source/cmVTKMakeInstantiatorCommand.h index a475312..297ed09 100644 --- a/Source/cmVTKMakeInstantiatorCommand.h +++ b/Source/cmVTKMakeInstantiatorCommand.h @@ -69,24 +69,24 @@ public: /** Succinct documentation. */ virtual const char* GetTerseDocumentation() { - return "Setup a library's classes to be created by vtkInstantiator"; + return "Register classes for creation by vtkInstantiator"; } /** More documentation. */ virtual const char* GetFullDocumentation() { return - "VTK_MAKE_INSTANTIATOR(libName srcList exportMacro\n" + "VTK_MAKE_INSTANTIATOR(className outSourceList\n" + " src-list1 [src-list2 ..]\n" + " EXPORT_MACRO exportMacro\n" " [HEADER_LOCATION dir] [GROUP_SIZE groupSize])\n" - "Generates a new class for the given library to allow its other\n" - "classes to be created by vtkInstantiator. Functions to create\n" - "classes listed in srcList are registered with vtkInstantiator, and\n" - "the new class containing this code is added to the srcList for\n" - "inclusion in the library. The libName argument is used to generate\n" - "the filename and name of the class used to register the functions\n" - "when the library is loaded. The exportMacro is the name of the\n" - "DLL export macro to use in the class definition\n" - "(ex. VTK_COMMON_EXPORT).\n" + "Generates a new class with the given name and adds its files to the\n" + "given outSourceList. It registers the classes from the other given\n" + "source lists with vtkInstantiator when it is loaded. The output\n" + "source list should be added to the library with the classes it\n" + "registers.\n" + "The EXPORT_MACRO argument must be given and followed by the export\n" + "macro to use when generating the class (ex. VTK_COMMON_EXPORT).\n" "The HEADER_LOCATION option must be followed by a path. It specifies\n" "the directory in which to place the generated class's header file.\n" "The generated class implementation files always go in the build\n" |