2019-09-09 13:40:24 +03:00
##
2023-01-16 16:24:51 +03:00
## Copyright 2020-2023 Leonid Yuriev <leo@yuriev.ru>
2019-08-31 17:13:02 +03:00
## and other libmdbx authors: please see AUTHORS file.
## All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted only as authorized by the OpenLDAP
## Public License.
##
## A copy of this license is available in the file LICENSE in the
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
##
##
## libmdbx = { Revised and extended descendant of Symas LMDB. }
2022-04-20 06:42:16 +03:00
## Please see README.md at https://gitflic.ru/project/erthink/libmdbx
2019-08-31 17:13:02 +03:00
##
## Libmdbx is superior to LMDB in terms of features and reliability,
## not inferior in performance. libmdbx works on Linux, FreeBSD, MacOS X
## and other systems compliant with POSIX.1-2008, but also support Windows
## as a complementary platform.
##
## The next version is under active non-public development and will be
## released as MithrilDB and libmithrildb for libraries & packages.
## Admittedly mythical Mithril is resembling silver but being stronger and
## lighter than steel. Therefore MithrilDB is rightly relevant name.
##
## MithrilDB will be radically different from libmdbx by the new database
## format and API based on C++17, as well as the Apache 2.0 License.
## The goal of this revolution is to provide a clearer and robust API,
## add more features and new valuable properties of database.
##
## The Future will (be) Positive. Всё будет хорошо.
##
2022-11-07 23:37:27 +03:00
if ( CMAKE_VERSION VERSION_LESS 3.8.2 )
cmake_minimum_required ( VERSION 3.0.2 )
elseif ( CMAKE_VERSION VERSION_LESS 3.12 )
2021-08-03 17:17:22 +03:00
cmake_minimum_required ( VERSION 3.8.2 )
else ( )
cmake_minimum_required ( VERSION 3.12 )
endif ( )
2020-04-07 23:06:18 +03:00
2019-08-31 17:13:02 +03:00
cmake_policy ( PUSH )
2021-08-03 17:17:22 +03:00
cmake_policy ( VERSION ${ CMAKE_MINIMUM_REQUIRED_VERSION } )
2022-06-01 15:13:03 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.21 )
cmake_policy ( SET CMP0126 NEW )
endif ( )
if ( NOT CMAKE_VERSION VERSION_LESS 3.17 )
cmake_policy ( SET CMP0102 NEW )
endif ( )
2020-05-10 03:41:28 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.15 )
cmake_policy ( SET CMP0091 NEW )
endif ( )
2019-10-24 16:40:40 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.13 )
cmake_policy ( SET CMP0077 NEW )
endif ( )
2019-08-31 17:13:02 +03:00
if ( NOT CMAKE_VERSION VERSION_LESS 3.12 )
cmake_policy ( SET CMP0075 NEW )
endif ( )
if ( NOT CMAKE_VERSION VERSION_LESS 3.9 )
2022-06-01 15:13:03 +03:00
cmake_policy ( SET CMP0068 NEW )
2019-08-31 17:13:02 +03:00
cmake_policy ( SET CMP0069 NEW )
include ( CheckIPOSupported )
check_ipo_supported ( RESULT CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE )
else ( )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE FALSE )
endif ( )
2020-04-15 17:09:37 +03:00
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git" AND
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / t e s t / C M a k e L i s t s . t x t " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / c o r e . c " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / a l l o y . c " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / c o n f i g . h . i n " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / v e r s i o n . c . i n " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / m a n 1 " A N D
2020-08-22 20:19:46 +03:00
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / m d b x _ c h k . c " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s r c / m d b x . c + + " )
2020-04-15 17:09:37 +03:00
set ( MDBX_AMALGAMATED_SOURCE FALSE )
find_program ( GIT git )
if ( NOT GIT )
message ( SEND_ERROR "Git command-line tool not found" )
endif ( )
set ( MDBX_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
2021-06-24 14:56:18 +03:00
elseif ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION.txt" AND
2020-04-15 17:09:37 +03:00
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m d b x . c " A N D
2020-08-22 20:19:46 +03:00
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m d b x . c + + " A N D
2020-04-15 17:09:37 +03:00
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c o n f i g . h . i n " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m a n 1 " A N D
E X I S T S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m d b x _ c h k . c " )
set ( MDBX_AMALGAMATED_SOURCE TRUE )
set ( MDBX_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" )
else ( )
2021-05-13 12:19:18 +03:00
message ( FATAL_ERROR "\n"
" P l e a s e d o n ' t u s e t a r b a l l s n o r z i p s w h i c h a r e a u t o m a t i c a l l y p r o v i d e d b y G i t h u b ! "
" T h e s e a r c h i v e s d o n o t c o n t a i n v e r s i o n i n f o r m a t i o n a n d t h u s a r e u n f i t t o b u i l d l i b m d b x . "
" Y o u c a n v o t e f o r a b i l i t y o f d i s a b l i n g a u t o - c r e a t i o n s u c h u n s u i t a b l e a r c h i v e s a t h t t p s : / / g i t h u b . c o m m u n i t y / t / d i s a b l e - t a r b a l l \ n "
" I n s t e a d o f a b o v e , j u s t c l o n e t h e g i t r e p o s i t o r y , e i t h e r d o w n l o a d a t a r b a l l o r z i p w i t h t h e p r o p e r l y a m a l g a m a t e d s o u r c e c o r e . "
" F o r e m b e d d i n g l i b m d b x u s e a g i t - s u b m o d u l e o r t h e a m a l g a m a t e d s o u r c e c o d e . \ n "
" P l e a s e , a v o i d u s i n g a n y o t h e r t e c h n i q u e s . " )
2020-04-15 17:09:37 +03:00
endif ( )
2019-08-31 17:13:02 +03:00
if ( DEFINED PROJECT_NAME )
2021-11-16 17:57:54 +03:00
option ( MDBX_FORCE_BUILD_AS_MAIN_PROJECT "Force libmdbx to full control build options even it added as a subdirectory to your project." OFF )
endif ( )
if ( DEFINED PROJECT_NAME AND NOT MDBX_FORCE_BUILD_AS_MAIN_PROJECT )
2019-08-31 17:13:02 +03:00
set ( SUBPROJECT ON )
2019-09-05 11:57:52 +03:00
set ( NOT_SUBPROJECT OFF )
2020-04-15 17:09:37 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE AND NOT DEFINED BUILD_TESTING )
2019-08-31 17:13:02 +03:00
set ( BUILD_TESTING OFF )
endif ( )
2020-09-27 16:49:55 +03:00
enable_language ( C )
2019-08-31 17:13:02 +03:00
else ( )
set ( SUBPROJECT OFF )
2019-09-05 11:57:52 +03:00
set ( NOT_SUBPROJECT ON )
2020-09-27 16:49:55 +03:00
project ( libmdbx C )
2020-04-15 17:09:37 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE AND NOT DEFINED BUILD_TESTING )
2019-08-31 17:13:02 +03:00
set ( BUILD_TESTING ON )
endif ( )
endif ( )
2022-04-21 19:49:57 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE )
include ( CTest )
option ( MDBX_ENABLE_TESTS "Build libmdbx tests." ${ BUILD_TESTING } )
elseif ( DEFINED MDBX_ENABLE_TESTS AND MDBX_ENABLE_TESTS )
2020-09-27 16:45:00 +03:00
message ( WARNING "MDBX_ENABLE_TESTS=${MDBX_ENABLE_TESTS}: But amalgamated source code don't includes tests." )
set ( MDBX_ENABLE_TESTS OFF )
endif ( )
2020-09-27 16:49:55 +03:00
# Try to find a C++ compiler unless sure that this is unnecessary.
2020-09-28 23:47:37 +03:00
if ( NOT CMAKE_CXX_COMPILER_LOADED )
2020-09-27 16:49:55 +03:00
include ( CheckLanguage )
if ( NOT DEFINED MDBX_BUILD_CXX OR MDBX_BUILD_CXX
OR ( NOT MDBX_AMALGAMATED_SOURCE AND ( NOT DEFINED MDBX_ENABLE_TESTS OR MDBX_ENABLE_TESTS ) ) )
check_language ( CXX )
if ( CMAKE_CXX_COMPILER )
enable_language ( CXX )
endif ( )
endif ( )
else ( )
enable_language ( CXX )
endif ( )
2021-04-19 17:43:25 +03:00
# Set default build type to Release. This is to ease a User's life.
2019-09-10 22:41:53 +03:00
if ( NOT CMAKE_BUILD_TYPE )
2021-04-19 17:43:25 +03:00
set ( CMAKE_BUILD_TYPE Release CACHE STRING
2019-09-10 22:41:53 +03:00
" C h o o s e t h e t y p e o f b u i l d , o p t i o n s a r e : D e b u g R e l e a s e R e l W i t h D e b I n f o M i n S i z e R e l . "
F O R C E )
endif ( )
2021-04-19 17:43:25 +03:00
string ( TOUPPER ${ CMAKE_BUILD_TYPE } CMAKE_BUILD_TYPE_UPPERCASE )
2019-09-10 22:41:53 +03:00
2020-04-07 23:07:32 +03:00
if ( NOT_SUBPROJECT AND ( CMAKE_CROSSCOMPILING OR IOS ) )
set ( CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY )
endif ( )
2019-08-31 17:13:02 +03:00
if ( NOT "$ENV{TEAMCITY_PROCESS_FLOW_ID}" STREQUAL "" )
set ( CI TEAMCITY )
message ( STATUS "TeamCity CI" )
elseif ( NOT "$ENV{TRAVIS}" STREQUAL "" )
set ( CI TRAVIS )
message ( STATUS "Travis CI" )
elseif ( NOT "$ENV{CIRCLECI}" STREQUAL "" )
set ( CI CIRCLE )
message ( STATUS "Circle CI" )
elseif ( NOT "$ENV{APPVEYOR}" STREQUAL "" )
set ( CI APPVEYOR )
message ( STATUS "AppVeyor CI" )
elseif ( NOT "$ENV{CI}" STREQUAL "" )
set ( CI "$ENV{CI}" )
message ( STATUS "Other CI (${CI})" )
else ( )
message ( STATUS "Assume No any CI environment" )
unset ( CI )
endif ( )
2019-09-01 16:35:30 +03:00
# output all mdbx-related targets in single directory
if ( NOT DEFINED MDBX_OUTPUT_DIR )
set ( MDBX_OUTPUT_DIR ${ CMAKE_CURRENT_BINARY_DIR } )
endif ( )
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ MDBX_OUTPUT_DIR } )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ MDBX_OUTPUT_DIR } )
set ( CMAKE_PDB_OUTPUT_DIRECTORY ${ MDBX_OUTPUT_DIR } )
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ MDBX_OUTPUT_DIR } )
2019-08-31 17:13:02 +03:00
include ( CheckFunctionExists )
include ( FindPackageMessage )
include ( GNUInstallDirs )
if ( CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND MSVC_VERSION LESS 1900 )
message ( SEND_ERROR "MSVC compiler ${MSVC_VERSION} is too old for building MDBX."
" A t l e a s t ' M i c r o s o f t V i s u a l S t u d i o 2 0 1 5 ' i s r e q u i r e d . " )
endif ( )
2022-06-01 15:13:03 +03:00
if ( NOT DEFINED THREADS_PREFER_PTHREAD_FLAG )
set ( THREADS_PREFER_PTHREAD_FLAG TRUE )
endif ( )
2020-10-05 19:12:20 +03:00
find_package ( Threads REQUIRED )
2019-08-31 17:13:02 +03:00
include ( cmake/utils.cmake )
include ( cmake/compiler.cmake )
include ( cmake/profile.cmake )
2020-10-05 19:12:20 +03:00
# Workaround for `-pthread` toolchain/cmake bug
if ( NOT APPLE AND NOT MSVC
A N D C M A K E _ U S E _ P T H R E A D S _ I N I T A N D N O T C M A K E _ T H R E A D _ L I B S _ I N I T
AND ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG ) )
check_compiler_flag ( "-pthread" CC_HAS_PTHREAD )
if ( CC_HAS_PTHREAD AND NOT CMAKE_EXE_LINKER_FLAGS MATCHES "-pthread" )
message ( STATUS "Force add -pthread for linker flags to avoid troubles" )
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread" )
set ( CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pthread" )
set ( CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -pthread" )
endif ( )
endif ( )
2019-08-31 17:13:02 +03:00
CHECK_FUNCTION_EXISTS ( pow NOT_NEED_LIBM )
if ( NOT_NEED_LIBM )
set ( LIB_MATH "" )
else ( )
set ( CMAKE_REQUIRED_LIBRARIES m )
CHECK_FUNCTION_EXISTS ( pow HAVE_LIBM )
if ( HAVE_LIBM )
set ( LIB_MATH m )
else ( )
message ( FATAL_ERROR "No libm found for math support" )
endif ( )
endif ( )
2019-09-03 02:24:19 +03:00
if ( SUBPROJECT )
if ( NOT DEFINED BUILD_SHARED_LIBS )
2019-09-05 11:57:52 +03:00
option ( BUILD_SHARED_LIBS "Build shared libraries (DLLs)" OFF )
endif ( )
if ( NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE )
2020-09-21 23:51:47 -04:00
option ( CMAKE_POSITION_INDEPENDENT_CODE "Generate position independent (PIC)" ON )
2019-09-03 02:24:19 +03:00
endif ( )
2022-07-28 18:48:21 +03:00
set ( MDBX_MANAGE_BUILD_FLAGS_DEFAULT OFF )
2019-09-03 02:24:19 +03:00
else ( )
2019-09-05 11:57:52 +03:00
option ( BUILD_SHARED_LIBS "Build shared libraries (DLLs)" ON )
2020-09-21 23:51:47 -04:00
option ( CMAKE_POSITION_INDEPENDENT_CODE "Generate position independent (PIC)" ON )
2019-08-31 17:13:02 +03:00
if ( CC_HAS_ARCH_NATIVE )
2019-09-05 11:57:52 +03:00
option ( BUILD_FOR_NATIVE_CPU "Generate code for the compiling machine CPU" OFF )
2019-08-31 17:13:02 +03:00
endif ( )
if ( CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE
2022-10-16 18:10:44 +03:00
O R G C C _ L T O _ A V A I L A B L E O R M S V C _ L T O _ A V A I L A B L E O R C L A N G _ L T O _ A V A I L A B L E )
2022-11-09 23:37:50 +03:00
if ( ( CMAKE_CONFIGURATION_TYPES OR NOT CMAKE_BUILD_TYPE_UPPERCASE STREQUAL "DEBUG" ) AND
( ( M S V C _ L T O _ A V A I L A B L E A N D N O T C M A K E _ C _ C O M P I L E R _ V E R S I O N V E R S I O N _ L E S S 1 9 ) O R
( G C C _ L T O _ A V A I L A B L E A N D N O T C M A K E _ C _ C O M P I L E R _ V E R S I O N V E R S I O N _ L E S S 7 ) O R
( C L A N G _ L T O _ A V A I L A B L E A N D N O T C M A K E _ C _ C O M P I L E R _ V E R S I O N V E R S I O N _ L E S S 5 ) ) )
set ( INTERPROCEDURAL_OPTIMIZATION_DEFAULT ON )
else ( )
set ( INTERPROCEDURAL_OPTIMIZATION_DEFAULT OFF )
endif ( )
option ( INTERPROCEDURAL_OPTIMIZATION "Enable interprocedural/LTO optimization." ${ INTERPROCEDURAL_OPTIMIZATION_DEFAULT } )
2019-08-31 17:13:02 +03:00
endif ( )
if ( INTERPROCEDURAL_OPTIMIZATION )
2022-11-09 23:37:50 +03:00
if ( GCC_LTO_AVAILABLE )
2019-08-31 17:13:02 +03:00
set ( LTO_ENABLED TRUE )
set ( CMAKE_AR ${ CMAKE_GCC_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
2022-10-16 18:10:44 +03:00
set ( CMAKE_C_COMPILER_AR ${ CMAKE_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
set ( CMAKE_CXX_COMPILER_AR ${ CMAKE_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
2019-08-31 17:13:02 +03:00
set ( CMAKE_NM ${ CMAKE_GCC_NM } CACHE PATH "Path to nm program with LTO-plugin" FORCE )
set ( CMAKE_RANLIB ${ CMAKE_GCC_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
2022-10-16 18:10:44 +03:00
set ( CMAKE_C_COMPILER_RANLIB ${ CMAKE_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
set ( CMAKE_CXX_COMPILER_RANLIB ${ CMAKE_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
2019-08-31 17:13:02 +03:00
message ( STATUS "MDBX indulge Link-Time Optimization by GCC" )
elseif ( CLANG_LTO_AVAILABLE )
set ( LTO_ENABLED TRUE )
2022-10-16 18:10:44 +03:00
if ( CMAKE_CLANG_LD )
set ( CMAKE_LINKER ${ CMAKE_CLANG_LD } CACHE PATH "Path to lld or ld program with LTO-plugin" FORCE )
endif ( )
2019-08-31 17:13:02 +03:00
set ( CMAKE_AR ${ CMAKE_CLANG_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
2022-10-16 18:10:44 +03:00
set ( CMAKE_C_COMPILER_AR ${ CMAKE_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
set ( CMAKE_CXX_COMPILER_AR ${ CMAKE_AR } CACHE PATH "Path to ar program with LTO-plugin" FORCE )
2019-08-31 17:13:02 +03:00
set ( CMAKE_NM ${ CMAKE_CLANG_NM } CACHE PATH "Path to nm program with LTO-plugin" FORCE )
set ( CMAKE_RANLIB ${ CMAKE_CLANG_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
2022-10-16 18:10:44 +03:00
set ( CMAKE_C_COMPILER_RANLIB ${ CMAKE_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
set ( CMAKE_CXX_COMPILER_RANLIB ${ CMAKE_RANLIB } CACHE PATH "Path to ranlib program with LTO-plugin" FORCE )
2019-08-31 17:13:02 +03:00
message ( STATUS "MDBX indulge Link-Time Optimization by CLANG" )
elseif ( MSVC_LTO_AVAILABLE )
set ( LTO_ENABLED TRUE )
message ( STATUS "MDBX indulge Link-Time Optimization by MSVC" )
elseif ( CMAKE_INTERPROCEDURAL_OPTIMIZATION_AVAILABLE )
message ( STATUS "MDBX indulge Interprocedural Optimization by CMake" )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
set ( LTO_ENABLED TRUE )
else ( )
message ( WARNING "Unable to engage interprocedural/LTO optimization." )
endif ( )
else ( )
set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE )
set ( LTO_ENABLED FALSE )
endif ( )
2020-04-15 17:09:37 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE )
find_program ( VALGRIND valgrind )
if ( VALGRIND )
# LY: cmake is ugly and nasty.
# - therefore memcheck-options should be defined before including ctest;
# - otherwise ctest may ignore it.
set ( MEMORYCHECK_SUPPRESSIONS_FILE
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / t e s t / v a l g r i n d _ s u p p r e s s . t x t "
C A C H E F I L E P A T H " S u p p r e s s i o n s f i l e f o r V a l g r i n d " F O R C E )
set ( MEMORYCHECK_COMMAND_OPTIONS
2023-10-11 13:40:41 +03:00
" - - t r a c e - c h i l d r e n = y e s - - l e a k - c h e c k = f u l l - - t r a c k - o r i g i n s = y e s - - t r a c k - o r i g i n s = y e s - - e r r o r - e x i t c o d e = 4 2 - - e r r o r - m a r k e r s = @ - - e r r o r s - f o r - l e a k - k i n d s = d e f i n i t e - - f a i r - s c h e d = y e s - - s u p p r e s s i o n s = $ { M E M O R Y C H E C K _ S U P P R E S S I O N S _ F I L E } "
2020-04-15 17:09:37 +03:00
C A C H E S T R I N G " V a l g r i n d o p t i o n s " F O R C E )
set ( VALGRIND_COMMAND_OPTIONS "${MEMORYCHECK_COMMAND_OPTIONS}" CACHE STRING "Valgrind options" FORCE )
endif ( )
2019-08-31 17:13:02 +03:00
2020-04-15 17:09:37 +03:00
# Enable 'make tags' target.
find_program ( CTAGS ctags )
if ( CTAGS )
add_custom_target ( tags COMMAND ${ CTAGS } -R -f tags
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
add_custom_target ( ctags DEPENDS tags )
endif ( CTAGS )
2020-05-05 18:52:32 +03:00
if ( UNIX )
find_program ( CLANG_FORMAT
2021-12-02 18:17:41 +03:00
N A M E S c l a n g - f o r m a t - 1 3 c l a n g - f o r m a t )
2020-05-05 18:52:32 +03:00
if ( CLANG_FORMAT )
execute_process ( COMMAND ${ CLANG_FORMAT } "--version" OUTPUT_VARIABLE clang_format_version_info )
string ( REGEX MATCH "version ([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" clang_format_version_info CLANG_FORMAT_VERSION )
2021-12-02 18:17:41 +03:00
if ( clang_format_version_info AND NOT CLANG_FORMAT_VERSION VERSION_LESS 13.0 )
2020-05-05 18:52:32 +03:00
# Enable 'make reformat' target.
add_custom_target ( reformat
V E R B A T I M
C O M M A N D
g i t l s - f i l e s |
g r e p - E \ \ . \ ( c | c x x | c c | c p p | h | h x x | h p p \ ) \ ( \ \ . i n \ ) ? \ $ |
x a r g s $ { C L A N G _ F O R M A T } - i - - s t y l e = f i l e
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ S O U R C E _ D I R } )
endif ( )
endif ( )
2020-04-15 17:09:37 +03:00
endif ( )
2019-08-31 17:13:02 +03:00
2020-04-15 17:09:37 +03:00
if ( NOT "${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}" )
add_custom_target ( distclean )
add_custom_command ( TARGET distclean
C O M M A N D $ { C M A K E _ C O M M A N D } - E r e m o v e _ d i r e c t o r y " $ { P R O J E C T _ B I N A R Y _ D I R } "
C O M M E N T " R e m o v i n g t h e b u i l d d i r e c t o r y a n d i t s c o n t e n t " )
elseif ( IS_DIRECTORY .git AND GIT )
add_custom_target ( distclean )
add_custom_command ( TARGET distclean
W O R K I N G _ D I R E C T O R Y $ { P R O J E C T _ S O U R C E _ D I R }
C O M M A N D $ { G I T } s u b m o d u l e f o r e a c h - - r e c u r s i v e g i t c l e a n - f - X - d
C O M M A N D $ { G I T } c l e a n - f - X - d
C O M M E N T " R e m o v i n g a l l b u i l d f i l e s f r o m t h e s o u r c e d i r e c t o r y " )
endif ( )
endif ( NOT MDBX_AMALGAMATED_SOURCE )
2019-08-31 17:13:02 +03:00
2022-07-28 18:48:21 +03:00
set ( MDBX_MANAGE_BUILD_FLAGS_DEFAULT ON )
2019-09-03 02:24:19 +03:00
endif ( SUBPROJECT )
2019-08-31 17:13:02 +03:00
2022-07-28 18:48:21 +03:00
option ( MDBX_MANAGE_BUILD_FLAGS "Allow libmdbx to configure/manage/override its own build flags" ${ MDBX_MANAGE_BUILD_FLAGS_DEFAULT } )
if ( MDBX_MANAGE_BUILD_FLAGS )
setup_compile_flags ( )
endif ( )
2019-10-22 12:14:26 +03:00
list ( FIND CMAKE_C_COMPILE_FEATURES c_std_11 HAS_C11 )
2020-08-22 20:19:46 +03:00
list ( FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 HAS_CXX11 )
list ( FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_14 HAS_CXX14 )
list ( FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_17 HAS_CXX17 )
list ( FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_20 HAS_CXX20 )
2021-11-07 02:17:26 +03:00
list ( FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_23 HAS_CXX23 )
2020-08-22 20:19:46 +03:00
if ( NOT DEFINED MDBX_CXX_STANDARD )
2021-11-07 02:15:03 +03:00
if ( DEFINED ENV{CMAKE_CXX_STANDARD} )
set ( CMAKE_CXX_STANDARD $ENV{ CMAKE_CXX_STANDARD } )
endif ( )
2020-08-22 20:19:46 +03:00
if ( DEFINED CMAKE_CXX_STANDARD )
set ( MDBX_CXX_STANDARD ${ CMAKE_CXX_STANDARD } )
2021-11-07 02:17:26 +03:00
elseif ( NOT HAS_CXX23 LESS 0
A N D NOT ( CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12 ) )
set ( MDBX_CXX_STANDARD 23 )
2021-08-04 14:09:50 +03:00
elseif ( NOT HAS_CXX20 LESS 0
2021-12-09 15:54:16 +03:00
A N D NOT ( CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10 ) )
2020-08-22 20:19:46 +03:00
set ( MDBX_CXX_STANDARD 20 )
2021-08-04 14:09:50 +03:00
elseif ( NOT HAS_CXX17 LESS 0
A N D NOT ( CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5 ) )
2020-08-22 20:19:46 +03:00
set ( MDBX_CXX_STANDARD 17 )
elseif ( NOT HAS_CXX14 LESS 0 )
set ( MDBX_CXX_STANDARD 14 )
elseif ( NOT HAS_CXX11 LESS 0 )
set ( MDBX_CXX_STANDARD 11 )
2022-11-07 23:37:27 +03:00
elseif ( CXX_FALLBACK_GNU11 OR CXX_FALLBACK_11 )
set ( MDBX_CXX_STANDARD 11 )
2020-08-22 20:19:46 +03:00
else ( )
set ( MDBX_CXX_STANDARD 98 )
endif ( )
endif ( )
2020-11-28 13:07:58 +03:00
if ( NOT DEFINED MDBX_C_STANDARD )
# MSVC >= 19.28 (Microsoft Visual Studio 16.8) is mad!
# It unable process Windows SDK headers in the C11 mode!
2022-01-31 23:29:03 +03:00
if ( MSVC AND MSVC_VERSION GREATER 1927 AND NOT MSVC_VERSION GREATER 1929 )
set ( MDBX_C_STANDARD 99 )
set ( C_FALLBACK_11 OFF )
set ( C_FALLBACK_GNU11 OFF )
elseif ( HAS_C11 LESS 0 AND NOT C_FALLBACK_GNU11 AND NOT C_FALLBACK_11 )
2020-11-28 13:07:58 +03:00
set ( MDBX_C_STANDARD 99 )
else ( )
set ( MDBX_C_STANDARD 11 )
endif ( )
2019-10-22 12:14:26 +03:00
endif ( )
2019-08-31 17:13:02 +03:00
2020-04-15 17:09:37 +03:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" AND EXISTS "${MDBX_SOURCE_DIR}/ntdll.def" )
if ( MSVC )
if ( NOT MSVC_LIB_EXE )
# Find lib.exe
get_filename_component ( CL_NAME ${ CMAKE_C_COMPILER } NAME )
string ( REPLACE cl.exe lib.exe MSVC_LIB_EXE ${ CL_NAME } )
find_program ( MSVC_LIB_EXE ${ MSVC_LIB_EXE } )
endif ( )
if ( MSVC_LIB_EXE )
message ( STATUS "Found MSVC's lib tool: ${MSVC_LIB_EXE}" )
set ( MDBX_NTDLL_EXTRA_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/mdbx_ntdll_extra.lib" )
add_custom_command ( OUTPUT "${MDBX_NTDLL_EXTRA_IMPLIB}"
C O M M E N T " C r e a t e e x t r a - i m p o r t - l i b r a r y f o r n t d l l . d l l "
M A I N _ D E P E N D E N C Y " $ { M D B X _ S O U R C E _ D I R } / n t d l l . d e f "
C O M M A N D $ { M S V C _ L I B _ E X E } / d e f : " $ { M D B X _ S O U R C E _ D I R } / n t d l l . d e f " / o u t : " $ { M D B X _ N T D L L _ E X T R A _ I M P L I B } " $ { I N I T I A L _ C M A K E _ S T A T I C _ L I N K E R _ F L A G S } )
else ( )
message ( WARNING "MSVC's lib tool not found" )
endif ( )
elseif ( MINGW OR MINGW64 )
if ( NOT DLLTOOL )
# Find dlltool
get_filename_component ( GCC_NAME ${ CMAKE_C_COMPILER } NAME )
string ( REPLACE gcc dlltool DLLTOOL_NAME ${ GCC_NAME } )
find_program ( DLLTOOL NAMES ${ DLLTOOL_NAME } )
endif ( )
if ( DLLTOOL )
message ( STATUS "Found dlltool: ${DLLTOOL}" )
set ( MDBX_NTDLL_EXTRA_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/mdbx_ntdll_extra.a" )
add_custom_command ( OUTPUT "${MDBX_NTDLL_EXTRA_IMPLIB}"
C O M M E N T " C r e a t e e x t r a - i m p o r t - l i b r a r y f o r n t d l l . d l l "
M A I N _ D E P E N D E N C Y " $ { M D B X _ S O U R C E _ D I R } / n t d l l . d e f "
C O M M A N D $ { D L L T O O L } - d " $ { M D B X _ S O U R C E _ D I R } / n t d l l . d e f " - l " $ { M D B X _ N T D L L _ E X T R A _ I M P L I B } " )
else ( )
message ( WARNING "dlltool not found" )
endif ( )
endif ( )
if ( MDBX_NTDLL_EXTRA_IMPLIB )
# LY: Sometimes CMake requires a nightmarish magic for simple things.
# 1) create a target out of the library compilation result
add_custom_target ( ntdll_extra_target DEPENDS "${MDBX_NTDLL_EXTRA_IMPLIB}" )
# 2) create an library target out of the library compilation result
add_library ( ntdll_extra STATIC IMPORTED GLOBAL )
add_dependencies ( ntdll_extra ntdll_extra_target )
# 3) specify where the library is (and where to find the headers)
set_target_properties ( ntdll_extra
P R O P E R T I E S
I M P O R T E D _ L O C A T I O N " $ { M D B X _ N T D L L _ E X T R A _ I M P L I B } " )
endif ( )
endif ( )
2019-12-04 23:05:49 +03:00
################################################################################
################################################################################
2019-09-03 02:24:19 +03:00
#
2019-12-04 23:05:49 +03:00
# #### ##### ##### # #### # # ####
# # # # # # # # # ## # #
# # # # # # # # # # # # ####
# # # ##### # # # # # # # #
# # # # # # # # # ## # #
# #### # # # #### # # ####
2019-09-03 02:24:19 +03:00
#
2023-11-02 16:54:32 +03:00
set ( MDBX_BUILD_OPTIONS ENABLE_UBSAN ENABLE_ASAN ENABLE_MEMCHECK ENABLE_GPROF ENABLE_GCOV )
2020-09-27 16:45:00 +03:00
macro ( add_mdbx_option NAME DESCRIPTION DEFAULT )
list ( APPEND MDBX_BUILD_OPTIONS ${ NAME } )
if ( NOT ${ DEFAULT } STREQUAL "AUTO" )
option ( ${ NAME } "${DESCRIPTION}" ${ DEFAULT } )
elseif ( NOT DEFINED ${ NAME } )
set ( ${ NAME } _AUTO ON )
endif ( )
endmacro ( )
if ( IOS )
set ( MDBX_BUILD_TOOLS_DEFAULT OFF )
if ( NOT_SUBPROJECT )
cmake_policy ( SET CMP0006 OLD )
set ( CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED "NO" )
endif ( )
else ( )
set ( MDBX_BUILD_TOOLS_DEFAULT ON )
endif ( )
2020-04-15 17:09:37 +03:00
add_mdbx_option ( MDBX_INSTALL_STATIC "Build and install libmdbx for static linking" OFF )
2019-09-05 11:57:52 +03:00
add_mdbx_option ( MDBX_BUILD_SHARED_LIBRARY "Build libmdbx as shared library (DLL)" ${ BUILD_SHARED_LIBS } )
2020-04-07 23:07:32 +03:00
add_mdbx_option ( MDBX_BUILD_TOOLS "Build MDBX tools (mdbx_chk/stat/dump/load/copy)" ${ MDBX_BUILD_TOOLS_DEFAULT } )
2020-09-27 14:16:26 +03:00
CMAKE_DEPENDENT_OPTION ( MDBX_INSTALL_MANPAGES "Install man-pages for MDBX tools (mdbx_chk/stat/dump/load/copy)" ON MDBX_BUILD_TOOLS OFF )
2019-09-03 02:24:19 +03:00
add_mdbx_option ( MDBX_TXN_CHECKOWNER "Checking transaction matches the calling thread inside libmdbx's API" ON )
2020-07-22 14:53:15 +03:00
add_mdbx_option ( MDBX_ENV_CHECKPID "Paranoid checking PID inside libmdbx's API" AUTO )
mark_as_advanced ( MDBX_ENV_CHECKPID )
2019-10-06 14:59:53 +03:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" )
2020-04-15 17:09:37 +03:00
add_mdbx_option ( MDBX_DISABLE_GNU_SOURCE "Don't use GNU/Linux libc extensions" OFF )
2019-10-06 14:59:53 +03:00
mark_as_advanced ( MDBX_DISABLE_GNU_SOURCE )
endif ( )
2020-04-15 17:09:37 +03:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Darwin" OR IOS )
2019-09-03 02:24:19 +03:00
add_mdbx_option ( MDBX_OSX_SPEED_INSTEADOF_DURABILITY "Disable use fcntl(F_FULLFSYNC) in favor of speed" OFF )
mark_as_advanced ( MDBX_OSX_SPEED_INSTEADOF_DURABILITY )
endif ( )
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
2020-04-15 17:09:37 +03:00
if ( MDBX_NTDLL_EXTRA_IMPLIB )
2021-04-29 20:09:16 +03:00
add_mdbx_option ( MDBX_WITHOUT_MSVC_CRT "Avoid dependence from MSVC CRT and use ntdll.dll instead" OFF )
2019-09-03 02:24:19 +03:00
endif ( )
2022-10-10 15:52:58 +03:00
set ( MDBX_AVOID_MSYNC_DEFAULT ON )
2019-09-03 02:24:19 +03:00
else ( )
add_mdbx_option ( MDBX_USE_OFDLOCKS "Use Open file description locks (aka OFD locks, non-POSIX)" AUTO )
mark_as_advanced ( MDBX_USE_OFDLOCKS )
2022-10-10 15:52:58 +03:00
set ( MDBX_AVOID_MSYNC_DEFAULT OFF )
2019-09-03 02:24:19 +03:00
endif ( )
2023-10-09 21:49:58 +03:00
add_mdbx_option ( MDBX_AVOID_MSYNC "Controls dirty pages tracking, spilling and persisting in MDBX_WRITEMAP mode" ${ MDBX_AVOID_MSYNC_DEFAULT } )
2022-10-10 15:52:58 +03:00
add_mdbx_option ( MDBX_LOCKING "Locking method (Windows=-1, SysV=5, POSIX=1988, POSIX=2001, POSIX=2008, Futexes=1995)" AUTO )
2019-12-04 23:05:49 +03:00
mark_as_advanced ( MDBX_LOCKING )
2020-04-15 17:09:37 +03:00
add_mdbx_option ( MDBX_TRUST_RTC "Does a system have battery-backed Real-Time Clock or just a fake" AUTO )
2019-12-04 23:05:49 +03:00
mark_as_advanced ( MDBX_TRUST_RTC )
2023-10-09 21:49:58 +03:00
add_mdbx_option ( MDBX_FORCE_ASSERTIONS "Force enable assertion checking" OFF )
add_mdbx_option ( MDBX_DISABLE_VALIDATION "Disable some checks to reduce an overhead and detection probability of database corruption to a values closer to the LMDB" OFF )
mark_as_advanced ( MDBX_DISABLE_VALIDATION )
add_mdbx_option ( MDBX_ENABLE_REFUND "Zerocost auto-compactification during write-transactions" ON )
add_mdbx_option ( MDBX_ENABLE_MADVISE "Using POSIX' madvise() and/or similar hints" ON )
2022-11-10 15:09:42 +03:00
if ( CMAKE_TARGET_BITNESS GREATER 32 )
set ( MDBX_BIGFOOT_DEFAULT ON )
else ( )
set ( MDBX_BIGFOOT_DEFAULT OFF )
endif ( )
2023-10-09 21:49:58 +03:00
add_mdbx_option ( MDBX_ENABLE_BIGFOOT "Chunking long list of retired pages during huge transactions commit to avoid use sequences of pages" ${ MDBX_BIGFOOT_DEFAULT } )
add_mdbx_option ( MDBX_ENABLE_PGOP_STAT "Gathering statistics for page operations" ON )
add_mdbx_option ( MDBX_ENABLE_PROFGC "Profiling of GC search and updates" OFF )
mark_as_advanced ( MDBX_ENABLE_PROFGC )
mdbx: переработка инициализации, проверки и импорта dbi-хендлов в транзакциях.
Ранее инициализация в транзакциях структур данных, связанных с
dbi-хендлами и subDb, выполнялась непосредственно при запуске
транзакций. Что в сценариях с большим кол-вом dbi-дексприторов (например
libfpta) порождало заметные накладные расходы, которые расли линейно от
общего кол-ва открытых subDb, а не от реально используемых в транзакции.
При использовании одной-двух сотен хендлов, при старте каждой транзакции
могли копироваться и/или обнуляться десятки килобайт. Теперь этот
недостаток устранен.
Изменена схема инициализации, валидации и импорта хендлов открытых после
старта транзакции:
1) Инициализация теперь выполняется отложенна, а при старте транзации
обнуляется только массив с однобайтовыми статустами dbi-хендлов.
При этом доступнва опция сборки `MDBX_ENABLE_DBI_SPARSE`, при активации
которой используется битовая карты, что снижает объем инициализации
при старте транзакции в 8 раз (CHAR_BIT).
2) Переработана валидация dbi-хендлов на входах API, с уменьшением кол-ва
проверок и ветвлений до теоретического минимума.
3) Переработ импорт dbi-хендов открытых после старта транзакци, теперь
при этом не захватывается мьютекс.
2023-11-05 22:10:29 +03:00
add_mdbx_option ( MDBX_ENABLE_DBI_SPARSE "FIXME" ON )
2023-11-04 23:45:29 +03:00
add_mdbx_option ( MDBX_ENABLE_DBI_LOCKFREE "FIXME" ON )
2020-04-15 17:09:37 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE )
2021-04-19 17:43:25 +03:00
if ( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE_UPPERCASE STREQUAL "DEBUG" )
set ( MDBX_ALLOY_BUILD_DEFAULT OFF )
else ( )
set ( MDBX_ALLOY_BUILD_DEFAULT ON )
endif ( )
add_mdbx_option ( MDBX_ALLOY_BUILD "Build MDBX library through single/alloyed object file" ${ MDBX_ALLOY_BUILD_DEFAULT } )
2020-08-22 20:19:46 +03:00
endif ( )
2020-04-15 17:09:37 +03:00
if ( ( MDBX_BUILD_TOOLS OR MDBX_ENABLE_TESTS ) AND MDBX_BUILD_SHARED_LIBRARY )
add_mdbx_option ( MDBX_LINK_TOOLS_NONSTATIC "Link MDBX tools with non-static libmdbx" OFF )
else ( )
unset ( MDBX_LINK_TOOLS_NONSTATIC CACHE )
endif ( )
2022-11-07 23:37:27 +03:00
if ( CMAKE_CXX_COMPILER_LOADED AND MDBX_CXX_STANDARD LESS 83 AND NOT MDBX_CXX_STANDARD LESS 11 )
2020-08-22 20:19:46 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE )
option ( MDBX_ENABLE_TESTS "Build MDBX tests" ${ BUILD_TESTING } )
endif ( )
2021-04-29 20:09:16 +03:00
if ( NOT MDBX_WITHOUT_MSVC_CRT
2020-09-13 19:50:53 +03:00
A N D NOT ( CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8 )
2021-08-04 14:09:50 +03:00
A N D NOT ( CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.9 )
2020-08-22 20:19:46 +03:00
A N D NOT ( MSVC AND MSVC_VERSION LESS 1900 ) )
option ( MDBX_BUILD_CXX "Build C++ portion" ON )
else ( )
set ( MDBX_BUILD_CXX FALSE )
endif ( )
else ( )
set ( MDBX_BUILD_CXX FALSE )
2020-09-27 16:45:00 +03:00
set ( MDBX_ENABLE_TESTS FALSE )
2020-08-22 20:19:46 +03:00
endif ( )
2020-04-15 17:09:37 +03:00
################################################################################
################################################################################
2020-09-28 23:47:37 +03:00
if ( MDBX_BUILD_CXX AND NOT CMAKE_CXX_COMPILER_LOADED )
2020-09-27 16:49:55 +03:00
message ( FATAL_ERROR "MDBX_BUILD_CXX=${MDBX_BUILD_CXX}: The C++ compiler is required to build the C++API." )
endif ( )
2022-04-07 21:57:49 +03:00
if ( MDBX_BUILD_CXX )
# determine library for C++ std::filesystem
probe_libcxx_filesystem ( )
endif ( )
2020-04-15 17:09:37 +03:00
# Get version
2020-04-30 03:45:47 +03:00
fetch_version ( MDBX "${CMAKE_CURRENT_SOURCE_DIR}" FALSE )
2020-04-15 17:09:37 +03:00
message ( STATUS "libmdbx version is ${MDBX_VERSION}" )
# sources list
2020-10-02 00:05:02 +03:00
set ( LIBMDBX_PUBLIC_HEADERS mdbx.h )
set ( LIBMDBX_SOURCES mdbx.h "${CMAKE_CURRENT_BINARY_DIR}/config.h" )
2020-04-15 17:09:37 +03:00
if ( MDBX_AMALGAMATED_SOURCE )
list ( APPEND LIBMDBX_SOURCES mdbx.c )
else ( )
# generate version file
configure_file ( "${MDBX_SOURCE_DIR}/version.c.in"
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / v e r s i o n . c " E S C A P E _ Q U O T E S )
file ( SHA256 "${CMAKE_CURRENT_BINARY_DIR}/version.c" MDBX_SOURCERY_DIGEST )
string ( MAKE_C_IDENTIFIER "${MDBX_GIT_DESCRIBE}" MDBX_SOURCERY_SUFFIX )
set ( MDBX_BUILD_SOURCERY "${MDBX_SOURCERY_DIGEST}_${MDBX_SOURCERY_SUFFIX}" )
if ( MDBX_ALLOY_BUILD )
2020-08-22 20:19:46 +03:00
list ( APPEND LIBMDBX_SOURCES "${MDBX_SOURCE_DIR}/alloy.c" )
2020-04-15 17:09:37 +03:00
include_directories ( "${MDBX_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" )
else ( )
list ( APPEND LIBMDBX_SOURCES
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / v e r s i o n . c "
2022-06-02 18:59:58 +03:00
" $ { M D B X _ S O U R C E _ D I R } / o p t i o n s . h " " $ { M D B X _ S O U R C E _ D I R } / b a s e . h "
2020-04-15 17:09:37 +03:00
" $ { M D B X _ S O U R C E _ D I R } / i n t e r n a l s . h " " $ { M D B X _ S O U R C E _ D I R } / o s a l . h "
" $ { M D B X _ S O U R C E _ D I R } / c o r e . c " " $ { M D B X _ S O U R C E _ D I R } / o s a l . c "
2022-07-13 22:11:28 +03:00
" $ { M D B X _ S O U R C E _ D I R } / l c k - p o s i x . c " )
if ( NOT APPLE )
list ( APPEND LIBMDBX_SOURCES "${MDBX_SOURCE_DIR}/lck-windows.c" )
endif ( )
2020-04-15 17:09:37 +03:00
include_directories ( "${MDBX_SOURCE_DIR}" )
endif ( )
endif ( MDBX_AMALGAMATED_SOURCE )
2020-08-22 20:19:46 +03:00
if ( MDBX_BUILD_CXX )
message ( STATUS "Use C${MDBX_C_STANDARD} and C++${MDBX_CXX_STANDARD} for libmdbx" )
2020-10-02 00:05:02 +03:00
list ( APPEND LIBMDBX_PUBLIC_HEADERS mdbx.h++ )
2020-08-22 20:19:46 +03:00
list ( APPEND LIBMDBX_SOURCES "${MDBX_SOURCE_DIR}/mdbx.c++" mdbx.h++ )
else ( )
message ( STATUS "Use C${MDBX_C_STANDARD} for libmdbx but C++ portion is disabled" )
endif ( )
2020-04-15 17:09:37 +03:00
2021-06-24 15:41:54 +03:00
if ( SUBPROJECT AND MSVC )
if ( MSVC_VERSION LESS 1900 )
message ( FATAL_ERROR "At least \" Microsoft C/C++ Compiler\ " version 19.0.24234.1 (Visual Studio 2015 Update 3) is required." )
endif ( )
add_compile_options ( "/utf-8" )
endif ( )
2020-04-15 17:09:37 +03:00
macro ( target_setup_options TARGET )
if ( DEFINED INTERPROCEDURAL_OPTIMIZATION )
set_target_properties ( ${ TARGET } PROPERTIES
I N T E R P R O C E D U R A L _ O P T I M I Z A T I O N $ < B O O L : $ { I N T E R P R O C E D U R A L _ O P T I M I Z A T I O N } > )
endif ( )
2022-01-31 23:29:03 +03:00
if ( NOT C_FALLBACK_GNU11 AND NOT C_FALLBACK_11 )
set_target_properties ( ${ TARGET } PROPERTIES
C _ S T A N D A R D $ { M D B X _ C _ S T A N D A R D } C _ S T A N D A R D _ R E Q U I R E D O N )
endif ( )
2020-08-22 20:19:46 +03:00
if ( MDBX_BUILD_CXX )
set_target_properties ( ${ TARGET } PROPERTIES
C X X _ S T A N D A R D $ { M D B X _ C X X _ S T A N D A R D } C X X _ S T A N D A R D _ R E Q U I R E D O N )
2021-06-24 15:41:54 +03:00
if ( MSVC AND NOT MSVC_VERSION LESS 1910 )
target_compile_options ( ${ TARGET } INTERFACE "/Zc:__cplusplus" )
endif ( )
2020-08-22 20:19:46 +03:00
endif ( )
2021-08-04 14:09:50 +03:00
if ( CC_HAS_FASTMATH
A N D NOT ( CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10 ) )
2020-04-15 17:09:37 +03:00
target_compile_options ( ${ TARGET } PRIVATE "-ffast-math" )
endif ( )
if ( CC_HAS_VISIBILITY )
target_compile_options ( ${ TARGET } PRIVATE "-fvisibility=hidden" )
endif ( )
if ( BUILD_FOR_NATIVE_CPU AND CC_HAS_ARCH_NATIVE )
2021-06-24 15:41:54 +03:00
target_compile_options ( ${ TARGET } PRIVATE "-march=native" )
2020-04-15 17:09:37 +03:00
endif ( )
endmacro ( )
macro ( libmdbx_setup_libs TARGET MODE )
2022-11-07 23:37:27 +03:00
if ( CMAKE_VERSION VERSION_LESS 3.1 )
target_link_libraries ( ${ TARGET } ${ MODE } ${ CMAKE_THREAD_LIBS_INIT } )
else ( )
target_link_libraries ( ${ TARGET } ${ MODE } Threads::Threads )
endif ( )
2020-04-15 17:09:37 +03:00
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
2022-11-08 00:42:32 +03:00
target_link_libraries ( ${ TARGET } ${ MODE } ntdll user32 kernel32 advapi32 )
2021-04-29 20:09:16 +03:00
if ( MDBX_NTDLL_EXTRA_IMPLIB AND MDBX_WITHOUT_MSVC_CRT )
2020-04-15 17:09:37 +03:00
target_link_libraries ( ${ TARGET } ${ MODE } ntdll_extra )
endif ( )
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "SunOS" OR ${ CMAKE_SYSTEM_NAME } STREQUAL "Solaris" )
target_link_libraries ( ${ TARGET } ${ MODE } kstat )
elseif ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Android" )
target_link_libraries ( ${ TARGET } ${ MODE } log )
endif ( )
2022-04-05 17:02:39 +03:00
if ( LIBCXX_FILESYSTEM AND MDBX_BUILD_CXX )
2022-04-22 23:03:58 +03:00
if ( CMAKE_COMPILER_IS_ELBRUSCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 1.25.23
2022-04-05 18:34:37 +03:00
A N D N O T C M A K E _ V E R S I O N V E R S I O N _ L E S S 3 . 1 3 )
target_link_options ( ${ TARGET } PUBLIC "-Wl,--allow-multiple-definition" )
endif ( )
2022-04-05 17:02:39 +03:00
target_link_libraries ( ${ TARGET } PUBLIC ${ LIBCXX_FILESYSTEM } )
2020-08-22 20:19:46 +03:00
endif ( )
2020-04-15 17:09:37 +03:00
endmacro ( )
# build static library
if ( MDBX_INSTALL_STATIC )
add_library ( mdbx-static STATIC ${ LIBMDBX_SOURCES } )
else ( )
add_library ( mdbx-static STATIC EXCLUDE_FROM_ALL ${ LIBMDBX_SOURCES } )
endif ( )
2020-10-02 00:05:02 +03:00
set_target_properties ( mdbx-static PROPERTIES PUBLIC_HEADER "${LIBMDBX_PUBLIC_HEADERS}" )
2020-04-17 00:37:29 +03:00
target_compile_definitions ( mdbx-static PRIVATE MDBX_BUILD_SHARED_LIBRARY=0 )
2020-04-15 17:09:37 +03:00
target_setup_options ( mdbx-static )
libmdbx_setup_libs ( mdbx-static INTERFACE )
if ( MDBX_BUILD_SHARED_LIBRARY )
set_target_properties ( mdbx-static PROPERTIES OUTPUT_NAME mdbx-static )
else ( )
set_target_properties ( mdbx-static PROPERTIES OUTPUT_NAME mdbx )
endif ( )
2022-04-13 11:05:50 +03:00
target_include_directories ( mdbx-static INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}" )
2019-09-03 02:24:19 +03:00
################################################################################
2020-04-15 17:09:37 +03:00
# build shared library
if ( MDBX_BUILD_SHARED_LIBRARY )
add_library ( mdbx SHARED ${ LIBMDBX_SOURCES } )
2020-10-02 00:05:02 +03:00
set_target_properties ( mdbx PROPERTIES PUBLIC_HEADER "${LIBMDBX_PUBLIC_HEADERS}" )
2020-04-17 00:37:29 +03:00
target_compile_definitions ( mdbx PRIVATE LIBMDBX_EXPORTS MDBX_BUILD_SHARED_LIBRARY=1 INTERFACE LIBMDBX_IMPORTS )
2020-04-15 17:09:37 +03:00
target_setup_options ( mdbx )
libmdbx_setup_libs ( mdbx PRIVATE )
2020-05-10 03:41:28 +03:00
if ( MSVC )
2021-04-29 20:09:16 +03:00
if ( MDBX_NTDLL_EXTRA_IMPLIB AND MDBX_WITHOUT_MSVC_CRT )
2020-05-10 03:41:28 +03:00
set_property ( TARGET mdbx PROPERTY LINKER_FLAGS "/NODEFAULTLIB" )
else ( )
set_property ( TARGET mdbx PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" )
endif ( )
endif ( )
2020-04-15 17:09:37 +03:00
if ( CC_HAS_VISIBILITY AND ( LTO_ENABLED OR INTERPROCEDURAL_OPTIMIZATION ) )
set_target_properties ( mdbx PROPERTIES LINK_FLAGS "-fvisibility=hidden" )
endif ( )
list ( APPEND MDBX_BUILD_FLAGS ${ CMAKE_SHARED_LINKER_FLAGS } )
2022-04-13 11:05:50 +03:00
target_include_directories ( mdbx INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}" )
2020-04-15 17:09:37 +03:00
endif ( )
if ( MDBX_BUILD_SHARED_LIBRARY AND MDBX_LINK_TOOLS_NONSTATIC )
set ( TOOL_MDBX_LIB mdbx )
# use, i.e. don't skip the full RPATH for the build tree
set ( CMAKE_SKIP_BUILD_RPATH FALSE )
# when building, don't use the install RPATH already (but later on when installing)
set ( CMAKE_BUILD_WITH_INSTALL_RPATH FALSE )
# add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
set ( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )
# the RPATH to be used when installing, but only if it's not a system directory
list ( FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir )
if ( isSystemDir EQUAL -1 )
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Darwin" )
set ( CMAKE_INSTALL_RPATH "@executable_path/../lib" )
else ( )
set ( CMAKE_INSTALL_RPATH "\$ORIGIN/../lib" )
endif ( )
endif ( )
else ( )
set ( TOOL_MDBX_LIB mdbx-static )
endif ( )
# build mdbx-tools
if ( MDBX_BUILD_TOOLS )
if ( NOT MDBX_AMALGAMATED_SOURCE AND ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
set ( WINGETOPT_SRC ${ MDBX_SOURCE_DIR } /wingetopt.c ${ MDBX_SOURCE_DIR } /wingetopt.h )
else ( )
set ( WINGETOPT_SRC "" )
endif ( )
2021-03-10 14:43:49 +03:00
foreach ( TOOL mdbx_chk mdbx_copy mdbx_stat mdbx_dump mdbx_load mdbx_drop )
2020-04-15 17:09:37 +03:00
add_executable ( ${ TOOL } mdbx.h ${ MDBX_SOURCE_DIR } / ${ TOOL } .c ${ WINGETOPT_SRC } )
2022-01-31 23:29:03 +03:00
if ( NOT C_FALLBACK_GNU11 AND NOT C_FALLBACK_11 )
2020-06-26 02:57:46 +03:00
set_target_properties ( ${ TOOL } PROPERTIES
C _ S T A N D A R D $ { M D B X _ C _ S T A N D A R D } C _ S T A N D A R D _ R E Q U I R E D O N )
endif ( )
2020-04-15 17:09:37 +03:00
target_setup_options ( ${ TOOL } )
target_link_libraries ( ${ TOOL } ${ TOOL_MDBX_LIB } )
endforeach ( )
if ( LIB_MATH )
target_link_libraries ( mdbx_chk ${ LIB_MATH } )
target_link_libraries ( mdbx_stat ${ LIB_MATH } )
endif ( )
endif ( )
################################################################################
# mdbx-shared-lib installation
2020-09-27 14:16:26 +03:00
if ( NOT DEFINED MDBX_DLL_INSTALL_DESTINATION )
if ( WIN32 )
2021-06-17 16:59:40 +03:00
set ( MDBX_DLL_INSTALL_DESTINATION ${ CMAKE_INSTALL_BINDIR } )
2020-09-27 14:16:26 +03:00
else ( )
2021-06-17 16:59:40 +03:00
set ( MDBX_DLL_INSTALL_DESTINATION ${ CMAKE_INSTALL_LIBDIR } )
2020-09-27 14:16:26 +03:00
endif ( )
endif ( )
2020-04-15 17:09:37 +03:00
if ( MDBX_BUILD_SHARED_LIBRARY )
if ( CMAKE_VERSION VERSION_LESS 3.12 )
install ( TARGETS mdbx EXPORT libmdbx
2020-09-27 14:16:26 +03:00
L I B R A R Y D E S T I N A T I O N $ { M D B X _ D L L _ I N S T A L L _ D E S T I N A T I O N } C O M P O N E N T r u n t i m e
2021-06-17 16:59:40 +03:00
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
P U B L I C _ H E A D E R D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l
I N C L U D E S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l )
2020-04-15 17:09:37 +03:00
else ( )
install ( TARGETS mdbx EXPORT libmdbx
2020-09-27 14:16:26 +03:00
L I B R A R Y D E S T I N A T I O N $ { M D B X _ D L L _ I N S T A L L _ D E S T I N A T I O N } C O M P O N E N T r u n t i m e
2020-04-15 17:09:37 +03:00
N A M E L I N K _ C O M P O N E N T d e v e l
2021-06-17 16:59:40 +03:00
O B J E C T S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
P U B L I C _ H E A D E R D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l
I N C L U D E S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l )
2020-04-15 17:09:37 +03:00
endif ( )
endif ( MDBX_BUILD_SHARED_LIBRARY )
# mdbx-tools installation
if ( MDBX_BUILD_TOOLS )
2020-09-27 14:16:26 +03:00
if ( NOT DEFINED MDBX_TOOLS_INSTALL_DESTINATION )
2021-06-17 16:59:40 +03:00
set ( MDBX_TOOLS_INSTALL_DESTINATION ${ CMAKE_INSTALL_BINDIR } )
2020-09-27 14:16:26 +03:00
endif ( )
2020-04-15 17:09:37 +03:00
install (
T A R G E T S
m d b x _ c h k
m d b x _ s t a t
m d b x _ c o p y
m d b x _ d u m p
m d b x _ l o a d
2021-03-10 14:43:49 +03:00
m d b x _ d r o p
2020-04-15 17:09:37 +03:00
R U N T I M E
2020-09-27 14:16:26 +03:00
D E S T I N A T I O N $ { M D B X _ T O O L S _ I N S T A L L _ D E S T I N A T I O N }
2020-04-15 17:09:37 +03:00
C O M P O N E N T r u n t i m e )
2020-09-27 14:16:26 +03:00
if ( MDBX_INSTALL_MANPAGES )
if ( NOT DEFINED MDBX_MAN_INSTALL_DESTINATION )
2021-06-17 16:59:40 +03:00
set ( MDBX_MAN_INSTALL_DESTINATION ${ CMAKE_INSTALL_MANDIR } /man1 )
2020-09-27 14:16:26 +03:00
endif ( )
install (
F I L E S
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ c h k . 1 "
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ s t a t . 1 "
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ c o p y . 1 "
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ d u m p . 1 "
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ l o a d . 1 "
2021-03-10 14:43:49 +03:00
" $ { M D B X _ S O U R C E _ D I R } / m a n 1 / m d b x _ d r o p . 1 "
2020-09-27 14:16:26 +03:00
D E S T I N A T I O N $ { M D B X _ M A N _ I N S T A L L _ D E S T I N A T I O N }
C O M P O N E N T d o c )
endif ( )
2020-04-15 17:09:37 +03:00
endif ( MDBX_BUILD_TOOLS )
# mdbx-static-lib installation
if ( MDBX_INSTALL_STATIC )
if ( CMAKE_VERSION VERSION_LESS 3.12 )
install ( TARGETS mdbx-static EXPORT libmdbx
2021-06-17 16:59:40 +03:00
L I B R A R Y D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
O B J E C T S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
P U B L I C _ H E A D E R D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l
I N C L U D E S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l )
2020-04-15 17:09:37 +03:00
else ( )
install ( TARGETS mdbx-static EXPORT libmdbx
2021-06-17 16:59:40 +03:00
L I B R A R Y D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
2020-04-15 17:09:37 +03:00
N A M E L I N K _ C O M P O N E N T d e v e l
2021-06-17 16:59:40 +03:00
O B J E C T S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
A R C H I V E D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } C O M P O N E N T d e v e l
P U B L I C _ H E A D E R D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l
I N C L U D E S D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ I N C L U D E D I R } C O M P O N E N T d e v e l )
2020-04-15 17:09:37 +03:00
endif ( )
endif ( MDBX_INSTALL_STATIC )
################################################################################
# collect options & build info
2021-06-02 14:44:58 +03:00
if ( NOT DEFINED MDBX_BUILD_TIMESTAMP )
string ( TIMESTAMP MDBX_BUILD_TIMESTAMP UTC )
endif ( )
2020-04-15 17:09:37 +03:00
set ( MDBX_BUILD_FLAGS ${ CMAKE_C_FLAGS } )
2020-08-22 20:19:46 +03:00
if ( MDBX_BUILD_CXX )
set ( MDBX_BUILD_FLAGS ${ CMAKE_CXX_FLAGS } )
endif ( )
2020-04-15 17:09:37 +03:00
# append cmake's build-type flags and defines
if ( NOT CMAKE_CONFIGURATION_TYPES )
list ( APPEND MDBX_BUILD_FLAGS ${ CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE } } )
2020-08-22 20:19:46 +03:00
if ( MDBX_BUILD_CXX )
list ( APPEND MDBX_BUILD_FLAGS ${ CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE } } )
endif ( )
2020-04-15 17:09:37 +03:00
endif ( )
2020-11-17 13:51:10 +03:00
# choice target to fetch definitions and options
if ( MDBX_BUILD_SHARED_LIBRARY )
set ( target4fetch mdbx )
else ( )
set ( target4fetch mdbx-static )
endif ( )
2020-04-15 17:09:37 +03:00
# get definitions
2020-11-17 13:51:10 +03:00
get_target_property ( defs_list ${ target4fetch } COMPILE_DEFINITIONS )
2020-04-15 17:09:37 +03:00
if ( defs_list )
list ( APPEND MDBX_BUILD_FLAGS ${ defs_list } )
endif ( )
# get target compile options
2020-11-17 13:51:10 +03:00
get_target_property ( options_list ${ target4fetch } COMPILE_OPTIONS )
2020-04-15 17:09:37 +03:00
if ( options_list )
list ( APPEND MDBX_BUILD_FLAGS ${ options_list } )
endif ( )
list ( REMOVE_DUPLICATES MDBX_BUILD_FLAGS )
string ( REPLACE ";" " " MDBX_BUILD_FLAGS "${MDBX_BUILD_FLAGS}" )
if ( CMAKE_CONFIGURATION_TYPES )
# add dynamic part via per-configuration define
message ( STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS} <AND CONFIGURATION DEPENDENT>" )
add_definitions ( -DMDBX_BUILD_FLAGS_CONFIG= "$<$<CONFIG:Debug>:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$<CONFIG:Release>:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$<CONFIG:RelWithDebInfo>:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$<CONFIG:MinSizeRel>:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>" )
else ( )
message ( STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS}" )
endif ( )
# get compiler info
execute_process ( COMMAND sh -c "${CMAKE_C_COMPILER} --version | head -1"
O U T P U T _ V A R I A B L E M D B X _ B U I L D _ C O M P I L E R
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E
E R R O R _ Q U I E T
R E S U L T _ V A R I A B L E r c )
if ( rc OR NOT MDBX_BUILD_COMPILER )
string ( STRIP "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}" MDBX_BUILD_COMPILER )
endif ( )
# make a build-target triplet
if ( CMAKE_C_COMPILER_TARGET )
set ( MDBX_BUILD_TARGET "${CMAKE_C_COMPILER_TARGET}" )
else ( )
2022-04-22 12:55:00 +03:00
if ( CMAKE_C_COMPILER_ARCHITECTURE_ID )
string ( STRIP "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" MDBX_BUILD_TARGET )
elseif ( CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_GENERATOR_PLATFORM STREQUAL CMAKE_SYSTEM_NAME )
string ( STRIP "${CMAKE_GENERATOR_PLATFORM}" MDBX_BUILD_TARGET )
elseif ( CMAKE_SYSTEM_ARCH )
string ( STRIP "${CMAKE_SYSTEM_ARCH}" MDBX_BUILD_TARGET )
elseif ( CMAKE_LIBRARY_ARCHITECTURE )
string ( STRIP "${CMAKE_LIBRARY_ARCHITECTURE}" MDBX_BUILD_TARGET )
elseif ( CMAKE_SYSTEM_PROCESSOR )
string ( STRIP "${CMAKE_SYSTEM_PROCESSOR}" MDBX_BUILD_TARGET )
else ( )
set ( MDBX_BUILD_TARGET "unknown" )
endif ( )
if ( CMAKE_C_COMPILER_ABI
A N D NOT ( CMAKE_C_COMPILER_ABI MATCHES ".*${MDBX_BUILD_TARGET}.*" OR MDBX_BUILD_TARGET MATCHES ".*${CMAKE_C_COMPILER_ABI}.*" ) )
2022-11-07 23:37:27 +03:00
string ( CONCAT MDBX_BUILD_TARGET "${MDBX_BUILD_TARGET}-${CMAKE_C_COMPILER_ABI}" )
2022-04-22 12:55:00 +03:00
endif ( )
if ( CMAKE_C_PLATFORM_ID
A N D NOT ( CMAKE_SYSTEM_NAME
AND ( CMAKE_C_PLATFORM_ID MATCHES ".*${CMAKE_SYSTEM_NAME}.*" OR CMAKE_SYSTEM_NAME MATCHES ".*${CMAKE_C_PLATFORM_ID}.*" ) )
A N D NOT ( CMAKE_C_PLATFORM_ID MATCHES ".*${CMAKE_C_PLATFORM_ID}.*" OR MDBX_BUILD_TARGET MATCHES ".*${CMAKE_C_PLATFORM_ID}.*" ) )
2022-11-07 23:37:27 +03:00
string ( CONCAT MDBX_BUILD_TARGET "${MDBX_BUILD_TARGET}-${CMAKE_C_COMPILER_ABI}" )
2022-04-22 12:55:00 +03:00
endif ( )
if ( CMAKE_SYSTEM_NAME )
2022-11-07 23:37:27 +03:00
string ( CONCAT MDBX_BUILD_TARGET "${MDBX_BUILD_TARGET}-${CMAKE_SYSTEM_NAME}" )
2022-04-22 12:55:00 +03:00
endif ( )
2020-04-15 17:09:37 +03:00
endif ( )
# provide build-type
if ( CMAKE_CONFIGURATION_TYPES )
2020-09-28 23:47:37 +03:00
# via per-configuration define
2020-04-15 17:09:37 +03:00
add_definitions ( -DMDBX_BUILD_TYPE= "$<CONFIG>" )
2020-09-30 04:01:48 +03:00
set ( MDBX_BUILD_TYPE "<CONFIGURATION DEPENDENT>" )
2020-04-15 17:09:37 +03:00
else ( )
set ( MDBX_BUILD_TYPE ${ CMAKE_BUILD_TYPE } )
endif ( )
# options
2021-12-10 17:15:53 +03:00
set ( options VERSION C_COMPILER CXX_COMPILER MDBX_BUILD_TARGET MDBX_BUILD_TYPE ${ MDBX_BUILD_OPTIONS } )
2020-04-15 17:09:37 +03:00
foreach ( item IN LISTS options )
if ( DEFINED ${ item } )
set ( value "${${item}}" )
elseif ( DEFINED MDBX_ ${ item } )
set ( item MDBX_ ${ item } )
set ( value "${${item}}" )
elseif ( DEFINED CMAKE_ ${ item } )
set ( item CMAKE_ ${ item } )
set ( value "${${item}}" )
else ( )
2021-12-10 17:15:53 +03:00
set ( value "AUTO (not pre-defined explicitly)" )
2020-04-15 17:09:37 +03:00
endif ( )
message ( STATUS "${item}: ${value}" )
endforeach ( item )
# provide config.h for library build info
configure_file ( "${MDBX_SOURCE_DIR}/config.h.in"
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / c o n f i g . h " E S C A P E _ Q U O T E S )
add_definitions ( -DMDBX_CONFIG_H= "${CMAKE_CURRENT_BINARY_DIR}/config.h" )
2019-09-03 02:24:19 +03:00
################################################################################
2020-04-15 17:09:37 +03:00
if ( NOT MDBX_AMALGAMATED_SOURCE AND MDBX_ENABLE_TESTS )
2020-09-28 23:47:37 +03:00
if ( NOT CMAKE_CXX_COMPILER_LOADED )
2020-09-27 16:49:55 +03:00
message ( FATAL_ERROR "MDBX_ENABLE_TESTS=${MDBX_ENABLE_TESTS}: The C++ compiler is required to build the tests." )
endif ( )
2019-08-31 17:13:02 +03:00
add_subdirectory ( test )
endif ( )
2020-09-27 16:45:00 +03:00
################################################################################
2022-06-12 23:13:14 +03:00
if ( NOT SUBPROJECT )
set ( PACKAGE "libmdbx" )
set ( CPACK_PACKAGE_VERSION_MAJOR ${ MDBX_VERSION_MAJOR } )
set ( CPACK_PACKAGE_VERSION_MINOR ${ MDBX_VERSION_MINOR } )
set ( CPACK_PACKAGE_VERSION_PATCH ${ MDBX_VERSION_RELEASE } )
set ( CPACK_PACKAGE_VERSION_COMMIT ${ MDBX_VERSION_REVISION } )
set ( PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}.${CPACK_PACKAGE_VERSION_COMMIT}" )
message ( STATUS "libmdbx package version is ${PACKAGE_VERSION}" )
2022-10-16 19:05:11 +03:00
file ( WRITE "${CMAKE_CURRENT_BINARY_DIR}/VERSION.txt" "${MDBX_VERSION_MAJOR}.${MDBX_VERSION_MINOR}.${MDBX_VERSION_RELEASE}.${MDBX_VERSION_REVISION}" )
2022-06-12 23:13:14 +03:00
endif ( )
2019-08-31 17:13:02 +03:00
cmake_policy ( POP )