|
|
@@ -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)
|