This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "CMake".
The branch, next has been updated via f25b66f11a0498939ee140fad5b3bc389c27d996 (commit) via 93e7729d661098fb00f1cca3104ff9361af6b741 (commit) from 0170a54df964f22b1387168603a719fd8cf07e03 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f25b66f11a0498939ee140fad5b3bc389c27d996 commit f25b66f11a0498939ee140fad5b3bc389c27d996 Merge: 0170a54 93e7729 Author: Stephen Kelly <steve...@gmail.com> AuthorDate: Wed Apr 16 10:08:10 2014 -0400 Commit: CMake Topic Stage <kwro...@kitware.com> CommitDate: Wed Apr 16 10:08:10 2014 -0400 Merge topic 'decay-language-version' into next 93e7729d Features: Decay language flag if requested is not available. http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=93e7729d661098fb00f1cca3104ff9361af6b741 commit 93e7729d661098fb00f1cca3104ff9361af6b741 Author: Stephen Kelly <steve...@gmail.com> AuthorDate: Fri Mar 28 16:09:35 2014 +0100 Commit: Stephen Kelly <steve...@gmail.com> CommitDate: Wed Apr 16 15:52:46 2014 +0200 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. diff --git a/Help/prop_tgt/CXX_STANDARD.rst b/Help/prop_tgt/CXX_STANDARD.rst index e1b6e78..fb72f3e 100644 --- a/Help/prop_tgt/CXX_STANDARD.rst +++ b/Help/prop_tgt/CXX_STANDARD.rst @@ -1,14 +1,26 @@ CXX_STANDARD ------------ -The C++ standard whose features are required to build this target. +The C++ standard whose features are requested to build this target. -This property specifies the C++ standard whose features are required +This property specifies the C++ standard whose features are requested to build this target. For some compilers, this results in adding a flag such as ``-std=c++11`` to the compile line. Supported values are ``98`` and ``11``. +If the value requested does not result in a compile flag being added for +the compiler in use, a previous standard flag will be added instead. This +means that using: + +.. code-block:: cmake + + set_property(TARGET tgt PROPERTY CXX_STANDARD 11) + +with a compiler which does not support ``-std=c++11`` or an equivalent +flag will not result in an error or warning, but will instead add the +``-std=c++98`` flag if supported. + This property is initialized by the value of the :variable:`CMAKE_CXX_STANDARD` variable if it is set when a target is created. diff --git a/Modules/Compiler/GNU-CXX.cmake b/Modules/Compiler/GNU-CXX.cmake index 6ec3958..b62e697 100644 --- a/Modules/Compiler/GNU-CXX.cmake +++ b/Modules/Compiler/GNU-CXX.cmake @@ -24,6 +24,8 @@ elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3) set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x") endif() +set(CMAKE_CXX_STANDARD_DEFAULT 98) + macro(cmake_record_cxx_compile_features) macro(_get_gcc_features std_version list) record_compiler_features(CXX "-std=${std_version}" ${list}) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index f375b5f..798264f 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,45 @@ 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); + langStdMap["CXX"].push_back("98"); + langStdMap["CXX"].push_back("11"); + } + + 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.begin(); + } + + 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; + } } } ----------------------------------------------------------------------- Summary of changes: Help/prop_tgt/CXX_STANDARD.rst | 16 ++++++++++++-- Modules/Compiler/GNU-CXX.cmake | 2 ++ Source/cmLocalGenerator.cxx | 47 ++++++++++++++++++++++++++++++++++------ 3 files changed, 56 insertions(+), 9 deletions(-) hooks/post-receive -- CMake _______________________________________________ Cmake-commits mailing list Cmake-commits@cmake.org http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-commits