diff options
author | Alexander Neundorf <neundorf@kde.org> | 2007-08-24 18:21:49 (GMT) |
---|---|---|
committer | Alexander Neundorf <neundorf@kde.org> | 2007-08-24 18:21:49 (GMT) |
commit | 9220e974017e34b53ba0650ec45c1a16566b6b88 (patch) | |
tree | 1e4ce1b543aa647e2ef7b79e2ab5c25dc1abf81c | |
parent | 9a4e7ea742e7ff8e1110f3fe55e98340cb309aef (diff) | |
download | CMake-9220e974017e34b53ba0650ec45c1a16566b6b88.zip CMake-9220e974017e34b53ba0650ec45c1a16566b6b88.tar.gz CMake-9220e974017e34b53ba0650ec45c1a16566b6b88.tar.bz2 |
BUG: fix #4057 (which had several duplicates): handle recursivew source groups better, i.e. multiple sourcegroups with the same end component work now
Alex
-rw-r--r-- | Source/cmMakefile.cxx | 148 | ||||
-rw-r--r-- | Source/cmMakefile.h | 12 | ||||
-rw-r--r-- | Source/cmSourceGroup.cxx | 8 | ||||
-rw-r--r-- | Source/cmSourceGroupCommand.cxx | 13 |
4 files changed, 86 insertions, 95 deletions
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index ecfdf80..534ab02 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<std::string>&name) { - // First see if the group exists. If so, replace its regular expression. - for(std::vector<cmSourceGroup>::iterator sg = this->SourceGroups.begin(); - sg != this->SourceGroups.end(); ++sg) + cmSourceGroup* sg = 0; + + // first look for source group starting with the same as the one we wants + for (std::vector<cmSourceGroup>::iterator sgIt = this->SourceGroups.begin(); + sgIt != this->SourceGroups.end(); ++sgIt) + { - std::string sgName = sg->GetName(); - if(sgName == name) + std::string sgName = sgIt->GetName(); + if(sgName == name[0]) { - return &(*sg); + sg = &(*sgIt); + break; } - else - { - cmSourceGroup *target = sg->lookupChild(name); + } - if(target) + if(sg != 0) + { + // iterate through its children to find match source group + for(unsigned int i=1; i<name.size(); ++i) + { + sg = sg->lookupChild(name[i].c_str()); + if(sg == 0) { - return target; + break; } } } - return 0; + return sg; +} + + void cmMakefile::AddSourceGroup(const char* name, + const char* regex, + const char* parent) +{ + if (name) + { + std::vector<std::string> nameVector; + nameVector.push_back(name); + AddSourceGroup(nameVector, regex, parent); + } } -void cmMakefile::AddSourceGroup(const char* name, +void cmMakefile::AddSourceGroup(const std::vector<std::string>& name, const char* regex, const char *parent) { - // First see if the group exists. If so, replace its regular expression. - for(unsigned int i=0;i<this->SourceGroups.size();++i) + cmSourceGroup* sg = 0; + std::vector<std::string> 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; - } + break; } - 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; - } - } + // 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 } - // The group doesn't exist. Add it. - this->SourceGroups.push_back(cmSourceGroup(name, regex)); + // 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 d81da01..d2cd1d2 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<std::string>& 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<std::string>&name); #endif /** diff --git a/Source/cmSourceGroup.cxx b/Source/cmSourceGroup.cxx index c34afe8..f98eeef 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 a013cc9..145b7ed 100644 --- a/Source/cmSourceGroupCommand.cxx +++ b/Source/cmSourceGroupCommand.cxx @@ -66,16 +66,13 @@ bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args) const char *parent = NULL; cmSourceGroup* sg = NULL; - for(unsigned int i=0;i<folders.size();++i) + sg = this->Makefile->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"); |