diff options
author | Alexander Neundorf <neundorf@kde.org> | 2007-07-11 20:22:04 (GMT) |
---|---|---|
committer | Alexander Neundorf <neundorf@kde.org> | 2007-07-11 20:22:04 (GMT) |
commit | bea1a5de771832463299146b4f2e4317c37f30bc (patch) | |
tree | b22c7527b5e9d4b21971f6b3d6d8aeda84e0015a /Source/cmTarget.cxx | |
parent | 9f16292b6a3a5959b2e7ddb11e54029b02701965 (diff) | |
download | CMake-bea1a5de771832463299146b4f2e4317c37f30bc.zip CMake-bea1a5de771832463299146b4f2e4317c37f30bc.tar.gz CMake-bea1a5de771832463299146b4f2e4317c37f30bc.tar.bz2 |
ENH: CMAKE_<LANG>_LINKER_PREFERENCE is now an integer priority, not a
two-step priority (None or Prefered)
Current order: ASM 0, C 10, Fortran 20, CXX 30, Java 40
This is the same order as automake choses:
http://www.gnu.org/software/automake/manual/html_node/How-the-Linker-is-Chosen.html
This change should be backward compatible:
if there is a project using fortran and CXX, they had to set the
LINKER_LANGUAGE explicitely, otherwise cmake complained (but still generated
the project files). Explicitely setting the linker language still overrides
automatic detection.
If somebody has a custom language for cmake and the PREFERENCE starts with
"P", its changed to 100, which gives it preference over all other languages
(except the other custom languages which have also "Prefered"). "None" is
converted to 0.
Alex
Diffstat (limited to 'Source/cmTarget.cxx')
-rw-r--r-- | Source/cmTarget.cxx | 84 |
1 files changed, 41 insertions, 43 deletions
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 70d0035..40132a5 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1477,59 +1477,57 @@ const char* cmTarget::GetLinkerLanguage(cmGlobalGenerator* gg) const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", "CXX"); } const char* linkerLang = this->GetProperty("LINKER_LANGUAGE"); - if(linkerLang) + if (linkerLang==0) { - 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 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) { - languages.insert(lang); + if(const char* lang = (*i)->GetLanguage()) + { + languages.insert(lang); + } } - } - 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') + + 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(prefLang && !(*s == prefLang)) + int linkerPref = gg->GetLinkerPreference(sit->c_str()); + if ((linkerPref > maxLinkerPref) || (linkerLang==0)) { - 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()); + maxLinkerPref = linkerPref; + linkerLang = sit->c_str(); + linkerLangList = *sit; + multiplePreferedLanguages = false; } - else + else if (linkerPref == maxLinkerPref) { - prefLang = s->c_str(); + linkerLangList += "; "; + linkerLangList += *sit; + multiplePreferedLanguages = true; } } + + 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()); + } } - if(!prefLang) - { - prefLang = languages.begin()->c_str(); - } - const_cast<cmTarget*>(this)->SetProperty("LINKER_LANGUAGE", prefLang); - return this->GetProperty("LINKER_LANGUAGE"); + return linkerLang; } //---------------------------------------------------------------------------- |