From 5891ba16ce5cec9ed81468da4d07f1513de756ee Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Tue, 13 Mar 2007 14:23:08 -0400 Subject: ENH: add project to target map, not used yet, but created --- Source/cmGlobalGenerator.cxx | 110 +++++++++++++++++++++++++++++++++++++++++++ Source/cmGlobalGenerator.h | 3 +- Source/cmMakefile.cxx | 31 +++++++----- Source/cmPropertyMap.cxx | 9 ++-- Source/cmTarget.cxx | 5 +- 5 files changed, 139 insertions(+), 19 deletions(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 2b58f8b..6703de2 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1055,6 +1055,116 @@ void cmGlobalGenerator::FillProjectMap() } while (lg); } + // now create project to target map + // This will make sure that targets have all the + // targets they depend on as part of the build. + this->FillProjectToTargetMap(); +} + + +// Build a map that contains a the set of targets used by each project +void cmGlobalGenerator::FillProjectToTargetMap() +{ + // loop over each project in the build + for(std::map >::iterator m = + this->ProjectMap.begin(); + m != this->ProjectMap.end(); ++m) + { + std::vector& lgs = m->second; + if(lgs.size() == 0) + { + continue; + } + cmStdString const & projectName = m->first; + cmMakefile* projectMakefile = lgs[0]->GetMakefile(); + // get the current EXCLUDE_FROM_ALL value from projectMakefile + const char* exclude = 0; + std::string excludeSave; + bool chain = false; + exclude = + projectMakefile->GetProperties(). + GetPropertyValue("EXCLUDE_FROM_ALL", + cmProperty::DIRECTORY, chain); + if(exclude) + { + excludeSave = exclude; + } + // Set EXCLUDE_FROM_ALL to FALSE for the top level makefile because + // in the current project nothing is excluded yet + projectMakefile->SetProperty("EXCLUDE_FROM_ALL", "FALSE"); + // now loop over all cmLocalGenerators in this project and pull + // out all the targets that depend on each other, even if those + // targets come from a target that is excluded. + for(std::vector::iterator lg = + lgs.begin(); lg != lgs.end(); ++lg) + { + cmMakefile* mf = (*lg)->GetMakefile(); + cmTargets& targets = mf->GetTargets(); + for(cmTargets::iterator t = targets.begin(); + t != targets.end(); ++t) + { + cmTarget& target = t->second; + // if the target is in all then add it to the project + if(!target.GetPropertyAsBool("EXCLUDE_FROM_ALL")) + { + // add this target to the project + this->ProjectToTargetMap[projectName].insert(&target); + // now get all the targets that link to this target and + // add them + cmTarget::LinkLibraryVectorType::const_iterator j, jend; + j = target.GetLinkLibraries().begin(); + jend = target.GetLinkLibraries().end(); + for(;j!= jend; ++j) + { + cmTarget* depTarget = this->FindTarget(0, j->first.c_str()); + if(depTarget) + { + this->ProjectToTargetMap[projectName].insert(depTarget); + } + } + // Now add any utility targets used by this target + std::set::const_iterator i, end; + i = target.GetUtilities().begin(); + end = target.GetUtilities().end(); + for(;i!= end; ++i) + { + cmTarget* depTarget = this->FindTarget(0, i->c_str()); + if(depTarget) + { + this->ProjectToTargetMap[projectName].insert(depTarget); + } + } + } + } + } + // Now restore the EXCLUDE_FROM_ALL property on the project top + // makefile + if(exclude) + { + exclude = excludeSave.c_str(); + } + projectMakefile->SetProperty("EXCLUDE_FROM_ALL", exclude); + } + // dump the map for debug purposes + // right now this map is not being used, but it was + // checked in to avoid constant conflicts. + // It is also the first step to creating sub projects + // that contain all of the targets they need. +#if 0 + std::map >::iterator i = + this->ProjectToTargetMap.begin(); + for(; i != this->ProjectToTargetMap.end(); ++i) + { + std::cerr << i->first << "\n"; + std::set::iterator t = i->second.begin(); + for(; t != i->second.end(); ++t) + { + cmTarget* target = *t; + std::cerr << "\t" << target->GetName() << "\n"; + } + } +#endif } diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 7072f26..eac72a4 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -198,7 +198,7 @@ protected: // has been populated. void FillProjectMap(); bool IsExcluded(cmLocalGenerator* root, cmLocalGenerator* gen); - + void FillProjectToTargetMap(); void CreateDefaultGlobalTargets(cmTargets* targets); cmTarget CreateGlobalTarget(const char* name, const char* message, const cmCustomCommandLines* commandLines, @@ -214,6 +214,7 @@ protected: std::vector LocalGenerators; // map from project name to vector of local generators in that project std::map > ProjectMap; + std::map > ProjectToTargetMap; // Set of named installation components requested by the project. std::set InstallComponents; diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 6e262bc..83b9d14 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1120,8 +1120,10 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath, // set the subdirs start dirs lg2->GetMakefile()->SetStartDirectory(srcPath); lg2->GetMakefile()->SetStartOutputDirectory(binPath); - lg2->GetMakefile()->SetProperty("EXCLUDE_FROM_ALL", - (excludeFromAll) ? "TRUE" : "FALSE"); + if(excludeFromAll) + { + lg2->GetMakefile()->SetProperty("EXCLUDE_FROM_ALL", "TRUE"); + } lg2->GetMakefile()->SetPreOrder(preorder); if (immediate) @@ -1342,8 +1344,10 @@ void cmMakefile::AddLibrary(const char* lname, int shared, // over changes in CMakeLists.txt, making the information stale and // hence useless. target.ClearDependencyInformation( *this, lname ); - target.SetProperty("EXCLUDE_FROM_ALL", - (excludeFromAll) ? "TRUE" : "FALSE"); + if(excludeFromAll) + { + target.SetProperty("EXCLUDE_FROM_ALL", "TRUE"); + } target.GetSourceLists() = srcs; this->AddGlobalLinkInformation(lname, target); cmTargets::iterator it = @@ -1358,8 +1362,10 @@ cmTarget* cmMakefile::AddExecutable(const char *exeName, cmTarget target; target.SetType(cmTarget::EXECUTABLE, exeName); target.SetMakefile(this); - target.SetProperty("EXCLUDE_FROM_ALL", - (excludeFromAll) ?"TRUE" : "FALSE"); + if(excludeFromAll) + { + target.SetProperty("EXCLUDE_FROM_ALL", "TRUE"); + } target.GetSourceLists() = srcs; this->AddGlobalLinkInformation(exeName, target); cmTargets::iterator it = @@ -2600,11 +2606,6 @@ void cmMakefile::SetProperty(const char* prop, const char* value) { return; } - if (!value) - { - value = "NOTFOUND"; - } - this->Properties.SetProperty(prop,value,cmProperty::DIRECTORY); } @@ -2653,6 +2654,11 @@ const char *cmMakefile::GetProperty(const char* prop, this->Properties.GetPropertyValue(prop, scope, chain); if (chain) { + if(this->LocalGenerator->GetParent()) + { + return this->LocalGenerator->GetParent()->GetMakefile()-> + GetProperty(prop, scope); + } return this->GetCMakeInstance()->GetProperty(prop,scope); } @@ -2782,5 +2788,6 @@ void cmMakefile::DefineProperties(cmake *cm) "A property on a target that indicates if the target is excluded " "from the default build target. If it is not, then with a Makefile " "for example typing make will couse this target to be built as well. " - "The same concept applies to the default build of other generators."); + "The same concept applies to the default build of other generators.", + true); } diff --git a/Source/cmPropertyMap.cxx b/Source/cmPropertyMap.cxx index 1ea913e..ed2976b 100644 --- a/Source/cmPropertyMap.cxx +++ b/Source/cmPropertyMap.cxx @@ -43,7 +43,11 @@ void cmPropertyMap::SetProperty(const char *name, const char *value, { return; } - + if(!value) + { + this->erase(name); + return; + } #ifdef CMAKE_STRICT if (!this->CMakeInstance) { @@ -89,7 +93,7 @@ const char *cmPropertyMap ::GetPropertyValue(const char *name, cmProperty::ScopeType scope, bool &chain) const -{ +{ chain = false; if (!name) { @@ -142,7 +146,6 @@ const char *cmPropertyMap } return 0; } - return it->second.GetValue(); } diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 5f110d3..45e71d0 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -122,7 +122,8 @@ void cmTarget::DefineProperties(cmake *cm) "A property on a target that indicates if the target is excluded " "from the default build target. If it is not, then with a Makefile " "for example typing make will couse this target to be built as well. " - "The same concept applies to the default build of other generators."); + "The same concept applies to the default build of other generators.", + true); cm->DefineProperty ("INSTALL_NAME_DIR", cmProperty::TARGET, @@ -1313,7 +1314,6 @@ const char *cmTarget::GetProperty(const char* prop, } return 0; } - bool chain = false; const char *retVal = this->Properties.GetPropertyValue(prop, scope, chain); @@ -1321,7 +1321,6 @@ const char *cmTarget::GetProperty(const char* prop, { return this->Makefile->GetProperty(prop,scope); } - return retVal; } -- cgit v0.12