1*a65addddSAndroid Build Coastguard Worker 2*a65addddSAndroid Build Coastguard Workerinclude(CheckCXXSourceCompiles) 3*a65addddSAndroid Build Coastguard Worker 4*a65addddSAndroid Build Coastguard Workerif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") 5*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST ${FRUIT_ADDITIONAL_COMPILE_FLAGS_GNU}) 6*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^Clang$") 7*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Clang}) 8*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel") 9*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST ${FRUIT_ADDITIONAL_COMPILE_FLAGS_Intel}) 10*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang") 11*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST ${FRUIT_ADDITIONAL_COMPILE_FLAGS_AppleClang}) 12*a65addddSAndroid Build Coastguard Workerelseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") 13*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST ${FRUIT_ADDITIONAL_COMPILE_FLAGS_MSVC}) 14*a65addddSAndroid Build Coastguard Workerendif() 15*a65addddSAndroid Build Coastguard Worker 16*a65addddSAndroid Build Coastguard Worker# `CMAKE_REQUIRED_FLAGS` does not accept variables of type list, convert to string. 17*a65addddSAndroid Build Coastguard Workerforeach(FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST_ITEM IN LISTS FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST) 18*a65addddSAndroid Build Coastguard Worker set(FRUIT_ADDITIONAL_REQUIRED_FLAGS "${FRUIT_ADDITIONAL_REQUIRED_FLAGS} ${FRUIT_ADDITIONAL_REQUIRED_FLAG_LIST_ITEM}") 19*a65addddSAndroid Build Coastguard Workerendforeach() 20*a65addddSAndroid Build Coastguard Worker 21*a65addddSAndroid Build Coastguard Workerif ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") 22*a65addddSAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} ${FRUIT_ADDITIONAL_REQUIRED_FLAGS} ${FRUIT_CXX_STANDARD_FLAGS}") 23*a65addddSAndroid Build Coastguard Workerelse() 24*a65addddSAndroid Build Coastguard Worker set(CMAKE_REQUIRED_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} ${FRUIT_ADDITIONAL_REQUIRED_FLAGS} ${FRUIT_CXX_STANDARD_FLAGS}") 25*a65addddSAndroid Build Coastguard Workerendif() 26*a65addddSAndroid Build Coastguard Worker 27*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 28*a65addddSAndroid Build Coastguard Workerint main() {} 29*a65addddSAndroid Build Coastguard Worker" 30*a65addddSAndroid Build Coastguard WorkerFRUIT_TRIVIAL_SOURCE_COMPILES) 31*a65addddSAndroid Build Coastguard Worker 32*a65addddSAndroid Build Coastguard Workerif (NOT "${FRUIT_TRIVIAL_SOURCE_COMPILES}") 33*a65addddSAndroid Build Coastguard Worker 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.") 34*a65addddSAndroid Build Coastguard Workerendif() 35*a65addddSAndroid Build Coastguard Worker 36*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 37*a65addddSAndroid Build Coastguard Workertemplate <typename T, typename U> 38*a65addddSAndroid Build Coastguard Workerstruct Pair {}; 39*a65addddSAndroid Build Coastguard Worker 40*a65addddSAndroid Build Coastguard Workerstruct Map : public Pair<int, float>, Pair<int, char> {}; 41*a65addddSAndroid Build Coastguard Worker 42*a65addddSAndroid Build Coastguard Workertemplate <typename Value> 43*a65addddSAndroid Build Coastguard WorkerValue f(Pair<int, Value>*) { return Value(); } 44*a65addddSAndroid Build Coastguard Worker 45*a65addddSAndroid Build Coastguard Workerint main() { 46*a65addddSAndroid Build Coastguard Worker f((Map*)0); 47*a65addddSAndroid Build Coastguard Worker} 48*a65addddSAndroid Build Coastguard Worker" 49*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_CLANG_ARBITRARY_OVERLOAD_RESOLUTION_BUG) 50*a65addddSAndroid Build Coastguard Worker 51*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 52*a65addddSAndroid Build Coastguard Workerint main() { 53*a65addddSAndroid Build Coastguard Worker bool b = __has_trivial_copy(int); 54*a65addddSAndroid Build Coastguard Worker (void) b; 55*a65addddSAndroid Build Coastguard Worker return 0; 56*a65addddSAndroid Build Coastguard Worker} 57*a65addddSAndroid Build Coastguard Worker" 58*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_HAS_TRIVIAL_COPY) 59*a65addddSAndroid Build Coastguard Worker 60*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 61*a65addddSAndroid Build Coastguard Workerint main() { 62*a65addddSAndroid Build Coastguard Worker bool b = __is_trivially_copyable(int); 63*a65addddSAndroid Build Coastguard Worker (void) b; 64*a65addddSAndroid Build Coastguard Worker return 0; 65*a65addddSAndroid Build Coastguard Worker} 66*a65addddSAndroid Build Coastguard Worker" 67*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_IS_TRIVIALLY_COPYABLE) 68*a65addddSAndroid Build Coastguard Worker 69*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 70*a65addddSAndroid Build Coastguard Worker#include <cstddef> 71*a65addddSAndroid Build Coastguard Workerusing X = max_align_t; 72*a65addddSAndroid Build Coastguard Workerint main() { 73*a65addddSAndroid Build Coastguard Worker return 0; 74*a65addddSAndroid Build Coastguard Worker} 75*a65addddSAndroid Build Coastguard Worker" 76*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_MAX_ALIGN_T) 77*a65addddSAndroid Build Coastguard Worker 78*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 79*a65addddSAndroid Build Coastguard Worker#include <type_traits> 80*a65addddSAndroid Build Coastguard Workerint main() { 81*a65addddSAndroid Build Coastguard Worker bool b = std::is_trivially_copyable<int>::value; 82*a65addddSAndroid Build Coastguard Worker (void) b; 83*a65addddSAndroid Build Coastguard Worker return 0; 84*a65addddSAndroid Build Coastguard Worker} 85*a65addddSAndroid Build Coastguard Worker" 86*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE) 87*a65addddSAndroid Build Coastguard Worker 88*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 89*a65addddSAndroid Build Coastguard Worker#include <type_traits> 90*a65addddSAndroid Build Coastguard Workerint main() { 91*a65addddSAndroid Build Coastguard Worker bool b = std::is_trivially_copy_constructible<int>::value; 92*a65addddSAndroid Build Coastguard Worker (void) b; 93*a65addddSAndroid Build Coastguard Worker return 0; 94*a65addddSAndroid Build Coastguard Worker} 95*a65addddSAndroid Build Coastguard Worker" 96*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_STD_IS_TRIVIALLY_COPY_CONSTRUCTIBLE) 97*a65addddSAndroid Build Coastguard Worker 98*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 99*a65addddSAndroid Build Coastguard Worker#include <cstddef> 100*a65addddSAndroid Build Coastguard Workerusing X = std::max_align_t; 101*a65addddSAndroid Build Coastguard Workerint main() { 102*a65addddSAndroid Build Coastguard Worker return 0; 103*a65addddSAndroid Build Coastguard Worker} 104*a65addddSAndroid Build Coastguard Worker" 105*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_STD_MAX_ALIGN_T) 106*a65addddSAndroid Build Coastguard Worker 107*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 108*a65addddSAndroid Build Coastguard Worker#include <typeinfo> 109*a65addddSAndroid Build Coastguard Workerint main() { 110*a65addddSAndroid Build Coastguard Worker (void) typeid(int); 111*a65addddSAndroid Build Coastguard Worker return 0; 112*a65addddSAndroid Build Coastguard Worker} 113*a65addddSAndroid Build Coastguard Worker" 114*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_TYPEID) 115*a65addddSAndroid Build Coastguard Worker 116*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 117*a65addddSAndroid Build Coastguard Worker#include <typeinfo> 118*a65addddSAndroid Build Coastguard Workerint main() { 119*a65addddSAndroid Build Coastguard Worker constexpr static const std::type_info& x = typeid(int); 120*a65addddSAndroid Build Coastguard Worker (void) x; 121*a65addddSAndroid Build Coastguard Worker return 0; 122*a65addddSAndroid Build Coastguard Worker} 123*a65addddSAndroid Build Coastguard Worker" 124*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_CONSTEXPR_TYPEID) 125*a65addddSAndroid Build Coastguard Worker 126*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 127*a65addddSAndroid Build Coastguard Worker#include <cxxabi.h> 128*a65addddSAndroid Build Coastguard Workerint main() { 129*a65addddSAndroid Build Coastguard Worker auto* p = abi::__cxa_demangle; 130*a65addddSAndroid Build Coastguard Worker (void) p; 131*a65addddSAndroid Build Coastguard Worker return 0; 132*a65addddSAndroid Build Coastguard Worker} 133*a65addddSAndroid Build Coastguard Worker" 134*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_CXA_DEMANGLE) 135*a65addddSAndroid Build Coastguard Worker 136*a65addddSAndroid Build Coastguard Workerif("${FRUIT_ENABLE_COVERAGE}") 137*a65addddSAndroid Build Coastguard Worker set(FRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE OFF) 138*a65addddSAndroid Build Coastguard Worker set(FRUIT_HAS_FORCEINLINE OFF) 139*a65addddSAndroid Build Coastguard Workerelse() 140*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 141*a65addddSAndroid Build Coastguard Worker__attribute__((always_inline)) 142*a65addddSAndroid Build Coastguard Workervoid f() { 143*a65addddSAndroid Build Coastguard Worker} 144*a65addddSAndroid Build Coastguard Worker 145*a65addddSAndroid Build Coastguard Workerint main() { 146*a65addddSAndroid Build Coastguard Worker return 0; 147*a65addddSAndroid Build Coastguard Worker} 148*a65addddSAndroid Build Coastguard Worker" 149*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_ALWAYS_INLINE_ATTRIBUTE) 150*a65addddSAndroid Build Coastguard Worker 151*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 152*a65addddSAndroid Build Coastguard Worker__forceinline 153*a65addddSAndroid Build Coastguard Workervoid f() { 154*a65addddSAndroid Build Coastguard Worker} 155*a65addddSAndroid Build Coastguard Worker 156*a65addddSAndroid Build Coastguard Workerint main() { 157*a65addddSAndroid Build Coastguard Worker return 0; 158*a65addddSAndroid Build Coastguard Worker} 159*a65addddSAndroid Build Coastguard Worker" 160*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_FORCEINLINE) 161*a65addddSAndroid Build Coastguard Worker 162*a65addddSAndroid Build Coastguard Workerendif() 163*a65addddSAndroid Build Coastguard Worker 164*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 165*a65addddSAndroid Build Coastguard Worker[[deprecated]] void f(); 166*a65addddSAndroid Build Coastguard Worker 167*a65addddSAndroid Build Coastguard Workerint main() { 168*a65addddSAndroid Build Coastguard Worker return 0; 169*a65addddSAndroid Build Coastguard Worker} 170*a65addddSAndroid Build Coastguard Worker" 171*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_ATTRIBUTE_DEPRECATED) 172*a65addddSAndroid Build Coastguard Worker 173*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 174*a65addddSAndroid Build Coastguard Workervoid f() __attribute__((deprecated)); 175*a65addddSAndroid Build Coastguard Worker 176*a65addddSAndroid Build Coastguard Workerint main() { 177*a65addddSAndroid Build Coastguard Worker return 0; 178*a65addddSAndroid Build Coastguard Worker} 179*a65addddSAndroid Build Coastguard Worker" 180*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED) 181*a65addddSAndroid Build Coastguard Worker 182*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 183*a65addddSAndroid Build Coastguard Worker__declspec(deprecated) void f(); 184*a65addddSAndroid Build Coastguard Worker 185*a65addddSAndroid Build Coastguard Workerint main() { 186*a65addddSAndroid Build Coastguard Worker return 0; 187*a65addddSAndroid Build Coastguard Worker} 188*a65addddSAndroid Build Coastguard Worker" 189*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_DECLSPEC_DEPRECATED) 190*a65addddSAndroid Build Coastguard Worker 191*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 192*a65addddSAndroid Build Coastguard Workerint f() { 193*a65addddSAndroid Build Coastguard Worker static int x = 1; 194*a65addddSAndroid Build Coastguard Worker if (x == 1) { 195*a65addddSAndroid Build Coastguard Worker return 0; 196*a65addddSAndroid Build Coastguard Worker } else { 197*a65addddSAndroid Build Coastguard Worker __assume(0); 198*a65addddSAndroid Build Coastguard Worker // Note: the lack of return here is intentional 199*a65addddSAndroid Build Coastguard Worker } 200*a65addddSAndroid Build Coastguard Worker} 201*a65addddSAndroid Build Coastguard Worker 202*a65addddSAndroid Build Coastguard Workerint main() { 203*a65addddSAndroid Build Coastguard Worker return f(); 204*a65addddSAndroid Build Coastguard Worker} 205*a65addddSAndroid Build Coastguard Worker" 206*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_MSVC_ASSUME) 207*a65addddSAndroid Build Coastguard Worker 208*a65addddSAndroid Build Coastguard WorkerCHECK_CXX_SOURCE_COMPILES(" 209*a65addddSAndroid Build Coastguard Workerint f() { 210*a65addddSAndroid Build Coastguard Worker static int x = 1; 211*a65addddSAndroid Build Coastguard Worker if (x == 1) { 212*a65addddSAndroid Build Coastguard Worker return 0; 213*a65addddSAndroid Build Coastguard Worker } else { 214*a65addddSAndroid Build Coastguard Worker __builtin_unreachable(); 215*a65addddSAndroid Build Coastguard Worker // Note: the lack of return here is intentional 216*a65addddSAndroid Build Coastguard Worker } 217*a65addddSAndroid Build Coastguard Worker} 218*a65addddSAndroid Build Coastguard Worker 219*a65addddSAndroid Build Coastguard Workerint main() { 220*a65addddSAndroid Build Coastguard Worker return f(); 221*a65addddSAndroid Build Coastguard Worker} 222*a65addddSAndroid Build Coastguard Worker" 223*a65addddSAndroid Build Coastguard WorkerFRUIT_HAS_BUILTIN_UNREACHABLE) 224*a65addddSAndroid Build Coastguard Worker 225*a65addddSAndroid Build Coastguard Worker 226*a65addddSAndroid Build Coastguard Workerif (NOT "${FRUIT_HAS_STD_MAX_ALIGN_T}" AND NOT "${FRUIT_HAS_MAX_ALIGN_T}") 227*a65addddSAndroid Build Coastguard Worker 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.") 228*a65addddSAndroid Build Coastguard Workerendif() 229*a65addddSAndroid Build Coastguard Worker 230*a65addddSAndroid Build Coastguard Workerif(NOT "${FRUIT_HAS_STD_IS_TRIVIALLY_COPYABLE}" AND NOT "${FRUIT_HAS_IS_TRIVIALLY_COPYABLE}" 231*a65addddSAndroid Build Coastguard Worker AND NOT "${FRUIT_HAS_HAS_TRIVIAL_COPY}") 232*a65addddSAndroid Build Coastguard Worker 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.") 233*a65addddSAndroid Build Coastguard Workerendif() 234*a65addddSAndroid Build Coastguard Worker 235*a65addddSAndroid Build Coastguard Workerif (NOT "${FRUIT_HAS_ATTRIBUTE_DEPRECATED}" AND NOT "${FRUIT_HAS_GCC_ATTRIBUTE_DEPRECATED}" AND NOT "${FRUIT_HAS_DECLSPEC_DEPRECATED}") 236*a65addddSAndroid Build Coastguard Worker message(WARNING "No supported way to mark functions as deprecated was found. Continuing anyway, without the 'deprecated' markers.") 237*a65addddSAndroid Build Coastguard Workerendif() 238*a65addddSAndroid Build Coastguard Worker 239*a65addddSAndroid Build Coastguard Workerconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/fruit-config-base.h.in ${CMAKE_CURRENT_BINARY_DIR}/../include/fruit/impl/fruit-config-base.h) 240*a65addddSAndroid Build Coastguard Worker 241*a65addddSAndroid Build Coastguard Workerinstall(FILES ${CMAKE_CURRENT_BINARY_DIR}/../include/fruit/impl/fruit-config-base.h 242*a65addddSAndroid Build Coastguard Worker DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fruit/impl) 243