[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