Adds writer test case for RCU
[folly.git] / CMake / FollyConfigChecks.cmake
1 include(CheckCXXSourceCompiles)
2 include(CheckCXXSourceRuns)
3 include(CheckFunctionExists)
4 include(CheckIncludeFile)
5 include(CheckSymbolExists)
6 include(CheckTypeSize)
7 include(CheckCXXCompilerFlag)
8
9 CHECK_INCLUDE_FILE_CXX(malloc.h FOLLY_HAVE_MALLOC_H)
10 CHECK_INCLUDE_FILE_CXX(bits/functexcept.h FOLLY_HAVE_BITS_FUNCTEXCEPT_H)
11 CHECK_INCLUDE_FILE_CXX(bits/c++config.h FOLLY_HAVE_BITS_CXXCONFIG_H)
12 CHECK_INCLUDE_FILE_CXX(features.h FOLLY_HAVE_FEATURES_H)
13 CHECK_INCLUDE_FILE_CXX(linux/membarrier.h FOLLY_HAVE_LINUX_MEMBARRIER_H)
14 CHECK_INCLUDE_FILE_CXX(jemalloc/jemalloc.h FOLLY_USE_JEMALLOC)
15
16 if(NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
17   # clang only rejects unknown warning flags if -Werror=unknown-warning-option
18   # is also specified.
19   CHECK_CXX_COMPILER_FLAG(
20     -Werror=unknown-warning-option
21     COMPILER_HAS_UNKNOWN_WARNING_OPTION)
22   if (COMPILER_HAS_UNKNOWN_WARNING_OPTION)
23     list(APPEND CMAKE_REQUIRED_FLAGS -Werror=unknown-warning-option)
24   endif()
25
26   CHECK_CXX_COMPILER_FLAG(-Wshadow-local COMPILER_HAS_W_SHADOW_LOCAL)
27   CHECK_CXX_COMPILER_FLAG(
28     -Wshadow-compatible-local
29     COMPILER_HAS_W_SHADOW_COMPATIBLE_LOCAL)
30   if (COMPILER_HAS_W_SHADOW_LOCAL AND COMPILER_HAS_W_SHADOW_COMPATIBLE_LOCAL)
31     set(FOLLY_HAVE_SHADOW_LOCAL_WARNINGS ON)
32   endif()
33 endif()
34
35 check_symbol_exists(pthread_atfork pthread.h FOLLY_HAVE_PTHREAD_ATFORK)
36
37 # Unfortunately check_symbol_exists() does not work for memrchr():
38 # it fails complaining that there are multiple overloaded versions of memrchr()
39 check_function_exists(memrchr FOLLY_HAVE_MEMRCHR)
40 check_symbol_exists(preadv sys/uio.h FOLLY_HAVE_PREADV)
41 check_symbol_exists(pwritev sys/uio.h FOLLY_HAVE_PWRITEV)
42 check_symbol_exists(clock_gettime time.h FOLLY_HAVE_CLOCK_GETTIME)
43
44 check_function_exists(
45   cplus_demangle_v3_callback
46   FOLLY_HAVE_CPLUS_DEMANGLE_V3_CALLBACK
47 )
48 check_function_exists(malloc_usable_size FOLLY_HAVE_MALLOC_USABLE_SIZE)
49
50 check_cxx_source_compiles("
51   #pragma GCC diagnostic error \"-Wattributes\"
52   extern \"C\" void (*test_ifunc(void))() { return 0; }
53   void func() __attribute__((ifunc(\"test_ifunc\")));
54   int main() { return 0; }"
55   FOLLY_HAVE_IFUNC
56 )
57 check_cxx_source_compiles("
58   #include <type_traits>
59   const bool val = std::is_trivially_copyable<bool>::value;
60   int main() { return 0; }"
61   FOLLY_HAVE_STD__IS_TRIVIALLY_COPYABLE
62 )
63 check_cxx_source_runs("
64   int main(int, char**) {
65     char buf[64] = {0};
66     unsigned long *ptr = (unsigned long *)(buf + 1);
67     *ptr = 0xdeadbeef;
68     return (*ptr & 0xff) == 0xef ? 0 : 1;
69   }"
70   FOLLY_HAVE_UNALIGNED_ACCESS
71 )
72 check_cxx_source_compiles("
73   int main(int argc, char** argv) {
74     unsigned size = argc;
75     char data[size];
76     return 0;
77   }"
78   FOLLY_HAVE_VLA
79 )
80 check_cxx_source_compiles("
81   extern \"C\" void configure_link_extern_weak_test() __attribute__((weak));
82   int main(int argc, char** argv) {
83     return configure_link_extern_weak_test == nullptr;
84   }"
85   FOLLY_HAVE_WEAK_SYMBOLS
86 )
87 check_cxx_source_runs("
88   #include <dlfcn.h>
89   int main() {
90     void *h = dlopen(\"linux-vdso.so.1\", RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
91     if (h == nullptr) {
92       return -1;
93     }
94     dlclose(h);
95     return 0;
96   }"
97   FOLLY_HAVE_LINUX_VDSO
98 )
99
100 check_type_size(__int128 INT128_SIZE LANGUAGE CXX)
101 if (NOT INT128_SIZE STREQUAL "")
102   set(FOLLY_HAVE_INT128_T ON)
103   check_cxx_source_compiles("
104     #include <type_traits>
105     static_assert(
106       ::std::is_same<::std::make_signed<unsigned __int128>::type,
107                      __int128>::value,
108       \"signed form of \`unsigned __uint128\` must be \`__int128\`.\");
109     int main() { return 0; }"
110     HAVE_INT128_TRAITS
111   )
112   if (HAVE_INT128_TRAITS)
113     set(FOLLY_SUPPLY_MISSING_INT128_TRAITS OFF)
114   else()
115     set(FOLLY_SUPPLY_MISSING_INT128_TRAITS ON)
116   endif()
117 endif()
118
119 check_cxx_source_runs("
120   #include <cstddef>
121   #include <cwchar>
122   int main(int argc, char** argv) {
123     return wcstol(L\"01\", nullptr, 10) == 1 ? 0 : 1;
124   }"
125   FOLLY_HAVE_WCHAR_SUPPORT
126 )
127
128 check_cxx_source_compiles("
129   #include <ext/random>
130   int main(int argc, char** argv) {
131     __gnu_cxx::sfmt19937 rng;
132     return 0;
133   }"
134   FOLLY_HAVE_EXTRANDOM_SFMT19937
135 )
136
137 check_cxx_source_compiles("
138   #include <type_traits>
139   #if !_LIBCPP_VERSION
140   #error No libc++
141   #endif
142   void func() {}"
143   FOLLY_USE_LIBCPP
144 )
145
146 check_cxx_source_runs("
147   #include <string.h>
148   #include <errno.h>
149   int main(int argc, char** argv) {
150     char buf[1024];
151     buf[0] = 0;
152     int ret = strerror_r(ENOMEM, buf, sizeof(buf));
153     return ret;
154   }"
155   FOLLY_HAVE_XSI_STRERROR_R
156 )
157
158 check_cxx_source_runs("
159   #include <stdarg.h>
160   #include <stdio.h>
161
162   int call_vsnprintf(const char* fmt, ...) {
163     char buf[256];
164     va_list ap;
165     va_start(ap, fmt);
166     int result = vsnprintf(buf, sizeof(buf), fmt, ap);
167     va_end(ap);
168     return result;
169   }
170
171   int main(int argc, char** argv) {
172     return call_vsnprintf(\"%\", 1) < 0 ? 0 : 1;
173   }"
174   HAVE_VSNPRINTF_ERRORS
175 )
176
177 if (FOLLY_HAVE_LIBGFLAGS)
178   # Older releases of gflags used the namespace "gflags"; newer releases
179   # use "google" but also make symbols available in the deprecated "gflags"
180   # namespace too.  The folly code internally uses "gflags" unless we tell it
181   # otherwise.
182   check_cxx_source_compiles("
183     #include <gflags/gflags.h>
184     int main() {
185       gflags::GetArgv();
186       return 0;
187     }
188     "
189     GFLAGS_NAMESPACE_IS_GFLAGS
190   )
191   if (GFLAGS_NAMESPACE_IS_GFLAGS)
192     set(FOLLY_UNUSUAL_GFLAGS_NAMESPACE OFF)
193     set(FOLLY_GFLAGS_NAMESPACE gflags)
194   else()
195     set(FOLLY_UNUSUAL_GFLAGS_NAMESPACE ON)
196     set(FOLLY_GFLAGS_NAMESPACE google)
197   endif()
198 endif()
199
200 set(FOLLY_USE_SYMBOLIZER OFF)
201 CHECK_INCLUDE_FILE_CXX(elf.h FOLLY_HAVE_ELF_H)
202 find_library(UNWIND_LIBRARIES NAMES unwind)
203 if (UNWIND_LIBRARIES)
204   list(APPEND FOLLY_LINK_LIBRARIES ${UNWIND_LIBRARIES})
205   list(APPEND CMAKE_REQUIRED_LIBRARIES ${UNWIND_LIBRARIES})
206 endif()
207 check_function_exists(backtrace FOLLY_HAVE_BACKTRACE)
208 if (FOLLY_HAVE_ELF_H AND FOLLY_HAVE_BACKTRACE AND LIBDWARF_FOUND)
209   set(FOLLY_USE_SYMBOLIZER ON)
210 endif()
211 message(STATUS "Setting FOLLY_USE_SYMBOLIZER: ${FOLLY_USE_SYMBOLIZER}")