| |
| include(CheckCXXSourceCompiles) |
| |
| set(CMAKE_REQUIRED_FLAGS "${FRUIT_COMPILE_FLAGS}") |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| int main() {} |
| " |
| FRUIT_TRIVIAL_SOURCE_COMPILES) |
| |
| if (NOT "${FRUIT_TRIVIAL_SOURCE_COMPILES}") |
| message(FATAL_ERROR "A trivial program with an empty main doesn't compile, something is wrong with your compiler and/or with your compiler flags.") |
| endif() |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| template <typename T, typename U> |
| struct Pair {}; |
| |
| struct Map : public Pair<int, float>, Pair<int, char> {}; |
| |
| template <typename Value> |
| Value f(Pair<int, Value>*) { return Value(); } |
| |
| int main() { |
| f((Map*)0); |
| } |
| " |
| FRUIT_HAS_CLANG_ARBITRARY_OVERLOAD_RESOLUTION_BUG) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| int main() { |
| bool b = __has_trivial_copy(int); |
| (void) b; |
| return 0; |
| } |
| " |
| FRUIT_HAS_HAS_TRIVIAL_COPY) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| int main() { |
| bool b = __is_trivially_copyable(int); |
| (void) b; |
| return 0; |
| } |
| " |
| FRUIT_HAS_IS_TRIVIALLY_COPYABLE) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <cstddef> |
| using X = max_align_t; |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_MAX_ALIGN_T) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <type_traits> |
| int main() { |
| bool b = std::is_trivially_copyable<int>::value; |
| (void) b; |
| return 0; |
| } |
| " |
| FRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <type_traits> |
| int main() { |
| bool b = std::is_trivially_copy_constructible<int>::value; |
| (void) b; |
| return 0; |
| } |
| " |
| FRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <cstddef> |
| using X = std::max_align_t; |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_STD_MAX_ALIGN_T) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <typeinfo> |
| int main() { |
| (void) typeid(int); |
| return 0; |
| } |
| " |
| FRUIT_HAS_TYPEID) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <typeinfo> |
| int main() { |
| constexpr static const std::type_info& x = typeid(int); |
| (void) x; |
| return 0; |
| } |
| " |
| FRUIT_HAS_CONSTEXPR_TYPEID) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| #include <cxxabi.h> |
| int main() { |
| auto* p = abi::__cxa_demangle; |
| (void) p; |
| return 0; |
| } |
| " |
| FRUIT_HAS_CXA_DEMANGLE) |
| |
| if("${FRUIT_ENABLE_COVERAGE}") |
| set(FRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE OFF) |
| set(FRUIT_HAS_FORCEINLINE OFF) |
| else() |
| CHECK_CXX_SOURCE_COMPILES(" |
| __attribute__((always_inline)) |
| void f() { |
| } |
| |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| __forceinline |
| void f() { |
| } |
| |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_FORCEINLINE) |
| |
| endif() |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| [[deprecated]] void f(); |
| |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_ATTRIBUTE_DEPRECATED) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| void f() __attribute__((deprecated)); |
| |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| __declspec(deprecated) void f(); |
| |
| int main() { |
| return 0; |
| } |
| " |
| FRUIT_HAS_DECLSPEC_DEPRECATED) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| int f() { |
| static int x = 1; |
| if (x == 1) { |
| return 0; |
| } else { |
| __assume(0); |
| // Note: the lack of return here is intentional |
| } |
| } |
| |
| int main() { |
| return f(); |
| } |
| " |
| FRUIT_HAS_MSVC_ASSUME) |
| |
| CHECK_CXX_SOURCE_COMPILES(" |
| int f() { |
| static int x = 1; |
| if (x == 1) { |
| return 0; |
| } else { |
| __builtin_unreachable(); |
| // Note: the lack of return here is intentional |
| } |
| } |
| |
| int main() { |
| return f(); |
| } |
| " |
| FRUIT_HAS_BUILTIN_UNREACHABLE) |
| |
| |
| if (NOT "${FRUIT_HAS_STD_MAX_ALIGN_T}" AND NOT "${FRUIT_HAS_MAX_ALIGN_T}") |
| message(WARNING "The current C++ standard library doesn't support std::max_align_t nor ::max_align_t. Attempting to use std::max_align_t anyway, but it most likely won't work.") |
| endif() |
| |
| if(NOT "${FRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE}" AND NOT "${FRUIT_HAS_IS_TRIVIALLY_COPYABLE}" |
| AND NOT "${FRUIT_HAS_HAS_TRIVIAL_COPY}") |
| message(WARNING "The current standard library doesn't support std::is_trivially_copyable<T>, and the current compiler doesn't support __is_trivially_copyable(T) nor __has_trivial_copy(T). Attemping to use std::is_trivially_copyable<T> anyway, but it most likely won't work.") |
| endif() |
| |
| if (NOT "${FRUIT_HAS_ATTRIBUTE_DEPRECATED}" AND NOT "${FRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED}" AND NOT "${FRUIT_HAS_DECLSPEC_DEPRECATED}") |
| message(WARNING "No supported way to mark functions as deprecated was found. Continuing anyway, without the 'deprecated' markers.") |
| endif() |
| |
| configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fruit-config-base.h.in ${CMAKE_CURRENT_BINARY_DIR}/../include/fruit/impl/fruit-config-base.h) |
| |
| install(FILES ${CMAKE_CURRENT_BINARY_DIR}/../include/fruit/impl/fruit-config-base.h |
| DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fruit/impl) |