diff options
author | Stephen Kelly <steveire@gmail.com> | 2014-03-28 15:09:35 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2014-05-07 10:17:49 (GMT) |
commit | 1df2116bfaa4c575404ae1eef225aed1530d668a (patch) | |
tree | 99a8fd5375d47f6359fd269c0d9e3ab030bc131e /Source/cmLocalGenerator.cxx | |
parent | c4f4dac2d550f0a8a44530187eac2ad03191c981 (diff) | |
download | CMake-1df2116bfaa4c575404ae1eef225aed1530d668a.zip CMake-1df2116bfaa4c575404ae1eef225aed1530d668a.tar.gz CMake-1df2116bfaa4c575404ae1eef225aed1530d668a.tar.bz2 |
Features: Decay language flag if requested is not available.
Use the highest standard compile flags available if requested language
version is too new.
This supports use-cases like
set(CMAKE_CXX_STANDARD 14)
# Compiled with -std=c++11 with GNU 4.7, which has no -std=c++14
# or equivalent flag
add_executable(main main.cpp)
This can be used in combination with preprocessor defines which
communicate the availability of certain language features for
optional use.
Diffstat (limited to 'Source/cmLocalGenerator.cxx')
-rw-r--r-- | Source/cmLocalGenerator.cxx | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index f375b5f..a29a0cd 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -2152,8 +2152,8 @@ AddCompilerRequirementFlag(std::string &flags, cmTarget* target, return; } std::string stdProp = lang + "_STANDARD"; - const char *standard = target->GetProperty(stdProp); - if (!standard) + const char *standardProp = target->GetProperty(stdProp); + if (!standardProp) { return; } @@ -2161,12 +2161,46 @@ AddCompilerRequirementFlag(std::string &flags, cmTarget* target, bool ext = target->GetPropertyAsBool(extProp); std::string type = ext ? "EXTENSION" : "STANDARD"; - std::string compile_option = - "CMAKE_" + lang + std::string(standard) - + "_" + type + "_COMPILE_OPTION"; - if (const char *opt = target->GetMakefile()->GetDefinition(compile_option)) + static std::map<std::string, std::vector<std::string> > langStdMap; + if (langStdMap.empty()) { - this->AppendFlags(flags, opt); + // Maintain sorted order, most recent first. + langStdMap["CXX"].push_back("11"); + langStdMap["CXX"].push_back("98"); + } + + std::string standard(standardProp); + + std::vector<std::string>& stds = langStdMap[lang]; + + std::vector<std::string>::const_iterator stdIt = + std::find(stds.begin(), stds.end(), standard); + assert(stdIt != stds.end()); + + const char* defaultStd + = this->Makefile->GetDefinition("CMAKE_" + lang + "_STANDARD_DEFAULT"); + std::vector<std::string>::const_iterator defaultStdIt; + if (defaultStd) + { + defaultStdIt = std::find(stds.begin(), stds.end(), defaultStd); + assert(defaultStdIt != stds.end()); + } + else + { + defaultStdIt = stds.end() - 1; + } + + for ( ; stdIt <= defaultStdIt; ++stdIt) + { + std::string option_flag = + "CMAKE_" + lang + *stdIt + + "_" + type + "_COMPILE_OPTION"; + + if (const char *opt = target->GetMakefile()->GetDefinition(option_flag)) + { + this->AppendFlags(flags, opt); + return; + } } } |