Merge topic 'xcode-source_groups-folders-issue-10039'
f09ba0f
Fix style errors added by parent and grandparenteeeeca1
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:
commit
98dc13e513
|
@ -2517,62 +2517,119 @@ void cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
cmXCodeObject *cmGlobalXCodeGenerator
|
cmXCodeObject *cmGlobalXCodeGenerator
|
||||||
::CreateOrGetPBXGroup(cmTarget& cmtarget, cmSourceGroup* sg)
|
::CreatePBXGroup(cmXCodeObject *parent, cmStdString name)
|
||||||
{
|
{
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue