You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
4.4 KiB
222 lines
4.4 KiB
|
|
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)
|