mongo/src/third_party/wiredtiger/cmake/configs/modes.cmake
Alex Pullen e7ebec401e Import wiredtiger: 9d2e4ce64fa8248ce21daa252e79528da59bc5d5 from branch mongodb-master (#54508)
GitOrigin-RevId: f0a6209b8e95fa30174606036a240e325e2d1947
2026-05-27 05:49:23 +00:00

208 lines
7.6 KiB
CMake

# Establishes build configuration modes we can use when compiling.
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(${CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
# Establish an internal cache variable to track our custom build modes.
set(BUILD_MODES Debug Release RelWithDebInfo CACHE INTERNAL "")
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
set(MSVC_C_COMPILER 1)
elseif("${CMAKE_C_COMPILER_ID}" MATCHES "^(Apple)?(C|c?)lang")
set(CLANG_C_COMPILER 1)
else()
set(GNU_C_COMPILER 1)
endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set(MSVC_CXX_COMPILER 1)
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(Apple)?(C|c?)lang")
set(CLANG_CXX_COMPILER 1)
else()
set(GNU_CXX_COMPILER 1)
endif()
function(define_build_mode mode)
cmake_parse_arguments(
PARSE_ARGV
1
"DEFINE_BUILD"
""
"DEPENDS"
"C_COMPILER_FLAGS;CXX_COMPILER_FLAGS;LINK_FLAGS;LIBS"
)
if (NOT "${DEFINE_BUILD_UNPARSED_ARGUMENTS}" STREQUAL "")
message(FATAL_ERROR "Unknown arguments to define_build_mode: ${DEFINE_BUILD_UNPARSED_ARGUMENTS}")
endif()
# Test if dependencies are met. Skip defining the build mode if not.
eval_dependency("${DEFINE_BUILD_DEPENDS}" enabled)
if(NOT enabled)
message(VERBOSE "Skipping build mode definition due to unmet dependencies: ${mode}")
return()
endif()
set(linker_flags "")
# Needs to validate linker flags to assert its a valid build mode.
if(DEFINE_BUILD_LINK_FLAGS)
set(CMAKE_REQUIRED_FLAGS "${DEFINE_BUILD_LINK_FLAGS}")
list(APPEND linker_flags "${DEFINE_BUILD_LINK_FLAGS}")
endif()
if(DEFINE_BUILD_LIBS)
set(CMAKE_REQUIRED_LIBRARIES "${DEFINE_BUILD_LIBS}")
list(APPEND linker_flags "${DEFINE_BUILD_LIBS}")
endif()
# Check if the compiler flags are available to ensure its a valid build mode.
if(DEFINE_BUILD_C_COMPILER_FLAGS)
check_c_compiler_flag("${DEFINE_BUILD_C_COMPILER_FLAGS}" HAVE_BUILD_${mode}_C_FLAGS)
if(NOT HAVE_BUILD_${mode}_C_FLAGS)
message(VERBOSE "Skipping build mode definition due to unavailable C flags: ${mode}")
unset(HAVE_BUILD_${mode}_C_FLAGS CACHE)
return()
endif()
endif()
if(DEFINE_BUILD_CXX_COMPILER_FLAGS)
check_cxx_compiler_flag("${DEFINE_BUILD_CXX_COMPILER_FLAGS}" HAVE_BUILD_${mode}_CXX_FLAGS)
if(NOT HAVE_BUILD_${mode}_CXX_FLAGS)
message(VERBOSE "Skipping build mode definition due to unavailable CXX flags: ${mode}")
unset(HAVE_BUILD_MODE_${mode}_FLAGS CACHE)
return()
endif()
endif()
unset(CMAKE_REQUIRED_FLAGS)
unset(CMAKE_REQUIRED_LIBRARIES)
unset(HAVE_BUILD_${mode}_C_FLAGS CACHE)
unset(HAVE_BUILD_${mode}_CXX_FLAGS CACHE)
string(REPLACE ";" " " c_flags "${DEFINE_BUILD_C_COMPILER_FLAGS}")
string(REPLACE ";" " " cxx_flags "${DEFINE_BUILD_CXX_COMPILER_FLAGS}")
string(REPLACE ";" " " linker_flags "${linker_flags}")
string(TOUPPER ${mode} build_mode)
# Seed the default flags for this build mode exactly once per build dir.
if(NOT WT_BUILD_MODE_${build_mode}_FLAGS_INITIALIZED)
set(CMAKE_C_FLAGS_${build_mode}
"${c_flags}" CACHE STRING
"Flags used by the C compiler for ${mode} build type or configuration." FORCE)
set(CMAKE_CXX_FLAGS_${build_mode}
"${cxx_flags}" CACHE STRING
"Flags used by the C++ compiler for ${mode} build type or configuration." FORCE)
set(CMAKE_EXE_LINKER_FLAGS_${build_mode}
"${linker_flags}" CACHE STRING
"Linker flags to be used to create executables for ${mode} build type." FORCE)
set(CMAKE_SHARED_LINKER_FLAGS_${build_mode}
"${linker_flags}" CACHE STRING
"Linker flags to be used to create shared libraries for ${mode} build type." FORCE)
set(CMAKE_MODULE_LINKER_FLAGS_${build_mode}
"${linker_flags}" CACHE STRING
"Linker flags to be used to create shared modules for ${mode} build type." FORCE)
set(WT_BUILD_MODE_${build_mode}_FLAGS_INITIALIZED TRUE CACHE INTERNAL
"WiredTiger ${mode} build mode flags have been initialized")
endif()
mark_as_advanced(
CMAKE_C_FLAGS_${build_mode}
CMAKE_CXX_FLAGS_${build_mode}
CMAKE_EXE_LINKER_FLAGS_${build_mode}
CMAKE_SHARED_LINKER_FLAGS_${build_mode}
CMAKE_MODULE_LINKER_FLAGS_${build_mode}
)
set(BUILD_MODES "${BUILD_MODES};${mode}" CACHE INTERNAL "")
endfunction()
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
set(no_omit_frame_flag "/Oy-")
else()
set(no_omit_frame_flag "-fno-omit-frame-pointer")
endif()
# ASAN build variant flags.
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
set(asan_link_flags "/fsanitize=address")
set(asan_compiler_c_flag "/fsanitize=address")
set(asan_compiler_cxx_flag "/fsanitize=address")
else()
set(asan_compiler_c_flag "-fsanitize=address -shared-libasan")
set(asan_compiler_cxx_flag "-fsanitize=address -shared-libasan")
set(asan_link_flags "-fsanitize=address")
endif()
# UBSAN build variant flags.
set(ubsan_link_flags "-fsanitize=undefined")
set(ubsan_compiler_c_flag "-fsanitize=undefined")
set(ubsan_compiler_cxx_flag "-fsanitize=undefined")
# MSAN build variant flags.
set(msan_link_flags "-fsanitize=memory")
set(msan_compiler_c_flag "-fsanitize=memory" "-fno-optimize-sibling-calls" "-fsanitize-memory-track-origins=2")
set(msan_compiler_cxx_flag "-fsanitize=memory" "-fno-optimize-sibling-calls" "-fsanitize-memory-track-origins=2")
# TSAN build variant flags.
set(tsan_link_flags "-fsanitize=thread")
set(tsan_compiler_c_flag "-fsanitize=thread")
set(tsan_compiler_cxx_flag "-fsanitize=thread")
# Define our custom build variants.
define_build_mode(ASan
C_COMPILER_FLAGS ${asan_compiler_c_flag} ${no_omit_frame_flag}
CXX_COMPILER_FLAGS ${asan_compiler_cxx_flag} ${no_omit_frame_flag}
LINK_FLAGS ${asan_link_flags}
)
define_build_mode(UBSan
C_COMPILER_FLAGS ${ubsan_compiler_c_flag} ${no_omit_frame_flag}
CXX_COMPILER_FLAGS ${ubsan_compiler_cxx_flag} ${no_omit_frame_flag}
LINK_FLAGS ${ubsan_link_flags}
# Disable UBSan on MSVC compilers (unsupported).
DEPENDS "NOT MSVC"
)
define_build_mode(MSan
C_COMPILER_FLAGS ${msan_compiler_c_flag} ${no_omit_frame_flag}
CXX_COMPILER_FLAGS ${msan_compiler_cxx_flag}
LINK_FLAGS ${msan_link_flags}
# Disable MSan on MSVC and GNU compilers (unsupported).
DEPENDS "CLANG_C_COMPILER"
)
define_build_mode(TSan
C_COMPILER_FLAGS ${tsan_compiler_c_flag} ${no_omit_frame_flag}
CXX_COMPILER_FLAGS ${tsan_compiler_cxx_flag}
LINK_FLAGS ${tsan_link_flags}
# Disable TSan on MSVC compilers (unsupported).
DEPENDS "NOT MSVC"
)
define_build_mode(Coverage
C_COMPILER_FLAGS "--coverage -fprofile-arcs"
CXX_COMPILER_FLAGS "--coverage -fprofile-arcs"
LINK_FLAGS "--coverage"
# Disable Coverage on MSVC compilers (unsupported).
DEPENDS "NOT MSVC"
)
# Set the WiredTiger default build type to Debug.
# Primary users of the build are our developers, who want as much help diagnosing
# issues as possible. Builds targeted for release to customers should switch to a "Release" setting.
if(NOT CMAKE_BUILD_TYPE)
string(REPLACE ";" " " build_modes_doc "${BUILD_MODES}")
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: ${build_modes_doc}." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${BUILD_MODES})
endif()
if(CMAKE_BUILD_TYPE)
if(NOT "${CMAKE_BUILD_TYPE}" IN_LIST BUILD_MODES)
message(FATAL_ERROR "Build type '${CMAKE_BUILD_TYPE}' not available.")
endif()
endif()
set(CMAKE_CONFIGURATION_TYPES ${BUILD_MODES})