From 9220e974017e34b53ba0650ec45c1a16566b6b88 Mon Sep 17 00:00:00 2001 From: Alexander Neundorf Date: Fri, 24 Aug 2007 14:21:49 -0400 Subject: [PATCH] BUG: fix #4057 (which had several duplicates): handle recursivew source groups better, i.e. multiple sourcegroups with the same end component work now Alex --- Source/cmMakefile.cxx | 158 +++++++++++++++----------------- Source/cmMakefile.h | 12 ++- Source/cmSourceGroup.cxx | 8 -- Source/cmSourceGroupCommand.cxx | 13 +-- 4 files changed, 91 insertions(+), 100 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index ecfdf8017..534ab02c2 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1448,105 +1448,99 @@ cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname) } #if defined(CMAKE_BUILD_WITH_CMAKE) -cmSourceGroup* cmMakefile::GetSourceGroup(const char* name) +cmSourceGroup* cmMakefile::GetSourceGroup(const std::vector&name) { - // First see if the group exists. If so, replace its regular expression. - for(std::vector::iterator sg = this->SourceGroups.begin(); - sg != this->SourceGroups.end(); ++sg) - { - std::string sgName = sg->GetName(); - if(sgName == name) - { - return &(*sg); - } - else - { - cmSourceGroup *target = sg->lookupChild(name); + cmSourceGroup* sg = 0; - if(target) + // first look for source group starting with the same as the one we wants + for (std::vector::iterator sgIt = this->SourceGroups.begin(); + sgIt != this->SourceGroups.end(); ++sgIt) + + { + std::string sgName = sgIt->GetName(); + if(sgName == name[0]) + { + sg = &(*sgIt); + break; + } + } + + if(sg != 0) + { + // iterate through its children to find match source group + for(unsigned int i=1; ilookupChild(name[i].c_str()); + if(sg == 0) { - return target; + break; } } } - return 0; + return sg; } -void cmMakefile::AddSourceGroup(const char* name, + void cmMakefile::AddSourceGroup(const char* name, + const char* regex, + const char* parent) +{ + if (name) + { + std::vector nameVector; + nameVector.push_back(name); + AddSourceGroup(nameVector, regex, parent); + } +} + +void cmMakefile::AddSourceGroup(const std::vector& name, const char* regex, const char *parent) { - // First see if the group exists. If so, replace its regular expression. - for(unsigned int i=0;iSourceGroups.size();++i) + cmSourceGroup* sg = 0; + std::vector currentName; + int i = 0; + const int lastElement = name.size()-1; + for(i=lastElement; i>=0; --i) { - cmSourceGroup *sg = &this->SourceGroups[i]; - - std::string sgName = sg->GetName(); - if(!parent) + currentName.assign(name.begin(), name.begin()+i+1); + sg = this->GetSourceGroup(currentName); + if(sg != 0) { - if(sgName == name) - { - if ( regex ) - { - // We only want to set the regular expression. If there are already - // source files in the group, we don't want to remove them. - sg->SetGroupRegex(regex); - } - return; - } - } - else - { - if(sgName == parent) - { - cmSourceGroup *localtarget = sg->lookupChild(name); - if(localtarget) - { - if ( regex ) - { - // We only want to set the regular expression. If there are - // already source files in the group, we don't want to remove - // them. - localtarget->SetGroupRegex(regex); - } - } - else - { - sg->AddChild(cmSourceGroup(name, regex)); - } - return; - } - else - { - cmSourceGroup *localtarget = sg->lookupChild(parent); - - if(localtarget) - { - cmSourceGroup *addtarget = localtarget->lookupChild(name); - - if(addtarget) - { - if ( regex ) - { - // We only want to set the regular expression. If there are - // already source files in the group, we don't want to - // remove them. - addtarget->SetGroupRegex(regex); - } - } - else - { - localtarget->AddChild(cmSourceGroup(name, regex)); - } - return; - } - } + break; } } - // The group doesn't exist. Add it. - this->SourceGroups.push_back(cmSourceGroup(name, regex)); + // i now contains the index of the last found component + if(i==lastElement) + { + // group already exists, replace its regular expression + if ( regex ) + { + // We only want to set the regular expression. If there are already + // source files in the group, we don't want to remove them. + sg->SetGroupRegex(regex); + } + return; + } + else if(i==-1) + { + // group does not exists nor belong to any existing group + // add its first component + this->SourceGroups.push_back(cmSourceGroup(name[0].c_str(), regex)); + sg = this->GetSourceGroup(currentName); + i = 0; // last component found + } + + // build the whole source group path + for(++i; i<=lastElement; ++i) + { + sg->AddChild(cmSourceGroup(name[i].c_str(), 0)); + sg = sg->lookupChild(name[i].c_str()); + } + + sg->SetGroupRegex(regex); } + #endif void cmMakefile::AddExtraDirectory(const char* dir) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index d81da01aa..d2cd1d2ec 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -291,10 +291,18 @@ public: #if defined(CMAKE_BUILD_WITH_CMAKE) /** - * Add a source group for consideration when adding a new source. + * Add a root source group for consideration when adding a new source. */ void AddSourceGroup(const char* name, const char* regex=0, const char* parent=0); + + /** + * Add a source group for consideration when adding a new source. + * name is tokenized. + */ + void AddSourceGroup(const std::vector& name, + const char* regex=0, const char* parent=0); + #endif /** @@ -541,7 +549,7 @@ public: /** * Get the source group */ - cmSourceGroup* GetSourceGroup(const char* name); + cmSourceGroup* GetSourceGroup(const std::vector&name); #endif /** diff --git a/Source/cmSourceGroup.cxx b/Source/cmSourceGroup.cxx index c34afe880..f98eeef4e 100644 --- a/Source/cmSourceGroup.cxx +++ b/Source/cmSourceGroup.cxx @@ -105,14 +105,6 @@ cmSourceGroup *cmSourceGroup::lookupChild(const char* name) { return &(*iter); // if it so return it } - // if the descendend isn't the one where looking for ask it's traverse - cmSourceGroup *result = iter->lookupChild(name); - - // if one of it's descendeds is the one we're looking for return it - if(result) - { - return result; - } } // if no child with this name was found return NULL diff --git a/Source/cmSourceGroupCommand.cxx b/Source/cmSourceGroupCommand.cxx index a013cc917..145b7ede2 100644 --- a/Source/cmSourceGroupCommand.cxx +++ b/Source/cmSourceGroupCommand.cxx @@ -66,16 +66,13 @@ bool cmSourceGroupCommand::InitialPass(std::vector const& args) const char *parent = NULL; cmSourceGroup* sg = NULL; - for(unsigned int i=0;iMakefile->GetSourceGroup(folders); + if(!sg) { - sg = this->Makefile->GetSourceGroup(folders[i].c_str()); - if(!sg) - { - this->Makefile->AddSourceGroup(folders[i].c_str(), 0, parent); - } - sg = this->Makefile->GetSourceGroup(folders[i].c_str()); - parent = folders[i].c_str(); + this->Makefile->AddSourceGroup(folders); + sg = this->Makefile->GetSourceGroup(folders); } + if(!sg) { this->SetError("Could not create or find source group");