1set(CHECK_CXX_FEATURE_PREFIX "") 2MARK_AS_ADVANCED(CHECK_CXX_FEATURE_PREFIX) 3 4macro(CHECK_CXX_FEATURE feature file message) 5 message(STATUS "Check whether the compiler ${message}") 6 try_compile(RESULT ${CMAKE_BINARY_DIR} 7 ${CMAKE_SOURCE_DIR}/cmake/cxx_tests/${file} 8 COMPILE_DEFINITIONS "${CHECK_CXX_FEATURE_DEFINITIONS}" 9 OUTPUT_VARIABLE OUTPUT) 10 11 if (RESULT) 12 set (FOUND "found") 13 set (STATUS "passed") 14 set(CHECK_CXX_FEATURE_DEFINITIONS "${CHECK_CXX_FEATURE_DEFINITIONS} -D${feature}") 15 else() 16 set (FOUND "not found") 17 set (STATUS "failed") 18 endif() 19 message(STATUS "Check whether the compiler ${message} - ${FOUND}") 20 set("${CHECK_CXX_FEATURE_PREFIX}${feature}" ${RESULT} CACHE INTERNAL "Does the compiler ${message}") 21 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 22 "Determining if the CXX compiler ${message} ${STATUS} with " 23 "the following output:\n${OUTPUT}\n\n") 24endmacro() 25 26macro(CHECK_CXX_GENERAL) 27 CHECK_CXX_FEATURE(HAVE_EXCEPTIONS exceptions.cpp "supports exceptions") 28 CHECK_CXX_FEATURE(HAVE_RTTI rtti.cpp "supports Run-Time Type Identification") 29 CHECK_CXX_FEATURE(HAVE_MEMBER_CONSTANTS member_constants.cpp "supports member constants") 30 CHECK_CXX_FEATURE(HAVE_OLD_FOR_SCOPING old_for_scoping.cpp "accepts the old for scoping rules") 31endmacro() 32 33macro(CHECK_CXX_KEYWORDS) 34 CHECK_CXX_FEATURE(HAVE_EXPLICIT explicit.cpp "supports the explicit keyword") 35 CHECK_CXX_FEATURE(HAVE_MUTABLE mutable.cpp "supports the mutable keyword") 36 CHECK_CXX_FEATURE(HAVE_TYPENAME typename.cpp "recognizes typename") 37 CHECK_CXX_FEATURE(HAVE_NCEG_RESTRICT nceg_restrict.cpp "supports the Numerical C Extensions Group restrict keyword") 38 CHECK_CXX_FEATURE(HAVE_RESTRICT_EGCS restrict_egcs.cpp "recognizes the '__restrict__' keyword") 39 CHECK_CXX_FEATURE(HAVE_BOOL bool.cpp "recognizes bool as a built-in type") 40endmacro() 41 42macro(CHECK_CXX_TYPE_CASTS) 43 CHECK_CXX_FEATURE(HAVE_CONST_CAST const_cast.cpp "supports const_cast<>") 44 CHECK_CXX_FEATURE(HAVE_STATIC_CAST static_cast.cpp "supports static_cast<>") 45 CHECK_CXX_FEATURE(HAVE_REINTERPRET_CAST reinterpret_cast.cpp "supports reinterpret_cast<>") 46 CHECK_CXX_FEATURE(HAVE_DYNAMIC_CAST dynamic_cast.cpp "supports dynamic_cast<>") 47endmacro() 48 49macro(CHECK_CXX_TEMPLATES_FEATURES) 50 CHECK_CXX_FEATURE(HAVE_TEMPLATES templates.cpp "supports basic templates") 51 CHECK_CXX_FEATURE(HAVE_PARTIAL_SPECIALIZATION partial_specialization.cpp "supports partial specialization") 52 CHECK_CXX_FEATURE(HAVE_PARTIAL_ORDERING partial_ordering.cpp "supports partial ordering") 53 CHECK_CXX_FEATURE(HAVE_DEFAULT_TEMPLATE_PARAMETERS default_template_parameters.cpp "supports default template parameters") 54 CHECK_CXX_FEATURE(HAVE_MEMBER_TEMPLATES member_templates.cpp "supports member templates") 55 CHECK_CXX_FEATURE(HAVE_MEMBER_TEMPLATES_OUTSIDE_CLASS member_templates_outside_class.cpp "supports member templates outside the class declaration") 56 CHECK_CXX_FEATURE(HAVE_FULL_SPECIALIZATION_SYNTAX full_specialization_syntax.cpp "recognizes the full specialization syntax") 57 CHECK_CXX_FEATURE(HAVE_FUNCTION_NONTYPE_PARAMETERS function_nontype_parameters.cpp "supports function templates with non-type parameters") 58 CHECK_CXX_FEATURE(HAVE_TEMPLATE_QUALIFIED_BASE_CLASS template_qualified_base_class.cpp "supports template-qualified base class specifiers") 59 CHECK_CXX_FEATURE(HAVE_TEMPLATE_QUALIFIED_RETURN_TYPE template_qualified_return_type.cpp "supports template-qualified return types") 60 CHECK_CXX_FEATURE(HAVE_EXPLICIT_TEMPLATE_FUNCTION_QUALIFICATION explicit_template_function_qualification.cpp "supports explicit template function qualification") 61 CHECK_CXX_FEATURE(HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS templates_as_template_arguments.cpp "supports templates as template arguments") 62 CHECK_CXX_FEATURE(HAVE_TEMPLATE_KEYWORD_QUALIFIER template_keyword_qualifier.cpp "supports use of the template keyword as a qualifier") 63 CHECK_CXX_FEATURE(HAVE_TEMPLATE_SCOPED_ARGUMENT_MATCHING template_scoped_argument_matching.cpp "supports function matching with argument types which are template scope-qualified") 64 CHECK_CXX_FEATURE(HAVE_TYPE_PROMOTION type_promotion.cpp "support the vector type promotion mechanism") 65 CHECK_CXX_FEATURE(HAVE_USE_NUMTRAIT use_numtrait.cpp "supports numeric traits promotions") 66 CHECK_CXX_FEATURE(HAVE_ENUM_COMPUTATIONS enum_computations.cpp "handles computations inside an enum") 67 CHECK_CXX_FEATURE(HAVE_ENUM_COMPUTATIONS_WITH_CAST enum_computations_with_cast.cpp "handles (int) casts in enum computations") 68endmacro() 69 70macro(CHECK_HEADER variable name) 71 find_path(FOUND ${name} "/usr/include;/usr/include/c++") 72 if (FOUND) 73 set(value TRUE) 74 else() 75 set(value FALSE) 76 endif() 77 set("${CHECK_CXX_FEATURE_PREFIX}${variable}" ${value} CACHE INTERNAL "Whether the header ${name} exists.") 78endmacro() 79 80macro(CHECK_CXX_STANDARD_LIBRARY) 81 CHECK_CXX_FEATURE(HAVE_COMPLEX have_complex.cpp "has complex<T>") 82 CHECK_CXX_FEATURE(HAVE_COMPLEX_FCNS have_complex_fcns.cpp "has standard complex<T> functions") 83 CHECK_HEADER(HAVE_CSTRING cstring) 84 CHECK_CXX_FEATURE(HAVE_NUMERIC_LIMITS have_numeric_limits.cpp "has numeric_limits<T>") 85 CHECK_CXX_FEATURE(HAVE_CLIMITS have_climits.cpp "has <climits> header") 86 CHECK_CXX_FEATURE(HAVE_VALARRAY have_valarray.cpp "has valarray<T>") 87 CHECK_CXX_FEATURE(HAVE_COMPLEX_MATH1 have_complex_math1.cpp "has complex math functions") 88 CHECK_CXX_FEATURE(HAVE_COMPLEX_MATH2 have_complex_math2.cpp "has more complex math functions") 89 CHECK_CXX_FEATURE(HAVE_IEEE_MATH have_ieee_math.cpp "supports IEEE math library") 90 CHECK_CXX_FEATURE(HAVE_SYSTEM_V_MATH have_system_v_math.cpp "supports System V math library") 91 CHECK_CXX_FEATURE(HAVE_MATH_FN_IN_NAMESPACE_STD math_fn_in_namespace_std.cpp "has C math functions in namespace std") 92 CHECK_CXX_FEATURE(HAVE_MATH_ABSINT_IN_NAMESPACE_STD math_absint_in_namespace_std.cpp "has C math abs(integer type) in namespace std") 93 CHECK_CXX_FEATURE(HAVE_COMPLEX_MATH_IN_NAMESPACE_STD complex_math_in_namespace_std.cpp "supports complex math functions are in namespace std") 94 CHECK_CXX_FEATURE(HAVE_ISNAN_IN_NAMESPACE_STD isnan_in_namespace_std.cpp "has isnan function in namespace std") 95 CHECK_CXX_FEATURE(HAVE_ISNORMAL_IN_NAMESPACE_STD isnormal_in_namespace_std.cpp "has isnormal function in namespace std") 96 CHECK_CXX_FEATURE(HAVE_STD have_std.cpp "supports ISO C++ standard library") 97 CHECK_CXX_FEATURE(HAVE_STL have_stl.cpp "supports Standard Template Library") 98 CHECK_CXX_FEATURE(HAVE_RUSAGE have_rusage.cpp "has getrusage() function") 99endmacro() 100 101macro(CHECK_ALL_CXX_FEATURES) 102 set(CHECK_CXX_FEATURE_PREFIX ${ARGN}) 103 CHECK_CXX_GENERAL() 104 CHECK_CXX_KEYWORDS() 105 CHECK_CXX_TYPE_CASTS() 106 CHECK_CXX_TEMPLATES_FEATURES() 107 CHECK_CXX_STANDARD_LIBRARY() 108endmacro() 109 110macro(CHECK_ALIGNMENT_DIRECTIVE) 111 set(CHECK_CXX_FEATURE_PREFIX ${ARGN}) 112 CHECK_CXX_FEATURE(HAVE_ALIGNEMENT_DIRECTIVE_WINDOWS_STYLE alignment_directive_win.cpp "has windows style alignment directives") 113 if (NOT ${CHECK_CXX_FEATURE_PREFIX}HAVE_ALIGNEMENT_DIRECTIVE_WINDOWS_STYLE STREQUAL "TRUE") 114 CHECK_CXX_FEATURE(HAVE_ALIGNEMENT_DIRECTIVE_GCC_STYLE alignment_directive_gcc.cpp "has gcc style alignment directives") 115 endif() 116endmacro() 117