Features: Make CMAKE_CXX_KNOWN_FEATURES a property.
As a 'built-in' variable it imposes a cost on all variable lookups and it is expected to be rarely used.
This commit is contained in:
parent
a354a8ba5e
commit
3fdfa5d3fc
|
@ -16,6 +16,7 @@ Properties of Global Scope
|
||||||
/prop_gbl/ALLOW_DUPLICATE_CUSTOM_TARGETS
|
/prop_gbl/ALLOW_DUPLICATE_CUSTOM_TARGETS
|
||||||
/prop_gbl/AUTOGEN_TARGETS_FOLDER
|
/prop_gbl/AUTOGEN_TARGETS_FOLDER
|
||||||
/prop_gbl/AUTOMOC_TARGETS_FOLDER
|
/prop_gbl/AUTOMOC_TARGETS_FOLDER
|
||||||
|
/prop_gbl/CMAKE_CXX_KNOWN_FEATURES
|
||||||
/prop_gbl/DEBUG_CONFIGURATIONS
|
/prop_gbl/DEBUG_CONFIGURATIONS
|
||||||
/prop_gbl/DISABLED_FEATURES
|
/prop_gbl/DISABLED_FEATURES
|
||||||
/prop_gbl/ENABLED_FEATURES
|
/prop_gbl/ENABLED_FEATURES
|
||||||
|
|
|
@ -258,7 +258,6 @@ Variables for Languages
|
||||||
|
|
||||||
/variable/CMAKE_COMPILER_IS_GNULANG
|
/variable/CMAKE_COMPILER_IS_GNULANG
|
||||||
/variable/CMAKE_CXX_COMPILE_FEATURES
|
/variable/CMAKE_CXX_COMPILE_FEATURES
|
||||||
/variable/CMAKE_CXX_KNOWN_FEATURES
|
|
||||||
/variable/CMAKE_CXX_STANDARD
|
/variable/CMAKE_CXX_STANDARD
|
||||||
/variable/CMAKE_CXX_EXTENSIONS
|
/variable/CMAKE_CXX_EXTENSIONS
|
||||||
/variable/CMAKE_Fortran_MODDIR_DEFAULT
|
/variable/CMAKE_Fortran_MODDIR_DEFAULT
|
||||||
|
|
|
@ -3,7 +3,7 @@ CMAKE_CXX_KNOWN_FEATURES
|
||||||
|
|
||||||
List of C++ features known to this version of CMake.
|
List of C++ features known to this version of CMake.
|
||||||
|
|
||||||
The features listed in this variable may be known to be available to the
|
The features listed in this global property may be known to be available to the
|
||||||
C++ compiler. If the feature is available with the C++ compiler, it will
|
C++ compiler. If the feature is available with the C++ compiler, it will
|
||||||
be listed in the :variable:`CMAKE_CXX_COMPILE_FEATURES` variable.
|
be listed in the :variable:`CMAKE_CXX_COMPILE_FEATURES` variable.
|
||||||
|
|
|
@ -4,5 +4,5 @@ CMAKE_CXX_COMPILE_FEATURES
|
||||||
List of features known to the C++ compiler
|
List of features known to the C++ compiler
|
||||||
|
|
||||||
These features are known to be available for use with the C++ compiler. This
|
These features are known to be available for use with the C++ compiler. This
|
||||||
list is a subset of the features listed in the :variable:`CMAKE_CXX_KNOWN_FEATURES`
|
list is a subset of the features listed in the :prop_gbl:`CMAKE_CXX_KNOWN_FEATURES`
|
||||||
variable.
|
global property.
|
||||||
|
|
|
@ -6,7 +6,10 @@ macro(record_compiler_features lang compile_flags feature_list)
|
||||||
file(REMOVE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin")
|
file(REMOVE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.bin")
|
||||||
file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}" "
|
file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/feature_tests.${lang_lc}" "
|
||||||
extern const char features[] = {\"\"\n")
|
extern const char features[] = {\"\"\n")
|
||||||
foreach(feature ${CMAKE_${lang}_KNOWN_FEATURES})
|
|
||||||
|
get_property(known_features GLOBAL PROPERTY CMAKE_${lang}_KNOWN_FEATURES)
|
||||||
|
|
||||||
|
foreach(feature ${known_features})
|
||||||
if (_cmake_feature_test_${feature})
|
if (_cmake_feature_test_${feature})
|
||||||
if (${_cmake_feature_test_${feature}} STREQUAL 1)
|
if (${_cmake_feature_test_${feature}} STREQUAL 1)
|
||||||
set(_feature_condition "\"1\" ")
|
set(_feature_condition "\"1\" ")
|
||||||
|
|
|
@ -41,54 +41,6 @@
|
||||||
#include <ctype.h> // for isspace
|
#include <ctype.h> // for isspace
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#define FOR_EACH_CXX_FEATURE(F) \
|
|
||||||
F(cxx_alias_templates) \
|
|
||||||
F(cxx_alignas) \
|
|
||||||
F(cxx_alignof) \
|
|
||||||
F(cxx_attributes) \
|
|
||||||
F(cxx_auto_type) \
|
|
||||||
F(cxx_constexpr) \
|
|
||||||
F(cxx_decltype) \
|
|
||||||
F(cxx_decltype_incomplete_return_types) \
|
|
||||||
F(cxx_default_function_template_args) \
|
|
||||||
F(cxx_defaulted_functions) \
|
|
||||||
F(cxx_defaulted_move_initializers) \
|
|
||||||
F(cxx_delegating_constructors) \
|
|
||||||
F(cxx_deleted_functions) \
|
|
||||||
F(cxx_enum_forward_declarations) \
|
|
||||||
F(cxx_explicit_conversions) \
|
|
||||||
F(cxx_extended_friend_declarations) \
|
|
||||||
F(cxx_extern_templates) \
|
|
||||||
F(cxx_final) \
|
|
||||||
F(cxx_func_identifier) \
|
|
||||||
F(cxx_generalized_initializers) \
|
|
||||||
F(cxx_inheriting_constructors) \
|
|
||||||
F(cxx_inline_namespaces) \
|
|
||||||
F(cxx_lambdas) \
|
|
||||||
F(cxx_local_type_template_args) \
|
|
||||||
F(cxx_long_long_type) \
|
|
||||||
F(cxx_noexcept) \
|
|
||||||
F(cxx_nonstatic_member_init) \
|
|
||||||
F(cxx_nullptr) \
|
|
||||||
F(cxx_override) \
|
|
||||||
F(cxx_range_for) \
|
|
||||||
F(cxx_raw_string_literals) \
|
|
||||||
F(cxx_reference_qualified_functions) \
|
|
||||||
F(cxx_right_angle_brackets) \
|
|
||||||
F(cxx_rvalue_references) \
|
|
||||||
F(cxx_sizeof_member) \
|
|
||||||
F(cxx_static_assert) \
|
|
||||||
F(cxx_strong_enums) \
|
|
||||||
F(cxx_template_template_parameters) \
|
|
||||||
F(cxx_thread_local) \
|
|
||||||
F(cxx_trailing_return_types) \
|
|
||||||
F(cxx_unicode_literals) \
|
|
||||||
F(cxx_uniform_initialization) \
|
|
||||||
F(cxx_unrestricted_unions) \
|
|
||||||
F(cxx_user_literals) \
|
|
||||||
F(cxx_variadic_macros) \
|
|
||||||
F(cxx_variadic_templates)
|
|
||||||
|
|
||||||
class cmMakefile::Internals
|
class cmMakefile::Internals
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -2499,12 +2451,6 @@ const char* cmMakefile::GetDefinition(const std::string& name) const
|
||||||
{
|
{
|
||||||
this->Internal->VarUsageStack.top().insert(name);
|
this->Internal->VarUsageStack.top().insert(name);
|
||||||
}
|
}
|
||||||
if (name == "CMAKE_CXX_KNOWN_FEATURES")
|
|
||||||
{
|
|
||||||
#define STRING_LIST_ELEMENT(F) ";" #F
|
|
||||||
return FOR_EACH_CXX_FEATURE(STRING_LIST_ELEMENT) + 1;
|
|
||||||
#undef STRING_LIST_ELEMENT
|
|
||||||
}
|
|
||||||
const char* def = this->Internal->VarStack.top().Get(name);
|
const char* def = this->Internal->VarStack.top().Get(name);
|
||||||
if(!def)
|
if(!def)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2273,6 +2273,12 @@ const char *cmake::GetProperty(const std::string& prop,
|
||||||
}
|
}
|
||||||
this->SetProperty("ENABLED_LANGUAGES", lang.c_str());
|
this->SetProperty("ENABLED_LANGUAGES", lang.c_str());
|
||||||
}
|
}
|
||||||
|
if (prop == "CMAKE_CXX_KNOWN_FEATURES")
|
||||||
|
{
|
||||||
|
#define STRING_LIST_ELEMENT(F) ";" #F
|
||||||
|
return FOR_EACH_CXX_FEATURE(STRING_LIST_ELEMENT) + 1;
|
||||||
|
#undef STRING_LIST_ELEMENT
|
||||||
|
}
|
||||||
return this->Properties.GetPropertyValue(prop, scope, chain);
|
return this->Properties.GetPropertyValue(prop, scope, chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -458,4 +458,52 @@ private:
|
||||||
{"-Wno-dev", "Suppress developer warnings."},\
|
{"-Wno-dev", "Suppress developer warnings."},\
|
||||||
{"-Wdev", "Enable developer warnings."}
|
{"-Wdev", "Enable developer warnings."}
|
||||||
|
|
||||||
|
#define FOR_EACH_CXX_FEATURE(F) \
|
||||||
|
F(cxx_alias_templates) \
|
||||||
|
F(cxx_alignas) \
|
||||||
|
F(cxx_alignof) \
|
||||||
|
F(cxx_attributes) \
|
||||||
|
F(cxx_auto_type) \
|
||||||
|
F(cxx_constexpr) \
|
||||||
|
F(cxx_decltype) \
|
||||||
|
F(cxx_decltype_incomplete_return_types) \
|
||||||
|
F(cxx_default_function_template_args) \
|
||||||
|
F(cxx_defaulted_functions) \
|
||||||
|
F(cxx_defaulted_move_initializers) \
|
||||||
|
F(cxx_delegating_constructors) \
|
||||||
|
F(cxx_deleted_functions) \
|
||||||
|
F(cxx_enum_forward_declarations) \
|
||||||
|
F(cxx_explicit_conversions) \
|
||||||
|
F(cxx_extended_friend_declarations) \
|
||||||
|
F(cxx_extern_templates) \
|
||||||
|
F(cxx_final) \
|
||||||
|
F(cxx_func_identifier) \
|
||||||
|
F(cxx_generalized_initializers) \
|
||||||
|
F(cxx_inheriting_constructors) \
|
||||||
|
F(cxx_inline_namespaces) \
|
||||||
|
F(cxx_lambdas) \
|
||||||
|
F(cxx_local_type_template_args) \
|
||||||
|
F(cxx_long_long_type) \
|
||||||
|
F(cxx_noexcept) \
|
||||||
|
F(cxx_nonstatic_member_init) \
|
||||||
|
F(cxx_nullptr) \
|
||||||
|
F(cxx_override) \
|
||||||
|
F(cxx_range_for) \
|
||||||
|
F(cxx_raw_string_literals) \
|
||||||
|
F(cxx_reference_qualified_functions) \
|
||||||
|
F(cxx_right_angle_brackets) \
|
||||||
|
F(cxx_rvalue_references) \
|
||||||
|
F(cxx_sizeof_member) \
|
||||||
|
F(cxx_static_assert) \
|
||||||
|
F(cxx_strong_enums) \
|
||||||
|
F(cxx_template_template_parameters) \
|
||||||
|
F(cxx_thread_local) \
|
||||||
|
F(cxx_trailing_return_types) \
|
||||||
|
F(cxx_unicode_literals) \
|
||||||
|
F(cxx_uniform_initialization) \
|
||||||
|
F(cxx_unrestricted_unions) \
|
||||||
|
F(cxx_user_literals) \
|
||||||
|
F(cxx_variadic_macros) \
|
||||||
|
F(cxx_variadic_templates)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -22,7 +22,8 @@ macro(run_test feature)
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
foreach(feature ${CMAKE_CXX_KNOWN_FEATURES})
|
get_property(features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
|
||||||
|
foreach(feature ${features})
|
||||||
run_test(${feature})
|
run_test(${feature})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue