cmake: add checks to generate folly-config.h correctly
[folly.git] / CMake / FollyConfigChecks.cmake
diff --git a/CMake/FollyConfigChecks.cmake b/CMake/FollyConfigChecks.cmake
new file mode 100644 (file)
index 0000000..b7da815
--- /dev/null
@@ -0,0 +1,61 @@
+include(CheckCXXSourceCompiles)
+include(CheckCXXSourceRuns)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CheckSymbolExists)
+
+CHECK_INCLUDE_FILE_CXX(malloc.h FOLLY_HAVE_MALLOC_H)
+CHECK_INCLUDE_FILE_CXX(bits/functexcept.h FOLLY_HAVE_BITS_FUNCTEXCEPT_H)
+
+if (FOLLY_HAVE_PTHREAD)
+  set(CMAKE_REQUIRED_LIBRARIES
+      "${CMAKE_REQUIRED_LIBRARIES} ${LIBPTHREAD_LIBRARIES}")
+  set(CMAKE_REQUIRED_INCLUDES
+      "${CMAKE_REQUIRED_INCLUDES} ${LIBPTHREAD_INCLUDE_DIRS}")
+endif()
+check_symbol_exists(pthread_atfork pthread.h FOLLY_HAVE_PTHREAD_ATFORK)
+
+# Unfortunately check_symbol_exists() does not work for memrchr():
+# it fails complaining that there are multiple overloaded versions of memrchr()
+check_function_exists(memrchr FOLLY_HAVE_MEMRCHR)
+check_symbol_exists(preadv sys/uio.h FOLLY_HAVE_PREADV)
+check_symbol_exists(pwritev sys/uio.h FOLLY_HAVE_PWRITEV)
+check_symbol_exists(clock_gettime time.h FOLLY_HAVE_CLOCK_GETTIME)
+
+check_cxx_source_compiles("
+  #pragma GCC diagnostic error \"-Wattributes\"
+  extern \"C\" void (*test_ifunc(void))() { return 0; }
+  void func() __attribute__((ifunc(\"test_ifunc\")));
+  int main() { return 0; }"
+  FOLLY_HAVE_IFUNC
+)
+check_cxx_source_compiles("
+  #include <type_traits>
+  const bool val = std::is_trivially_copyable<bool>::value;
+  int main() { return 0; }"
+  FOLLY_HAVE_STD__IS_TRIVIALLY_COPYABLE
+)
+check_cxx_source_runs("
+  int main(int, char**) {
+    char buf[64] = {0};
+    unsigned long *ptr = (unsigned long *)(buf + 1);
+    *ptr = 0xdeadbeef;
+    return (*ptr & 0xff) == 0xef ? 0 : 1;
+  }"
+  FOLLY_HAVE_UNALIGNED_ACCESS
+)
+check_cxx_source_compiles("
+  int main(int argc, char** argv) {
+    unsigned size = argc;
+    char data[size];
+    return 0;
+  }"
+  FOLLY_HAVE_VLA
+)
+check_cxx_source_compiles("
+  extern \"C\" void configure_link_extern_weak_test() __attribute__((weak));
+  int main(int argc, char** argv) {
+    return configure_link_extern_weak_test == nullptr;
+  }"
+  FOLLY_HAVE_WEAK_SYMBOLS
+)