build: cmake: add build mode support
Scylla uses different build mode to customize the build for different purposes. in this change, instead of having it in a python dictionary, the customized settings are located in their own files, and loaded on demand. we don't support multi-config generator yet. Signed-off-by: Kefu Chai <kefu.chai@scylladb.com>
This commit is contained in:
@@ -5,44 +5,18 @@ project(scylla)
|
||||
list(APPEND CMAKE_MODULE_PATH
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
message(STATUS "Setting build type to 'Release' as none was specified.")
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE
|
||||
STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"Debug" "Release" "Dev" "Sanitize")
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE)
|
||||
else()
|
||||
set(BUILD_TYPE "release")
|
||||
endif()
|
||||
|
||||
function(default_target_arch arch)
|
||||
set(x86_instruction_sets i386 i686 x86_64)
|
||||
if(CMAKE_SYSTEM_PROCESSOR IN_LIST x86_instruction_sets)
|
||||
set(${arch} "westmere" PARENT_SCOPE)
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR EQUAL "aarch64")
|
||||
set(${arch} "armv8-a+crc+crypto" PARENT_SCOPE)
|
||||
else()
|
||||
set(${arch} "" PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
default_target_arch(target_arch)
|
||||
if(target_arch)
|
||||
set(target_arch_flag "-march=${target_arch}")
|
||||
endif()
|
||||
|
||||
set(cxx_coro_flag)
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES GNU)
|
||||
set(cxx_coro_flag -fcoroutines)
|
||||
endif()
|
||||
|
||||
set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE
|
||||
STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"Debug" "Release" "Dev" "Sanitize")
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_mode)
|
||||
include("mode.common")
|
||||
include("mode.${build_mode}")
|
||||
add_compile_definitions(${Seastar_DEFINITIONS_${build_mode}})
|
||||
# Configure Seastar compile options to align with Scylla
|
||||
set(Seastar_CXX_FLAGS ${cxx_coro_flag} ${target_arch_flag} CACHE INTERNAL "" FORCE)
|
||||
set(Seastar_CXX_DIALECT gnu++20 CACHE INTERNAL "" FORCE)
|
||||
set(CMAKE_CXX_STANDARD "20" CACHE INTERNAL "")
|
||||
set(CMAKE_CXX_EXTENSIONS ON CACHE INTERNAL "")
|
||||
|
||||
add_subdirectory(seastar)
|
||||
|
||||
@@ -53,14 +27,8 @@ find_package(ZLIB REQUIRED)
|
||||
find_package(ICU COMPONENTS uc REQUIRED)
|
||||
find_package(absl REQUIRED)
|
||||
|
||||
set(scylla_build_dir "${CMAKE_BINARY_DIR}/build/${BUILD_TYPE}")
|
||||
set(scylla_gen_build_dir "${scylla_build_dir}/gen")
|
||||
file(MAKE_DIRECTORY "${scylla_build_dir}" "${scylla_gen_build_dir}")
|
||||
|
||||
# Place libraries, executables and archives in ${buildroot}/build/${mode}/
|
||||
foreach(mode RUNTIME LIBRARY ARCHIVE)
|
||||
set(CMAKE_${mode}_OUTPUT_DIRECTORY "${scylla_build_dir}")
|
||||
endforeach()
|
||||
set(scylla_gen_build_dir "${CMAKE_BINARY_DIR}/gen")
|
||||
file(MAKE_DIRECTORY "${scylla_gen_build_dir}")
|
||||
|
||||
# Generate C++ source files from thrift definitions
|
||||
function(scylla_generate_thrift)
|
||||
@@ -581,10 +549,6 @@ target_link_libraries(scylla PRIVATE
|
||||
-fuse-ld=lld)
|
||||
# TODO: patch dynamic linker to match configure.py behavior
|
||||
|
||||
target_compile_options(scylla PRIVATE
|
||||
-std=gnu++20
|
||||
${cxx_coro_flag}
|
||||
${target_arch_flag})
|
||||
# Hacks needed to expose internal APIs for xxhash dependencies
|
||||
target_compile_definitions(scylla PRIVATE XXH_PRIVATE_API HAVE_LZ4_COMPRESS_DEFAULT)
|
||||
|
||||
|
||||
21
cmake/mode.DEBUG.cmake
Normal file
21
cmake/mode.DEBUG.cmake
Normal file
@@ -0,0 +1,21 @@
|
||||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
|
||||
# -fasan -Og breaks some coroutines on aarch64, use -O0 instead
|
||||
set(default_Seastar_OptimizationLevel_DEBUG "g")
|
||||
else()
|
||||
set(default_Seastar_OptimizationLevel_DEBUG "0")
|
||||
endif()
|
||||
set(Seastar_OptimizationLevel_DEBUG
|
||||
${default_Seastar_OptimizationLevel_DEBUG}
|
||||
CACHE
|
||||
INTERNAL
|
||||
"")
|
||||
|
||||
set(Seastar_DEFINITIONS_DEBUG
|
||||
SCYLLA_BUILD_MODE=debug
|
||||
DEBUG
|
||||
SANITIZE
|
||||
DEBUG_LSA_SANITIZER
|
||||
SCYLLA_ENABLE_ERROR_INJECTION)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG
|
||||
" -O${Seastar_OptimizationLevel_DEBUG} -g -gz")
|
||||
14
cmake/mode.DEV.cmake
Normal file
14
cmake/mode.DEV.cmake
Normal file
@@ -0,0 +1,14 @@
|
||||
set(Seastar_OptimizationLevel_DEV "2")
|
||||
set(CMAKE_CXX_FLAGS_DEV
|
||||
""
|
||||
CACHE
|
||||
INTERNAL
|
||||
"")
|
||||
string(APPEND CMAKE_CXX_FLAGS_RELEASE
|
||||
" -O${Seastar_OptimizationLevel_RELEASE}")
|
||||
|
||||
set(Seastar_DEFINITIONS_DEV
|
||||
SCYLLA_BUILD_MODE=devel
|
||||
DEVEL
|
||||
SEASTAR_ENABLE_ALLOC_FAILURE_INJECTION
|
||||
SCYLLA_ENABLE_ERROR_INJECTION)
|
||||
14
cmake/mode.RELEASE.cmake
Normal file
14
cmake/mode.RELEASE.cmake
Normal file
@@ -0,0 +1,14 @@
|
||||
set(Seastar_OptimizationLevel_RELEASE "3")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE
|
||||
"-ffunction-sections -fdata-sections"
|
||||
CACHE
|
||||
INTERNAL
|
||||
"")
|
||||
string(APPEND CMAKE_CXX_FLAGS_RELEASE
|
||||
" -O${Seastar_OptimizationLevel_RELEASE}")
|
||||
|
||||
set(Seastar_DEFINITIONS_DEBUG
|
||||
SCYLLA_BUILD_MODE=release)
|
||||
|
||||
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE
|
||||
"-Wl,--gc-sections")
|
||||
31
cmake/mode.common.cmake
Normal file
31
cmake/mode.common.cmake
Normal file
@@ -0,0 +1,31 @@
|
||||
set(disabled_warnings
|
||||
c++11-narrowing
|
||||
mismatched-tags
|
||||
missing-braces
|
||||
overloaded-virtual
|
||||
unsupported-friend)
|
||||
include(CheckCXXCompilerFlag)
|
||||
foreach(warning disabled_warnings)
|
||||
check_cxx_compiler_flag("-Wno-${warning}" _warning_supported)
|
||||
if(_warning_supported)
|
||||
list(APPEND _supported_warnings ${warning})
|
||||
endif()
|
||||
endforeach()
|
||||
list(TRANSFORM disabled_warnings PREPEND "-Wno-")
|
||||
string(JOIN " " CMAKE_CXX_FLAGS "-Wall" "-Werror" ${disabled_warnings})
|
||||
|
||||
function(default_target_arch arch)
|
||||
set(x86_instruction_sets i386 i686 x86_64)
|
||||
if(CMAKE_SYSTEM_PROCESSOR IN_LIST x86_instruction_sets)
|
||||
set(${arch} "westmere" PARENT_SCOPE)
|
||||
elseif(CMAKE_SYSTEM_PROCESSOR EQUAL "aarch64")
|
||||
set(${arch} "armv8-a+crc+crypto" PARENT_SCOPE)
|
||||
else()
|
||||
set(${arch} "" PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
default_target_arch(target_arch)
|
||||
if(target_arch)
|
||||
string(APPEND CMAKE_CXX_FLAGS " -march=${target_arch}")
|
||||
endif()
|
||||
Reference in New Issue
Block a user