diff options
-rw-r--r-- | Modules/CMakeASMCompiler.cmake.in | 2 | ||||
-rw-r--r-- | Modules/CMakeCCompiler.cmake.in | 2 | ||||
-rw-r--r-- | Modules/CMakeCXXCompiler.cmake.in | 2 | ||||
-rw-r--r-- | Modules/CMakeForceCompiler.cmake | 11 | ||||
-rw-r--r-- | Modules/CMakeFortranCompiler.cmake.in | 2 | ||||
-rw-r--r-- | Modules/CMakeJavaCompiler.cmake.in | 2 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 42 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 84 |
9 files changed, 61 insertions, 90 deletions
diff --git a/Modules/CMakeASMCompiler.cmake.in b/Modules/CMakeASMCompiler.cmake.in index 230805b..f839a3e 100644 --- a/Modules/CMakeASMCompiler.cmake.in +++ b/Modules/CMakeASMCompiler.cmake.in @@ -7,5 +7,5 @@ SET(CMAKE_ASM@ASM_DIALECT@_COMPILER_LOADED 1) SET(CMAKE_ASM@ASM_DIALECT@_COMPILER_ENV_VAR "@_CMAKE_ASM_COMPILER_ENV_VAR@") SET(CMAKE_ASM@ASM_DIALECT@_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -SET(CMAKE_ASM@ASM_DIALECT@_LINKER_PREFERENCE 0) +SET(CMAKE_ASM@ASM_DIALECT@_LINKER_PREFERENCE None) diff --git a/Modules/CMakeCCompiler.cmake.in b/Modules/CMakeCCompiler.cmake.in index 6a7fef8..b746aba 100644 --- a/Modules/CMakeCCompiler.cmake.in +++ b/Modules/CMakeCCompiler.cmake.in @@ -21,7 +21,7 @@ ENDIF(CMAKE_COMPILER_IS_MINGW) SET(CMAKE_C_COMPILER_ID_RUN 1) SET(CMAKE_C_SOURCE_FILE_EXTENSIONS c) SET(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -SET(CMAKE_C_LINKER_PREFERENCE 10) +SET(CMAKE_C_LINKER_PREFERENCE None) # save the size of void* in case where cache is removed # and the this file is still around diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in index b3a84dd..f2c53d5 100644 --- a/Modules/CMakeCXXCompiler.cmake.in +++ b/Modules/CMakeCXXCompiler.cmake.in @@ -21,7 +21,7 @@ ENDIF(CMAKE_COMPILER_IS_MINGW) SET(CMAKE_CXX_COMPILER_ID_RUN 1) SET(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;H;o;O;obj;OBJ;def;DEF;rc;RC) SET(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm) -SET(CMAKE_CXX_LINKER_PREFERENCE 30) +SET(CMAKE_CXX_LINKER_PREFERENCE Prefered) # save the size of void* in case where cache is removed # and the this file is still around diff --git a/Modules/CMakeForceCompiler.cmake b/Modules/CMakeForceCompiler.cmake index 751fd78..d104ad9 100644 --- a/Modules/CMakeForceCompiler.cmake +++ b/Modules/CMakeForceCompiler.cmake @@ -38,12 +38,6 @@ MACRO(CMAKE_FORCE_C_COMPILER compiler id sizeof_void) SET(CMAKE_C_COMPILER_ID_RUN TRUE) SET(CMAKE_C_COMPILER_ID ${id}) SET(CMAKE_C_COMPILER_WORKS TRUE) - - # Set old compiler and platform id variables. - IF("${CMAKE_C_COMPILER_ID}" MATCHES "GNU") - SET(CMAKE_COMPILER_IS_GNUCC 1) - ENDIF("${CMAKE_C_COMPILER_ID}" MATCHES "GNU") - SET(CMAKE_SIZEOF_VOID_P ${sizeof_void} CACHE STRING "sizeof void") SET(HAVE_CMAKE_SIZEOF_VOID_P TRUE CACHE INTERNAL "have sizeof void") ENDMACRO(CMAKE_FORCE_C_COMPILER) @@ -53,10 +47,5 @@ MACRO(CMAKE_FORCE_CXX_COMPILER compiler id) SET(CMAKE_CXX_COMPILER_ID_RUN TRUE) SET(CMAKE_CXX_COMPILER_ID ${id}) SET(CMAKE_CXX_COMPILER_WORKS TRUE) - - IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - SET(CMAKE_COMPILER_IS_GNUCXX 1) - ENDIF("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - ENDMACRO(CMAKE_FORCE_CXX_COMPILER) diff --git a/Modules/CMakeFortranCompiler.cmake.in b/Modules/CMakeFortranCompiler.cmake.in index 67a0c64..a4f3941 100644 --- a/Modules/CMakeFortranCompiler.cmake.in +++ b/Modules/CMakeFortranCompiler.cmake.in @@ -21,7 +21,7 @@ ENDIF(CMAKE_COMPILER_IS_MINGW) SET(CMAKE_Fortran_COMPILER_ID_RUN 1) SET(CMAKE_Fortran_SOURCE_FILE_EXTENSIONS f;F;f77;F77;f90;F90;for;f95;F95) SET(CMAKE_Fortran_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -SET(CMAKE_Fortran_LINKER_PREFERENCE 20) +SET(CMAKE_Fortran_LINKER_PREFERENCE Prefered) IF(UNIX) SET(CMAKE_Fortran_OUTPUT_EXTENSION .o) ELSE(UNIX) diff --git a/Modules/CMakeJavaCompiler.cmake.in b/Modules/CMakeJavaCompiler.cmake.in index 83c1ee4..c9eeb14 100644 --- a/Modules/CMakeJavaCompiler.cmake.in +++ b/Modules/CMakeJavaCompiler.cmake.in @@ -5,7 +5,7 @@ SET(CMAKE_Java_ARCHIVE "@CMAKE_Java_ARCHIVE@") SET(CMAKE_Java_COMPILER_LOADED 1) SET(CMAKE_Java_SOURCE_FILE_EXTENSIONS java) -SET(CMAKE_Java_LINKER_PREFERENCE 40) +SET(CMAKE_Java_LINKER_PREFERENCE Prefered) SET(CMAKE_Java_OUTPUT_EXTENSION .class) SET(CMAKE_STATIC_LIBRARY_PREFIX_Java "") SET(CMAKE_STATIC_LIBRARY_SUFFIX_Java ".jar") 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"); } //---------------------------------------------------------------------------- |