Merge topic 'xcode-source_groups-folders-issue-10039'

f09ba0f Fix style errors added by parent and grandparent
eeeeca1 XCode: Support target folders on XCode.
59ed84e Xcode: Support multiple level nesting of XCode folders (#10039)
d0a403f CMake: Move tokenize to cmSystemTools
This commit is contained in:
Brad King 2011-06-08 15:44:44 -04:00 committed by CMake Topic Stage
commit 98dc13e513
5 changed files with 126 additions and 62 deletions

View File

@ -2517,62 +2517,119 @@ void cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root,
} }
} }
//---------------------------------------------------------------------------- cmXCodeObject *cmGlobalXCodeGenerator
cmXCodeObject* cmGlobalXCodeGenerator ::CreatePBXGroup(cmXCodeObject *parent, cmStdString name)
::CreateOrGetPBXGroup(cmTarget& cmtarget, cmSourceGroup* sg)
{ {
cmStdString s = cmtarget.GetName(); cmXCodeObject* parentChildren = NULL;
s += "/"; if(parent)
s += sg->GetName(); parentChildren = parent->GetObject("children");
std::map<cmStdString, cmXCodeObject* >::iterator i =
this->GroupNameMap.find(s);
if(i != this->GroupNameMap.end())
{
return i->second;
}
i = this->TargetGroup.find(cmtarget.GetName());
cmXCodeObject* tgroup = 0;
if(i != this->TargetGroup.end())
{
tgroup = i->second;
}
else
{
tgroup = this->CreateObject(cmXCodeObject::PBXGroup);
this->TargetGroup[cmtarget.GetName()] = tgroup;
cmXCodeObject* tgroupChildren =
this->CreateObject(cmXCodeObject::OBJECT_LIST);
tgroup->AddAttribute("name", this->CreateString(cmtarget.GetName()));
tgroup->AddAttribute("children", tgroupChildren);
if(this->XcodeVersion == 15)
{
tgroup->AddAttribute("refType", this->CreateString("4"));
}
tgroup->AddAttribute("sourceTree", this->CreateString("<group>"));
this->SourcesGroupChildren->AddObject(tgroup);
}
// If it's the default source group (empty name) then put the source file
// directly in the tgroup...
//
if (cmStdString(sg->GetName()) == "")
{
this->GroupNameMap[s] = tgroup;
return tgroup;
}
cmXCodeObject* tgroupChildren = tgroup->GetObject("children");
cmXCodeObject* group = this->CreateObject(cmXCodeObject::PBXGroup); cmXCodeObject* group = this->CreateObject(cmXCodeObject::PBXGroup);
cmXCodeObject* groupChildren = cmXCodeObject* groupChildren =
this->CreateObject(cmXCodeObject::OBJECT_LIST); this->CreateObject(cmXCodeObject::OBJECT_LIST);
group->AddAttribute("name", this->CreateString(sg->GetName())); group->AddAttribute("name", this->CreateString(name.c_str()));
group->AddAttribute("children", groupChildren); group->AddAttribute("children", groupChildren);
if(this->XcodeVersion == 15) if(this->XcodeVersion == 15)
{ {
group->AddAttribute("refType", this->CreateString("4")); group->AddAttribute("refType", this->CreateString("4"));
} }
group->AddAttribute("sourceTree", this->CreateString("<group>")); group->AddAttribute("sourceTree", this->CreateString("<group>"));
tgroupChildren->AddObject(group); if(parentChildren)
parentChildren->AddObject(group);
return group;
}
//----------------------------------------------------------------------------
cmXCodeObject* cmGlobalXCodeGenerator
::CreateOrGetPBXGroup(cmTarget& cmtarget, cmSourceGroup* sg)
{
cmStdString s;
cmStdString target;
const char *targetFolder= cmtarget.GetProperty("FOLDER");
if(targetFolder) {
target = targetFolder;
target += "/";
}
target += cmtarget.GetName();
s = target + "/";
s += sg->GetFullName();
std::map<cmStdString, cmXCodeObject* >::iterator it =
this->GroupNameMap.find(s);
if(it != this->GroupNameMap.end())
{
return it->second;
}
it = this->TargetGroup.find(target);
cmXCodeObject* tgroup = 0;
if(it != this->TargetGroup.end())
{
tgroup = it->second;
}
else
{
std::vector<std::string> tgt_folders =
cmSystemTools::tokenize(target, "/");
cmStdString curr_tgt_folder;
for(std::vector<std::string>::size_type i = 0; i < tgt_folders.size();i++)
{
curr_tgt_folder += tgt_folders[i];
it = this->TargetGroup.find(curr_tgt_folder);
if(it == this->TargetGroup.end())
{
tgroup = this->CreatePBXGroup(tgroup,tgt_folders[i]);
this->TargetGroup[curr_tgt_folder] = tgroup;
}
else
{
tgroup = it->second;
continue;
}
if(i == 0)
{
this->SourcesGroupChildren->AddObject(tgroup);
}
curr_tgt_folder += "/";
}
}
this->TargetGroup[target] = tgroup;
// If it's the default source group (empty name) then put the source file
// directly in the tgroup...
//
if (cmStdString(sg->GetFullName()) == "")
{
this->GroupNameMap[s] = tgroup;
return tgroup;
}
//It's a recursive folder structure, let's find the real parent group
if(std::string(sg->GetFullName()) != std::string(sg->GetName()))
{
std::vector<std::string> folders =
cmSystemTools::tokenize(sg->GetFullName(), "\\");
cmStdString curr_folder = cmtarget.GetName();
curr_folder += "/";
for(std::vector<std::string>::size_type i = 0; i < folders.size();i++)
{
curr_folder += folders[i];
std::map<cmStdString, cmXCodeObject* >::iterator i_folder =
this->GroupNameMap.find(curr_folder);
//Create new folder
if(i_folder == this->GroupNameMap.end())
{
cmXCodeObject *group = this->CreatePBXGroup(tgroup,folders[i]);
this->GroupNameMap[curr_folder] = group;
tgroup = group;
}
else
{
tgroup = i_folder->second;
}
curr_folder = curr_folder + "\\";
}
return tgroup;
}
cmXCodeObject *group = this->CreatePBXGroup(tgroup,sg->GetName());
this->GroupNameMap[s] = group; this->GroupNameMap[s] = group;
return group; return group;
} }

View File

@ -88,6 +88,8 @@ public:
private: private:
cmXCodeObject* CreateOrGetPBXGroup(cmTarget& cmtarget, cmXCodeObject* CreateOrGetPBXGroup(cmTarget& cmtarget,
cmSourceGroup* sg); cmSourceGroup* sg);
cmXCodeObject* CreatePBXGroup(cmXCodeObject *parent,
cmStdString name);
void CreateGroups(cmLocalGenerator* root, void CreateGroups(cmLocalGenerator* root,
std::vector<cmLocalGenerator*>& std::vector<cmLocalGenerator*>&
generators); generators);

View File

@ -11,37 +11,6 @@
============================================================================*/ ============================================================================*/
#include "cmSourceGroupCommand.h" #include "cmSourceGroupCommand.h"
inline std::vector<std::string> tokenize(const std::string& str,
const std::string& sep)
{
std::vector<std::string> tokens;
std::string::size_type tokend = 0;
do
{
std::string::size_type tokstart=str.find_first_not_of(sep, tokend);
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);
if (tokens.empty())
{
tokens.push_back("");
}
return tokens;
}
// cmSourceGroupCommand // cmSourceGroupCommand
bool cmSourceGroupCommand bool cmSourceGroupCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) ::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
@ -58,7 +27,8 @@ bool cmSourceGroupCommand
delimiter = this->Makefile->GetDefinition("SOURCE_GROUP_DELIMITER"); delimiter = this->Makefile->GetDefinition("SOURCE_GROUP_DELIMITER");
} }
std::vector<std::string> folders = tokenize(args[0], delimiter); std::vector<std::string> folders =
cmSystemTools::tokenize(args[0], delimiter);
cmSourceGroup* sg = 0; cmSourceGroup* sg = 0;
sg = this->Makefile->GetSourceGroup(folders); sg = this->Makefile->GetSourceGroup(folders);

View File

@ -2919,3 +2919,35 @@ bool cmSystemTools::RepeatedRemoveDirectory(const char* dir)
} }
return false; return false;
} }
//----------------------------------------------------------------------------
std::vector<std::string> cmSystemTools::tokenize(const std::string& str,
const std::string& sep)
{
std::vector<std::string> tokens;
std::string::size_type tokend = 0;
do
{
std::string::size_type tokstart=str.find_first_not_of(sep, tokend);
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);
if (tokens.empty())
{
tokens.push_back("");
}
return tokens;
}

View File

@ -444,6 +444,9 @@ public:
/** Remove a directory; repeat a few times in case of locked files. */ /** Remove a directory; repeat a few times in case of locked files. */
static bool RepeatedRemoveDirectory(const char* dir); static bool RepeatedRemoveDirectory(const char* dir);
/** Tokenize a string */
static std::vector<std::string> tokenize(const std::string& str,
const std::string& sep);
private: private:
static bool s_ForceUnixPaths; static bool s_ForceUnixPaths;
static bool s_RunCommandHideConsole; static bool s_RunCommandHideConsole;