[Cmake-commits] [cmake-commits] king committed cmTarget.cxx 1.264 1.265
cmake-commits at cmake.org
cmake-commits at cmake.org
Thu Jul 30 10:59:32 EDT 2009
Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv5829/Source
Modified Files:
cmTarget.cxx
Log Message:
Refactor target linker language selection
This factors the decision logic out of cmTarget::ComputeLinkClosure into
dedicated class cmTargetSelectLinker. We replace several local
variables with a single object instance, and organize code into methods.
Index: cmTarget.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmTarget.cxx,v
retrieving revision 1.264
retrieving revision 1.265
diff -C 2 -d -r1.264 -r1.265
*** cmTarget.cxx 11 Jul 2009 14:12:05 -0000 1.264
--- cmTarget.cxx 30 Jul 2009 14:59:25 -0000 1.265
***************
*** 2415,2418 ****
--- 2415,2471 ----
//----------------------------------------------------------------------------
+ class cmTargetSelectLinker
+ {
+ int Preference;
+ cmTarget* Target;
+ cmMakefile* Makefile;
+ cmGlobalGenerator* GG;
+ std::set<cmStdString> Preferred;
+ public:
+ cmTargetSelectLinker(cmTarget* target): Preference(0), Target(target)
+ {
+ this->Makefile = this->Target->GetMakefile();
+ this->GG = this->Makefile->GetLocalGenerator()->GetGlobalGenerator();
+ }
+ void Consider(const char* lang)
+ {
+ int preference = this->GG->GetLinkerPreference(lang);
+ if(preference > this->Preference)
+ {
+ this->Preference = preference;
+ this->Preferred.clear();
+ }
+ if(preference == this->Preference)
+ {
+ this->Preferred.insert(lang);
+ }
+ }
+ std::string Choose()
+ {
+ if(this->Preferred.empty())
+ {
+ return "";
+ }
+ else if(this->Preferred.size() > 1)
+ {
+ cmOStringStream e;
+ e << "Target " << this->Target->GetName()
+ << " contains multiple languages with the highest linker preference"
+ << " (" << this->Preference << "):\n";
+ for(std::set<cmStdString>::const_iterator
+ li = this->Preferred.begin(); li != this->Preferred.end(); ++li)
+ {
+ e << " " << *li << "\n";
+ }
+ e << "Set the LINKER_LANGUAGE property for this target.";
+ cmake* cm = this->Makefile->GetCMakeInstance();
+ cm->IssueMessage(cmake::FATAL_ERROR, e.str(),
+ this->Target->GetBacktrace());
+ }
+ return *this->Preferred.begin();
+ }
+ };
+
+ //----------------------------------------------------------------------------
void cmTarget::ComputeLinkClosure(const char* config, LinkClosure& lc)
{
***************
*** 2453,2489 ****
{
// Find the language with the highest preference value.
! cmGlobalGenerator* gg =
! this->Makefile->GetLocalGenerator()->GetGlobalGenerator();
! std::string linkerLangList; // only used for the error message
! int maxLinkerPref = 0;
! bool multiplePreferedLanguages = false;
for(std::set<cmStdString>::const_iterator sit = languages.begin();
sit != languages.end(); ++sit)
{
! int linkerPref = gg->GetLinkerPreference(sit->c_str());
! if (lc.LinkerLanguage.empty() || (linkerPref > maxLinkerPref))
! {
! maxLinkerPref = linkerPref;
! lc.LinkerLanguage = *sit;
! linkerLangList = *sit;
! multiplePreferedLanguages = false;
! }
! else if (linkerPref == maxLinkerPref)
! {
! linkerLangList += "; ";
! linkerLangList += *sit;
! multiplePreferedLanguages = true;
! }
! }
!
! if (multiplePreferedLanguages)
! {
! cmOStringStream err;
! err << "Error: Target " << this->Name << " contains multiple languages "
! << "with the highest linker preference (" << maxLinkerPref << "): "
! << linkerLangList << "\n"
! << "You must set the LINKER_LANGUAGE property for this target.";
! cmSystemTools::Error(err.str().c_str());
}
}
}
--- 2506,2516 ----
{
// Find the language with the highest preference value.
! cmTargetSelectLinker tsl(this);
for(std::set<cmStdString>::const_iterator sit = languages.begin();
sit != languages.end(); ++sit)
{
! tsl.Consider(sit->c_str());
}
+ lc.LinkerLanguage = tsl.Choose();
}
}
More information about the Cmake-commits
mailing list