summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalGenerator.cxx
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2014-03-28 15:09:35 (GMT)
committerStephen Kelly <steveire@gmail.com>2014-05-07 10:17:49 (GMT)
commit1df2116bfaa4c575404ae1eef225aed1530d668a (patch)
tree99a8fd5375d47f6359fd269c0d9e3ab030bc131e /Source/cmLocalGenerator.cxx
parentc4f4dac2d550f0a8a44530187eac2ad03191c981 (diff)
downloadCMake-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.cxx48
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;
+ }
}
}