From 44a7cd55ff126412d8ba8b82739a1bee132c62a1 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Thu, 27 Jun 2002 15:57:09 -0400 Subject: removed all source lists from the system and made them vectors. Also appended _CMAKE_PATH to the end of the automatic cache entries for executables and libraries. Odds of all these changes working are slim but cmake builds and passes all its tests. VTK40 starts building --- Source/cmAuxSourceDirectoryCommand.cxx | 9 +- Source/cmCreateTestSourceList.cxx | 2 +- Source/cmDSWWriter.cxx | 3 +- Source/cmFLTKWrapUICommand.cxx | 29 +++---- Source/cmGetFilenameComponentCommand.cxx | 2 +- Source/cmITKWrapTclCommand.cxx | 8 +- Source/cmInstallFilesCommand.cxx | 25 +----- Source/cmLinkLibrariesCommand.cxx | 3 +- Source/cmMSDotNETGenerator.cxx | 3 +- Source/cmMakeDepend.cxx | 44 +++++----- Source/cmMakefile.cxx | 94 +++++++++----------- Source/cmMakefile.h | 25 +++--- Source/cmQTWrapCPPCommand.cxx | 61 ++++++------- Source/cmQTWrapUICommand.cxx | 101 +++++++++++----------- Source/cmSourceFilesCommand.cxx | 31 +++++-- Source/cmSourceFilesRemoveCommand.cxx | 84 +++++++++--------- Source/cmSystemTools.cxx | 2 +- Source/cmSystemTools.h | 2 +- Source/cmTarget.cxx | 33 ++----- Source/cmTargetLinkLibrariesCommand.cxx | 3 +- Source/cmUnixMakefileGenerator.cxx | 11 ++- Source/cmVTKMakeInstantiatorCommand.cxx | 48 ++++------ Source/cmVTKWrapJavaCommand.cxx | 58 +++++++------ Source/cmVTKWrapPythonCommand.cxx | 63 ++++++++------ Source/cmVTKWrapTclCommand.cxx | 74 +++++++++------- Source/cmWrapExcludeFilesCommand.cxx | 40 ++++++--- Tests/Complex/Library/CMakeLists.txt | 4 +- Tests/ComplexOneConfig/Library/CMakeLists.txt | 4 +- Tests/ComplexRelativePaths/Library/CMakeLists.txt | 4 +- 29 files changed, 448 insertions(+), 422 deletions(-) diff --git a/Source/cmAuxSourceDirectoryCommand.cxx b/Source/cmAuxSourceDirectoryCommand.cxx index ad79acd..7562833 100644 --- a/Source/cmAuxSourceDirectoryCommand.cxx +++ b/Source/cmAuxSourceDirectoryCommand.cxx @@ -26,6 +26,7 @@ bool cmAuxSourceDirectoryCommand::InitialPass(std::vector const& ar return false; } + std::string sourceListValue; std::string templateDirectory = args[0]; m_Makefile->AddExtraDirectory(templateDirectory.c_str()); std::string tdir = m_Makefile->GetCurrentDirectory(); @@ -61,11 +62,17 @@ bool cmAuxSourceDirectoryCommand::InitialPass(std::vector const& ar m_Makefile->GetSourceExtensions(), m_Makefile->GetHeaderExtensions()); cmfile.SetIsAnAbstractClass(false); - m_Makefile->AddSource(cmfile,args[1].c_str()); + m_Makefile->AddSource(cmfile); + if (sourceListValue.size() > 0) + { + sourceListValue += ";"; + } + sourceListValue += cmfile.GetSourceName(); } } } } + m_Makefile->AddDefinition(args[1].c_str(), sourceListValue.c_str()); return true; } diff --git a/Source/cmCreateTestSourceList.cxx b/Source/cmCreateTestSourceList.cxx index d320f52..e8643ab 100644 --- a/Source/cmCreateTestSourceList.cxx +++ b/Source/cmCreateTestSourceList.cxx @@ -266,7 +266,7 @@ bool cmCreateTestSourceList::InitialPass(std::vector const& argsIn) "cxx", false); m_Makefile->AddSource(cfile); - sourceListValue = args[1].c_str(); + sourceListValue = args[1] + ".cxx"; for(i = testsBegin; i != tests.end(); ++i) { diff --git a/Source/cmDSWWriter.cxx b/Source/cmDSWWriter.cxx index 147ac0b..52a69c4 100644 --- a/Source/cmDSWWriter.cxx +++ b/Source/cmDSWWriter.cxx @@ -252,8 +252,9 @@ void cmDSWWriter::WriteProject(std::ostream& fout, if(j->first != dspname) { // is the library part of this DSW ? If so add dependency + std::string libPath = j->first + "_CMAKE_PATH"; const char* cacheValue - = m_Makefile->GetDefinition(j->first.c_str()); + = m_Makefile->GetDefinition(libPath.c_str()); if(cacheValue) { fout << "Begin Project Dependency\n"; diff --git a/Source/cmFLTKWrapUICommand.cxx b/Source/cmFLTKWrapUICommand.cxx index 3ac91ec..ec6f7cf 100644 --- a/Source/cmFLTKWrapUICommand.cxx +++ b/Source/cmFLTKWrapUICommand.cxx @@ -48,39 +48,33 @@ bool cmFLTKWrapUICommand::InitialPass(std::vector const& args) m_Target = args[0]; // Target that will use the generated files m_GUISourceList = args[1]; // Source List of the GUI source files - cmMakefile::SourceMap &GUISources = m_Makefile->GetSources(); - + std::vector newArgs; + m_Makefile->ExpandSourceListArguments(args,newArgs, 1); + // get the list of GUI files from which .cxx and .h will be generated - cmMakefile::SourceMap::iterator l = GUISources.find( m_GUISourceList ); - if (l == GUISources.end()) - { - this->SetError("bad source list passed to FLTKWrapUICommand"); - return false; - } - std::string outputDirectory = m_Makefile->GetCurrentOutputDirectory(); // Some of the generated files are *.h so the directory "GUI" // where they are created have to be added to the include path m_Makefile->AddIncludeDirectory( outputDirectory.c_str() ); - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + for(std::vector::iterator i = (newArgs.begin() + 1); + i != newArgs.end(); i++) { - cmSourceFile &curr = *(*i); + cmSourceFile *curr = m_Makefile->GetSource(i->c_str()); // if we should use the source GUI // to generate .cxx and .h files - if (!curr.GetWrapExclude()) + if (!curr || !curr->GetWrapExclude()) { cmSourceFile header_file; cmSourceFile source_file; + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*i); const bool headerFileOnly = true; - header_file.SetName(curr.GetSourceName().c_str(), + header_file.SetName(srcName.c_str(), outputDirectory.c_str(), "h",headerFileOnly); - source_file.SetName(curr.GetSourceName().c_str(), + source_file.SetName(srcName.c_str(), outputDirectory.c_str(), "cxx",!headerFileOnly); - std::string origname = cdir + "/" + curr.GetSourceName() + "." + - curr.GetSourceExtension(); + std::string origname = cdir + "/" + *i; std::string hname = header_file.GetFullPath(); std::string cxxname = source_file.GetFullPath(); m_WrapUserInterface.push_back(origname); @@ -90,7 +84,6 @@ bool cmFLTKWrapUICommand::InitialPass(std::vector const& args) header_file.GetDepends().push_back(origname); m_GeneratedHeadersClasses.push_back(header_file); m_GeneratedSourcesClasses.push_back(source_file); - } } diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx index bd3958c..a1b0778 100644 --- a/Source/cmGetFilenameComponentCommand.cxx +++ b/Source/cmGetFilenameComponentCommand.cxx @@ -54,7 +54,7 @@ bool cmGetFilenameComponentCommand::InitialPass(std::vector const& } else if (args[2] == "NAME_WE") { - result = cmSystemTools::GetFilenameNameWithoutExtension(filename); + result = cmSystemTools::GetFilenameWithoutExtension(filename); } else { diff --git a/Source/cmITKWrapTclCommand.cxx b/Source/cmITKWrapTclCommand.cxx index 838fc3f..4ec309c 100644 --- a/Source/cmITKWrapTclCommand.cxx +++ b/Source/cmITKWrapTclCommand.cxx @@ -58,7 +58,7 @@ bool cmITKWrapTclCommand::InitialPass(std::vector const& argsIn) bool cmITKWrapTclCommand::CreateCableRule(const char* configFile) { std::string tclFile = - cmSystemTools::GetFilenameNameWithoutExtension(configFile); + cmSystemTools::GetFilenameWithoutExtension(configFile); tclFile += "_tcl"; std::string inFile = m_Makefile->GetCurrentDirectory(); @@ -138,8 +138,10 @@ bool cmITKWrapTclCommand::CreateCableRule(const char* configFile) // Set dependency hints. file.GetDepends().push_back(inFile.c_str()); file.GetDepends().push_back("CableTclFacility/ctCalls.h"); - m_Makefile->AddSource(file, m_TargetName.c_str()); - + m_Makefile->AddSource(file); + std::string srcname = file.GetSourceName() + ".cxx"; + m_Makefile->AddDefinition(m_TargetName.c_str(), + srcname.c_str()); return true; } diff --git a/Source/cmInstallFilesCommand.cxx b/Source/cmInstallFilesCommand.cxx index 31aa5fa..6095dcc 100644 --- a/Source/cmInstallFilesCommand.cxx +++ b/Source/cmInstallFilesCommand.cxx @@ -26,7 +26,7 @@ bool cmInstallFilesCommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); // Create an INSTALL_FILES target specifically for this path. m_TargetName = "INSTALL_FILES_"+args[0]; @@ -63,26 +63,9 @@ void cmInstallFilesCommand::FinalPass() { // replace any variables std::string temps = *s; - // look for a srclist - if (m_Makefile->GetSources().find(temps) != m_Makefile->GetSources().end()) - { - const std::vector &clsList = - m_Makefile->GetSources().find(temps)->second; - std::vector::const_iterator c = clsList.begin(); - for (; c != clsList.end(); ++c) - { - testf = (*c)->GetSourceName() + ext; - // add to the result - targetSourceLists.push_back(testf); - } - } - // if one wasn't found then assume it is a single class - else - { - testf = temps + ext; - // add to the result - targetSourceLists.push_back(testf); - } + testf = temps + ext; + // add to the result + targetSourceLists.push_back(testf); } } else // reg exp list diff --git a/Source/cmLinkLibrariesCommand.cxx b/Source/cmLinkLibrariesCommand.cxx index 4024f91..a97143f 100644 --- a/Source/cmLinkLibrariesCommand.cxx +++ b/Source/cmLinkLibrariesCommand.cxx @@ -51,7 +51,8 @@ bool cmLinkLibrariesCommand::InitialPass(std::vector const& argsIn) const char* ldir = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); if (cmSystemTools::IsOff(ldir)) { - const char* dir = m_Makefile->GetDefinition(i->c_str()); + std::string libPath = *i + "_CMAKE_PATH"; + const char* dir = m_Makefile->GetDefinition(libPath.c_str()); if( dir ) { m_Makefile->AddLinkDirectory( dir ); diff --git a/Source/cmMSDotNETGenerator.cxx b/Source/cmMSDotNETGenerator.cxx index 0a5b605..54c8c4d 100644 --- a/Source/cmMSDotNETGenerator.cxx +++ b/Source/cmMSDotNETGenerator.cxx @@ -407,8 +407,9 @@ void cmMSDotNETGenerator::WriteProjectDepends(std::ostream& fout, if(j->first != dspname) { // is the library part of this SLN ? If so add dependency + std::string libPath = j->first + "_CMAKE_PATH"; const char* cacheValue - = m_Makefile->GetDefinition(j->first.c_str()); + = m_Makefile->GetDefinition(libPath.c_str()); if(cacheValue) { fout << "\t\t{" << this->CreateGUID(dspname) << "}." << depcount << " = {" diff --git a/Source/cmMakeDepend.cxx b/Source/cmMakeDepend.cxx index b56f26a..ab1b090 100644 --- a/Source/cmMakeDepend.cxx +++ b/Source/cmMakeDepend.cxx @@ -143,39 +143,35 @@ void cmMakeDepend::GenerateDependInformation(cmDependInformation* info) if(!found) { // Try to find the file amongst the sources - cmMakefile::SourceMap srcmap = m_Makefile->GetSources(); - cmMakefile::SourceMap::iterator l; - for (l= srcmap.begin() ; l!=srcmap.end() ; l++) + cmSourceFile *srcFile = + m_Makefile->GetSource(cmSystemTools::GetFilenameWithoutExtension(path).c_str()); + if (srcFile) { - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + if (srcFile->GetFullPath() == path) { - if ((*i)->GetFullPath() == path) - { - found=true; - } - else - { - //try to guess which include path to use - for(std::vector::iterator t = + found=true; + } + else + { + //try to guess which include path to use + for(std::vector::iterator t = m_IncludeDirectories.begin(); - t != m_IncludeDirectories.end(); ++t) + t != m_IncludeDirectories.end(); ++t) + { + std::string incpath = *t; + incpath = incpath + "/"; + incpath = incpath + path; + if (srcFile->GetFullPath() == incpath) { - std::string incpath = *t; - incpath = incpath + "/"; - incpath = incpath + path; - if ((*i)->GetFullPath() == incpath) - { - // set the path to the guessed path - info->m_FullPath = incpath; - found=true; - } + // set the path to the guessed path + info->m_FullPath = incpath; + found=true; } } } } } - + if(!found) { // Couldn't find any dependency information. diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index ade3a90..d41e83a 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -154,16 +154,6 @@ void cmMakefile::Print() const { // print the class lists std::cout << "classes:\n"; - for(SourceMap::const_iterator l = m_Sources.begin(); - l != m_Sources.end(); l++) - { - std::cout << " Class list named: " << l->first << std::endl; - for(std::vector::const_iterator i = l->second.begin(); - i != l->second.end(); i++) - { - (*i)->Print(); - } - } std::cout << " m_Targets: "; for (cmTargets::const_iterator l = m_Targets.begin(); @@ -364,27 +354,6 @@ bool cmMakefile::ReadListFile(const char* filename, const char* external) return true; } - - -cmSourceFile *cmMakefile::GetSource(const char *srclist, const char *cname) -{ - SourceMap::iterator sl = m_Sources.find(srclist); - // find the src list - if (sl == m_Sources.end()) - { - return 0; - } - // find the class - for (std::vector::iterator i = sl->second.begin(); - i != sl->second.end(); ++i) - { - if ((*i)->GetSourceName() == cname) - { - return *i; - } - } - return 0; -} void cmMakefile::AddCommand(cmCommand* wg) { @@ -444,26 +413,6 @@ void cmMakefile::GenerateMakefile() } -void cmMakefile::AddSource(cmSourceFile& cmfile, const char *srclist) -{ - m_Sources[srclist].push_back(this->AddSource(cmfile)); -} - - -void cmMakefile::RemoveSource(cmSourceFile& cmfile, const char *srclist) -{ - std::vector &maplist = m_Sources[srclist]; - for( std::vector::iterator f = maplist.begin(); - f != maplist.end(); ++f) - { - if((*f)->GetSourceName() == cmfile.GetSourceName()) - { - maplist.erase(f); - return; - } - } -} - void cmMakefile::AddCustomCommand(const char* source, const char* command, const std::vector& commandArgs, @@ -711,8 +660,10 @@ void cmMakefile::AddLibrary(const char* lname, int shared, m_Targets.insert(cmTargets::value_type(lname,target)); // Add an entry into the cache + std::string libPath = lname; + libPath += "_CMAKE_PATH"; cmCacheManager::GetInstance()-> - AddCacheEntry(lname, + AddCacheEntry(libPath.c_str(), this->GetCurrentOutputDirectory(), "Path to a library", cmCacheManager::INTERNAL); @@ -778,8 +729,10 @@ void cmMakefile::AddExecutable(const char *exeName, // Add an entry into the cache + std::string exePath = exeName; + exePath += "_CMAKE_PATH"; cmCacheManager::GetInstance()-> - AddCacheEntry(exeName, + AddCacheEntry(exePath.c_str(), this->GetCurrentOutputDirectory(), "Path to an executable", cmCacheManager::INTERNAL); } @@ -1368,7 +1321,7 @@ cmData* cmMakefile::LookupData(const char* name) const } } -cmSourceFile* cmMakefile::GetSource(const char* sourceName) +cmSourceFile* cmMakefile::GetSource(const char* sourceName) const { std::string s = sourceName; std::string ext; @@ -1378,7 +1331,7 @@ cmSourceFile* cmMakefile::GetSource(const char* sourceName) ext = s.substr(pos+1, s.size() - pos-1); s = s.substr(0, pos); } - for(std::vector::iterator i = m_SourceFiles.begin(); + for(std::vector::const_iterator i = m_SourceFiles.begin(); i != m_SourceFiles.end(); ++i) { if((*i)->GetSourceName() == s @@ -1411,3 +1364,34 @@ void cmMakefile::EnableLanguage(const char* lang) m_MakefileGenerator->EnableLanguage(lang); } +void cmMakefile::ExpandSourceListArguments( + std::vector const& arguments, + std::vector& newargs, int start) +{ + // first figure out if we need to handle version 1.2 style source lists + int oldVersion = 1; + const char* versionValue + = this->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"); + if (versionValue && atof(versionValue) > 1.2) + { + oldVersion = 0; + } + + // now expand the args + std::vector tmpArgs; + int i; + for(i = 0; i < arguments.size(); ++i) + { + // is the arg defined ?, if so use the def + const char *def = this->GetDefinition(arguments[i].c_str()); + if (def && oldVersion && i >= start) + { + tmpArgs.push_back(def); + } + else + { + tmpArgs.push_back(arguments[i]); + } + } + cmSystemTools::ExpandListArguments(tmpArgs, newargs); +} diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index b897137..a4c561c 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -218,12 +218,12 @@ public: /** * Add a class/source file to the build. */ - void AddSource(cmSourceFile& ,const char *srcListName); + //void AddSource(cmSourceFile& ,const char *srcListName); /** * Remove a class/source file from the build. */ - void RemoveSource(cmSourceFile& ,const char *srcListName); + //void RemoveSource(cmSourceFile& ,const char *srcListName); /** * Add a source group for consideration when adding a new source. @@ -375,18 +375,21 @@ public: return m_IncludeDirectories; } - /** - * Return a list of source files in this makefile. + /** Expand out any arguements in the vector that have ; separated + * strings into multiple arguements. A new vector is created + * containing the expanded versions of all arguments in argsIn. + * This method differes from the one in cmSystemTools in that if + * the CmakeLists file is version 1.2 or earlier it will check for + * source lists being used without ${} around them */ - typedef std::map > SourceMap; - const SourceMap &GetSources() const {return m_Sources;} - SourceMap &GetSources() {return m_Sources;} - cmSourceFile* GetSource(const char *srclist, const char *sourceName); - + void ExpandSourceListArguments(std::vector const& argsIn, + std::vector& argsOut, + int startArgumentIndex); + /** Get a cmSourceFile pointer for a given source name, if the name is * not found, then a null pointer is returned. */ - cmSourceFile* GetSource(const char* sourceName); + cmSourceFile* GetSource(const char* sourceName) const; ///! Add a new cmSourceFile to the list of sources for this makefile. cmSourceFile* AddSource(cmSourceFile const&); @@ -524,9 +527,7 @@ protected: // libraries, classes, and executables cmTargets m_Targets; - SourceMap m_Sources; std::vector m_SourceFiles; - std::vector m_SubDirectories; // list of sub directories struct StringSet : public std::set diff --git a/Source/cmQTWrapCPPCommand.cxx b/Source/cmQTWrapCPPCommand.cxx index df1ba0c..e55513d 100644 --- a/Source/cmQTWrapCPPCommand.cxx +++ b/Source/cmQTWrapCPPCommand.cxx @@ -25,7 +25,7 @@ bool cmQTWrapCPPCommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); // 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 @@ -50,37 +50,28 @@ bool cmQTWrapCPPCommand::InitialPass(std::vector const& argsIn) m_SourceList = args[1]; // get the list of classes for this library - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); - - - for(std::vector::const_iterator j = (args.begin() + 2); + for(std::vector::iterator j = (args.begin() + 2); j != args.end(); ++j) { - cmMakefile::SourceMap::iterator l = Classes.find(*j); - if (l == Classes.end()) - { - this->SetError("bad source list passed to QTWrapCPPCommand"); - return false; - } - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + cmSourceFile *curr = m_Makefile->GetSource(j->c_str()); + + // if we should wrap the class + if (!curr || !curr->GetWrapExclude()) { - cmSourceFile &curr = *(*i); - // if we should wrap the class - if (!curr.GetWrapExclude()) + cmSourceFile file; + if (curr) { - cmSourceFile file; - file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); - std::string newName = "moc_" + curr.GetSourceName(); - file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string hname = cdir + "/" + curr.GetSourceName() + "." + - curr.GetSourceExtension(); - m_WrapHeaders.push_back(hname); - // add starting depends - file.GetDepends().push_back(hname); - m_WrapClasses.push_back(file); + file.SetIsAnAbstractClass(curr->IsAnAbstractClass()); } + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*j); + std::string newName = "moc_" + srcName; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string hname = cdir + "/" + *j; + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); } } @@ -94,7 +85,14 @@ void cmQTWrapCPPCommand::FinalPass() size_t lastClass = m_WrapClasses.size(); std::vector depends; std::string moc_exe = "${QT_MOC_EXE}"; + std::string sourceListValue; + // was the list already populated + const char *def = m_Makefile->GetDefinition(m_SourceList.c_str()); + if (def) + { + sourceListValue = def; + } // wrap all the .h files depends.push_back(moc_exe); @@ -110,7 +108,12 @@ void cmQTWrapCPPCommand::FinalPass() for(size_t classNum = 0; classNum < lastClass; classNum++) { // Add output to build list - m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + m_Makefile->AddSource(m_WrapClasses[classNum]); + if (sourceListValue.size() > 0) + { + sourceListValue += ";"; + } + sourceListValue += m_WrapClasses[classNum].GetSourceName() + ".cxx"; // set up moc command std::string res = m_Makefile->GetCurrentOutputDirectory(); @@ -131,7 +134,7 @@ void cmQTWrapCPPCommand::FinalPass() } m_Makefile->AddDefinition("GENERATED_QT_FILES",moc_list.c_str()); - + m_Makefile->AddDefinition(m_SourceList.c_str(), sourceListValue.c_str()); } diff --git a/Source/cmQTWrapUICommand.cxx b/Source/cmQTWrapUICommand.cxx index 957816d..8a93f6a 100644 --- a/Source/cmQTWrapUICommand.cxx +++ b/Source/cmQTWrapUICommand.cxx @@ -25,7 +25,7 @@ bool cmQTWrapUICommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + m_Makefile->ExpandSourceListArguments(argsIn, args, 3); // 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 @@ -49,63 +49,66 @@ bool cmQTWrapUICommand::InitialPass(std::vector const& argsIn) m_LibraryName = args[0]; m_HeaderList = args[1]; m_SourceList = args[2]; + std::string sourceListValue; + const char *def = m_Makefile->GetDefinition(m_SourceList.c_str()); + if (def) + { + sourceListValue = def; + } // get the list of classes for this library - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); - - - for(std::vector::const_iterator j = (args.begin() + 3); + for(std::vector::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 = m_Makefile->GetSource(j->c_str()); + + // if we should wrap the class + if (!curr || !curr->GetWrapExclude()) { - cmSourceFile &curr = *(*i); - // if we should wrap the class - if (!curr.GetWrapExclude()) + cmSourceFile header_file; + cmSourceFile source_file; + cmSourceFile moc_file; + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*j); + header_file.SetName(srcName.c_str(), + m_Makefile->GetCurrentOutputDirectory(), + "h",false); + source_file.SetName(srcName.c_str(), + m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string moc_source_name("moc_"); + moc_source_name = moc_source_name + srcName; + moc_file.SetName(moc_source_name.c_str(), + m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string origname = cdir + "/" + *j; + std::string hname = header_file.GetFullPath(); + m_WrapUserInterface.push_back(origname); + // add starting depends + moc_file.GetDepends().push_back(hname); + 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); + m_WrapMocClasses.push_back(moc_file); + m_Makefile->AddSource(header_file); + m_Makefile->AddSource(source_file); + m_Makefile->AddSource(moc_file); + + // create the list of sources + if (sourceListValue.size() > 0) { - cmSourceFile header_file; - cmSourceFile source_file; - cmSourceFile moc_file; - 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 moc_source_name("moc_"); - moc_source_name = moc_source_name + curr.GetSourceName().c_str(); - moc_file.SetName(moc_source_name.c_str(), - m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string origname = cdir + "/" + curr.GetSourceName() + "." + - curr.GetSourceExtension(); - std::string hname = header_file.GetFullPath(); - m_WrapUserInterface.push_back(origname); - // add starting depends - moc_file.GetDepends().push_back(hname); - 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); - m_WrapMocClasses.push_back(moc_file); - m_Makefile->AddSource(header_file, - m_HeaderList.c_str()); - m_Makefile->AddSource(source_file, - m_SourceList.c_str()); - m_Makefile->AddSource(moc_file, - m_SourceList.c_str()); + sourceListValue += ";"; } + sourceListValue += header_file.GetSourceName() + ".h"; + sourceListValue += ";"; + sourceListValue += source_file.GetSourceName() + ".cxx"; + sourceListValue += ";"; + sourceListValue += moc_file.GetSourceName() + ".cxx"; } } + m_Makefile->AddDefinition(m_SourceList.c_str(), sourceListValue.c_str()); return true; } diff --git a/Source/cmSourceFilesCommand.cxx b/Source/cmSourceFilesCommand.cxx index 0024f9e..63d06e5 100644 --- a/Source/cmSourceFilesCommand.cxx +++ b/Source/cmSourceFilesCommand.cxx @@ -34,8 +34,16 @@ bool cmSourceFilesCommand::InitialPass(std::vector const& argsIn) } std::vector args; cmSystemTools::ExpandListArguments(argsIn, args); - + std::string sourceListValue; + + // was the list already populated std::string name = args[0]; + const char *def = m_Makefile->GetDefinition(name.c_str()); + if (def) + { + sourceListValue = def; + } + int generated = 0; @@ -54,8 +62,12 @@ bool cmSourceFilesCommand::InitialPass(std::vector const& argsIn) if(sf) { // if the source file is already in the makefile, - // then add the pointer to the source list without creating a cmSourceFile - m_Makefile->GetSources()[name].push_back(sf); + // then add the pointer to the source list without creating cmSourceFile + if (sourceListValue.size() > 0) + { + sourceListValue += ";"; + } + sourceListValue += copy; continue; } cmSourceFile file; @@ -79,11 +91,13 @@ bool cmSourceFilesCommand::InitialPass(std::vector const& argsIn) } else { - file.SetName(name_no_ext.c_str(), m_Makefile->GetCurrentOutputDirectory(), + file.SetName(name_no_ext.c_str(), + m_Makefile->GetCurrentOutputDirectory(), ext.c_str(), false); } } else + { // if this is a full path then if((path.size() && path[0] == '/') || (path.size() > 1 && path[1] == ':')) @@ -99,9 +113,16 @@ bool cmSourceFilesCommand::InitialPass(std::vector const& argsIn) m_Makefile->GetSourceExtensions(), m_Makefile->GetHeaderExtensions()); } - m_Makefile->AddSource(file, name.c_str()); + } + m_Makefile->AddSource(file); + if (sourceListValue.size() > 0) + { + sourceListValue += ";"; + } + sourceListValue += copy; } + m_Makefile->AddDefinition(name.c_str(), sourceListValue.c_str()); return true; } diff --git a/Source/cmSourceFilesRemoveCommand.cxx b/Source/cmSourceFilesRemoveCommand.cxx index 3c5274a..2f1b259 100644 --- a/Source/cmSourceFilesRemoveCommand.cxx +++ b/Source/cmSourceFilesRemoveCommand.cxx @@ -17,7 +17,7 @@ #include "cmSourceFilesRemoveCommand.h" // cmSourceFilesRemoveCommand -bool cmSourceFilesRemoveCommand::InitialPass(std::vector const& argsIn) +bool cmSourceFilesRemoveCommand::InitialPass(std::vector const& args) { const char* versionValue = m_Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"); @@ -26,56 +26,60 @@ bool cmSourceFilesRemoveCommand::InitialPass(std::vector const& arg this->SetError("The SOURCE_FILES_REMOVE command has been deprecated in CMake version 1.4. You should use the REMOVE command instead.\n"); return false; } - if(argsIn.size() < 1 ) + + if(args.size() < 2 ) { this->SetError("called with incorrect number of arguments"); return false; } - std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); - int generated = 0; - for(std::vector::const_iterator i = (args.begin() + 1); - i != args.end(); ++i) + const char* variable = args[0].c_str(); // VAR is always first + // get the old value + const char* cacheValue + = m_Makefile->GetDefinition(variable); + + // expand the variable + std::vector varArgsExpanded; + std::vector temp; + temp.push_back(std::string(cacheValue)); + cmSystemTools::ExpandListArguments(temp, varArgsExpanded); + + // expand the args + // check for REMOVE(VAR v1 v2 ... vn) + std::vector argsExpanded; + std::vector temp2; + for(unsigned int j = 1; j < args.size(); ++j) { - std::string copy = *i; - if ( copy == "GENERATED" ) - { - generated = 1; - continue; - } - cmSourceFile file; - if ( generated ) + temp2.push_back(args[j]); + } + cmSystemTools::ExpandListArguments(temp2, argsExpanded); + + // now create the new value + std::string value; + for(unsigned int j = 0; j < varArgsExpanded.size(); ++j) + { + int found = 0; + for(unsigned int k = 0; k < argsExpanded.size(); ++k) { - // This file will be generated, so we should not check - // if it exist. - std::string ext = cmSystemTools::GetFilenameExtension(copy); - std::string path = cmSystemTools::GetFilenamePath(copy); - std::string name_no_ext = cmSystemTools::GetFilenameName(copy.c_str()); - name_no_ext = name_no_ext.substr(0, name_no_ext.length()-ext.length()); - if ( ext.length() && ext[0] == '.' ) - { - ext = ext.substr(1); - } - if((path.size() && path[0] == '/') || - (path.size() > 1 && path[1] == ':')) - { - file.SetName(name_no_ext.c_str(), path.c_str(), ext.c_str(), false); - } - else - { - file.SetName(name_no_ext.c_str(), m_Makefile->GetCurrentOutputDirectory(), - ext.c_str(), false); - } + if (varArgsExpanded[j] == argsExpanded[k]) + { + found = 1; + break; + } } - else + if (!found) { - file.SetName((*i).c_str(), m_Makefile->GetCurrentDirectory(), - m_Makefile->GetSourceExtensions(), - m_Makefile->GetHeaderExtensions()); + if (value.size()) + { + value += ";"; + } + value += varArgsExpanded[j]; } - m_Makefile->RemoveSource(file, args[0].c_str()); } + + // add the definition + m_Makefile->AddDefinition(variable, value.c_str()); + return true; } diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 5730eb8..8a11240 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1865,7 +1865,7 @@ std::string cmSystemTools::GetFilenameExtension(const std::string& filename) * Return file name without extension of a full filename (i.e. without path). * Warning: it considers the longest extension (for example: .tar.gz) */ -std::string cmSystemTools::GetFilenameNameWithoutExtension(const std::string& filename) +std::string cmSystemTools::GetFilenameWithoutExtension(const std::string& filename) { std::string name = cmSystemTools::GetFilenameName(filename); std::string::size_type dot_pos = name.find("."); diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 623a6ed..b7f8911 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -253,7 +253,7 @@ public: static std::string GetFilenameExtension(const std::string&); ///! return file name without extension of a full filename. - static std::string GetFilenameNameWithoutExtension(const std::string&); + static std::string GetFilenameWithoutExtension(const std::string&); static long int ModifiedTime(const char* filename); diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index d654342..3c0d052 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -39,19 +39,6 @@ void cmTarget::GenerateSourceFilesFromSourceLists( cmMakefile &mf) std::string temps = *s; mf.ExpandVariablesInString(temps); - // look for a srclist, this is old code we really don't want - // any source lists in the future. - if (mf.GetSources().find(temps) != mf.GetSources().end()) - { - const std::vector &clsList = - mf.GetSources().find(temps)->second; - // if we ahave a limited build list, use it - m_SourceFiles.insert(m_SourceFiles.end(), - clsList.begin(), - clsList.end()); - done = 1; - } - // Next if one wasn't found then assume it is a single class if (!done && mf.GetSource(temps.c_str())) { @@ -64,25 +51,16 @@ void cmTarget::GenerateSourceFilesFromSourceLists( cmMakefile &mf) // where a source list would be passed into here, by making it // a vector we need to possibly lookup the variable to maintain // CMake 1.2 compatability. + const char* versionValue + = mf.GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"); if (!done) { - const char* versionValue - = mf.GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"); if (!versionValue || atof(versionValue) <= 1.2) { const char* varValue = mf.GetDefinition(temps.c_str()); // if the definition exists - // and it has an extension in it then assume it is a source file - // the problem is that ADD_EXECUTABLE creates a definition with the - // same name as the executable which could be the same name as the - // source file without the extension, so if you do this: - // ADD_EXECUTABLE(foo foo) where foo.cxx is a source file, then - // foo will be varValue will be defined to the path of the executable, but - // not a source list as we expect, so look for a "." in the string to see - // if it is a file or not. - if (varValue - && strchr(varValue, '.')) + if (varValue) { std::vector tval; tval.push_back(varValue); @@ -340,7 +318,10 @@ cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) { if( addLibDirs ) { - const char* libpath = mf.GetDefinition( k->c_str() ); + // who the hell knows what this is, I think that K contains the + // name of a library but ... Ken + std::string libPathStr = *k + "_CMAKE_PATH"; + const char* libpath = mf.GetDefinition( libPathStr.c_str() ); if( libpath ) { // Don't add a link directory that is already present. diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx index 143cf86..e2816ee 100644 --- a/Source/cmTargetLinkLibrariesCommand.cxx +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -54,7 +54,8 @@ bool cmTargetLinkLibrariesCommand::InitialPass(std::vector const& a const char* ldir = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH"); if (cmSystemTools::IsOff(ldir)) { - const char* dir = m_Makefile->GetDefinition(i->c_str()); + std::string libPath = *i + "_CMAKE_PATH"; + const char* dir = m_Makefile->GetDefinition(libPath.c_str()); if( dir ) { m_Makefile->AddLinkDirectoryForTarget(args[0].c_str(), dir ); diff --git a/Source/cmUnixMakefileGenerator.cxx b/Source/cmUnixMakefileGenerator.cxx index c8ed941..62ae125 100644 --- a/Source/cmUnixMakefileGenerator.cxx +++ b/Source/cmUnixMakefileGenerator.cxx @@ -942,7 +942,8 @@ void cmUnixMakefileGenerator::OutputDependLibs(std::ostream& fout) // loop over the list of directories that the libraries might // be in, looking for an ADD_LIBRARY(lib...) line. This would // be stored in the cache - const char* cacheValue = m_Makefile->GetDefinition(lib->c_str()); + std::string libPath = *lib + "_CMAKE_PATH"; + const char* cacheValue = m_Makefile->GetDefinition(libPath.c_str()); // if cache and not the current directory add a rule, to // jump into the directory and build for the first time if(cacheValue && @@ -1058,7 +1059,9 @@ bool cmUnixMakefileGenerator::SamePath(const char* path1, const char* path2) void cmUnixMakefileGenerator::OutputLibDepend(std::ostream& fout, const char* name) { - const char* cacheValue = m_Makefile->GetDefinition(name); + std::string libPath = name; + libPath += "_CMAKE_PATH"; + const char* cacheValue = m_Makefile->GetDefinition(libPath.c_str()); if(cacheValue ) { // if there is a cache value, then this is a library that cmake @@ -1112,7 +1115,9 @@ void cmUnixMakefileGenerator::OutputLibDepend(std::ostream& fout, void cmUnixMakefileGenerator::OutputExeDepend(std::ostream& fout, const char* name) { - const char* cacheValue = m_Makefile->GetDefinition(name); + std::string exePath = name; + exePath += "_CMAKE_PATH"; + const char* cacheValue = m_Makefile->GetDefinition(exePath.c_str()); if(cacheValue ) { // if there is a cache value, then this is a executable/utility that cmake diff --git a/Source/cmVTKMakeInstantiatorCommand.cxx b/Source/cmVTKMakeInstantiatorCommand.cxx index d649117..bf8466e 100644 --- a/Source/cmVTKMakeInstantiatorCommand.cxx +++ b/Source/cmVTKMakeInstantiatorCommand.cxx @@ -28,11 +28,10 @@ cmVTKMakeInstantiatorCommand return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); - - m_ClassName = args[0]; + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); + std::string sourceListValue; - std::string outSourceList = args[1]; + m_ClassName = args[0]; std::vector inSourceLists; m_ExportMacro = "-"; @@ -112,32 +111,17 @@ cmVTKMakeInstantiatorCommand for(std::vector::const_iterator s = inSourceLists.begin(); s != inSourceLists.end(); ++s) { - // Find the source list specified. - cmMakefile::SourceMap::iterator srcListIter = - m_Makefile->GetSources().find(*s); + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*s); + cmSourceFile *sf = m_Makefile->GetSource(s->c_str()); - if(srcListIter == m_Makefile->GetSources().end()) + // Wrap-excluded and abstract classes do not have a New() method. + // vtkIndent and vtkTimeStamp are special cases and are not + // vtkObject subclasses. + if( + (!sf || (!sf->GetWrapExclude() && !sf->GetIsAnAbstractClass())) && + ((srcName != "vtkIndent") && (srcName != "vtkTimeStamp"))) { - std::string errStr = "No source list named " + *s; - this->SetError(errStr.c_str()); - return false; - } - - std::vector& srcList = srcListIter->second; - - // Collect the names of the classes. - for(std::vector::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()); - } + m_Classes.push_back(srcName); } } @@ -173,7 +157,8 @@ cmVTKMakeInstantiatorCommand file.SetName(fileName.c_str(), filePath.c_str(), m_Makefile->GetSourceExtensions(), m_Makefile->GetHeaderExtensions()); - m_Makefile->AddSource(file, outSourceList.c_str()); + m_Makefile->AddSource(file); + sourceListValue += file.GetSourceName() + ".cxx"; } size_t numClasses = m_Classes.size(); @@ -207,9 +192,12 @@ cmVTKMakeInstantiatorCommand file.SetName(fileName.c_str(), filePath.c_str(), m_Makefile->GetSourceExtensions(), m_Makefile->GetHeaderExtensions()); - m_Makefile->AddSource(file, outSourceList.c_str()); + m_Makefile->AddSource(file); + sourceListValue += ";"; + sourceListValue += file.GetSourceName() + ".cxx"; } + m_Makefile->AddDefinition(args[1].c_str(), sourceListValue.c_str()); return true; } diff --git a/Source/cmVTKWrapJavaCommand.cxx b/Source/cmVTKWrapJavaCommand.cxx index 84634a2..787fb3b 100644 --- a/Source/cmVTKWrapJavaCommand.cxx +++ b/Source/cmVTKWrapJavaCommand.cxx @@ -25,7 +25,7 @@ bool cmVTKWrapJavaCommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); // 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 @@ -42,35 +42,29 @@ bool cmVTKWrapJavaCommand::InitialPass(std::vector const& argsIn) m_SourceList = args[1]; // get the list of classes for this library - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); for(std::vector::const_iterator j = (args.begin() + 2); j != args.end(); ++j) { - cmMakefile::SourceMap::iterator l = Classes.find(*j); - if (l == Classes.end()) - { - this->SetError("bad source list passed to VTKWrapJavaCommand"); - return false; - } - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + cmSourceFile *curr = m_Makefile->GetSource(j->c_str()); + + // if we should wrap the class + if (!curr || !curr->GetWrapExclude()) { - cmSourceFile &curr = *(*i); - // if we should wrap the class - if (!curr.GetWrapExclude()) + cmSourceFile file; + if (curr) { - cmSourceFile file; - file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); - std::string newName = curr.GetSourceName() + "Java"; - file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string hname = cdir + "/" + curr.GetSourceName() + ".h"; - m_WrapHeaders.push_back(hname); - // add starting depends - file.GetDepends().push_back(hname); - m_WrapClasses.push_back(file); - m_OriginalNames.push_back(curr.GetSourceName()); + file.SetIsAnAbstractClass(curr->IsAnAbstractClass()); } + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*j); + std::string newName = srcName + "Java"; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string hname = cdir + "/" + srcName + ".h"; + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); + m_OriginalNames.push_back(srcName); } } @@ -89,9 +83,17 @@ void cmVTKWrapJavaCommand::FinalPass() std::string pjava = "${VTK_PARSE_JAVA_EXE}"; std::string hints = "${VTK_WRAP_HINTS}"; std::string resultDirectory = "${VTK_JAVA_HOME}"; + std::string sourceListValue; m_Makefile->ExpandVariablesInString(hints); + // was the list already populated + const char *def = m_Makefile->GetDefinition(m_SourceList.c_str()); + if (def) + { + sourceListValue = def; + } + // wrap all the .h files depends.push_back(wjava); depends2.push_back(pjava); @@ -102,7 +104,12 @@ void cmVTKWrapJavaCommand::FinalPass() } for(size_t classNum = 0; classNum < lastClass; classNum++) { - m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + m_Makefile->AddSource(m_WrapClasses[classNum]); + if (sourceListValue.size() > 0) + { + sourceListValue += ";"; + } + sourceListValue += m_WrapClasses[classNum].GetSourceName() + ".cxx"; // wrap java std::string res = m_Makefile->GetCurrentOutputDirectory(); @@ -146,6 +153,7 @@ void cmVTKWrapJavaCommand::FinalPass() alldepends, empty); + m_Makefile->AddDefinition(m_SourceList.c_str(), sourceListValue.c_str()); } diff --git a/Source/cmVTKWrapPythonCommand.cxx b/Source/cmVTKWrapPythonCommand.cxx index 7748942..2f23559 100644 --- a/Source/cmVTKWrapPythonCommand.cxx +++ b/Source/cmVTKWrapPythonCommand.cxx @@ -25,7 +25,7 @@ bool cmVTKWrapPythonCommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); // 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 @@ -43,34 +43,28 @@ bool cmVTKWrapPythonCommand::InitialPass(std::vector const& argsIn) m_SourceList = args[1]; // get the list of classes for this library - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); - for(std::vector::const_iterator j = (args.begin() + 2); + for(std::vector::iterator j = (args.begin() + 2); j != args.end(); ++j) { - cmMakefile::SourceMap::iterator l = Classes.find(*j); - if (l == Classes.end()) + cmSourceFile *curr = m_Makefile->GetSource(j->c_str()); + + // if we should wrap the class + if (!curr || !curr->GetWrapExclude()) { - this->SetError("bad source list passed to VTKWrapPythonCommand"); - 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 file; + if (curr) { - cmSourceFile file; - file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); - std::string newName = curr.GetSourceName() + "Python"; - file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string hname = cdir + "/" + curr.GetSourceName() + ".h"; - m_WrapHeaders.push_back(hname); - // add starting depends - file.GetDepends().push_back(hname); - m_WrapClasses.push_back(file); + file.SetIsAnAbstractClass(curr->IsAnAbstractClass()); } + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*j); + std::string newName = srcName + "Python"; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + std::string hname = cdir + "/" + srcName + ".h"; + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); } } @@ -84,9 +78,18 @@ void cmVTKWrapPythonCommand::FinalPass() std::vector depends; std::string wpython = "${VTK_WRAP_PYTHON_EXE}"; std::string hints = "${VTK_WRAP_HINTS}"; + std::string sourceListValue; m_Makefile->ExpandVariablesInString(hints); + // was the list already populated + const char *def = m_Makefile->GetDefinition(m_SourceList.c_str()); + if (def) + { + sourceListValue = def; + sourceListValue += ";"; + } + // Create the init file std::string res = m_LibraryName; res += "Init.cxx"; @@ -99,8 +102,9 @@ void cmVTKWrapPythonCommand::FinalPass() newName += "Init"; cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), "cxx",false); - m_Makefile->AddSource(cfile,m_SourceList.c_str()); - + m_Makefile->AddSource(cfile); + sourceListValue += newName + ".cxx"; + // wrap all the .h files depends.push_back(wpython); if (strcmp("${VTK_WRAP_HINTS}",hints.c_str())) @@ -109,7 +113,7 @@ void cmVTKWrapPythonCommand::FinalPass() } for(size_t classNum = 0; classNum < lastClass; classNum++) { - m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + m_Makefile->AddSource(m_WrapClasses[classNum]); std::string res = m_Makefile->GetCurrentOutputDirectory(); res += "/"; res += m_WrapClasses[classNum].GetSourceName() + ".cxx"; @@ -121,11 +125,14 @@ void cmVTKWrapPythonCommand::FinalPass() } args.push_back((m_WrapClasses[classNum].IsAnAbstractClass() ? "0" : "1")); args.push_back(res); + sourceListValue += ";"; + sourceListValue += m_WrapClasses[classNum].GetSourceName() + ".cxx"; + m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(), wpython.c_str(), args, depends, res.c_str(), m_LibraryName.c_str()); } - + m_Makefile->AddDefinition(m_SourceList.c_str(), sourceListValue.c_str()); } bool cmVTKWrapPythonCommand::CreateInitFile(std::string& res) diff --git a/Source/cmVTKWrapTclCommand.cxx b/Source/cmVTKWrapTclCommand.cxx index f7f0f26..f0c1a7e 100644 --- a/Source/cmVTKWrapTclCommand.cxx +++ b/Source/cmVTKWrapTclCommand.cxx @@ -25,10 +25,19 @@ bool cmVTKWrapTclCommand::InitialPass(std::vector const& argsIn) return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); + // keep the library name - m_LibraryName = args[0]; + m_LibraryName = argsIn[0]; + if (argsIn[1] == std::string("SOURCES")) + { + m_Makefile->ExpandSourceListArguments(argsIn, args, 3); + } + else + { + m_Makefile->ExpandSourceListArguments(argsIn, args, 2); + } + // 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 if(!m_Makefile->IsOn("VTK_WRAP_TCL")) @@ -39,7 +48,7 @@ bool cmVTKWrapTclCommand::InitialPass(std::vector const& argsIn) // extract the sources and commands parameters std::vector sources; bool doing_sources = true; - + for(std::vector::const_iterator j = (args.begin() + 1); j != args.end(); ++j) { @@ -73,34 +82,28 @@ bool cmVTKWrapTclCommand::InitialPass(std::vector const& argsIn) // get the resulting source list name m_SourceList = sources[0]; - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); for(std::vector::iterator j = (sources.begin() + 1); j != sources.end(); ++j) { - cmMakefile::SourceMap::iterator l = Classes.find(*j); - if (l == Classes.end()) - { - this->SetError("bad source list passed to VTKWrapTclCommand"); - return false; - } - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + cmSourceFile *curr = m_Makefile->GetSource(j->c_str()); + + // if we should wrap the class + if (!curr || !curr->GetWrapExclude()) { - cmSourceFile &curr = *(*i); - // if we should wrap the class - if (!curr.GetWrapExclude()) + cmSourceFile file; + if (curr) { - cmSourceFile file; - file.SetIsAnAbstractClass(curr.IsAnAbstractClass()); - std::string newName = curr.GetSourceName() + "Tcl"; - file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), - "cxx",false); - std::string hname = cdir + "/" + curr.GetSourceName() + ".h"; - m_WrapHeaders.push_back(hname); - // add starting depends - file.GetDepends().push_back(hname); - m_WrapClasses.push_back(file); + file.SetIsAnAbstractClass(curr->IsAnAbstractClass()); } + std::string srcName = cmSystemTools::GetFilenameWithoutExtension(*j); + std::string newName = srcName + "Tcl"; + std::string hname = cdir + "/" + srcName + ".h"; + file.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), + "cxx",false); + m_WrapHeaders.push_back(hname); + // add starting depends + file.GetDepends().push_back(hname); + m_WrapClasses.push_back(file); } } } @@ -117,6 +120,15 @@ void cmVTKWrapTclCommand::FinalPass() std::string hints = "${VTK_WRAP_HINTS}"; m_Makefile->ExpandVariablesInString(hints); + std::string sourceListValue; + + // was the list already populated + const char *def = m_Makefile->GetDefinition(m_SourceList.c_str()); + if (def) + { + sourceListValue = def; + sourceListValue += ";"; + } // Create the init file std::string res = m_LibraryName; @@ -130,8 +142,9 @@ void cmVTKWrapTclCommand::FinalPass() newName += "Init"; cfile.SetName(newName.c_str(), m_Makefile->GetCurrentOutputDirectory(), "cxx",false); - m_Makefile->AddSource(cfile,m_SourceList.c_str()); - + m_Makefile->AddSource(cfile); + sourceListValue += newName + ".cxx"; + // wrap all the .h files depends.push_back(wtcl); if (strcmp("${VTK_WRAP_HINTS}",hints.c_str())) @@ -140,7 +153,7 @@ void cmVTKWrapTclCommand::FinalPass() } for(size_t classNum = 0; classNum < lastClass; classNum++) { - m_Makefile->AddSource(m_WrapClasses[classNum],m_SourceList.c_str()); + m_Makefile->AddSource(m_WrapClasses[classNum]); std::vector args; args.push_back(m_WrapHeaders[classNum]); if (strcmp("${VTK_WRAP_HINTS}",hints.c_str())) @@ -152,12 +165,15 @@ void cmVTKWrapTclCommand::FinalPass() res += "/"; res += m_WrapClasses[classNum].GetSourceName() + ".cxx"; args.push_back(res); + sourceListValue += ";"; + sourceListValue += m_WrapClasses[classNum].GetSourceName() + ".cxx"; m_Makefile->AddCustomCommand(m_WrapHeaders[classNum].c_str(), wtcl.c_str(), args, depends, res.c_str(), m_LibraryName.c_str()); + } - + m_Makefile->AddDefinition(m_SourceList.c_str(), sourceListValue.c_str()); } bool cmVTKWrapTclCommand::CreateInitFile(std::string& res) diff --git a/Source/cmWrapExcludeFilesCommand.cxx b/Source/cmWrapExcludeFilesCommand.cxx index 2bc4e84..90c98c2 100644 --- a/Source/cmWrapExcludeFilesCommand.cxx +++ b/Source/cmWrapExcludeFilesCommand.cxx @@ -33,22 +33,42 @@ bool cmWrapExcludeFilesCommand::InitialPass(std::vector const& args return false; } std::vector args; - cmSystemTools::ExpandListArguments(argsIn, args); - cmMakefile::SourceMap &Classes = m_Makefile->GetSources(); + m_Makefile->ExpandSourceListArguments(argsIn, args, 0); + for(std::vector::const_iterator j = args.begin(); j != args.end(); ++j) { - for(cmMakefile::SourceMap::iterator l = Classes.begin(); - l != Classes.end(); l++) + // if the file is already in the makefile just set properites on it + cmSourceFile* sf = m_Makefile->GetSource(j->c_str()); + if(sf) { - for(std::vector::iterator i = l->second.begin(); - i != l->second.end(); i++) + sf->SetWrapExclude(true); + } + // if file is not already in the makefile, then add it + else + { + std::string newfile = *j; + cmSourceFile file; + std::string path = cmSystemTools::GetFilenamePath(newfile); + // set the flags + file.SetWrapExclude(true); + // if this is a full path then + if((path.size() && path[0] == '/') || + (path.size() > 1 && path[1] == ':')) { - if((*i)->GetSourceName() == (*j)) - { - (*i)->SetWrapExclude(true); - } + file.SetName(cmSystemTools::GetFilenameName(newfile.c_str()).c_str(), + path.c_str(), + m_Makefile->GetSourceExtensions(), + m_Makefile->GetHeaderExtensions()); } + else + { + file.SetName(newfile.c_str(), m_Makefile->GetCurrentDirectory(), + m_Makefile->GetSourceExtensions(), + m_Makefile->GetHeaderExtensions()); + } + // add the source file to the makefile + m_Makefile->AddSource(file); } } return true; diff --git a/Tests/Complex/Library/CMakeLists.txt b/Tests/Complex/Library/CMakeLists.txt index 0f9c5eb..cf6b976 100644 --- a/Tests/Complex/Library/CMakeLists.txt +++ b/Tests/Complex/Library/CMakeLists.txt @@ -18,7 +18,7 @@ SOURCE_FILES(LibrarySources GENERATED nonexisting_file) SOURCE_FILES_REMOVE(LibrarySources create_file.cxx GENERATED nonexisting_file) -ADD_LIBRARY(CMakeTestLibrary LibrarySources) +ADD_LIBRARY(CMakeTestLibrary ${LibrarySources}) IF(WIN32) IF(NOT CYGWIN) @@ -37,7 +37,7 @@ ENDIF(WIN32) # Create shared library # SOURCE_FILES(SharedLibrarySources sharedFile) -ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources) +ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) diff --git a/Tests/ComplexOneConfig/Library/CMakeLists.txt b/Tests/ComplexOneConfig/Library/CMakeLists.txt index 0f9c5eb..cf6b976 100644 --- a/Tests/ComplexOneConfig/Library/CMakeLists.txt +++ b/Tests/ComplexOneConfig/Library/CMakeLists.txt @@ -18,7 +18,7 @@ SOURCE_FILES(LibrarySources GENERATED nonexisting_file) SOURCE_FILES_REMOVE(LibrarySources create_file.cxx GENERATED nonexisting_file) -ADD_LIBRARY(CMakeTestLibrary LibrarySources) +ADD_LIBRARY(CMakeTestLibrary ${LibrarySources}) IF(WIN32) IF(NOT CYGWIN) @@ -37,7 +37,7 @@ ENDIF(WIN32) # Create shared library # SOURCE_FILES(SharedLibrarySources sharedFile) -ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources) +ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) diff --git a/Tests/ComplexRelativePaths/Library/CMakeLists.txt b/Tests/ComplexRelativePaths/Library/CMakeLists.txt index 0f9c5eb..cf6b976 100644 --- a/Tests/ComplexRelativePaths/Library/CMakeLists.txt +++ b/Tests/ComplexRelativePaths/Library/CMakeLists.txt @@ -18,7 +18,7 @@ SOURCE_FILES(LibrarySources GENERATED nonexisting_file) SOURCE_FILES_REMOVE(LibrarySources create_file.cxx GENERATED nonexisting_file) -ADD_LIBRARY(CMakeTestLibrary LibrarySources) +ADD_LIBRARY(CMakeTestLibrary ${LibrarySources}) IF(WIN32) IF(NOT CYGWIN) @@ -37,7 +37,7 @@ ENDIF(WIN32) # Create shared library # SOURCE_FILES(SharedLibrarySources sharedFile) -ADD_LIBRARY(CMakeTestLibraryShared SHARED SharedLibrarySources) +ADD_LIBRARY(CMakeTestLibraryShared SHARED ${SharedLibrarySources}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST_C_FLAGS") ADD_LIBRARY(CMakeTestCLibraryShared SHARED testConly.c) -- cgit v0.12