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