From aa0a3562dd47bdd6d9ca3058bd1dfd525e79d36d Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 14 Mar 2014 13:21:26 +0100 Subject: cmGeneratorTarget: Compute target objects on demand Add a ComputeObjectMapping method to compute the object names. It takes mapping to populate as an out-parameter so that it can be extended in the future with parameters relevant to generator expression evaluation. Remove the supporting cmGeneratorTarget::AddObject method. It is no longer needed as the container member is populated directly. The ComputeObjectMapping method is called whenever objects are requested from the cmGeneratorTarget. Because the Xcode generator makes no such request, explicitly invoke the method from that generator so that the logic of checking for bad sources in object libraries is executed. In a follow-up, the UseObjectLibraries usage may be replaced by a true generator expression evaluator for TARGET_OBJECTS. That will require generators to use cmGeneratorTarget::GetExternalObjects which is not currently the case for Xcode and VS generators. --- Source/cmGeneratorTarget.cxx | 31 +++++++++++++++++++++----- Source/cmGeneratorTarget.h | 5 +++-- Source/cmGlobalGenerator.cxx | 46 --------------------------------------- Source/cmGlobalGenerator.h | 2 -- Source/cmGlobalXCodeGenerator.cxx | 2 ++ 5 files changed, 30 insertions(+), 56 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 64ca863..321dd42 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -311,18 +311,36 @@ cmGeneratorTarget ::GetObjectSources(std::vector &data) const { IMPLEMENT_VISIT(ObjectSources); + + if (!this->Objects.empty()) + { + return; + } + + for(std::vector::const_iterator it = data.begin(); + it != data.end(); ++it) + { + this->Objects[*it]; + } + + this->LocalGenerator->ComputeObjectFilenames(this->Objects, this); } -//---------------------------------------------------------------------------- -const std::string& cmGeneratorTarget::GetObjectName(cmSourceFile const* file) +void cmGeneratorTarget::ComputeObjectMapping() { - return this->Objects[file]; + if(!this->Objects.empty()) + { + return; + } + std::vector sourceFiles; + this->GetObjectSources(sourceFiles); } -void cmGeneratorTarget::AddObject(cmSourceFile const* sf, - std::string const&name) +//---------------------------------------------------------------------------- +const std::string& cmGeneratorTarget::GetObjectName(cmSourceFile const* file) { - this->Objects[sf] = name; + this->ComputeObjectMapping(); + return this->Objects[file]; } //---------------------------------------------------------------------------- @@ -334,6 +352,7 @@ void cmGeneratorTarget::AddExplicitObjectName(cmSourceFile const* sf) //---------------------------------------------------------------------------- bool cmGeneratorTarget::HasExplicitObjectName(cmSourceFile const* file) const { + const_cast(this)->ComputeObjectMapping(); std::set::const_iterator it = this->ExplicitObjectName.find(file); return it != this->ExplicitObjectName.end(); diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index cb59783..38e6510 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -35,7 +35,6 @@ public: void GetObjectSources(std::vector &) const; const std::string& GetObjectName(cmSourceFile const* file); - void AddObject(cmSourceFile const* sf, std::string const&name); bool HasExplicitObjectName(cmSourceFile const* file) const; void AddExplicitObjectName(cmSourceFile const* sf); @@ -47,6 +46,8 @@ public: void GetCustomCommands(std::vector&) const; void GetExpectedResxHeaders(std::set&) const; + void ComputeObjectMapping(); + cmTarget* Target; cmMakefile* Makefile; cmLocalGenerator* LocalGenerator; @@ -123,7 +124,7 @@ private: typedef std::map SourceEntriesType; SourceEntriesType SourceEntries; - std::map Objects; + mutable std::map Objects; std::set ExplicitObjectName; mutable std::map > SystemIncludesCache; diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 6caaee3..66ccf39 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1222,8 +1222,6 @@ void cmGlobalGenerator::Generate() this->LocalGenerators[i]->GenerateTargetManifest(); } - this->ComputeGeneratorTargetObjects(); - this->ProcessEvaluationFiles(); // Compute the inter-target dependencies. @@ -1440,27 +1438,6 @@ void cmGlobalGenerator::CreateGeneratorTargets() } } -//---------------------------------------------------------------------------- -void cmGlobalGenerator::ComputeGeneratorTargetObjects() -{ - // Construct per-target generator information. - for(unsigned int i=0; i < this->LocalGenerators.size(); ++i) - { - cmMakefile *mf = this->LocalGenerators[i]->GetMakefile(); - cmGeneratorTargetsType targets = mf->GetGeneratorTargets(); - for(cmGeneratorTargetsType::iterator ti = targets.begin(); - ti != targets.end(); ++ti) - { - if (ti->second->Target->IsImported() - || ti->second->Target->GetType() == cmTarget::INTERFACE_LIBRARY) - { - continue; - } - cmGeneratorTarget* gt = ti->second; - this->ComputeTargetObjects(gt); - } - } -} //---------------------------------------------------------------------------- void cmGlobalGenerator::ClearGeneratorMembers() @@ -1522,29 +1499,6 @@ cmGlobalGenerator::GetGeneratorTarget(cmTarget const* t) const } //---------------------------------------------------------------------------- -void cmGlobalGenerator::ComputeTargetObjects(cmGeneratorTarget* gt) const -{ - std::vector objectSources; - gt->GetObjectSources(objectSources); - - std::map mapping; - for(std::vector::const_iterator it - = objectSources.begin(); it != objectSources.end(); ++it) - { - mapping[*it]; - } - - gt->LocalGenerator->ComputeObjectFilenames(mapping, gt); - - for(std::map::const_iterator it - = mapping.begin(); it != mapping.end(); ++it) - { - assert(!it->second.empty()); - gt->AddObject(it->first, it->second); - } -} - -//---------------------------------------------------------------------------- void cmGlobalGenerator::ComputeTargetObjectDirectory(cmGeneratorTarget*) const { } diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 668bb6b..54f5f3b 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -444,8 +444,6 @@ private: friend class cmake; void CreateGeneratorTargets(cmMakefile* mf); void CreateGeneratorTargets(); - void ComputeGeneratorTargetObjects(); - void ComputeTargetObjects(cmGeneratorTarget* gt) const; void ClearGeneratorMembers(); diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 2a6e522..d9d4927 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -987,6 +987,8 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, cmtarget.GetSourceFiles(classes); std::sort(classes.begin(), classes.end(), cmSourceFilePathCompare()); + gtgt->ComputeObjectMapping(); + std::vector externalObjFiles; std::vector headerFiles; std::vector resourceFiles; -- cgit v0.12