2020-04-24 03:24:12 +08:00
|
|
|
include(CompilerChecks)
|
2020-03-28 06:44:55 +08:00
|
|
|
|
2020-04-24 03:24:12 +08:00
|
|
|
env_set(USE_GPERFTOOLS OFF BOOL "Use gperfools for profiling")
|
2020-03-28 06:44:55 +08:00
|
|
|
env_set(USE_VALGRIND OFF BOOL "Compile for valgrind usage")
|
2020-04-24 03:24:12 +08:00
|
|
|
env_set(USE_VALGRIND_FOR_CTEST ${USE_VALGRIND} BOOL "Use valgrind for ctest")
|
|
|
|
env_set(ALLOC_INSTRUMENTATION OFF BOOL "Instrument alloc")
|
|
|
|
env_set(WITH_UNDODB OFF BOOL "Use rr or undodb")
|
|
|
|
env_set(USE_ASAN OFF BOOL "Compile with address sanitizer")
|
|
|
|
env_set(USE_UBSAN OFF BOOL "Compile with undefined behavior sanitizer")
|
|
|
|
env_set(FDB_RELEASE OFF BOOL "This is a building of a final release")
|
2020-03-28 06:44:55 +08:00
|
|
|
env_set(USE_CCACHE OFF BOOL "Use ccache for compilation if available")
|
2020-04-24 03:24:12 +08:00
|
|
|
env_set(RELATIVE_DEBUG_PATHS OFF BOOL "Use relative file paths in debug info")
|
|
|
|
env_set(USE_WERROR OFF BOOL "Compile with -Werror. Recommended for local development and CI.")
|
|
|
|
default_linker(_use_ld)
|
2020-04-24 05:37:20 +08:00
|
|
|
env_set(USE_LD "${_use_ld}" STRING
|
|
|
|
"The linker to use for building: can be LD (system default and same as DEFAULT), BFD, GOLD, or LLD - will be LLD for Clang if available, DEFAULT otherwise")
|
2020-04-24 03:24:12 +08:00
|
|
|
use_libcxx(_use_libcxx)
|
|
|
|
env_set(USE_LIBCXX "${_use_libcxx}" BOOL "Use libc++")
|
|
|
|
static_link_libcxx(_static_link_libcxx)
|
|
|
|
env_set(STATIC_LINK_LIBCXX "${_static_link_libcxx}" BOOL "Statically link libstdcpp/libc++")
|
2019-07-10 03:11:51 +08:00
|
|
|
|
2020-04-11 01:08:24 +08:00
|
|
|
if(USE_LIBCXX AND STATIC_LINK_LIBCXX AND NOT USE_LD STREQUAL "LLD")
|
|
|
|
message(FATAL_ERROR "Unsupported configuration: STATIC_LINK_LIBCXX with libc+++ only works if USE_LD=LLD")
|
|
|
|
endif()
|
|
|
|
|
2019-07-10 03:11:51 +08:00
|
|
|
set(rel_debug_paths OFF)
|
2019-07-16 06:16:43 +08:00
|
|
|
if(RELATIVE_DEBUG_PATHS)
|
2019-07-10 03:11:51 +08:00
|
|
|
set(rel_debug_paths ON)
|
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
|
2019-04-03 08:34:29 +08:00
|
|
|
if(USE_GPERFTOOLS)
|
|
|
|
find_package(Gperftools REQUIRED)
|
|
|
|
endif()
|
|
|
|
|
2019-02-09 04:24:32 +08:00
|
|
|
add_compile_options(-DCMAKE_BUILD)
|
2019-03-15 08:47:30 +08:00
|
|
|
add_compile_definitions(BOOST_ERROR_CODE_HEADER_ONLY BOOST_SYSTEM_NO_DEPRECATED)
|
2019-02-07 10:16:54 +08:00
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
if(ALLOC_INSTRUMENTATION)
|
|
|
|
add_compile_options(-DALLOC_INSTRUMENTATION)
|
|
|
|
endif()
|
|
|
|
if(WITH_UNDODB)
|
|
|
|
add_compile_options(-DWITH_UNDODB)
|
|
|
|
endif()
|
|
|
|
if(DEBUG_TASKS)
|
|
|
|
add_compile_options(-DDEBUG_TASKS)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(NDEBUG)
|
|
|
|
add_compile_options(-DNDEBUG)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(FDB_RELEASE)
|
|
|
|
add_compile_options(-DFDB_RELEASE)
|
2019-12-17 06:37:51 +08:00
|
|
|
add_compile_options(-DFDB_CLEAN_BUILD)
|
2019-01-03 05:32:26 +08:00
|
|
|
endif()
|
|
|
|
|
|
|
|
include_directories(${CMAKE_SOURCE_DIR})
|
|
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
if (NOT OPEN_FOR_IDE)
|
|
|
|
add_definitions(-DNO_INTELLISENSE)
|
|
|
|
endif()
|
2019-02-07 11:27:38 +08:00
|
|
|
if(WIN32)
|
|
|
|
add_definitions(-DUSE_USEFIBERS)
|
|
|
|
else()
|
|
|
|
add_definitions(-DUSE_UCONTEXT)
|
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
|
2019-06-06 23:54:31 +08:00
|
|
|
if (USE_CCACHE)
|
2019-12-17 06:37:51 +08:00
|
|
|
FIND_PROGRAM(CCACHE_FOUND "ccache")
|
|
|
|
if(CCACHE_FOUND)
|
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
|
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
|
|
|
else()
|
|
|
|
message(SEND_ERROR "CCACHE is ON, but ccache was not found")
|
|
|
|
endif()
|
2019-06-04 10:35:46 +08:00
|
|
|
endif()
|
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
include(CheckFunctionExists)
|
|
|
|
set(CMAKE_REQUIRED_INCLUDES stdlib.h malloc.h)
|
|
|
|
set(CMAKE_REQUIRED_LIBRARIES c)
|
2019-09-18 03:23:48 +08:00
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
2019-01-03 05:32:26 +08:00
|
|
|
|
|
|
|
if(WIN32)
|
2019-03-08 00:20:50 +08:00
|
|
|
# see: https://docs.microsoft.com/en-us/windows/desktop/WinProg/using-the-windows-headers
|
2019-12-15 23:13:46 +08:00
|
|
|
# this sets the windows target version to Windows Server 2003
|
|
|
|
set(WINDOWS_TARGET 0x0502)
|
2020-02-10 00:34:14 +08:00
|
|
|
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
|
|
|
|
# TODO: This doesn't seem to be good style, but I couldn't find a better way so far
|
|
|
|
string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
|
|
endif()
|
|
|
|
add_compile_options(/W0 /EHsc /bigobj $<$<CONFIG:Release>:/Zi> /MP /FC /Gm-)
|
2019-12-15 23:13:46 +08:00
|
|
|
add_compile_definitions(_WIN32_WINNT=${WINDOWS_TARGET} WINVER=${WINDOWS_TARGET} NTDDI_VERSION=0x05020000 BOOST_ALL_NO_LIB)
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
2019-01-03 05:32:26 +08:00
|
|
|
else()
|
|
|
|
set(GCC NO)
|
|
|
|
set(CLANG NO)
|
2019-06-21 00:29:01 +08:00
|
|
|
set(ICC NO)
|
2019-01-03 05:32:26 +08:00
|
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
|
|
|
|
set(CLANG YES)
|
2019-06-21 00:29:01 +08:00
|
|
|
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
|
|
|
|
set(ICC YES)
|
2019-01-03 05:32:26 +08:00
|
|
|
else()
|
|
|
|
# This is not a very good test. However, as we do not really support many architectures
|
|
|
|
# this is good enough for now
|
|
|
|
set(GCC YES)
|
|
|
|
endif()
|
|
|
|
|
2019-05-13 01:41:04 +08:00
|
|
|
# check linker flags.
|
2019-07-26 23:49:56 +08:00
|
|
|
if (USE_LD STREQUAL "DEFAULT")
|
|
|
|
set(USE_LD "LD")
|
2019-08-21 07:35:41 +08:00
|
|
|
else()
|
2019-07-26 23:49:56 +08:00
|
|
|
if ((NOT (USE_LD STREQUAL "LD")) AND (NOT (USE_LD STREQUAL "GOLD")) AND (NOT (USE_LD STREQUAL "LLD")) AND (NOT (USE_LD STREQUAL "BFD")))
|
2019-07-30 07:41:42 +08:00
|
|
|
message (FATAL_ERROR "USE_LD must be set to DEFAULT, LD, BFD, GOLD, or LLD!")
|
2019-07-26 23:49:56 +08:00
|
|
|
endif()
|
2019-05-13 01:41:04 +08:00
|
|
|
endif()
|
|
|
|
|
|
|
|
# if USE_LD=LD, then we don't do anything, defaulting to whatever system
|
|
|
|
# linker is available (e.g. binutils doesn't normally exist on macOS, so this
|
|
|
|
# implies the default xcode linker, and other distros may choose others by
|
|
|
|
# default).
|
|
|
|
|
2019-07-26 23:49:56 +08:00
|
|
|
if(USE_LD STREQUAL "BFD")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=bfd -Wl,--disable-new-dtags")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=bfd -Wl,--disable-new-dtags")
|
|
|
|
endif()
|
|
|
|
|
2019-05-13 01:41:04 +08:00
|
|
|
if(USE_LD STREQUAL "GOLD")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(USE_LD STREQUAL "LLD")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld -Wl,--disable-new-dtags")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld -Wl,--disable-new-dtags")
|
|
|
|
endif()
|
|
|
|
|
2019-07-10 03:11:51 +08:00
|
|
|
if(rel_debug_paths)
|
|
|
|
add_compile_options("-fdebug-prefix-map=${CMAKE_SOURCE_DIR}=." "-fdebug-prefix-map=${CMAKE_BINARY_DIR}=.")
|
|
|
|
endif()
|
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
# we always compile with debug symbols. CPack will strip them out
|
|
|
|
# and create a debuginfo rpm
|
2019-06-19 02:02:48 +08:00
|
|
|
add_compile_options(-ggdb -fno-omit-frame-pointer)
|
2019-01-03 05:32:26 +08:00
|
|
|
if(USE_ASAN)
|
|
|
|
add_compile_options(
|
2019-06-19 02:02:48 +08:00
|
|
|
-fsanitize=address
|
2019-08-19 07:52:19 +08:00
|
|
|
-DUSE_SANITIZER)
|
2019-06-19 02:02:48 +08:00
|
|
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fsanitize=address")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address ${CMAKE_THREAD_LIBS_INIT}")
|
2019-01-03 05:32:26 +08:00
|
|
|
endif()
|
|
|
|
|
2019-08-19 07:52:19 +08:00
|
|
|
if(USE_UBSAN)
|
|
|
|
add_compile_options(
|
|
|
|
-fsanitize=undefined
|
2019-12-06 07:11:10 +08:00
|
|
|
# TODO(atn34) Re-enable -fsanitize=alignment once https://github.com/apple/foundationdb/issues/1434 is resolved
|
2019-11-27 11:34:44 +08:00
|
|
|
-fno-sanitize=alignment
|
2019-08-19 07:52:19 +08:00
|
|
|
-DUSE_SANITIZER)
|
|
|
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fsanitize=undefined")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=undefined")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined ${CMAKE_THREAD_LIBS_INIT}")
|
|
|
|
endif()
|
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
if(PORTABLE_BINARY)
|
|
|
|
message(STATUS "Create a more portable binary")
|
|
|
|
set(CMAKE_MODULE_LINKER_FLAGS "-static-libstdc++ -static-libgcc ${CMAKE_MODULE_LINKER_FLAGS}")
|
|
|
|
set(CMAKE_SHARED_LINKER_FLAGS "-static-libstdc++ -static-libgcc ${CMAKE_SHARED_LINKER_FLAGS}")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++ -static-libgcc ${CMAKE_EXE_LINKER_FLAGS}")
|
|
|
|
endif()
|
2019-06-19 05:30:30 +08:00
|
|
|
if(STATIC_LINK_LIBCXX)
|
|
|
|
if (NOT USE_LIBCXX AND NOT APPLE)
|
|
|
|
add_link_options(-static-libstdc++ -static-libgcc)
|
|
|
|
endif()
|
|
|
|
endif()
|
2019-12-06 07:11:10 +08:00
|
|
|
# # Instruction sets we require to be supported by the CPU
|
|
|
|
# TODO(atn34) Re-enable once https://github.com/apple/foundationdb/issues/1434 is resolved
|
|
|
|
# Some of the following instructions have alignment requirements, so it seems
|
|
|
|
# prudent to disable them until we properly align memory.
|
|
|
|
# add_compile_options(
|
|
|
|
# -maes
|
|
|
|
# -mmmx
|
|
|
|
# -mavx
|
|
|
|
# -msse4.2)
|
2019-09-17 02:47:37 +08:00
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
if (USE_VALGRIND)
|
|
|
|
add_compile_options(-DVALGRIND -DUSE_VALGRIND)
|
|
|
|
endif()
|
|
|
|
if (CLANG)
|
2019-09-17 02:47:37 +08:00
|
|
|
add_compile_options()
|
2020-01-29 01:51:05 +08:00
|
|
|
# Clang has link errors unless `atomic` is specifically requested.
|
2020-01-29 10:32:13 +08:00
|
|
|
if(NOT APPLE)
|
2020-04-10 05:16:14 +08:00
|
|
|
#add_link_options(-latomic)
|
2020-01-29 10:32:13 +08:00
|
|
|
endif()
|
2019-06-11 06:28:27 +08:00
|
|
|
if (APPLE OR USE_LIBCXX)
|
|
|
|
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-stdlib=libc++>)
|
|
|
|
add_compile_definitions(WITH_LIBCXX)
|
|
|
|
if (NOT APPLE)
|
2020-04-10 05:16:14 +08:00
|
|
|
if (STATIC_LINK_LIBCXX)
|
|
|
|
add_link_options(-static-libgcc -nostdlib++ -Wl,-Bstatic -lc++ -lc++abi -Wl,-Bdynamic)
|
|
|
|
endif()
|
|
|
|
add_link_options(-stdlib=libc++ -Wl,-build-id=sha1)
|
2019-06-11 06:28:27 +08:00
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
endif()
|
2019-08-13 00:15:10 +08:00
|
|
|
if (OPEN_FOR_IDE)
|
|
|
|
add_compile_options(
|
|
|
|
-Wno-unknown-attributes)
|
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
add_compile_options(
|
|
|
|
-Wno-unknown-warning-option
|
|
|
|
-Wno-dangling-else
|
|
|
|
-Wno-sign-compare
|
|
|
|
-Wno-comment
|
|
|
|
-Wno-unknown-pragmas
|
|
|
|
-Wno-delete-non-virtual-dtor
|
|
|
|
-Wno-undefined-var-template
|
|
|
|
-Wno-tautological-pointer-compare
|
|
|
|
-Wno-format)
|
2019-09-17 02:47:37 +08:00
|
|
|
if (USE_CCACHE)
|
|
|
|
add_compile_options(
|
2019-09-18 03:15:58 +08:00
|
|
|
-Wno-register
|
2020-04-11 01:08:24 +08:00
|
|
|
-Wno-unused-command-line-argument)
|
2019-09-17 02:47:37 +08:00
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
endif()
|
2019-09-26 13:08:44 +08:00
|
|
|
if (USE_WERROR)
|
2019-01-03 05:32:26 +08:00
|
|
|
add_compile_options(-Werror)
|
|
|
|
endif()
|
2019-06-21 00:29:01 +08:00
|
|
|
if (GCC)
|
2019-09-27 00:34:01 +08:00
|
|
|
add_compile_options(-Wno-pragmas)
|
|
|
|
|
|
|
|
# Otherwise `state [[maybe_unused]] int x;` will issue a warning.
|
|
|
|
# https://stackoverflow.com/questions/50646334/maybe-unused-on-member-variable-gcc-warns-incorrectly-that-attribute-is
|
|
|
|
add_compile_options(-Wno-attributes)
|
2019-06-21 00:29:01 +08:00
|
|
|
elseif(ICC)
|
|
|
|
add_compile_options(-wd1879 -wd1011)
|
2019-06-21 05:28:31 +08:00
|
|
|
add_link_options(-static-intel)
|
2019-06-21 00:29:01 +08:00
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
add_compile_options(-Wno-error=format
|
2019-04-10 02:16:45 +08:00
|
|
|
-Wunused-variable
|
2019-01-03 05:32:26 +08:00
|
|
|
-Wno-deprecated
|
|
|
|
-fvisibility=hidden
|
|
|
|
-Wreturn-type
|
|
|
|
-fPIC)
|
2019-04-03 10:58:21 +08:00
|
|
|
if (GPERFTOOLS_FOUND AND GCC)
|
|
|
|
add_compile_options(
|
|
|
|
-fno-builtin-malloc
|
|
|
|
-fno-builtin-calloc
|
|
|
|
-fno-builtin-realloc
|
|
|
|
-fno-builtin-free)
|
|
|
|
endif()
|
2019-01-03 05:32:26 +08:00
|
|
|
|
2019-05-22 04:35:27 +08:00
|
|
|
# Check whether we can use dtrace probes
|
2019-08-01 10:14:11 +08:00
|
|
|
include(CheckSymbolExists)
|
2019-05-22 04:35:27 +08:00
|
|
|
check_symbol_exists(DTRACE_PROBE sys/sdt.h SUPPORT_DTRACE)
|
2019-10-22 01:57:58 +08:00
|
|
|
check_symbol_exists(aligned_alloc stdlib.h HAS_ALIGNED_ALLOC)
|
|
|
|
message(STATUS "Has aligned_alloc: ${HAS_ALIGNED_ALLOC}")
|
2019-05-22 04:35:27 +08:00
|
|
|
if(SUPPORT_DTRACE)
|
|
|
|
add_compile_definitions(DTRACE_PROBES)
|
|
|
|
endif()
|
2019-10-22 01:57:58 +08:00
|
|
|
if(HAS_ALIGNED_ALLOC)
|
|
|
|
add_compile_definitions(HAS_ALIGNED_ALLOC)
|
|
|
|
endif()
|
2019-05-22 04:35:27 +08:00
|
|
|
|
2019-01-03 05:32:26 +08:00
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
|
set(USE_LTO OFF CACHE BOOL "Do link time optimization")
|
|
|
|
if (USE_LTO)
|
|
|
|
add_compile_options($<$<CONFIG:Release>:-flto>)
|
|
|
|
set(CMAKE_AR "gcc-ar")
|
|
|
|
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
|
|
set(CMAKE_C_ARCHIVE_FINISH true)
|
|
|
|
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
|
|
set(CMAKE_CXX_ARCHIVE_FINISH true)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
endif()
|