Merge topic 'Xcode-universal-binary-depend-issue-11844'

44cdae9 Xcode: Fix parallel build depends with universal binaries (#11844)
This commit is contained in:
Brad King 2011-06-07 14:03:53 -04:00 committed by CMake Topic Stage
commit 33b3d10d6e
3 changed files with 72 additions and 44 deletions

View File

@ -322,6 +322,19 @@ void cmGlobalXCodeGenerator::SetGenerationRoot(cmLocalGenerator* root)
this->CurrentXCodeHackMakefile += "/XCODE_DEPEND_HELPER.make";
}
//----------------------------------------------------------------------------
std::string
cmGlobalXCodeGenerator::PostBuildMakeTarget(std::string const& tName,
std::string const& configName)
{
std::string out = "PostBuild." + tName;
if(this->XcodeVersion > 20)
{
out += "." + configName;
}
return out;
}
//----------------------------------------------------------------------------
void
cmGlobalXCodeGenerator::AddExtraTargets(cmLocalGenerator* root,
@ -351,12 +364,8 @@ cmGlobalXCodeGenerator::AddExtraTargets(cmLocalGenerator* root,
makecommand.push_back(dir.c_str());
makecommand.push_back("-f");
makecommand.push_back(this->CurrentXCodeHackMakefile.c_str());
if(this->XcodeVersion > 20)
{
makecommand.push_back("all.$(CONFIGURATION)");
}
cmCustomCommandLines commandLines;
commandLines.push_back(makecommand);
makecommand.push_back(""); // placeholder, see below
// Add Re-Run CMake rules
this->CreateReRunCMakeFile(root, gens);
@ -383,6 +392,10 @@ cmGlobalXCodeGenerator::AddExtraTargets(cmLocalGenerator* root,
target.GetType() == cmTarget::SHARED_LIBRARY ||
target.GetType() == cmTarget::MODULE_LIBRARY))
{
makecommand[makecommand.size()-1] =
this->PostBuildMakeTarget(target.GetName(), "$(CONFIGURATION)");
cmCustomCommandLines commandLines;
commandLines.push_back(makecommand);
lg->GetMakefile()->AddCustomCommandToTarget(target.GetName(),
no_depends,
commandLines,
@ -2437,6 +2450,10 @@ void cmGlobalXCodeGenerator
{
linkLibs += li->Value;
}
if(li->Target && !li->Target->IsImported())
{
target->AddDependTarget(configName, li->Target->GetName());
}
}
this->AppendBuildSettingAttribute(target, "OTHER_LDFLAGS",
linkLibs.c_str(), configName);
@ -2882,41 +2899,10 @@ cmGlobalXCodeGenerator::CreateXCodeDependHackTarget(
// correctly by xcode
makefileStream << "# DO NOT EDIT\n";
makefileStream << "# This makefile makes sure all linkable targets are\n";
makefileStream << "# up-to-date with anything they link to, avoiding a "
"bug in Xcode 1.5\n";
for(std::vector<std::string>::const_iterator
ct = this->CurrentConfigurationTypes.begin();
ct != this->CurrentConfigurationTypes.end(); ++ct)
{
if(this->XcodeVersion < 21 || ct->empty())
{
makefileStream << "all: ";
}
else
{
makefileStream << "all." << *ct << ": ";
}
const char* configName = 0;
if(!ct->empty())
{
configName = ct->c_str();
}
for(std::vector<cmXCodeObject*>::iterator i = targets.begin();
i != targets.end(); ++i)
{
cmXCodeObject* target = *i;
cmTarget* t =target->GetTarget();
if(t->GetType() == cmTarget::EXECUTABLE ||
t->GetType() == cmTarget::SHARED_LIBRARY ||
t->GetType() == cmTarget::MODULE_LIBRARY)
{
std::string tfull = t->GetFullPath(configName);
makefileStream << "\\\n\t" <<
this->ConvertToRelativeForMake(tfull.c_str());
}
}
makefileStream << "\n\n";
}
makefileStream << "# up-to-date with anything they link to\n"
"default:\n"
"\techo \"Do not invoke directly\"\n"
"\n";
makefileStream
<< "# For each target create a dummy rule "
"so the target does not have to exist\n";
@ -2962,14 +2948,40 @@ cmGlobalXCodeGenerator::CreateXCodeDependHackTarget(
{
cmXCodeObject* target = *i;
cmTarget* t =target->GetTarget();
if(t->GetType() == cmTarget::EXECUTABLE ||
t->GetType() == cmTarget::STATIC_LIBRARY ||
t->GetType() == cmTarget::SHARED_LIBRARY ||
t->GetType() == cmTarget::MODULE_LIBRARY)
{
// Declare an entry point for the target post-build phase.
makefileStream << this->PostBuildMakeTarget(t->GetName(), *ct)
<< ":\n";
}
if(t->GetType() == cmTarget::EXECUTABLE ||
t->GetType() == cmTarget::SHARED_LIBRARY ||
t->GetType() == cmTarget::MODULE_LIBRARY)
{
// Create a rule for this target.
std::string tfull = t->GetFullPath(configName);
makefileStream << this->ConvertToRelativeForMake(tfull.c_str())
<< ":";
std::string trel = this->ConvertToRelativeForMake(tfull.c_str());
// Add this target to the post-build phases of its dependencies.
std::map<cmStdString, cmXCodeObject::StringVec>::const_iterator
y = target->GetDependTargets().find(*ct);
if(y != target->GetDependTargets().end())
{
std::vector<cmStdString> const& deptgts = y->second;
for(std::vector<cmStdString>::const_iterator d = deptgts.begin();
d != deptgts.end(); ++d)
{
makefileStream << this->PostBuildMakeTarget(*d, *ct) << ": "
<< trel << "\n";
}
}
// Create a rule for this target.
makefileStream << trel << ":";
// List dependencies if any exist.
std::map<cmStdString, cmXCodeObject::StringVec>::const_iterator

View File

@ -198,6 +198,8 @@ protected:
std::vector<cmXCodeObject*> XCodeObjects;
cmXCodeObject* RootObject;
private:
std::string PostBuildMakeTarget(std::string const& tName,
std::string const& configName);
cmXCodeObject* MainGroupChildren;
cmXCodeObject* SourcesGroupChildren;
cmXCodeObject* ResourcesGroupChildren;

View File

@ -139,6 +139,19 @@ public:
{
return this->DependLibraries;
}
void AddDependTarget(const char* configName,
const char* tName)
{
if(!configName)
{
configName = "";
}
this->DependTargets[configName].push_back(tName);
}
std::map<cmStdString, StringVec> const& GetDependTargets()
{
return this->DependTargets;
}
std::vector<cmXCodeObject*> const& GetObjectList() { return this->List;}
void SetComment(const char* c) { this->Comment = c;}
static void PrintString(std::ostream& os,cmStdString String);
@ -156,6 +169,7 @@ protected:
cmXCodeObject* PBXTargetDependencyValue;
std::vector<cmXCodeObject*> List;
std::map<cmStdString, StringVec> DependLibraries;
std::map<cmStdString, StringVec> DependTargets;
std::map<cmStdString, cmXCodeObject*> ObjectAttributes;
};
#endif