diff options
Diffstat (limited to 'storage/innobase/innodb.cmake')
-rw-r--r-- | storage/innobase/innodb.cmake | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/storage/innobase/innodb.cmake b/storage/innobase/innodb.cmake new file mode 100644 index 00000000000..809e58941e9 --- /dev/null +++ b/storage/innobase/innodb.cmake @@ -0,0 +1,285 @@ +# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +# This is the CMakeLists for InnoDB + +INCLUDE(CheckFunctionExists) +INCLUDE(CheckCSourceCompiles) +INCLUDE(CheckCSourceRuns) + +IF(LZ4_INCLUDE_DIR AND LZ4_LIBRARY) + ADD_DEFINITIONS(-DHAVE_LZ4=1) + INCLUDE_DIRECTORIES(${LZ4_INCLUDE_DIR}) +ENDIF() + +# OS tests +IF(UNIX) + IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") + + ADD_DEFINITIONS("-DUNIV_LINUX -D_GNU_SOURCE=1") + + CHECK_INCLUDE_FILES (libaio.h HAVE_LIBAIO_H) + CHECK_LIBRARY_EXISTS(aio io_queue_init "" HAVE_LIBAIO) + + IF(HAVE_LIBAIO_H AND HAVE_LIBAIO) + ADD_DEFINITIONS(-DLINUX_NATIVE_AIO=1) + LINK_LIBRARIES(aio) + ENDIF() + + IF(HAVE_LIBNUMA) + LINK_LIBRARIES(numa) + ENDIF() + + ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "SunOS") + ADD_DEFINITIONS("-DUNIV_SOLARIS") + ENDIF() +ENDIF() + +OPTION(INNODB_COMPILER_HINTS "Compile InnoDB with compiler hints" ON) +MARK_AS_ADVANCED(INNODB_COMPILER_HINTS) + +IF(INNODB_COMPILER_HINTS) + ADD_DEFINITIONS("-DCOMPILER_HINTS") +ENDIF() + +SET(MUTEXTYPE "event" CACHE STRING "Mutex type: event, sys or futex") + +IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU") +# After: WL#5825 Using C++ Standard Library with MySQL code +# we no longer use -fno-exceptions +# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") + +# Add -Wconversion if compiling with GCC +## As of Mar 15 2011 this flag causes 3573+ warnings. If you are reading this +## please fix them and enable the following code: +#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wconversion") + + IF (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR + CMAKE_SYSTEM_PROCESSOR MATCHES "i386") + INCLUDE(CheckCXXCompilerFlag) + CHECK_CXX_COMPILER_FLAG("-fno-builtin-memcmp" HAVE_NO_BUILTIN_MEMCMP) + IF (HAVE_NO_BUILTIN_MEMCMP) + # Work around http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052 + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/rem/rem0cmp.cc + PROPERTIES COMPILE_FLAGS -fno-builtin-memcmp) + ENDIF() + ENDIF() +ENDIF() + +# Enable InnoDB's UNIV_DEBUG in debug builds +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DUNIV_DEBUG") + +OPTION(WITH_INNODB_EXTRA_DEBUG "Enable extra InnoDB debug checks" OFF) +IF(WITH_INNODB_EXTRA_DEBUG) + IF(NOT WITH_DEBUG) + MESSAGE(FATAL_ERROR "WITH_INNODB_EXTRA_DEBUG can be enabled only when WITH_DEBUG is enabled") + ENDIF() + + SET(EXTRA_DEBUG_FLAGS "") + SET(EXTRA_DEBUG_FLAGS "${EXTRA_DEBUG_FLAGS} -DUNIV_AHI_DEBUG") + SET(EXTRA_DEBUG_FLAGS "${EXTRA_DEBUG_FLAGS} -DUNIV_DDL_DEBUG") + SET(EXTRA_DEBUG_FLAGS "${EXTRA_DEBUG_FLAGS} -DUNIV_DEBUG_FILE_ACCESSES") + SET(EXTRA_DEBUG_FLAGS "${EXTRA_DEBUG_FLAGS} -DUNIV_ZIP_DEBUG") + + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${EXTRA_DEBUG_FLAGS}") + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${EXTRA_DEBUG_FLAGS}") +ENDIF() + +CHECK_FUNCTION_EXISTS(sched_getcpu HAVE_SCHED_GETCPU) +IF(HAVE_SCHED_GETCPU) + ADD_DEFINITIONS(-DHAVE_SCHED_GETCPU=1) +ENDIF() + +CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP) +IF(HAVE_NANOSLEEP) + ADD_DEFINITIONS(-DHAVE_NANOSLEEP=1) +ENDIF() + +IF(NOT MSVC) + CHECK_C_SOURCE_RUNS( + " + #define _GNU_SOURCE + #include <fcntl.h> + #include <linux/falloc.h> + int main() + { + /* Ignore the return value for now. Check if the flags exist. + The return value is checked at runtime. */ + fallocate(0, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, 0, 0); + + return(0); + }" + HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE + ) +ENDIF() + +IF(HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE) + ADD_DEFINITIONS(-DHAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE=1) +ENDIF() + +IF(NOT MSVC) +# either define HAVE_IB_GCC_ATOMIC_BUILTINS or not +IF(NOT CMAKE_CROSSCOMPILING) + CHECK_C_SOURCE_RUNS( + "#include<stdint.h> + int main() + { + __sync_synchronize(); + return(0); + }" + HAVE_IB_GCC_SYNC_SYNCHRONISE + ) + CHECK_C_SOURCE_RUNS( + "#include<stdint.h> + int main() + { + __atomic_thread_fence(__ATOMIC_ACQUIRE); + __atomic_thread_fence(__ATOMIC_RELEASE); + return(0); + }" + HAVE_IB_GCC_ATOMIC_THREAD_FENCE + ) + CHECK_C_SOURCE_RUNS( + "#include<stdint.h> + int main() + { + unsigned char a = 0; + unsigned char b = 0; + unsigned char c = 1; + + __atomic_exchange(&a, &b, &c, __ATOMIC_RELEASE); + __atomic_compare_exchange(&a, &b, &c, 0, + __ATOMIC_RELEASE, __ATOMIC_ACQUIRE); + return(0); + }" + HAVE_IB_GCC_ATOMIC_COMPARE_EXCHANGE + ) +ENDIF() + +IF(HAVE_IB_GCC_SYNC_SYNCHRONISE) + ADD_DEFINITIONS(-DHAVE_IB_GCC_SYNC_SYNCHRONISE=1) +ENDIF() + +IF(HAVE_IB_GCC_ATOMIC_THREAD_FENCE) + ADD_DEFINITIONS(-DHAVE_IB_GCC_ATOMIC_THREAD_FENCE=1) +ENDIF() + +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> + + 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)); + + __sync_bool_compare_and_swap(&x1, x2, x3); + + return(0); + }" + HAVE_IB_ATOMIC_PTHREAD_T_GCC) +ENDIF() +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( + " + #include <stdio.h> + #include <unistd.h> + #include <errno.h> + #include <assert.h> + #include <linux/futex.h> + #include <unistd.h> + #include <sys/syscall.h> + + int futex_wait(int* futex, int v) { + return(syscall(SYS_futex, futex, FUTEX_WAIT_PRIVATE, v, NULL, NULL, 0)); + } + + int futex_signal(int* futex) { + return(syscall(SYS_futex, futex, FUTEX_WAKE, 1, NULL, NULL, 0)); + } + + int main() { + int ret; + int m = 1; + + /* It is setup to fail and return EWOULDBLOCK. */ + ret = futex_wait(&m, 0); + assert(ret == -1 && errno == EWOULDBLOCK); + /* Shouldn't wake up any threads. */ + assert(futex_signal(&m) == 0); + + return(0); + }" + HAVE_IB_LINUX_FUTEX) +ENDIF() +IF(HAVE_IB_LINUX_FUTEX) + ADD_DEFINITIONS(-DHAVE_IB_LINUX_FUTEX=1) +ENDIF() + +ENDIF(NOT MSVC) + +CHECK_FUNCTION_EXISTS(asprintf HAVE_ASPRINTF) +CHECK_FUNCTION_EXISTS(vasprintf HAVE_VASPRINTF) + +# Solaris atomics +IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS") + IF(NOT CMAKE_CROSSCOMPILING) + CHECK_C_SOURCE_COMPILES( + "#include <mbarrier.h> + int main() { + __machine_r_barrier(); + __machine_w_barrier(); + return(0); + }" + HAVE_IB_MACHINE_BARRIER_SOLARIS) + ENDIF() + IF(HAVE_IB_MACHINE_BARRIER_SOLARIS) + ADD_DEFINITIONS(-DHAVE_IB_MACHINE_BARRIER_SOLARIS=1) + ENDIF() +ENDIF() + +IF(MSVC) + ADD_DEFINITIONS(-DHAVE_WINDOWS_MM_FENCE) +ENDIF() + +IF(MUTEXTYPE MATCHES "event") + ADD_DEFINITIONS(-DMUTEX_EVENT) +ELSEIF(MUTEXTYPE MATCHES "futex" AND DEFINED HAVE_IB_LINUX_FUTEX) + ADD_DEFINITIONS(-DMUTEX_FUTEX) +ELSE() + ADD_DEFINITIONS(-DMUTEX_SYS) +ENDIF() + +# Include directories under innobase +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/storage/innobase/include + ${CMAKE_SOURCE_DIR}/storage/innobase/handler + ${CMAKE_SOURCE_DIR}/libbinlogevents/include ) + |