xref: /aosp_15_r20/external/google-fruit/configuration/CMakeLists.txt (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
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