FIX: apply patch from bug# 1965
This commit is contained in:
parent
1e72091e86
commit
aa47caab2d
@ -315,13 +315,23 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout,
|
|||||||
// Loop through every source group.
|
// Loop through every source group.
|
||||||
for(std::vector<cmSourceGroup>::const_iterator sg = sourceGroups.begin();
|
for(std::vector<cmSourceGroup>::const_iterator sg = sourceGroups.begin();
|
||||||
sg != sourceGroups.end(); ++sg)
|
sg != sourceGroups.end(); ++sg)
|
||||||
|
{
|
||||||
|
this->WriteGroup(&(*sg), target, fout, libName);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the DSP file's footer.
|
||||||
|
this->WriteDSPFooter(fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmLocalVisualStudio6Generator::WriteGroup(const cmSourceGroup *sg, cmTarget target, std::ostream &fout, const char *libName)
|
||||||
{
|
{
|
||||||
const std::vector<const cmSourceFile *> &sourceFiles =
|
const std::vector<const cmSourceFile *> &sourceFiles =
|
||||||
sg->GetSourceFiles();
|
sg->GetSourceFiles();
|
||||||
// If the group is empty, don't write it at all.
|
// If the group is empty, don't write it at all.
|
||||||
|
|
||||||
if(sourceFiles.empty())
|
if(sourceFiles.empty())
|
||||||
{
|
{
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the group has a name, write the header.
|
// If the group has a name, write the header.
|
||||||
@ -411,15 +421,22 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<cmSourceGroup> children = sg->GetGroupChildren();
|
||||||
|
|
||||||
|
for(unsigned int i=0;i<children.size();++i)
|
||||||
|
{
|
||||||
|
this->WriteGroup(&children[i], target, fout, libName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// If the group has a name, write the footer.
|
// If the group has a name, write the footer.
|
||||||
if(name != "")
|
if(name != "")
|
||||||
{
|
{
|
||||||
this->WriteDSPEndGroup(fout);
|
this->WriteDSPEndGroup(fout);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Write the DSP file's footer.
|
|
||||||
this->WriteDSPFooter(fout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -763,9 +780,11 @@ void cmLocalVisualStudio6Generator
|
|||||||
libPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH");
|
libPath = m_Makefile->GetDefinition("LIBRARY_OUTPUT_PATH");
|
||||||
}
|
}
|
||||||
std::string exePath = "";
|
std::string exePath = "";
|
||||||
|
std::string exePathDebug = "";
|
||||||
if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"))
|
if (m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH"))
|
||||||
{
|
{
|
||||||
exePath = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH");
|
exePath = m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH");
|
||||||
|
|
||||||
}
|
}
|
||||||
if(libPath.size())
|
if(libPath.size())
|
||||||
{
|
{
|
||||||
@ -952,13 +971,37 @@ void cmLocalVisualStudio6Generator
|
|||||||
extraLinkOptions =
|
extraLinkOptions =
|
||||||
m_Makefile->GetRequiredDefinition("CMAKE_EXE_LINKER_FLAGS");
|
m_Makefile->GetRequiredDefinition("CMAKE_EXE_LINKER_FLAGS");
|
||||||
|
|
||||||
|
|
||||||
// if the executable has an output name then add the appropriate flag
|
// if the executable has an output name then add the appropriate flag
|
||||||
if (target.GetProperty("OUTPUT_NAME"))
|
if (target.GetProperty("OUTPUT_NAME"))
|
||||||
{
|
{
|
||||||
|
std::string outputname = target.GetProperty("OUTPUT_NAME");
|
||||||
libMultiLineOptions += "# ADD LINK32 /out:";
|
libMultiLineOptions += "# ADD LINK32 /out:";
|
||||||
libMultiLineOptions += target.GetProperty("OUTPUT_NAME");
|
libMultiLineOptions += outputname;
|
||||||
libMultiLineOptions += " \n";
|
libMultiLineOptions += " \n";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
libMultiLineOptions += "# ADD LINK32 /out:\"";
|
||||||
|
|
||||||
|
if(exePath != "")
|
||||||
|
libMultiLineOptions += exePath + "/" + libName + ".exe";
|
||||||
|
else
|
||||||
|
libMultiLineOptions += std::string(libName) + ".exe";
|
||||||
|
|
||||||
|
libMultiLineOptions += "\"\n";
|
||||||
|
|
||||||
|
|
||||||
|
libMultiLineOptionsForDebug += "# ADD LINK32 /out:\"";
|
||||||
|
|
||||||
|
if(exePath != "")
|
||||||
|
libMultiLineOptionsForDebug += exePath + "/" + libName + "D.exe";
|
||||||
|
else
|
||||||
|
libMultiLineOptionsForDebug += std::string(libName) + "D.exe";
|
||||||
|
|
||||||
|
libMultiLineOptionsForDebug += "\"\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(target.GetType() == cmTarget::SHARED_LIBRARY)
|
if(target.GetType() == cmTarget::SHARED_LIBRARY)
|
||||||
{
|
{
|
||||||
@ -1087,9 +1130,28 @@ void cmLocalVisualStudio6Generator
|
|||||||
cmSystemTools::ReplaceString(line, "LIBRARY_OUTPUT_PATH",
|
cmSystemTools::ReplaceString(line, "LIBRARY_OUTPUT_PATH",
|
||||||
removeQuotes(
|
removeQuotes(
|
||||||
this->ConvertToOptionallyRelativeOutputPath(libPath.c_str())).c_str());
|
this->ConvertToOptionallyRelativeOutputPath(libPath.c_str())).c_str());
|
||||||
|
|
||||||
|
|
||||||
|
if (!m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH_OVERRIDE") || exePath == "")
|
||||||
|
{
|
||||||
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATH",
|
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATH",
|
||||||
removeQuotes(
|
removeQuotes(
|
||||||
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATHRelease",
|
||||||
|
removeQuotes(
|
||||||
|
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
||||||
|
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATHDebug",
|
||||||
|
removeQuotes(
|
||||||
|
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
||||||
|
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATHMinSizeRel",
|
||||||
|
removeQuotes(
|
||||||
|
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
||||||
|
cmSystemTools::ReplaceString(line, "EXECUTABLE_OUTPUT_PATHRelWithDebInfo",
|
||||||
|
removeQuotes(
|
||||||
|
this->ConvertToOptionallyRelativeOutputPath(exePath.c_str())).c_str());
|
||||||
|
}
|
||||||
cmSystemTools::ReplaceString(line,
|
cmSystemTools::ReplaceString(line,
|
||||||
"EXTRA_DEFINES",
|
"EXTRA_DEFINES",
|
||||||
m_Makefile->GetDefineFlags());
|
m_Makefile->GetDefineFlags());
|
||||||
|
@ -90,7 +90,8 @@ private:
|
|||||||
void AddUtilityCommandHack(cmTarget& target, int count,
|
void AddUtilityCommandHack(cmTarget& target, int count,
|
||||||
std::vector<std::string>& depends,
|
std::vector<std::string>& depends,
|
||||||
const cmCustomCommandLines& commandLines);
|
const cmCustomCommandLines& commandLines);
|
||||||
|
void WriteGroup(const cmSourceGroup *sg, cmTarget target,
|
||||||
|
std::ostream &fout, const char *libName);
|
||||||
std::string CreateTargetRules(cmTarget &target,
|
std::string CreateTargetRules(cmTarget &target,
|
||||||
const char *libName);
|
const char *libName);
|
||||||
std::string m_IncludeOptions;
|
std::string m_IncludeOptions;
|
||||||
|
@ -724,7 +724,10 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout,
|
|||||||
this->OutputLibraries(fout, configName, libName, target);
|
this->OutputLibraries(fout, configName, libName, target);
|
||||||
fout << "\"\n";
|
fout << "\"\n";
|
||||||
temp = m_ExecutableOutputPath;
|
temp = m_ExecutableOutputPath;
|
||||||
|
|
||||||
|
if (!m_Makefile->GetDefinition("EXECUTABLE_OUTPUT_PATH_OVERRIDE"))
|
||||||
temp += configName;
|
temp += configName;
|
||||||
|
|
||||||
temp += "/";
|
temp += "/";
|
||||||
|
|
||||||
// do we have a different executable name?
|
// do we have a different executable name?
|
||||||
@ -736,6 +739,9 @@ void cmLocalVisualStudio7Generator::OutputBuildTool(std::ostream& fout,
|
|||||||
{
|
{
|
||||||
temp += libName;
|
temp += libName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
temp += debugPostfix;
|
||||||
|
|
||||||
temp += ".exe";
|
temp += ".exe";
|
||||||
fout << "\t\t\t\tOutputFile=\"" << this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"\n";
|
fout << "\t\t\t\tOutputFile=\"" << this->ConvertToXMLOutputPathSingle(temp.c_str()) << "\"\n";
|
||||||
for(std::map<cmStdString, cmStdString>::iterator i = flagMap.begin();
|
for(std::map<cmStdString, cmStdString>::iterator i = flagMap.begin();
|
||||||
@ -988,15 +994,28 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
|||||||
|
|
||||||
|
|
||||||
// Loop through every source group.
|
// Loop through every source group.
|
||||||
for(std::vector<cmSourceGroup>::const_iterator sg = sourceGroups.begin();
|
for(unsigned int i = 0; i < sourceGroups.size(); ++i)
|
||||||
sg != sourceGroups.end(); ++sg)
|
{
|
||||||
|
cmSourceGroup sg = sourceGroups[i];
|
||||||
|
this->WriteGroup(&sg, target, fout, libName, configs);
|
||||||
|
}
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
fout << "\t</Files>\n";
|
||||||
|
|
||||||
|
// Write the VCProj file's footer.
|
||||||
|
this->WriteVCProjFooter(fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmLocalVisualStudio7Generator::WriteGroup(const cmSourceGroup *sg, cmTarget target, std::ostream &fout, const char *libName, std::vector<std::string> *configs)
|
||||||
{
|
{
|
||||||
const std::vector<const cmSourceFile *> &sourceFiles =
|
const std::vector<const cmSourceFile *> &sourceFiles =
|
||||||
sg->GetSourceFiles();
|
sg->GetSourceFiles();
|
||||||
// If the group is empty, don't write it at all.
|
// If the group is empty, don't write it at all.
|
||||||
if(sourceFiles.empty())
|
if(sourceFiles.empty())
|
||||||
{
|
{
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the group has a name, write the header.
|
// If the group has a name, write the header.
|
||||||
@ -1105,18 +1124,19 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<cmSourceGroup> children = sg->GetGroupChildren();
|
||||||
|
|
||||||
|
for(unsigned int i=0;i<children.size();++i)
|
||||||
|
{
|
||||||
|
this->WriteGroup(&children[i], target, fout, libName, configs);
|
||||||
|
}
|
||||||
|
|
||||||
// If the group has a name, write the footer.
|
// If the group has a name, write the footer.
|
||||||
if(name != "")
|
if(name != "")
|
||||||
{
|
{
|
||||||
this->WriteVCProjEndGroup(fout);
|
this->WriteVCProjEndGroup(fout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fout << "\t</Files>\n";
|
|
||||||
|
|
||||||
// Write the VCProj file's footer.
|
|
||||||
this->WriteVCProjFooter(fout);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void cmLocalVisualStudio7Generator::
|
void cmLocalVisualStudio7Generator::
|
||||||
WriteCustomRule(std::ostream& fout,
|
WriteCustomRule(std::ostream& fout,
|
||||||
|
@ -111,6 +111,8 @@ private:
|
|||||||
const char* output,
|
const char* output,
|
||||||
const char* extraFlags);
|
const char* extraFlags);
|
||||||
|
|
||||||
|
void WriteGroup(const cmSourceGroup *sg, cmTarget target, std::ostream &fout, const char *libName, std::vector<std::string> *configs);
|
||||||
|
|
||||||
std::vector<std::string> m_CreatedProjectNames;
|
std::vector<std::string> m_CreatedProjectNames;
|
||||||
std::string m_LibraryOutputPath;
|
std::string m_LibraryOutputPath;
|
||||||
std::string m_ExecutableOutputPath;
|
std::string m_ExecutableOutputPath;
|
||||||
|
@ -1181,17 +1181,29 @@ cmSourceGroup* cmMakefile::GetSourceGroup(const char* name)
|
|||||||
{
|
{
|
||||||
return &(*sg);
|
return &(*sg);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmSourceGroup *target = sg->lookupChild(name);
|
||||||
|
|
||||||
|
if(target)
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMakefile::AddSourceGroup(const char* name, const char* regex)
|
void cmMakefile::AddSourceGroup(const char* name, const char* regex, const char *parent)
|
||||||
{
|
{
|
||||||
// First see if the group exists. If so, replace its regular expression.
|
// First see if the group exists. If so, replace its regular expression.
|
||||||
for(std::vector<cmSourceGroup>::iterator sg = m_SourceGroups.begin();
|
for(unsigned int i=0;i<m_SourceGroups.size();++i)
|
||||||
sg != m_SourceGroups.end(); ++sg)
|
|
||||||
{
|
{
|
||||||
|
cmSourceGroup *sg = &m_SourceGroups[i];
|
||||||
|
|
||||||
std::string sgName = sg->GetName();
|
std::string sgName = sg->GetName();
|
||||||
|
if(!parent)
|
||||||
|
{
|
||||||
if(sgName == name)
|
if(sgName == name)
|
||||||
{
|
{
|
||||||
if ( regex )
|
if ( regex )
|
||||||
@ -1203,6 +1215,52 @@ void cmMakefile::AddSourceGroup(const char* name, const char* regex)
|
|||||||
return;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The group doesn't exist. Add it.
|
// The group doesn't exist. Add it.
|
||||||
m_SourceGroups.push_back(cmSourceGroup(name, regex));
|
m_SourceGroups.push_back(cmSourceGroup(name, regex));
|
||||||
@ -1651,9 +1709,10 @@ cmMakefile::FindSourceGroup(const char* source,
|
|||||||
for(std::vector<cmSourceGroup>::reverse_iterator sg = groups.rbegin();
|
for(std::vector<cmSourceGroup>::reverse_iterator sg = groups.rbegin();
|
||||||
sg != groups.rend(); ++sg)
|
sg != groups.rend(); ++sg)
|
||||||
{
|
{
|
||||||
if(sg->MatchesFiles(source))
|
cmSourceGroup *result = sg->MatchChildrenFiles(source);
|
||||||
|
if(result)
|
||||||
{
|
{
|
||||||
return *sg;
|
return *result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1661,12 +1720,14 @@ cmMakefile::FindSourceGroup(const char* source,
|
|||||||
for(std::vector<cmSourceGroup>::reverse_iterator sg = groups.rbegin();
|
for(std::vector<cmSourceGroup>::reverse_iterator sg = groups.rbegin();
|
||||||
sg != groups.rend(); ++sg)
|
sg != groups.rend(); ++sg)
|
||||||
{
|
{
|
||||||
if(sg->MatchesRegex(source))
|
cmSourceGroup *result = sg->MatchChildrenRegex(source);
|
||||||
|
if(result)
|
||||||
{
|
{
|
||||||
return *sg;
|
return *result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Shouldn't get here, but just in case, return the default group.
|
// Shouldn't get here, but just in case, return the default group.
|
||||||
return groups.front();
|
return groups.front();
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Add a source group for consideration when adding a new source.
|
* Add a source group for consideration when adding a new source.
|
||||||
*/
|
*/
|
||||||
void AddSourceGroup(const char* name, const char* regex=0);
|
void AddSourceGroup(const char* name, const char* regex=0, const char* parent=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an auxiliary directory to the build.
|
* Add an auxiliary directory to the build.
|
||||||
|
@ -81,3 +81,88 @@ std::vector<const cmSourceFile*>& cmSourceGroup::GetSourceFiles()
|
|||||||
{
|
{
|
||||||
return m_SourceFiles;
|
return m_SourceFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmSourceGroup::AddChild(cmSourceGroup child)
|
||||||
|
{
|
||||||
|
m_GroupChildren.push_back(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
cmSourceGroup *cmSourceGroup::lookupChild(const char* name)
|
||||||
|
{
|
||||||
|
// initializing iterators
|
||||||
|
std::vector<cmSourceGroup>::iterator iter = m_GroupChildren.begin();
|
||||||
|
std::vector<cmSourceGroup>::iterator end = m_GroupChildren.end();
|
||||||
|
|
||||||
|
// st
|
||||||
|
for(;iter!=end; ++iter)
|
||||||
|
{
|
||||||
|
std::string sgName = iter->GetName();
|
||||||
|
|
||||||
|
// look if descenened is the one were looking for
|
||||||
|
if(sgName == 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
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSourceGroup *cmSourceGroup::MatchChildrenFiles(const char *name)
|
||||||
|
{
|
||||||
|
// initializing iterators
|
||||||
|
std::vector<cmSourceGroup>::iterator iter = m_GroupChildren.begin();
|
||||||
|
std::vector<cmSourceGroup>::iterator end = m_GroupChildren.end();
|
||||||
|
|
||||||
|
if(this->MatchesFiles(name))
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
for(;iter!=end;++iter)
|
||||||
|
{
|
||||||
|
cmSourceGroup *result = iter->MatchChildrenFiles(name);
|
||||||
|
if(result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cmSourceGroup *cmSourceGroup::MatchChildrenRegex(const char *name)
|
||||||
|
{
|
||||||
|
// initializing iterators
|
||||||
|
std::vector<cmSourceGroup>::iterator iter = m_GroupChildren.begin();
|
||||||
|
std::vector<cmSourceGroup>::iterator end = m_GroupChildren.end();
|
||||||
|
|
||||||
|
if(this->MatchesRegex(name))
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
for(;iter!=end; ++iter)
|
||||||
|
{
|
||||||
|
cmSourceGroup *result = iter->MatchChildrenRegex(name);
|
||||||
|
if(result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<cmSourceGroup> cmSourceGroup::GetGroupChildren() const
|
||||||
|
{
|
||||||
|
return m_GroupChildren;
|
||||||
|
}
|
||||||
|
@ -48,6 +48,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
void AddGroupFile(const char* name);
|
void AddGroupFile(const char* name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add child to this sourcegroup
|
||||||
|
*/
|
||||||
|
void AddChild(cmSourceGroup child);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Looks up child and returns it
|
||||||
|
*/
|
||||||
|
cmSourceGroup *lookupChild(const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of this group.
|
* Get the name of this group.
|
||||||
*/
|
*/
|
||||||
@ -63,6 +73,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool MatchesFiles(const char* name);
|
bool MatchesFiles(const char* name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given name matches this group's explicit file list in children.
|
||||||
|
*/
|
||||||
|
cmSourceGroup *MatchChildrenFiles(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given name matches this group's regex in children.
|
||||||
|
*/
|
||||||
|
cmSourceGroup *MatchChildrenRegex(const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assign the given source file to this group. Used only by
|
* Assign the given source file to this group. Used only by
|
||||||
* generators.
|
* generators.
|
||||||
@ -76,6 +96,7 @@ public:
|
|||||||
const std::vector<const cmSourceFile*>& GetSourceFiles() const;
|
const std::vector<const cmSourceFile*>& GetSourceFiles() const;
|
||||||
std::vector<const cmSourceFile*>& GetSourceFiles();
|
std::vector<const cmSourceFile*>& GetSourceFiles();
|
||||||
|
|
||||||
|
std::vector<cmSourceGroup> GetGroupChildren() const;
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* The name of the source group.
|
* The name of the source group.
|
||||||
@ -97,6 +118,8 @@ private:
|
|||||||
* this group.
|
* this group.
|
||||||
*/
|
*/
|
||||||
std::vector<const cmSourceFile*> m_SourceFiles;
|
std::vector<const cmSourceFile*> m_SourceFiles;
|
||||||
|
|
||||||
|
std::vector<cmSourceGroup> m_GroupChildren;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,6 +16,50 @@
|
|||||||
=========================================================================*/
|
=========================================================================*/
|
||||||
#include "cmSourceGroupCommand.h"
|
#include "cmSourceGroupCommand.h"
|
||||||
|
|
||||||
|
inline std::vector<std::string> tokenize(const std::string& str,
|
||||||
|
const std::string& sep,
|
||||||
|
bool skipEmptyTokens)
|
||||||
|
{
|
||||||
|
std::vector<std::string> tokens;
|
||||||
|
std::string::size_type tokstart,tokend;
|
||||||
|
|
||||||
|
if (skipEmptyTokens)
|
||||||
|
{
|
||||||
|
tokend=0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tokend=std::string::npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (skipEmptyTokens)
|
||||||
|
{
|
||||||
|
tokstart=str.find_first_not_of(sep,tokend);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tokstart=tokend+1;
|
||||||
|
}
|
||||||
|
if (tokstart==std::string::npos)
|
||||||
|
{
|
||||||
|
break; // no more tokens
|
||||||
|
}
|
||||||
|
tokend=str.find_first_of(sep,tokstart);
|
||||||
|
if (tokend==std::string::npos)
|
||||||
|
{
|
||||||
|
tokens.push_back(str.substr(tokstart));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tokens.push_back(str.substr(tokstart,tokend-tokstart));
|
||||||
|
}
|
||||||
|
} while (tokend!=std::string::npos);
|
||||||
|
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
|
||||||
// cmSourceGroupCommand
|
// cmSourceGroupCommand
|
||||||
bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args)
|
bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args)
|
||||||
{
|
{
|
||||||
@ -25,12 +69,26 @@ bool cmSourceGroupCommand::InitialPass(std::vector<std::string> const& args)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the source group with the given name.
|
std::string delimiter = "\\";
|
||||||
cmSourceGroup* sg = m_Makefile->GetSourceGroup(args[0].c_str());
|
|
||||||
|
if(m_Makefile->GetDefinition("SOURCE_GROUP_DELIMITER"))
|
||||||
|
delimiter = m_Makefile->GetDefinition("SOURCE_GROUP_DELIMITER");
|
||||||
|
|
||||||
|
std::vector<std::string> folders = tokenize(args[0], delimiter, true);
|
||||||
|
|
||||||
|
const char *parent = NULL;
|
||||||
|
|
||||||
|
cmSourceGroup* sg = NULL;
|
||||||
|
|
||||||
|
for(unsigned int i=0;i<folders.size();++i)
|
||||||
|
{
|
||||||
|
sg = m_Makefile->GetSourceGroup(folders[i].c_str());
|
||||||
if(!sg)
|
if(!sg)
|
||||||
{
|
{
|
||||||
m_Makefile->AddSourceGroup(args[0].c_str(), 0);
|
m_Makefile->AddSourceGroup(folders[i].c_str(), 0, parent);
|
||||||
sg = m_Makefile->GetSourceGroup(args[0].c_str());
|
}
|
||||||
|
sg = m_Makefile->GetSourceGroup(folders[i].c_str());
|
||||||
|
parent = folders[i].c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If only two arguments are given, the pre-1.8 version of the
|
// If only two arguments are given, the pre-1.8 version of the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user