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:
Stephen Kelly 2014-05-02 10:03:24 +02:00
parent a354a8ba5e
commit 3fdfa5d3fc
9 changed files with 64 additions and 60 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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\" ")

View File

@ -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)
{ {

View File

@ -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);
} }

View File

@ -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

View File

@ -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()