Based on:
https://github.com/MariaDB/server/commit/84da1547e6ccc25daa0e7a9b11ae51c51629a923

From 84da1547e6ccc25daa0e7a9b11ae51c51629a923 Mon Sep 17 00:00:00 2001
From: Sergei Golubchik <serg@mariadb.org>
Date: Fri, 23 Oct 2015 22:21:50 +0200
Subject: [PATCH] MDEV-8883 more cross-compiling fixes

use CHECK_C_SOURCE_COMPILES for atomic tests if cross-compiling
(continue to use CHECK_C_SOURCE_RUNS otherwise)

-------------------------
Error log:

/home/timesys/factory/build_armv7l-timesys-linux-uclibcgnueabi/mysql-5.6.51/mysql-server-mysql-5.6.51/storage/innobase/fts/fts0fts.cc:4080:57: error: 'os_atomic_increment_ulint' was not declared in this scope
                                                         os_atomic_increment_ulint(
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/timesys/factory/build_armv7l-timesys-linux-uclibcgnueabi/mysql-5.6.51/mysql-server-mysql-5.6.51/storage/innobase/fts/fts0fts.cc:4080:57: note: suggested alternative: 'os_atomic_inc_ulint'
                                                         os_atomic_increment_ulint(
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
                                                         os_atomic_inc_ulint
/home/timesys/factory/build_armv7l-timesys-linux-uclibcgnueabi/mysql-5.6.51/mysql-server-mysql-5.6.51/storage/innobase/fts/fts0fts.cc:4088:57: error: 'os_atomic_decrement_ulint' was not declared in this scope
                                                         os_atomic_decrement_ulint(
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/timesys/factory/build_armv7l-timesys-linux-uclibcgnueabi/mysql-5.6.51/mysql-server-mysql-5.6.51/storage/innobase/fts/fts0fts.cc:4088:57: note: suggested alternative: 'os_atomic_dec_ulint'
                                                         os_atomic_decrement_ulint(
                                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
                                                         os_atomic_dec_ulint

---
 cmake/compiler_bugs.cmake     | 12 +++++--
 cmake/floating_point.cmake    | 12 +++++--
 storage/innobase/innodb.cmake | 65 ++++++++++++++++++++---------------
 3 files changed, 58 insertions(+), 31 deletions(-)

diff --git a/cmake/compiler_bugs.cmake b/cmake/compiler_bugs.cmake
index 8714fa33..61da3a1b 100644
--- a/cmake/compiler_bugs.cmake
+++ b/cmake/compiler_bugs.cmake
@@ -55,11 +55,19 @@ SET(code "
 ")
 
 IF(CMAKE_COMPILER_IS_GNUCC)
-  CHECK_C_SOURCE_RUNS("${code}" HAVE_C_SHIFT_OR_OPTIMIZATION_BUG)
+  IF(CMAKE_CROSSCOMPILING)
+    CHECK_CXX_SOURCE_COMPILES("${code}" HAVE_C_SHIFT_OR_OPTIMIZATION_BUG)
+  ELSE()
+    CHECK_C_SOURCE_RUNS("${code}" HAVE_C_SHIFT_OR_OPTIMIZATION_BUG)
+  ENDIF()
 ENDIF()
 
 IF(CMAKE_COMPILER_IS_GNUCXX)
-  CHECK_CXX_SOURCE_RUNS("${code}" HAVE_CXX_SHIFT_OR_OPTIMIZATION_BUG)
+  IF(CMAKE_CROSSCOMPILING)
+    CHECK_CXX_SOURCE_COMPILES("${code}" HAVE_CXX_SHIFT_OR_OPTIMIZATION_BUG)
+  ELSE()
+    CHECK_CXX_SOURCE_RUNS("${code}" HAVE_CXX_SHIFT_OR_OPTIMIZATION_BUG)
+  ENDIF()
 ENDIF()
 
 SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}")
diff --git a/cmake/floating_point.cmake b/cmake/floating_point.cmake
index d032f388..8cdafae8 100644
--- a/cmake/floating_point.cmake
+++ b/cmake/floating_point.cmake
@@ -53,11 +53,19 @@ SET(CMAKE_REQUIRED_FLAGS
 )
 
 IF(CMAKE_COMPILER_IS_GNUCC)
-  CHECK_C_SOURCE_RUNS("${code}" HAVE_C_FLOATING_POINT_FUSED_MADD)
+  IF(CMAKE_CROSSCOMPILING)
+    CHECK_CXX_SOURCE_COMPILES("${code}" HAVE_C_FLOATING_POINT_FUSED_MADD)
+  ELSE()
+    CHECK_C_SOURCE_RUNS("${code}" HAVE_C_FLOATING_POINT_FUSED_MADD)
+  ENDIF()
 ENDIF()
 
 IF(CMAKE_COMPILER_IS_GNUCXX)
-  CHECK_CXX_SOURCE_RUNS("${code}" HAVE_CXX_FLOATING_POINT_FUSED_MADD)
+  IF(CMAKE_CROSSCOMPILING)
+    CHECK_CXX_SOURCE_COMPILES("${code}" HAVE_CXX_FLOATING_POINT_FUSED_MADD)
+  ELSE()
+    CHECK_CXX_SOURCE_RUNS("${code}" HAVE_CXX_FLOATING_POINT_FUSED_MADD)
+  ENDIF()
 ENDIF()
 
 SET(CMAKE_REQUIRED_FLAGS
diff --git a/storage/innobase/innodb.cmake b/storage/innobase/innodb.cmake
index c58df349..6fe8a303 100644
--- a/storage/innobase/innodb.cmake
+++ b/storage/innobase/innodb.cmake
@@ -30,6 +30,20 @@ IF(LZ4_LIBRARY)
   ADD_DEFINITIONS(-DHAVE_LZ4=1)
 ENDIF()
 
+IF(CMAKE_CROSSCOMPILING)
+  # Use CHECK_C_SOURCE_COMPILES instead of CHECK_C_SOURCE_RUNS when
+  # cross-compiling. Not as precise, but usually good enough.
+  # This only make sense for atomic tests in this file, this trick doesn't
+  # work in a general case.
+  MACRO(CHECK_C_SOURCE SOURCE VAR)
+    CHECK_C_SOURCE_COMPILES("${SOURCE}" "${VAR}")
+  ENDMACRO()
+ELSE()
+  MACRO(CHECK_C_SOURCE SOURCE VAR)
+    CHECK_C_SOURCE_RUNS("${SOURCE}" "${VAR}")
+  ENDMACRO()
+ENDIF()
+
 # OS tests
 IF(UNIX)
   IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
@@ -110,7 +124,7 @@ IF(HAVE_NANOSLEEP)
 ENDIF()
 
 IF(NOT MSVC)
-  CHECK_C_SOURCE_RUNS(
+  CHECK_C_SOURCE(
   "
   #define _GNU_SOURCE
   #include <fcntl.h>
@@ -132,9 +146,8 @@ IF(HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE)
 ENDIF()
 
 IF(NOT MSVC)
-# either define HAVE_IB_GCC_ATOMIC_BUILTINS or not
-IF(NOT CMAKE_CROSSCOMPILING)
-  CHECK_C_SOURCE_RUNS(
+  # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not
+  CHECK_C_SOURCE(
   "#include<stdint.h>
   int main()
   {
@@ -143,7 +156,7 @@ IF(NOT CMAKE_CROSSCOMPILING)
   }"
   HAVE_IB_GCC_SYNC_SYNCHRONISE
   )
-  CHECK_C_SOURCE_RUNS(
+  CHECK_C_SOURCE(
   "#include<stdint.h>
   int main()
   {
@@ -153,7 +166,7 @@ IF(NOT CMAKE_CROSSCOMPILING)
   }"
   HAVE_IB_GCC_ATOMIC_THREAD_FENCE
   )
-  CHECK_C_SOURCE_RUNS(
+  CHECK_C_SOURCE(
   "#include<stdint.h>
   int main()
   {
@@ -168,7 +181,7 @@ IF(NOT CMAKE_CROSSCOMPILING)
   }"
   HAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE
   )
-ENDIF()
+
 
 IF(HAVE_IB_GCC_SYNC_SYNCHRONISE)
  ADD_DEFINITIONS(-DHAVE_IB_GCC_SYNC_SYNCHRONISE=1)
@@ -182,35 +195,33 @@ IF(HAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE)
  ADD_DEFINITIONS(-DHAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE=1)
 ENDIF()
 
- # either define HAVE_IB_ATOMIC_PTHREAD_T_GCC or not
-IF(NOT CMAKE_CROSSCOMPILING)
-  CHECK_C_SOURCE_RUNS(
-  "
-  #include <pthread.h>
-  #include <string.h>
+# either define HAVE_IB_ATOMIC_PTHREAD_T_GCC or not
+CHECK_C_SOURCE(
+"
+#include <pthread.h>
+#include <string.h>
 
-  int main() {
-    pthread_t       x1;
-    pthread_t       x2;
-    pthread_t       x3;
+int main() {
+  pthread_t       x1;
+  pthread_t       x2;
+  pthread_t       x3;
 
-    memset(&x1, 0x0, sizeof(x1));
-    memset(&x2, 0x0, sizeof(x2));
-    memset(&x3, 0x0, sizeof(x3));
+  memset(&x1, 0x0, sizeof(x1));
+  memset(&x2, 0x0, sizeof(x2));
+  memset(&x3, 0x0, sizeof(x3));
 
-    __sync_bool_compare_and_swap(&x1, x2, x3);
+  __sync_bool_compare_and_swap(&x1, x2, x3);
 
-    return(0);
-  }"
-  HAVE_IB_ATOMIC_PTHREAD_T_GCC)
-ENDIF()
+  return(0);
+}"
+HAVE_IB_ATOMIC_PTHREAD_T_GCC)
 IF(HAVE_IB_ATOMIC_PTHREAD_T_GCC)
   ADD_DEFINITIONS(-DHAVE_IB_ATOMIC_PTHREAD_T_GCC=1)
 ENDIF()
 
 # Only use futexes on Linux if GCC atomics are available
-IF(NOT MSVC AND NOT CMAKE_CROSSCOMPILING)
-  CHECK_C_SOURCE_RUNS(
+IF(NOT MSVC)
+  CHECK_C_SOURCE(
   "
   #include <stdio.h>
   #include <unistd.h>
-- 
2.25.1

