ENH: add real support for Xcode21
This commit is contained in:
parent
389333967b
commit
6b4c142c7d
|
@ -147,6 +147,7 @@ ENDIF(UNIX)
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(SRCS ${SRCS}
|
SET(SRCS ${SRCS}
|
||||||
cmXCodeObject.cxx
|
cmXCodeObject.cxx
|
||||||
|
cmXCode21Object.cxx
|
||||||
cmGlobalXCodeGenerator.cxx
|
cmGlobalXCodeGenerator.cxx
|
||||||
cmGlobalXCodeGenerator.h
|
cmGlobalXCodeGenerator.h
|
||||||
cmGlobalXCode21Generator.cxx
|
cmGlobalXCode21Generator.cxx
|
||||||
|
|
|
@ -15,9 +15,31 @@
|
||||||
|
|
||||||
=========================================================================*/
|
=========================================================================*/
|
||||||
#include "cmGlobalXCode21Generator.h"
|
#include "cmGlobalXCode21Generator.h"
|
||||||
|
#include "cmXCode21Object.h"
|
||||||
|
|
||||||
cmGlobalXCode21Generator::cmGlobalXCode21Generator()
|
cmGlobalXCode21Generator::cmGlobalXCode21Generator()
|
||||||
{
|
{
|
||||||
this->m_XcodeVersion = 21;
|
this->m_XcodeVersion = 21;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmGlobalXCode21Generator::WriteXCodePBXProj(std::ostream& fout,
|
||||||
|
cmLocalGenerator* ,
|
||||||
|
std::vector<cmLocalGenerator*>& )
|
||||||
|
{
|
||||||
|
fout << "// !$*UTF8*$!\n";
|
||||||
|
fout << "{\n";
|
||||||
|
cmXCode21Object::Indent(1, fout);
|
||||||
|
fout << "archiveVersion = 1;\n";
|
||||||
|
cmXCode21Object::Indent(1, fout);
|
||||||
|
fout << "classes = {\n";
|
||||||
|
cmXCode21Object::Indent(1, fout);
|
||||||
|
fout << "};\n";
|
||||||
|
cmXCode21Object::Indent(1, fout);
|
||||||
|
fout << "objectVersion = 42;\n";
|
||||||
|
cmXCode21Object::PrintList(m_XCodeObjects, fout);
|
||||||
|
cmXCode21Object::Indent(1, fout);
|
||||||
|
fout << "rootObject = " << m_RootObject->GetId() << " /* Project object */;\n";
|
||||||
|
fout << "}\n";
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ class cmGlobalXCode21Generator : public cmGlobalXCodeGenerator
|
||||||
public:
|
public:
|
||||||
cmGlobalXCode21Generator();
|
cmGlobalXCode21Generator();
|
||||||
static cmGlobalGenerator* New() { return new cmGlobalXCode21Generator; }
|
static cmGlobalGenerator* New() { return new cmGlobalXCode21Generator; }
|
||||||
|
virtual void WriteXCodePBXProj(std::ostream& fout,
|
||||||
|
cmLocalGenerator* root,
|
||||||
|
std::vector<cmLocalGenerator*>& generators);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "cmLocalXCodeGenerator.h"
|
#include "cmLocalXCodeGenerator.h"
|
||||||
#include "cmMakefile.h"
|
#include "cmMakefile.h"
|
||||||
#include "cmXCodeObject.h"
|
#include "cmXCodeObject.h"
|
||||||
|
#include "cmXCode21Object.h"
|
||||||
#include "cmake.h"
|
#include "cmake.h"
|
||||||
#include "cmGeneratedFileStream.h"
|
#include "cmGeneratedFileStream.h"
|
||||||
#include "cmSourceFile.h"
|
#include "cmSourceFile.h"
|
||||||
|
@ -114,7 +115,13 @@ void cmGlobalXCodeGenerator::EnableLanguage(std::vector<std::string>const&
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mf->AddDefinition("CMAKE_CFG_INTDIR","$(CONFIGURATION)");
|
mf->AddDefinition("CMAKE_CFG_INTDIR","$(CONFIGURATION)");
|
||||||
mf->AddDefinition("CMAKE_CONFIGURATION_TYPES","Developement;Deployment");
|
mf->AddCacheDefinition(
|
||||||
|
"CMAKE_CONFIGURATION_TYPES",
|
||||||
|
"Debug;Release;MinSizeRel;RelWithDebInfo",
|
||||||
|
"Semicolon separated list of supported configuration types, "
|
||||||
|
"only supports Debug, Release, MinSizeRel, and RelWithDebInfo, "
|
||||||
|
"anything else will be ignored.",
|
||||||
|
cmCacheManager::STRING);
|
||||||
}
|
}
|
||||||
mf->AddDefinition("CMAKE_GENERATOR_CC", "gcc");
|
mf->AddDefinition("CMAKE_GENERATOR_CC", "gcc");
|
||||||
mf->AddDefinition("CMAKE_GENERATOR_CXX", "g++");
|
mf->AddDefinition("CMAKE_GENERATOR_CXX", "g++");
|
||||||
|
@ -146,6 +153,11 @@ std::string cmGlobalXCodeGenerator::GenerateBuildCommand(const char* makeProgram
|
||||||
makeCommand += " -project ";
|
makeCommand += " -project ";
|
||||||
makeCommand += projectName;
|
makeCommand += projectName;
|
||||||
makeCommand += ".xcode";
|
makeCommand += ".xcode";
|
||||||
|
if(m_XcodeVersion > 20)
|
||||||
|
{
|
||||||
|
makeCommand += "proj";
|
||||||
|
}
|
||||||
|
|
||||||
bool clean = false;
|
bool clean = false;
|
||||||
if ( targetName && strcmp(targetName, "clean") == 0 )
|
if ( targetName && strcmp(targetName, "clean") == 0 )
|
||||||
{
|
{
|
||||||
|
@ -175,7 +187,7 @@ std::string cmGlobalXCodeGenerator::GenerateBuildCommand(const char* makeProgram
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
makeCommand += " -configuration Development";
|
makeCommand += " -configuration Debug";
|
||||||
}
|
}
|
||||||
makeCommand += " OBJROOT=.";
|
makeCommand += " OBJROOT=.";
|
||||||
return makeCommand;
|
return makeCommand;
|
||||||
|
@ -401,7 +413,15 @@ void cmGlobalXCodeGenerator::ClearXCodeObjects()
|
||||||
cmXCodeObject*
|
cmXCodeObject*
|
||||||
cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::PBXType ptype)
|
cmGlobalXCodeGenerator::CreateObject(cmXCodeObject::PBXType ptype)
|
||||||
{
|
{
|
||||||
cmXCodeObject* obj = new cmXCodeObject(ptype, cmXCodeObject::OBJECT);
|
cmXCodeObject* obj;
|
||||||
|
if(m_XcodeVersion == 15)
|
||||||
|
{
|
||||||
|
obj = new cmXCodeObject(ptype, cmXCodeObject::OBJECT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj = new cmXCode21Object(ptype, cmXCodeObject::OBJECT);
|
||||||
|
}
|
||||||
m_XCodeObjects.push_back(obj);
|
m_XCodeObjects.push_back(obj);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
@ -747,6 +767,29 @@ void cmGlobalXCodeGenerator::CreateCustomCommands(cmXCodeObject* buildPhases,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string cmGlobalXCodeGenerator::ExtractFlag(const char* flag,
|
||||||
|
std::string& flags)
|
||||||
|
{
|
||||||
|
std::string retFlag;
|
||||||
|
std::string::size_type pos = flags.find(flag);
|
||||||
|
if(pos != flags.npos)
|
||||||
|
{
|
||||||
|
retFlag = flag;
|
||||||
|
// remove the flag
|
||||||
|
flags[pos]=' ';
|
||||||
|
flags[pos+1]=' ';
|
||||||
|
char pos2 = flags[pos+2];
|
||||||
|
// if the pos after the option
|
||||||
|
if(pos2 != ' ' && pos2 != 0 )
|
||||||
|
{
|
||||||
|
retFlag += pos2;
|
||||||
|
// remove the next part of the flag
|
||||||
|
flags[pos+2] = ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retFlag;
|
||||||
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void
|
void
|
||||||
cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase,
|
cmGlobalXCodeGenerator::AddCommandsToBuildPhase(cmXCodeObject* buildphase,
|
||||||
|
@ -890,7 +933,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||||
cmXCodeObject* buildSettings,
|
cmXCodeObject* buildSettings,
|
||||||
std::string& fileType,
|
std::string& fileType,
|
||||||
std::string& productType,
|
std::string& productType,
|
||||||
std::string& productName)
|
std::string& productName,
|
||||||
|
const char* buildtype)
|
||||||
{
|
{
|
||||||
this->ConfigureOutputPaths();
|
this->ConfigureOutputPaths();
|
||||||
std::string flags;
|
std::string flags;
|
||||||
|
@ -915,6 +959,10 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||||
std::string cflags;
|
std::string cflags;
|
||||||
if(lang)
|
if(lang)
|
||||||
{
|
{
|
||||||
|
if(buildtype)
|
||||||
|
{
|
||||||
|
m_CurrentMakefile->AddDefinition("CMAKE_BUILD_TYPE", buildtype);
|
||||||
|
}
|
||||||
// for c++ projects get the c flags as well
|
// for c++ projects get the c flags as well
|
||||||
if(strcmp(lang, "CXX") == 0)
|
if(strcmp(lang, "CXX") == 0)
|
||||||
{
|
{
|
||||||
|
@ -926,6 +974,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||||
|
|
||||||
// Add shared-library flags if needed.
|
// Add shared-library flags if needed.
|
||||||
m_CurrentLocalGenerator->AddSharedFlags(flags, lang, shared);
|
m_CurrentLocalGenerator->AddSharedFlags(flags, lang, shared);
|
||||||
|
m_CurrentMakefile->AddDefinition("CMAKE_BUILD_TYPE", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add define flags
|
// Add define flags
|
||||||
|
@ -1080,12 +1129,42 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||||
buildSettings->AddAttribute("HEADER_SEARCH_PATHS",
|
buildSettings->AddAttribute("HEADER_SEARCH_PATHS",
|
||||||
this->CreateString(dirs.c_str()));
|
this->CreateString(dirs.c_str()));
|
||||||
}
|
}
|
||||||
|
std::string oflagc = this->ExtractFlag("-O", cflags);
|
||||||
|
char optLevel[2];
|
||||||
|
optLevel[0] = '0';
|
||||||
|
optLevel[1] = 0;
|
||||||
|
if(oflagc.size() == 3)
|
||||||
|
{
|
||||||
|
optLevel[0] = oflagc[2];
|
||||||
|
}
|
||||||
|
if(oflagc.size() == 2)
|
||||||
|
{
|
||||||
|
optLevel[0] = '1';
|
||||||
|
}
|
||||||
|
std::string oflag = this->ExtractFlag("-O", flags);
|
||||||
|
if(oflag.size() == 3)
|
||||||
|
{
|
||||||
|
optLevel[0] = oflag[2];
|
||||||
|
}
|
||||||
|
if(oflag.size() == 2)
|
||||||
|
{
|
||||||
|
optLevel[0] = '1';
|
||||||
|
}
|
||||||
|
std::string gflagc = this->ExtractFlag("-g", cflags);
|
||||||
|
std::string gflag = this->ExtractFlag("-g", flags);
|
||||||
|
const char* debugStr = "YES";
|
||||||
|
if(gflagc.size() ==0 && gflag.size() == 0)
|
||||||
|
{
|
||||||
|
debugStr = "NO";
|
||||||
|
}
|
||||||
|
buildSettings->AddAttribute("GCC_GENERATE_DEBUGGING_SYMBOLS",
|
||||||
|
this->CreateString(debugStr));
|
||||||
buildSettings->AddAttribute("GCC_OPTIMIZATION_LEVEL",
|
buildSettings->AddAttribute("GCC_OPTIMIZATION_LEVEL",
|
||||||
this->CreateString("0"));
|
this->CreateString(optLevel));
|
||||||
buildSettings->AddAttribute("INSTALL_PATH",
|
buildSettings->AddAttribute("INSTALL_PATH",
|
||||||
this->CreateString(""));
|
this->CreateString(""));
|
||||||
buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
|
buildSettings->AddAttribute("OPTIMIZATION_CFLAGS",
|
||||||
this->CreateString(""));
|
this->CreateString(oflagc.c_str()));
|
||||||
if(lang && strcmp(lang, "CXX") == 0)
|
if(lang && strcmp(lang, "CXX") == 0)
|
||||||
{
|
{
|
||||||
flags += " ";
|
flags += " ";
|
||||||
|
@ -1167,7 +1246,11 @@ cmGlobalXCodeGenerator::CreateUtilityTarget(cmTarget& cmtarget)
|
||||||
std::string productName;
|
std::string productName;
|
||||||
this->CreateBuildSettings(cmtarget,
|
this->CreateBuildSettings(cmtarget,
|
||||||
buildSettings, fileTypeString,
|
buildSettings, fileTypeString,
|
||||||
productTypeString, productName);
|
productTypeString, productName, 0);
|
||||||
|
if(m_XcodeVersion > 20)
|
||||||
|
{
|
||||||
|
this->AddConfigurations(target, cmtarget);
|
||||||
|
}
|
||||||
target->AddAttribute("buildSettings", buildSettings);
|
target->AddAttribute("buildSettings", buildSettings);
|
||||||
cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
target->AddAttribute("dependencies", dependencies);
|
target->AddAttribute("dependencies", dependencies);
|
||||||
|
@ -1177,6 +1260,40 @@ cmGlobalXCodeGenerator::CreateUtilityTarget(cmTarget& cmtarget)
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmGlobalXCodeGenerator::AddConfigurations(cmXCodeObject* target,
|
||||||
|
cmTarget& cmtarget)
|
||||||
|
{
|
||||||
|
std::string configTypes = m_CurrentMakefile->GetRequiredDefinition("CMAKE_CONFIGURATION_TYPES");
|
||||||
|
std::vector<std::string> configVectorIn;
|
||||||
|
std::vector<std::string> configVector;
|
||||||
|
configVectorIn.push_back(configTypes);
|
||||||
|
cmSystemTools::ExpandList(configVectorIn, configVector);
|
||||||
|
configVector.push_back("Default");
|
||||||
|
cmXCodeObject* configlist = this->CreateObject(cmXCodeObject::XCConfigurationList);
|
||||||
|
cmXCodeObject* buildConfigurations =
|
||||||
|
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
|
configlist->AddAttribute("buildConfigurations", buildConfigurations);
|
||||||
|
target->AddAttribute("buildConfigurationList",
|
||||||
|
this->CreateObjectReference(configlist));
|
||||||
|
for(unsigned int i = 0; i < configVector.size(); ++i)
|
||||||
|
{
|
||||||
|
cmXCodeObject* config = this->CreateObject(cmXCodeObject::XCBuildConfiguration);
|
||||||
|
buildConfigurations->AddObject(config);
|
||||||
|
cmXCodeObject* buildSettings =
|
||||||
|
this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
|
std::string fileTypeString;
|
||||||
|
std::string productTypeString;
|
||||||
|
std::string productName;
|
||||||
|
std::string buildtype = cmSystemTools::UpperCase(configVector[i]);
|
||||||
|
this->CreateBuildSettings(cmtarget,
|
||||||
|
buildSettings, fileTypeString,
|
||||||
|
productTypeString, productName, buildtype.c_str());
|
||||||
|
config->AddAttribute("name", this->CreateString(configVector[i].c_str()));
|
||||||
|
config->AddAttribute("buildSettings", buildSettings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmXCodeObject*
|
cmXCodeObject*
|
||||||
cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget,
|
cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget,
|
||||||
|
@ -1192,9 +1309,13 @@ cmGlobalXCodeGenerator::CreateXCodeTarget(cmTarget& cmtarget,
|
||||||
std::string fileTypeString;
|
std::string fileTypeString;
|
||||||
std::string productTypeString;
|
std::string productTypeString;
|
||||||
std::string productName;
|
std::string productName;
|
||||||
|
if(m_XcodeVersion > 20)
|
||||||
|
{
|
||||||
|
this->AddConfigurations(target, cmtarget);
|
||||||
|
}
|
||||||
this->CreateBuildSettings(cmtarget,
|
this->CreateBuildSettings(cmtarget,
|
||||||
buildSettings, fileTypeString,
|
buildSettings, fileTypeString,
|
||||||
productTypeString, productName);
|
productTypeString, productName, 0);
|
||||||
target->AddAttribute("buildSettings", buildSettings);
|
target->AddAttribute("buildSettings", buildSettings);
|
||||||
cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
cmXCodeObject* dependencies = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
target->AddAttribute("dependencies", dependencies);
|
target->AddAttribute("dependencies", dependencies);
|
||||||
|
@ -1292,6 +1413,38 @@ void cmGlobalXCodeGenerator::AddDependTarget(cmXCodeObject* target,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmGlobalXCodeGenerator::AppendBuildSettingAttribute(cmXCodeObject* target,
|
||||||
|
const char* attribute,
|
||||||
|
const char* value)
|
||||||
|
{
|
||||||
|
cmXCodeObject* configurationList = target->GetObject("buildConfigurationList")->GetObject();
|
||||||
|
cmXCodeObject* buildConfigs = configurationList->GetObject("buildConfigurations");
|
||||||
|
std::vector<cmXCodeObject*> list = buildConfigs->GetObjectList();
|
||||||
|
// each configuration and the target itself has a buildSettings in it
|
||||||
|
list.push_back(target);
|
||||||
|
for(std::vector<cmXCodeObject*>::iterator i = list.begin(); i != list.end(); ++i)
|
||||||
|
{
|
||||||
|
cmXCodeObject* settings = (*i)->GetObject("buildSettings");
|
||||||
|
if(settings)
|
||||||
|
{
|
||||||
|
cmXCodeObject* attr = settings->GetObject(attribute);
|
||||||
|
if(!attr)
|
||||||
|
{
|
||||||
|
settings->AddAttribute(attribute, this->CreateString(value));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string oldValue = attr->GetString();
|
||||||
|
cmSystemTools::ReplaceString(oldValue, "\"", "");
|
||||||
|
oldValue += " ";
|
||||||
|
oldValue += value;
|
||||||
|
attr->SetString(oldValue.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
void cmGlobalXCodeGenerator::AddLinkLibrary(cmXCodeObject* target,
|
void cmGlobalXCodeGenerator::AddLinkLibrary(cmXCodeObject* target,
|
||||||
const char* library,
|
const char* library,
|
||||||
|
@ -1304,20 +1457,16 @@ void cmGlobalXCodeGenerator::AddLinkLibrary(cmXCodeObject* target,
|
||||||
|
|
||||||
// if the library is not a full path then add it with a -l flag
|
// if the library is not a full path then add it with a -l flag
|
||||||
// to the settings of the target
|
// to the settings of the target
|
||||||
cmXCodeObject* settings = target->GetObject("buildSettings");
|
|
||||||
cmXCodeObject* ldflags = settings->GetObject("OTHER_LDFLAGS");
|
|
||||||
std::string link = ldflags->GetString();
|
|
||||||
cmSystemTools::ReplaceString(link, "\"", "");
|
|
||||||
cmsys::RegularExpression reg("^([ \t]*\\-[lLWRB])|([ \t]*\\-framework)|(\\${)|([ \t]*\\-pthread)|([ \t]*`)");
|
cmsys::RegularExpression reg("^([ \t]*\\-[lLWRB])|([ \t]*\\-framework)|(\\${)|([ \t]*\\-pthread)|([ \t]*`)");
|
||||||
// if the library is not already in the form required by the compiler
|
// if the library is not already in the form required by the compiler
|
||||||
// add a -l infront of the name
|
// add a -l infront of the name
|
||||||
link += " ";
|
std::string link;
|
||||||
if(!reg.find(library))
|
if(!reg.find(library))
|
||||||
{
|
{
|
||||||
link += "-l";
|
link += "-l";
|
||||||
}
|
}
|
||||||
link += library;
|
link += library;
|
||||||
ldflags->SetString(link.c_str());
|
this->AppendBuildSettingAttribute(target, "OTHER_LDFLAGS", link.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -1417,11 +1566,7 @@ void cmGlobalXCodeGenerator::AddDependAndLinkInformation(cmXCodeObject* target)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmXCodeObject* bset = target->GetObject("buildSettings");
|
cmXCodeObject* bset = target->GetObject("buildSettings");
|
||||||
if(bset)
|
this->AppendBuildSettingAttribute(target, "LIBRARY_SEARCH_PATHS", linkDirs.c_str());
|
||||||
{
|
|
||||||
bset->AddAttribute("LIBRARY_SEARCH_PATHS",
|
|
||||||
this->CreateString(linkDirs.c_str()));
|
|
||||||
}
|
|
||||||
// now add the link libraries
|
// now add the link libraries
|
||||||
for(std::vector<cmStdString>::iterator lib = linkItems.begin();
|
for(std::vector<cmStdString>::iterator lib = linkItems.begin();
|
||||||
lib != linkItems.end(); ++lib)
|
lib != linkItems.end(); ++lib)
|
||||||
|
@ -1584,14 +1729,29 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root,
|
||||||
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
|
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("NO"));
|
||||||
cmXCodeObject* developBuildStyle =
|
cmXCodeObject* developBuildStyle =
|
||||||
this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
||||||
|
if(m_XcodeVersion == 15)
|
||||||
|
{
|
||||||
developBuildStyle->AddAttribute("name", this->CreateString("Development"));
|
developBuildStyle->AddAttribute("name", this->CreateString("Development"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
developBuildStyle->AddAttribute("name", this->CreateString("Debug"));
|
||||||
|
}
|
||||||
developBuildStyle->AddAttribute("buildSettings", group);
|
developBuildStyle->AddAttribute("buildSettings", group);
|
||||||
|
|
||||||
group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
group = this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES"));
|
group->AddAttribute("COPY_PHASE_STRIP", this->CreateString("YES"));
|
||||||
cmXCodeObject* deployBuildStyle =
|
cmXCodeObject* deployBuildStyle =
|
||||||
this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
this->CreateObject(cmXCodeObject::PBXBuildStyle);
|
||||||
|
if(m_XcodeVersion == 15)
|
||||||
|
{
|
||||||
deployBuildStyle->AddAttribute("name", this->CreateString("Deployment"));
|
deployBuildStyle->AddAttribute("name", this->CreateString("Deployment"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
deployBuildStyle->AddAttribute("name", this->CreateString("Release"));
|
||||||
|
}
|
||||||
|
|
||||||
deployBuildStyle->AddAttribute("buildSettings", group);
|
deployBuildStyle->AddAttribute("buildSettings", group);
|
||||||
|
|
||||||
cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
cmXCodeObject* listObjs = this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
|
@ -1634,6 +1794,28 @@ void cmGlobalXCodeGenerator::CreateXCodeObjects(cmLocalGenerator* root,
|
||||||
m_RootObject->AddAttribute("buildSyles", listObjs);
|
m_RootObject->AddAttribute("buildSyles", listObjs);
|
||||||
m_RootObject->AddAttribute("hasScannedForEncodings",
|
m_RootObject->AddAttribute("hasScannedForEncodings",
|
||||||
this->CreateString("0"));
|
this->CreateString("0"));
|
||||||
|
cmXCodeObject* configlist = this->CreateObject(cmXCodeObject::XCConfigurationList);
|
||||||
|
cmXCodeObject* configDebug = this->CreateObject(cmXCodeObject::XCBuildConfiguration);
|
||||||
|
cmXCodeObject* configRelease = this->CreateObject(cmXCodeObject::XCBuildConfiguration);
|
||||||
|
cmXCodeObject* configDefault = this->CreateObject(cmXCodeObject::XCBuildConfiguration);
|
||||||
|
cmXCodeObject* buildConfigurations =
|
||||||
|
this->CreateObject(cmXCodeObject::OBJECT_LIST);
|
||||||
|
buildConfigurations->AddObject(configDebug);
|
||||||
|
buildConfigurations->AddObject(configRelease);
|
||||||
|
buildConfigurations->AddObject(configDefault);
|
||||||
|
configlist->AddAttribute("buildConfigurations", buildConfigurations);
|
||||||
|
cmXCodeObject* buildSettings =
|
||||||
|
this->CreateObject(cmXCodeObject::ATTRIBUTE_GROUP);
|
||||||
|
configDebug->AddAttribute("name", this->CreateString("Debug"));
|
||||||
|
configDebug->AddAttribute("buildSettings", buildSettings);
|
||||||
|
configRelease->AddAttribute("name", this->CreateString("Release"));
|
||||||
|
configRelease->AddAttribute("buildSettings", buildSettings);
|
||||||
|
configDefault->AddAttribute("name", this->CreateString("Default"));
|
||||||
|
configDefault->AddAttribute("buildSettings", buildSettings);
|
||||||
|
|
||||||
|
m_RootObject->AddAttribute("buildConfigurationList",
|
||||||
|
this->CreateObjectReference(configlist));
|
||||||
|
|
||||||
std::vector<cmXCodeObject*> targets;
|
std::vector<cmXCodeObject*> targets;
|
||||||
for(std::vector<cmLocalGenerator*>::iterator i = generators.begin();
|
for(std::vector<cmLocalGenerator*>::iterator i = generators.begin();
|
||||||
i != generators.end(); ++i)
|
i != generators.end(); ++i)
|
||||||
|
@ -1769,6 +1951,10 @@ cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root,
|
||||||
xcodeDir += "/";
|
xcodeDir += "/";
|
||||||
xcodeDir += root->GetMakefile()->GetProjectName();
|
xcodeDir += root->GetMakefile()->GetProjectName();
|
||||||
xcodeDir += ".xcode";
|
xcodeDir += ".xcode";
|
||||||
|
if(m_XcodeVersion > 20)
|
||||||
|
{
|
||||||
|
xcodeDir += "proj";
|
||||||
|
}
|
||||||
cmSystemTools::MakeDirectory(xcodeDir.c_str());
|
cmSystemTools::MakeDirectory(xcodeDir.c_str());
|
||||||
xcodeDir += "/project.pbxproj";
|
xcodeDir += "/project.pbxproj";
|
||||||
cmGeneratedFileStream fout(xcodeDir.c_str());
|
cmGeneratedFileStream fout(xcodeDir.c_str());
|
||||||
|
|
|
@ -98,21 +98,26 @@ private:
|
||||||
cmXCodeObject* CreateObjectReference(cmXCodeObject*);
|
cmXCodeObject* CreateObjectReference(cmXCodeObject*);
|
||||||
cmXCodeObject* CreateXCodeTarget(cmTarget& target,
|
cmXCodeObject* CreateXCodeTarget(cmTarget& target,
|
||||||
cmXCodeObject* buildPhases);
|
cmXCodeObject* buildPhases);
|
||||||
|
void AddConfigurations(cmXCodeObject* target,
|
||||||
|
cmTarget& cmtarget);
|
||||||
|
void AppendBuildSettingAttribute(cmXCodeObject* target, const char* attr,
|
||||||
|
const char* value);
|
||||||
cmXCodeObject* CreateUtilityTarget(cmTarget& target);
|
cmXCodeObject* CreateUtilityTarget(cmTarget& target);
|
||||||
void AddDependAndLinkInformation(cmXCodeObject* target);
|
void AddDependAndLinkInformation(cmXCodeObject* target);
|
||||||
void CreateBuildSettings(cmTarget& target,
|
void CreateBuildSettings(cmTarget& target,
|
||||||
cmXCodeObject* buildSettings,
|
cmXCodeObject* buildSettings,
|
||||||
std::string& fileType,
|
std::string& fileType,
|
||||||
std::string& productType,
|
std::string& productType,
|
||||||
std::string& projectName);
|
std::string& projectName,
|
||||||
|
const char* buildType);
|
||||||
|
std::string ExtractFlag(const char* flag, std::string& flags);
|
||||||
// delete all objects in the m_XCodeObjects vector.
|
// delete all objects in the m_XCodeObjects vector.
|
||||||
void ClearXCodeObjects();
|
void ClearXCodeObjects();
|
||||||
void CreateXCodeObjects(cmLocalGenerator* root,
|
void CreateXCodeObjects(cmLocalGenerator* root,
|
||||||
std::vector<cmLocalGenerator*>& generators);
|
std::vector<cmLocalGenerator*>& generators);
|
||||||
void OutputXCodeProject(cmLocalGenerator* root,
|
void OutputXCodeProject(cmLocalGenerator* root,
|
||||||
std::vector<cmLocalGenerator*>& generators);
|
std::vector<cmLocalGenerator*>& generators);
|
||||||
void WriteXCodePBXProj(std::ostream& fout,
|
virtual void WriteXCodePBXProj(std::ostream& fout,
|
||||||
cmLocalGenerator* root,
|
cmLocalGenerator* root,
|
||||||
std::vector<cmLocalGenerator*>& generators);
|
std::vector<cmLocalGenerator*>& generators);
|
||||||
cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen,
|
cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen,
|
||||||
|
@ -135,9 +140,9 @@ private:
|
||||||
void CreateReRunCMakeFile(cmLocalGenerator* root);
|
void CreateReRunCMakeFile(cmLocalGenerator* root);
|
||||||
protected:
|
protected:
|
||||||
int m_XcodeVersion;
|
int m_XcodeVersion;
|
||||||
private:
|
|
||||||
std::vector<cmXCodeObject*> m_XCodeObjects;
|
std::vector<cmXCodeObject*> m_XCodeObjects;
|
||||||
cmXCodeObject* m_RootObject;
|
cmXCodeObject* m_RootObject;
|
||||||
|
private:
|
||||||
cmXCodeObject* m_MainGroupChildren;
|
cmXCodeObject* m_MainGroupChildren;
|
||||||
cmXCodeObject* m_SourcesGroupChildren;
|
cmXCodeObject* m_SourcesGroupChildren;
|
||||||
cmMakefile* m_CurrentMakefile;
|
cmMakefile* m_CurrentMakefile;
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
#include "cmXCode21Object.h"
|
||||||
|
|
||||||
|
cmXCode21Object::cmXCode21Object(PBXType ptype, Type type)
|
||||||
|
:cmXCodeObject(ptype, type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void cmXCode21Object::PrintComment(std::ostream& out)
|
||||||
|
{
|
||||||
|
out << "/* */";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v, std::ostream& out, PBXType t)
|
||||||
|
{
|
||||||
|
bool hasOne = false;
|
||||||
|
for(std::vector<cmXCodeObject*>::const_iterator i = v.begin();
|
||||||
|
i != v.end(); ++i)
|
||||||
|
{
|
||||||
|
cmXCodeObject* obj = *i;
|
||||||
|
if(obj->GetType() == OBJECT && obj->GetIsA() == t)
|
||||||
|
{
|
||||||
|
hasOne = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!hasOne)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
out << "/* Begin " << PBXTypeNames[t] << " section */\n";
|
||||||
|
for(std::vector<cmXCodeObject*>::const_iterator i = v.begin();
|
||||||
|
i != v.end(); ++i)
|
||||||
|
{
|
||||||
|
cmXCodeObject* obj = *i;
|
||||||
|
if(obj->GetType() == OBJECT && obj->GetIsA() == t)
|
||||||
|
{
|
||||||
|
obj->Print(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out << "/* End " << PBXTypeNames[t] << " section */\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmXCode21Object::PrintList(std::vector<cmXCodeObject*> const& v, std::ostream& out)
|
||||||
|
{
|
||||||
|
cmXCodeObject::Indent(1, out);
|
||||||
|
out << "objects = {\n";
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXAggregateTarget);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXBuildFile);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXBuildStyle);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXContainerItemProxy);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXFileReference);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXFrameworksBuildPhase);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXGroup);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXHeadersBuildPhase);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXNativeTarget);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXProject);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXSourcesBuildPhase);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXShellScriptBuildPhase);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXResourcesBuildPhase);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXApplicationReference);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXExecutableFileReference);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXLibraryReference);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXToolTarget);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXLibraryTarget);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::PBXTargetDependency);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::XCBuildConfiguration);
|
||||||
|
cmXCode21Object::PrintList(v, out, cmXCode21Object::XCConfigurationList);
|
||||||
|
cmXCodeObject::Indent(1, out);
|
||||||
|
out << "};\n";
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef cmXCode21Object_h
|
||||||
|
#define cmXCode21Object_h
|
||||||
|
|
||||||
|
#include "cmXCodeObject.h"
|
||||||
|
|
||||||
|
class cmXCode21Object : public cmXCodeObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cmXCode21Object(PBXType ptype, Type type);
|
||||||
|
virtual void PrintComment(std::ostream&);
|
||||||
|
static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out, PBXType t);
|
||||||
|
static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out);
|
||||||
|
};
|
||||||
|
#endif
|
|
@ -8,7 +8,7 @@ const char* cmXCodeObject::PBXTypeNames[] = {
|
||||||
"PBXTargetDependency", "PBXShellScriptBuildPhase",
|
"PBXTargetDependency", "PBXShellScriptBuildPhase",
|
||||||
"PBXResourcesBuildPhase", "PBXApplicationReference",
|
"PBXResourcesBuildPhase", "PBXApplicationReference",
|
||||||
"PBXExecutableFileReference", "PBXLibraryReference", "PBXToolTarget",
|
"PBXExecutableFileReference", "PBXLibraryReference", "PBXToolTarget",
|
||||||
"PBXLibraryTarget", "PBXAggregateTarget",
|
"PBXLibraryTarget", "PBXAggregateTarget", "XCBuildConfiguration", "XCConfigurationList",
|
||||||
"None"
|
"None"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,7 +68,9 @@ void cmXCodeObject::Indent(int level, std::ostream& out)
|
||||||
void cmXCodeObject::Print(std::ostream& out)
|
void cmXCodeObject::Print(std::ostream& out)
|
||||||
{
|
{
|
||||||
cmXCodeObject::Indent(2, out);
|
cmXCodeObject::Indent(2, out);
|
||||||
out << m_Id << " = {\n";
|
out << m_Id << " ";
|
||||||
|
this->PrintComment(out);
|
||||||
|
out << " = {\n";
|
||||||
std::map<cmStdString, cmXCodeObject*>::iterator i;
|
std::map<cmStdString, cmXCodeObject*>::iterator i;
|
||||||
for(i = m_ObjectAttributes.begin(); i != m_ObjectAttributes.end(); ++i)
|
for(i = m_ObjectAttributes.begin(); i != m_ObjectAttributes.end(); ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,12 +15,15 @@ public:
|
||||||
PBXShellScriptBuildPhase, PBXResourcesBuildPhase,
|
PBXShellScriptBuildPhase, PBXResourcesBuildPhase,
|
||||||
PBXApplicationReference, PBXExecutableFileReference,
|
PBXApplicationReference, PBXExecutableFileReference,
|
||||||
PBXLibraryReference, PBXToolTarget, PBXLibraryTarget,
|
PBXLibraryReference, PBXToolTarget, PBXLibraryTarget,
|
||||||
PBXAggregateTarget,
|
PBXAggregateTarget,XCBuildConfiguration,XCConfigurationList,
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
static const char* PBXTypeNames[];
|
static const char* PBXTypeNames[];
|
||||||
~cmXCodeObject();
|
~cmXCodeObject();
|
||||||
cmXCodeObject(PBXType ptype, Type type);
|
cmXCodeObject(PBXType ptype, Type type);
|
||||||
|
Type GetType() { return m_Type;}
|
||||||
|
PBXType GetIsA() { return m_IsA;}
|
||||||
|
|
||||||
void SetString(const char* s)
|
void SetString(const char* s)
|
||||||
{
|
{
|
||||||
m_String = "\"";
|
m_String = "\"";
|
||||||
|
@ -62,6 +65,8 @@ public:
|
||||||
}
|
}
|
||||||
static void Indent(int level, std::ostream& out);
|
static void Indent(int level, std::ostream& out);
|
||||||
void Print(std::ostream& out);
|
void Print(std::ostream& out);
|
||||||
|
virtual void PrintComment(std::ostream&) {};
|
||||||
|
|
||||||
static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out);
|
static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out);
|
||||||
const char* GetId()
|
const char* GetId()
|
||||||
{
|
{
|
||||||
|
@ -116,7 +121,8 @@ public:
|
||||||
{
|
{
|
||||||
return m_DependLibraries;
|
return m_DependLibraries;
|
||||||
}
|
}
|
||||||
private:
|
std::vector<cmXCodeObject*> const& GetObjectList() { return m_List;}
|
||||||
|
protected:
|
||||||
cmTarget* m_cmTarget;
|
cmTarget* m_cmTarget;
|
||||||
Type m_Type;
|
Type m_Type;
|
||||||
cmStdString m_Id;
|
cmStdString m_Id;
|
||||||
|
|
Loading…
Reference in New Issue