Newer
Older
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
set(CMAKE_INCLUDE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_INCLUDE_PATH})
include(CheckLibraryExists)
include(CheckIncludeFile)
include(CheckCCompilerFlag)
include(CheckSymbolExists)
include(CheckCSourceRuns)
Dmitry Simonenko
committed
include(CheckCXXSourceRuns)
include(CheckCSourceCompiles)
include(CheckCXXSourceCompiles)
include(CheckFunctionExists)
include(FindOptionalPackage)
find_program(ECHO echo)
find_program(XSLTPROC xsltproc)
find_program(XMLLINT xmllint)
find_program(JING jing)
find_program(LYNX lynx)
find_program(CAT cat)
find_program(GIT git)
Konstantin Osipov
committed
find_program(LD ld)
# Define PACKAGE macro in tarantool/config.h
set (PACKAGE "Tarantool")
#
# Set default build type to Debug. This is to ease a developer's
# life. Release binaries are built by BuildBot automatically anyway.
#
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
endif()
# Define GNU standard installation directories
include(GNUInstallDirs)
include(cmake/utils.cmake)
# the order is significant: we need to know os and compiler to configure libs
include(cmake/arch.cmake)
include(cmake/os.cmake)
include(cmake/compiler.cmake)
include(cmake/simd.cmake)
include(cmake/profile.cmake)
include(cmake/FindReadline.cmake)
if (NOT READLINE_FOUND)
message(FATAL_ERROR "readline library not found.")
endif()
check_symbol_exists(MAP_ANON sys/mman.h HAVE_MAP_ANON)
check_symbol_exists(MAP_ANONYMOUS sys/mman.h HAVE_MAP_ANONYMOUS)
check_include_file(sys/time.h HAVE_SYS_TIME_H)
check_include_file(unwind.h HAVE_UNWIND_H)
check_include_file(cpuid.h HAVE_CPUID_H)
check_include_file(sys/prctl.h HAVE_PRCTL_H)
check_symbol_exists(O_DSYNC fcntl.h HAVE_O_DSYNC)
check_symbol_exists(fdatasync unistd.h HAVE_FDATASYNC)
check_function_exists(memmem HAVE_MEMMEM)
check_function_exists(memrchr HAVE_MEMRCHR)
check_function_exists(sendfile HAVE_SENDFILE)
if (HAVE_SENDFILE)
if (TARGET_OS_LINUX)
set(HAVE_SENDFILE_LINUX 1)
else(HAVE_SENDFILE)
set(HAVE_SENDFILE_BSD 1)
endif()
check_function_exists(open_memstream HAVE_OPEN_MEMSTREAM)
check_function_exists(fmemopen HAVE_FMEMOPEN)
check_function_exists(funopen HAVE_FUNOPEN)
#
# Some versions of GNU libc define non-portable __libc_stack_end
# which we use to determine the end (or beginning, actually) of
# stack. Find whether or not it's present.
check_library_exists("" __libc_stack_end "" HAVE_LIBC_STACK_END)
Konstantin Osipov
committed
# Enable 'make tags' target.
Konstantin Osipov
committed
add_custom_target(tags COMMAND ctags -R -f tags
Konstantin Osipov
committed
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
# Define PACKAGE_VERSION -- a string constant with tarantool version.
set (PACKAGE_VERSION "")
# Get git version only if source directory has .git repository, this
# avoids git to search .git repository in parent
# directories.
#
if (EXISTS "${CMAKE_SOURCE_DIR}/.git")
execute_process (COMMAND ${GIT} describe HEAD
OUTPUT_VARIABLE PACKAGE_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
if (PACKAGE_VERSION STREQUAL "")
message (FATAL_ERROR "Failed to retrive git version.")
endif()
endif()
set (VERSION_FILE "${CMAKE_SOURCE_DIR}/VERSION")
# Update version file or use it when there is no git
# repository within sources (source tarballs).
#
if (PACKAGE_VERSION STREQUAL "")
if (NOT EXISTS "${VERSION_FILE}")
message (FATAL_ERROR "Version file ${VERSION_FILE} does not exists.")
endif()
message (WARNING "Using version from version file ${VERSION_FILE}")
execute_process (COMMAND ${CAT} ${VERSION_FILE}
OUTPUT_VARIABLE PACKAGE_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (PACKAGE_VERSION STREQUAL "")
message (FATAL_ERROR "Unable to retrive version from git or ${VERSION_FILE} file.")
endif()
else()
file(WRITE ${VERSION_FILE} "${PACKAGE_VERSION}\n")
#
# Specify where to look for include files.
#
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(${PROJECT_BINARY_DIR}/src)
include_directories(${PROJECT_SOURCE_DIR}/src/lib)
include_directories(${PROJECT_SOURCE_DIR})
#
# Specify Tarantool modules prefixes
#
set(MODULE_SUFFIX "tarantool")
set(MODULE_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${MODULE_SUFFIX}")
set(MODULE_LUADIR "${CMAKE_INSTALL_DATADIR}/${MODULE_SUFFIX}")
set(MODULE_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/${MODULE_SUFFIX}")
foreach(dir
LIBDIR
LUADIR
INCLUDEDIR
)
if(NOT IS_ABSOLUTE ${MODULE_${dir}})
set(MODULE_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${MODULE_${dir}}")
else()
set(MODULE_FULL_${dir} "${MODULE_${dir}}")
endif()
endforeach()
message(STATUS "Module sources: ${MODULE_FULL_LUADIR}")
message(STATUS "Module libraries: ${MODULE_FULL_LIBDIR}")
message(STATUS "Module includes: ${MODULE_FULL_INCLUDEDIR}")
list(APPEND MODULE_LUAPATH "${MODULE_FULL_LUADIR}/?.lua")
list(APPEND MODULE_LUAPATH "${MODULE_FULL_LUADIR}/?/init.lua")
list(APPEND MODULE_LIBPATH "${MODULE_FULL_LIBDIR}/?${CMAKE_SHARED_MODULE_SUFFIX}")
message(STATUS "Module package.path: ${MODULE_LUAPATH}")
message(STATUS "Module package.cpath: ${MODULE_LIBPATH}")
#
# Now handle all configuration options.
#
option(ENABLE_DOC "Enable building of documentation" OFF)
Dmitry Simonenko
committed
option(ENABLE_TRACE "Enable debug trace of tarantool_box execution to
a file specified in TARANTOOL_TRACE environment variable" ON)
option(ENABLE_BACKTRACE "Enable output of fiber backtrace information in 'show
fiber' administrative command. Only works on x86 architectures, if compiled
with gcc. If GNU binutils and binutils-dev libraries are installed, backtrace
is output with resolved function (symbol) names. Otherwise only frame
addresses are printed." ${CMAKE_COMPILER_IS_GNUCC})
if (ENABLE_BACKTRACE)
if (NOT ${CMAKE_COMPILER_IS_GNUCC} OR
NOT (${CMAKE_SYSTEM_PROCESSOR} MATCHES "86|amd64"))
# We only know this option to work with gcc
# on x86 architecture.
message (FATAL_ERROR "ENABLE_BACKTRACE option is set but the system is not x86 based (${CMAKE_SYSTEM_PROCESSOR}) or the compiler is not GNU GCC (${CMAKE_C_COMPILER}).")
endif()
Dmitry Simonenko
committed
# Use GNU bfd if present.
check_library_exists (bfd bfd_init "" HAVE_BFD_LIB)
check_library_exists (iberty cplus_demangle "" HAVE_IBERTY_LIB)
set(CMAKE_REQUIRED_DEFINITIONS -DPACKAGE=${PACKAGE} -DPACKAGE_VERSION=${PACKAGE_VERSION})
check_include_file(bfd.h HAVE_BFD_H)
set(CMAKE_REQUIRED_DEFINITIONS)
if (HAVE_BFD_LIB AND HAVE_BFD_H AND HAVE_IBERTY_LIB)
endif()
endif()
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
##
## Third-Party libraries
##
#
# Since we *optionally* build bundled libs, a direct build
# dependency between tarantool_box and libluajit/libobjc won't
# work: add an empty custom target for this dependency instead.
# If a bundled objc or luajit is built, it is added to the
# dependency list of build_bundled_libs target.
#
add_custom_target(build_bundled_libs)
#
# LibLUAJIT
#
include(luajit)
#
# LibEV
#
#
# Currently our code uses libev with #define EV_MULTIPLICITY 0.
# This option means that libev has a global variable with
# struct ev_loop data.
# Such design is not compatible with the dynamic version of libev
# provided by distros.
set(ENABLE_BUNDLED_LIBEV ON)
include(BuildLibEV)
libev_build()
add_dependencies(build_bundled_libs ev)
#
# LibEIO
#
option(ENABLE_BUNDLED_LIBEIO "Enable building of the bundled libeio" ON)
if (ENABLE_BUNDLED_LIBEIO)
include(BuildLibEIO)
libeio_build()
add_dependencies(build_bundled_libs eio)
else()
set(LIBEIO_FIND_REQUIRED ON)
find_package(LibEIO)
endif()
#
# LibCORO
#
#
# Tarantool uses 'coro' (coroutines) library to implement
# cooperative multi-tasking. Since coro.h is included
# universally, define the underlying implementation switch
# in the top level CMakeLists.txt, to ensure a consistent
# header file layout across the entire project.
#
set(ENABLE_BUNDLED_LIBCORO ON)
include(BuildLibCORO)
libcoro_build()
add_dependencies(build_bundled_libs coro)
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "86" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "amd64")
add_definitions("-DCORO_ASM")
else()
add_definitions("-DCORO_SJLJ")
endif()
#
# LibGOPT
#
include(BuildLibGOPT)
libgopt_build()
add_dependencies(build_bundled_libs gopt)
#
# LibCJSON
#
include(BuildLibCJSON)
libcjson_build()
add_dependencies(build_bundled_libs cjson)
#
# LibYAML
#
include(BuildLibYAML)
libyaml_build()
add_dependencies(build_bundled_libs yaml)
#
# LibUUID
#
set(LIBUUID_FIND_REQUIRED ON)
find_package(LibUUID)
#
# Third-Party misc
#
include(BuildMisc)
libmisc_build()
add_dependencies(build_bundled_libs misc)
include(BuildSophia)
sophia_build()
set (sophia_lib "${PROJECT_BINARY_DIR}/third_party/sophia/db/libsophia.a")
option(ENABLE_RPM "Enable install of a RPM specific files" OFF)
# cpack config. called package.cmake to avoid
# conflicts with the global CPack.cmake (On MacOS X
# file names are case-insensitive)
#
include (cmake/package.cmake)
#
# RPM build environment
# CPACK is only used for .tar.gz package generation.
# To build an RPM we need a source package,
# so rpm.cmake depends on package.cmake.
#
include (cmake/rpm.cmake)
add_subdirectory(extra)
add_subdirectory(test)
install (FILES README.md LICENSE doc/box-protocol.txt
DESTINATION share/doc/tarantool)
Dmitry Simonenko
committed
# tarantool info summary (used in server version output)
#
set(TARANTOOL_OPTIONS "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
set(TARANTOOL_OPTIONS "${TARANTOOL_OPTIONS} -DENABLE_TRACE=${ENABLE_TRACE} -DENABLE_BACKTRACE=${ENABLE_BACKTRACE}")
set(TARANTOOL_BUILD "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_BUILD_TYPE}")
set(TARANTOOL_C_COMPILER ${CMAKE_C_COMPILER})
set(TARANTOOL_CXX_COMPILER ${CMAKE_CXX_COMPILER})
Dmitry Simonenko
committed
#
# Output compile-time defines into config.h. Do it at the end
# of the script to make sure all variables are set.
#
configure_file(
"${PROJECT_SOURCE_DIR}/src/trivia/config.h.cmake"
"${PROJECT_BINARY_DIR}/src/trivia/config.h"
install(FILES ${PROJECT_BINARY_DIR}/src/trivia/config.h
DESTINATION ${MODULE_INCLUDEDIR})
message (STATUS "Tarantool configuration is complete:")
message (STATUS "VERSION: ${PACKAGE_VERSION}")
Dmitry Simonenko
committed
message (STATUS "BUILD: ${TARANTOOL_BUILD}")
message (STATUS "C_COMPILER: ${TARANTOOL_C_COMPILER}")
message (STATUS "CXX_COMPILER: ${TARANTOOL_CXX_COMPILER}")
message (STATUS "C_FLAGS:${TARANTOOL_C_FLAGS}")
message (STATUS "CXX_FLAGS:${TARANTOOL_CXX_FLAGS}")
Dmitry Simonenko
committed
message (STATUS "PREFIX: ${CMAKE_INSTALL_PREFIX}")
message (STATUS "MODULE_DIR: ${MODULE_DIR}")
message (STATUS "ENABLE_SSE2: ${ENABLE_SSE2}")
message (STATUS "ENABLE_AVX: ${ENABLE_AVX}")
message (STATUS "ENABLE_GCOV: ${ENABLE_GCOV}")
message (STATUS "ENABLE_GPROF: ${ENABLE_GPROF}")
message (STATUS "ENABLE_TRACE: ${ENABLE_TRACE}")
Dmitry Simonenko
committed
message (STATUS "ENABLE_BACKTRACE: ${ENABLE_BACKTRACE} (symbol resolve: ${HAVE_BFD})")
message (STATUS "ENABLE_BUNDLED_LUAJIT: ${ENABLE_BUNDLED_LUAJIT}")
message (STATUS "ENABLE_BUNDLED_LIBEV: ${ENABLE_BUNDLED_LIBEV}")
message (STATUS "ENABLE_BUNDLED_LIBEIO: ${ENABLE_BUNDLED_LIBEIO}")
message (STATUS "ENABLE_BUNDLED_LIBCORO: ${ENABLE_BUNDLED_LIBCORO}")
message (STATUS "ENABLE_DOC: ${ENABLE_DOC}")
list_optional_packages()
if (TARGET_OS_DARWIN)
message (STATUS "DARWIN_BUILD_TYPE: ${DARWIN_BUILD_TYPE}")
endif()
Dmitry Simonenko
committed
message (STATUS "")
message (STATUS "To view or modify configuration results, check out CMakeCache.txt.")