diff options
author | Alexander Neundorf <neundorf@kde.org> | 2007-07-11 21:29:27 (GMT) |
---|---|---|
committer | Alexander Neundorf <neundorf@kde.org> | 2007-07-11 21:29:27 (GMT) |
commit | 16705a3e87f3f8a877b5fe8dc1e953c7abca4da3 (patch) | |
tree | b0d172432a933f384da65b00d0ff031ff2f39b41 /Source | |
parent | bea1a5de771832463299146b4f2e4317c37f30bc (diff) | |
download | CMake-16705a3e87f3f8a877b5fe8dc1e953c7abca4da3.zip CMake-16705a3e87f3f8a877b5fe8dc1e953c7abca4da3.tar.gz CMake-16705a3e87f3f8a877b5fe8dc1e953c7abca4da3.tar.bz2 |
COMP: revert last commit for now, broke Visual Studio
Alex
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 42 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 84 |
3 files changed, 56 insertions, 74 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 31adcf1..cea5b2b 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -570,35 +570,12 @@ void cmGlobalGenerator::SetLanguageEnabledMaps(const char* l, cmMakefile* mf) std::string linkerPrefVar = std::string("CMAKE_") + std::string(l) + std::string("_LINKER_PREFERENCE"); const char* linkerPref = mf->GetDefinition(linkerPrefVar.c_str()); - int preference = 0; - if(linkerPref) + if(!linkerPref) { - if (sscanf(linkerPref, "%d", &preference)!=1) - { - // backward compatibility: before 2.6 LINKER_PREFERENCE - // was either "None" or "Prefered", and only the first character was - // tested. So if there is a custom language out there and it is - // "Prefered", set its preference high - if (linkerPref[0]=='P') - { - preference = 100; - } - else - { - preference = 0; - } - } + linkerPref = "None"; } + this->LanguageToLinkerPreference[l] = linkerPref; - if (preference < 0) - { - std::string msg = linkerPrefVar; - msg += " is negative, adjusting it to 0"; - cmSystemTools::Message(msg.c_str(), "Warning"); - preference = 0; - } - - this->LanguageToLinkerPreference[l] = preference; std::string outputExtensionVar = std::string("CMAKE_") + std::string(l) + std::string("_OUTPUT_EXTENSION"); @@ -775,6 +752,10 @@ void cmGlobalGenerator::Configure() } notFoundVars += "\n"; } + cmSystemTools::Error("This project requires some variables to be set,\n" + "and cmake can not find them.\n" + "Please set the following variables:\n", + notFoundVars.c_str()); } // at this point this->LocalGenerators has been filled, // so create the map from project name to vector of local generators @@ -1139,14 +1120,13 @@ void cmGlobalGenerator::GetEnabledLanguages(std::vector<std::string>& lang) } } -int cmGlobalGenerator::GetLinkerPreference(const char* lang) +const char* cmGlobalGenerator::GetLinkerPreference(const char* lang) { - std::map<cmStdString, int>::const_iterator it = this->LanguageToLinkerPreference.find(lang); - if (it != this->LanguageToLinkerPreference.end()) + if(this->LanguageToLinkerPreference.count(lang)) { - return it->second; + return this->LanguageToLinkerPreference[lang].c_str(); } - return 0; + return "None"; } void cmGlobalGenerator::FillProjectMap() diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index ccf00d7..959945c 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -153,7 +153,7 @@ public: ///! is an extension to be ignored bool IgnoreFile(const char* ext); ///! What is the preference for linkers and this language (None or Prefered) - int GetLinkerPreference(const char* lang); + const char* GetLinkerPreference(const char* lang); ///! What is the object file extension for a given source file? const char* GetLanguageOutputExtension(cmSourceFile const&); @@ -257,7 +257,7 @@ private: std::map<cmStdString, cmStdString> OutputExtensions; std::map<cmStdString, cmStdString> LanguageToOutputExtension; std::map<cmStdString, cmStdString> ExtensionToLanguage; - std::map<cmStdString, int> LanguageToLinkerPreference; + std::map<cmStdString, cmStdString> LanguageToLinkerPreference; // this is used to improve performance std::map<cmStdString,cmTarget *> TotalTargets; diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 40132a5..70d0035 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1477,57 +1477,59 @@ const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg) const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", "CXX"); } const char* linkerLang = this->GetProperty("LINKER_LANGUAGE"); - if (linkerLang==0) + if(linkerLang) { - // if the property has not yet been set, collect all languages in the - // target and then find the language with the highest preference value - std::set<cmStdString> languages; - for(std::vector<cmSourceFile*>::const_iterator - i = this->SourceFiles.begin(); i != this->SourceFiles.end(); ++i) + return linkerLang; + } + std::set<cmStdString> languages; + for(std::vector<cmSourceFile*>::const_iterator i + = this->SourceFiles.begin(); + i != this->SourceFiles.end(); ++i) + { + if(const char* lang = (*i)->GetLanguage()) { - if(const char* lang = (*i)->GetLanguage()) - { - languages.insert(lang); - } + languages.insert(lang); } - - 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) + } + if(languages.size() == 0) + { + return 0; + } + if(languages.size() == 1) + { + const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", + languages.begin()->c_str()); + return this->GetProperty("LINKER_LANGUAGE"); + } + const char* prefLang = 0; + for(std::set<cmStdString>::const_iterator s = languages.begin(); + s != languages.end(); ++s) + { + const char* lpref = gg->GetLinkerPreference(s->c_str()); + if(lpref[0] == 'P') { - int linkerPref = gg->GetLinkerPreference(sit->c_str()); - if ((linkerPref > maxLinkerPref) || (linkerLang==0)) + if(prefLang && !(*s == prefLang)) { - maxLinkerPref = linkerPref; - linkerLang = sit->c_str(); - linkerLangList = *sit; - multiplePreferedLanguages = false; + std::string m = "Error Target: "; + m += this->Name + " Contains more than one Prefered language: "; + m += *s; + m += " and "; + m += prefLang; + m += "\nYou must set the LINKER_LANGUAGE property for this target."; + cmSystemTools::Error(m.c_str()); } - else if (linkerPref == maxLinkerPref) + else { - linkerLangList += "; "; - linkerLangList += *sit; - multiplePreferedLanguages = true; + prefLang = s->c_str(); } } - - if (linkerLang!=0) - { - const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", linkerLang); - } - 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()); - } } - return linkerLang; + if(!prefLang) + { + prefLang = languages.begin()->c_str(); + } + const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", prefLang); + return this->GetProperty("LINKER_LANGUAGE"); } //---------------------------------------------------------------------------- |