cmTarget: Add CXX_STANDARD_REQUIRED to control decay.
This commit is contained in:
parent
1df2116bfa
commit
205215fb8a
|
@ -110,6 +110,7 @@ Properties on Targets
|
|||
/prop_tgt/CONFIG_POSTFIX
|
||||
/prop_tgt/CXX_EXTENSIONS
|
||||
/prop_tgt/CXX_STANDARD
|
||||
/prop_tgt/CXX_STANDARD_REQUIRED
|
||||
/prop_tgt/DEBUG_POSTFIX
|
||||
/prop_tgt/DEFINE_SYMBOL
|
||||
/prop_tgt/EchoString
|
||||
|
|
|
@ -260,6 +260,7 @@ Variables for Languages
|
|||
/variable/CMAKE_CXX_COMPILE_FEATURES
|
||||
/variable/CMAKE_CXX_EXTENSIONS
|
||||
/variable/CMAKE_CXX_STANDARD
|
||||
/variable/CMAKE_CXX_STANDARD_REQUIRED
|
||||
/variable/CMAKE_Fortran_MODDIR_DEFAULT
|
||||
/variable/CMAKE_Fortran_MODDIR_FLAG
|
||||
/variable/CMAKE_Fortran_MODOUT_FLAG
|
||||
|
|
|
@ -19,7 +19,8 @@ means that using:
|
|||
|
||||
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.
|
||||
``-std=c++98`` flag if supported. This "decay" behavior may be controlled
|
||||
with the :prop_tgt:`CXX_STANDARD_REQUIRED` target property.
|
||||
|
||||
This property is initialized by the value of
|
||||
the :variable:`CMAKE_CXX_STANDARD` variable if it is set when a target
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
CXX_STANDARD_REQUIRED
|
||||
---------------------
|
||||
|
||||
Boolean describing whether the value of :prop_tgt:`CXX_STANDARD` is a requirement.
|
||||
|
||||
If this property is set to ``ON``, then the value of the
|
||||
:prop_tgt:`CXX_STANDARD` target property is treated as a requirement. If this
|
||||
property is ``OFF`` or unset, the :prop_tgt:`CXX_STANDARD` target property is
|
||||
treated as optional and may "decay" to a previous standard if the requested is
|
||||
not available.
|
||||
|
||||
This property is initialized by the value of
|
||||
the :variable:`CMAKE_CXX_STANDARD_REQUIRED` variable if it is set when a
|
||||
target is created.
|
|
@ -0,0 +1,8 @@
|
|||
CMAKE_CXX_STANDARD_REQUIRED
|
||||
---------------------------
|
||||
|
||||
Default value for ``CXX_STANDARD_REQUIRED`` property of targets.
|
||||
|
||||
This variable is used to initialize the :prop_tgt:`CXX_STANDARD_REQUIRED`
|
||||
property on all targets. See that target property for additional
|
||||
information.
|
|
@ -2161,6 +2161,26 @@ AddCompilerRequirementFlag(std::string &flags, cmTarget* target,
|
|||
bool ext = target->GetPropertyAsBool(extProp);
|
||||
std::string type = ext ? "EXTENSION" : "STANDARD";
|
||||
|
||||
if (target->GetPropertyAsBool(lang + "_STANDARD_REQUIRED"))
|
||||
{
|
||||
std::string option_flag =
|
||||
"CMAKE_" + lang + standardProp
|
||||
+ "_" + type + "_COMPILE_OPTION";
|
||||
|
||||
const char *opt = target->GetMakefile()->GetDefinition(option_flag);
|
||||
if (!opt)
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << "Target \"" << target->GetName() << "\" requires the language "
|
||||
"dialect \"" << lang << standardProp << "\" "
|
||||
<< (ext ? "(with compiler extensions)" : "") << ", but CMake "
|
||||
"does not know the compile flags to use to enable it.";
|
||||
this->GetMakefile()->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||
}
|
||||
this->AppendFlags(flags, opt);
|
||||
return;
|
||||
}
|
||||
|
||||
static std::map<std::string, std::vector<std::string> > langStdMap;
|
||||
if (langStdMap.empty())
|
||||
{
|
||||
|
|
|
@ -315,6 +315,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
|
|||
this->SetPropertyDefault("MACOSX_RPATH", 0);
|
||||
this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
|
||||
this->SetPropertyDefault("CXX_STANDARD", 0);
|
||||
this->SetPropertyDefault("CXX_STANDARD_REQUIRED", 0);
|
||||
this->SetPropertyDefault("CXX_EXTENSIONS", 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,9 @@ add_executable(CompileFeatures main.cpp)
|
|||
set_property(TARGET CompileFeatures
|
||||
PROPERTY COMPILE_FEATURES "cxx_auto_type"
|
||||
)
|
||||
set_property(TARGET CompileFeatures
|
||||
PROPERTY CXX_STANDARD_REQUIRED TRUE
|
||||
)
|
||||
|
||||
add_executable(GenexCompileFeatures main.cpp)
|
||||
set_property(TARGET GenexCompileFeatures
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX11" , but CMake does not
|
||||
know the compile flags to use to enable it.
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 11)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD_REQUIRED TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX11" \(with compiler
|
||||
extensions\), but CMake does not know the compile flags to use to enable it.
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 11)
|
||||
set_property(TARGET foo PROPERTY CXX_EXTENSIONS TRUE)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD_REQUIRED TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX11" \(with compiler
|
||||
extensions\), but CMake does not know the compile flags to use to enable it.
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 11)
|
||||
set_property(TARGET foo PROPERTY CXX_EXTENSIONS TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX11" , but CMake does not
|
||||
know the compile flags to use to enable it.
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 11)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX98" , but CMake does not
|
||||
know the compile flags to use to enable it.
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 98)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD_REQUIRED TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX98" \(with compiler
|
||||
extensions\), but CMake does not know the compile flags to use to enable it.
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 98)
|
||||
set_property(TARGET foo PROPERTY CXX_EXTENSIONS TRUE)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD_REQUIRED TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX98" \(with compiler
|
||||
extensions\), but CMake does not know the compile flags to use to enable it.
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 98)
|
||||
set_property(TARGET foo PROPERTY CXX_EXTENSIONS TRUE)
|
|
@ -0,0 +1 @@
|
|||
1
|
|
@ -0,0 +1,3 @@
|
|||
CMake Error in CMakeLists.txt:
|
||||
Target "foo" requires the language dialect "CXX98" , but CMake does not
|
||||
know the compile flags to use to enable it.
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
add_library(foo empty.cpp)
|
||||
set_property(TARGET foo PROPERTY CXX_STANDARD 98)
|
|
@ -18,3 +18,18 @@ if (NOT FEATURES)
|
|||
run_cmake(NoSupportedCxxFeatures)
|
||||
run_cmake(NoSupportedCxxFeaturesGenex)
|
||||
endif()
|
||||
|
||||
foreach(standard 98 11)
|
||||
file(READ
|
||||
"${RunCMake_BINARY_DIR}/generate_feature_list-build/cxx${standard}_flag.txt"
|
||||
CXX${standard}_FLAG
|
||||
)
|
||||
if (CXX${standard}_FLAG STREQUAL NOTFOUND)
|
||||
run_cmake(RequireCXX${standard})
|
||||
run_cmake(RequireCXX${standard}Variable)
|
||||
endif()
|
||||
if (CXX${standard}EXT_FLAG STREQUAL NOTFOUND)
|
||||
run_cmake(RequireCXX${standard}Ext)
|
||||
run_cmake(RequireCXX${standard}ExtVariable)
|
||||
endif()
|
||||
endforeach()
|
||||
|
|
|
@ -2,3 +2,22 @@
|
|||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/features.txt"
|
||||
"${CMAKE_CXX_COMPILE_FEATURES}"
|
||||
)
|
||||
|
||||
foreach(standard 98 11)
|
||||
set(CXX${standard}_FLAG NOTFOUND)
|
||||
if (DEFINED CMAKE_CXX${standard}_STANDARD_COMPILE_OPTION)
|
||||
set(CXX${standard}_FLAG ${CMAKE_CXX${standard}_STANDARD_COMPILE_OPTION})
|
||||
endif()
|
||||
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cxx${standard}_flag.txt"
|
||||
"${CXX${standard}_FLAG}"
|
||||
)
|
||||
set(CXX${standard}EXT_FLAG NOTFOUND)
|
||||
if (DEFINED CMAKE_CXX${standard}_EXTENSION_COMPILE_OPTION)
|
||||
set(CXX${standard}EXT_FLAG ${CMAKE_CXX${standard}_EXTENSION_COMPILE_OPTION})
|
||||
endif()
|
||||
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cxx${standard}ext_flag.txt"
|
||||
"${CXX${standard}EXT_FLAG}"
|
||||
)
|
||||
endforeach()
|
||||
|
|
Loading…
Reference in New Issue