diff --git a/CMakeLists.dist-minimal b/CMakeLists.dist-minimal new file mode 100644 index 00000000..39dcf9e1 --- /dev/null +++ b/CMakeLists.dist-minimal @@ -0,0 +1,146 @@ +## +## This is the minimal template for CMakeList.txt which could be used +## to build libmdbx from the "amalgamated form" of libmdbx's source code. +## +## The amalgamated form is intended to embedding libmdbx in other projects +## in cases when using as git-submodule is not acceptable or inconveniently. +## +## The amalgamated form could be generated from full git repository +## on Linux just by `make dist`. +## + +## +## Copyright 2019 Leonid Yuriev +## 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 +## . +## + +## +## libmdbx = { Revised and extended descendant of Symas LMDB. } +## Please see README.md at https://github.com/leo-yuriev/libmdbx +## +## 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. Всё будет хорошо. +## + +cmake_minimum_required(VERSION 3.8.2) +cmake_policy(PUSH) +cmake_policy(VERSION 3.8.2) +if(NOT CMAKE_VERSION VERSION_LESS 3.12) + cmake_policy(SET CMP0075 NEW) +endif() + +if(DEFINED PROJECT_NAME) + set(SUBPROJECT ON) + set(NOT_SUBPROJECT OFF) +else() + set(SUBPROJECT OFF) + set(NOT_SUBPROJECT ON) + project(libmdbx C CXX) +endif() + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif() + +# not supported by this (minimal) script +add_definitions(-DMDBX_AVOID_CRT=0) + +# provide build timestamp +string(TIMESTAMP MDBX_BUILD_TIMESTAMP UTC) +add_definitions(-DMDBX_BUILD_TIMESTAMP="${MDBX_BUILD_TIMESTAMP}") + +# provide compiler info +execute_process(COMMAND sh -c "${CMAKE_C_COMPILER} --version | head -1" + OUTPUT_VARIABLE MDBX_BUILD_COMPILER + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + RESULT_VARIABLE rc) +if(rc OR NOT MDBX_BUILD_COMPILER) + string(STRIP "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}" MDBX_BUILD_COMPILER) +endif() +add_definitions(-DMDBX_BUILD_COMPILER="${MDBX_BUILD_COMPILER}") + +# provide cpu/arch-system pair +if(CMAKE_C_COMPILER_TARGET) + set(MDBX_BUILD_TARGET "${CMAKE_C_COMPILER_TARGET}") +elseif(CMAKE_C_PLATFORM_ID AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME) + string(STRIP "${CMAKE_C_PLATFORM_ID}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET) +elseif(CMAKE_LIBRARY_ARCHITECTURE) + string(STRIP "${CMAKE_LIBRARY_ARCHITECTURE}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET) +elseif(CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME) + string(STRIP "${CMAKE_GENERATOR_PLATFORM}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET) +elseif(CMAKE_SYSTEM_ARCH) + string(STRIP "${CMAKE_SYSTEM_ARCH}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET) +else() + string(STRIP "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET) +endif() +add_definitions(-DMDBX_BUILD_TARGET="${MDBX_BUILD_TARGET}") + +# provide build target-config +if(CMAKE_CONFIGURATION_TYPES) + add_definitions(-DMDBX_BUILD_CONFIG="$") +else() + add_definitions(-DMDBX_BUILD_CONFIG="${CMAKE_BUILD_TYPE}") +endif() + +# provide build cflags +set(MDBX_BUILD_FLAGS "") +list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS}) +list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES}) +if(CMAKE_CONFIGURATION_TYPES) + add_definitions(-MDBX_BUILD_FLAGS_CONFIG="$<$:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>") +else() + string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPERCASE) + list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}) + list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES_${CMAKE_BUILD_TYPE_UPPERCASE}}) +endif() +list(REMOVE_DUPLICATES MDBX_BUILD_FLAGS) +add_definitions(-DMDBX_BUILD_FLAGS="${MDBX_BUILD_FLAGS}") + +# add targets both for shared and static libraries +# static library used for tools, to avoid rpath/dll-path troubles +add_library(mdbx SHARED mdbx.c mdbx.h) +add_library(mdbx-static STATIC EXCLUDE_FROM_ALL mdbx.c mdbx.h) +target_compile_definitions(mdbx PRIVATE -DLIBMDBX_EXPORTS=1 INTERFACE -DLIBMDBX_IMPORTS=1) + +# link libraries +find_package(Threads REQUIRED) +target_link_libraries(mdbx PRIVATE ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(mdbx-static INTERFACE ${CMAKE_THREAD_LIBS_INIT}) +if(WIN32) + target_link_libraries(mdbx PRIVATE ntdll.lib) + target_link_libraries(mdbx-static INTERFACE ntdll.lib) +endif() + +# add target for mdbx-tools +foreach(TOOL mdbx_chk mdbx_copy mdbx_stat mdbx_dump mdbx_load) + add_executable(${TOOL} ${TOOL}.c) + target_link_libraries(${TOOL} mdbx-static) +endforeach() + +cmake_policy(POP) diff --git a/CMakeLists.txt b/CMakeLists.txt index 117bcd44..bd837af4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,12 @@ else() endif() endif() +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif() + macro(add_mdbx_option NAME DESCPTION DEFAULT) list(APPEND MDBX_BUILD_OPTIONS ${NAME}) if(NOT ${DEFAULT} STREQUAL "AUTO") diff --git a/GNUmakefile b/GNUmakefile index 4e0af71f..bc62e85f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -112,7 +112,8 @@ define uname2titer esac endef -MAN_SRCDIR := src/man1/ +DIST_EXTRA := LICENSE README.md CMakeLists.txt GNUmakefile $(addprefix man1/, $(MANPAGES)) +DIST_SRC := mdbx.h mdbx.c $(addsuffix .c, $(TOOLS)) TEST_DB ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.db TEST_LOG ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.log @@ -122,6 +123,7 @@ TEST_SRC := test/osal-$(TEST_OSAL).cc $(filter-out $(wildcard test/osal-*.cc), TEST_INC := $(wildcard test/*.h) TEST_OBJ := $(patsubst %.cc,%.o,$(TEST_SRC)) +MAN_SRCDIR := src/man1/ ALLOY_DEPS = $(wildcard src/elements/*) MDBX_VERSION_GIT = ${shell set -o pipefail; git describe --tags | sed -n 's|^v*\([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)\(.*\)|\1|p' || echo 'Please fetch tags and/or install latest git version'} MDBX_GIT_TIMESTAMP = $(shell git show --no-patch --format=%cI HEAD || echo 'Please install latest get version') @@ -190,11 +192,8 @@ mdbx-static.o: src/elements/config.h src/elements/version.c src/alloy.c $(ALLOY_ .PHONY: dist dist: lidmbx-sources-$(MDBX_VERSION_SUFFIX).tar.gz $(lastword $(MAKEFILE_LIST)) -lidmbx-sources-$(MDBX_VERSION_SUFFIX).tar.gz: dist/mdbx.c dist/mdbx.h \ - dist/mdbx_chk.c dist/mdbx_copy.c dist/mdbx_dump.c dist/mdbx_load.c dist/mdbx_stat.c \ - dist/GNUmakefile $(lastword $(MAKEFILE_LIST)) $(addprefix dist/man1/,$(MANPAGES)) - tar -c -a -f $@ --owner=0 --group=0 -C dist mdbx.c mdbx.h \ - mdbx_chk.c mdbx_copy.c mdbx_dump.c mdbx_load.c mdbx_stat.c GNUmakefile man1 \ +lidmbx-sources-$(MDBX_VERSION_SUFFIX).tar.gz: $(addprefix dist/, $(DIST_SRC) $(DIST_EXTRA)) $(addprefix dist/man1/,$(MANPAGES)) + tar -c -a -f $@ --owner=0 --group=0 -C dist $(DIST_SRC) $(DIST_EXTRA) \ && rm dist/@tmp-shared_internals.inc dist/mdbx.h: mdbx.h src/elements/version.c $(lastword $(MAKEFILE_LIST)) @@ -235,7 +234,12 @@ $(foreach file,$(TOOLS),$(eval $(call dist-tool-rule,$(file)))) dist/man1/mdbx_%.1: src/man1/mdbx_%.1 mkdir -p dist/man1/ && cp $< $@ - +dist/LICENSE: LICENSE + mkdir -p dist/man1/ && cp $< $@ +dist/README.md: README.md + mkdir -p dist/man1/ && cp $< $@ +dist/CMakeLists.txt: CMakeLists.dist-minimal + mkdir -p dist/man1/ && cp $< $@ endif ################################################################################ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 23de0e52..a2c63c46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -127,60 +127,34 @@ install(TARGETS mdbx # # library build info (used in library version output) # - -# get definitions as a string of "-Dxyz=124 ..." -get_target_property(MDBX_DEFINITIONS mdbx COMPILE_DEFINITIONS) -if(NOT MDBX_DEFINITIONS) - set(MDBX_DEFINITIONS "") -endif() -list(REMOVE_DUPLICATES MDBX_DEFINITIONS) -string(REGEX REPLACE "([^;]+)" " -D\\1" MDBX_DEFINITIONS "${MDBX_DEFINITIONS}") -string(STRIP MDBX_DEFINITIONS "${MDBX_DEFINITIONS}") - -# get target compile options as a list -get_target_property(mdbx_compile_options mdbx COMPILE_OPTIONS) -if(NOT mdbx_compile_options) - set(mdbx_compile_options "") -endif() - -# append cmake's common cxx flags and defines -string(REPLACE " " ";" cmake_cxx_options "${CMAKE_C_FLAGS}" "${CMAKE_C_DEFINES}") -list(INSERT mdbx_compile_options 0 "${cmake_c_options}") -unset(cmake_c_options) +set(MDBX_BUILD_FLAGS "") # append cmake's build-type flags and defines if(NOT CMAKE_CONFIGURATION_TYPES) - string(REPLACE " " ";" cmake_cxx_options - "${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}" - "${CMAKE_C_DEFINES_${CMAKE_BUILD_TYPE_UPPERCASE}}") - list(APPEND mdbx_compile_options "${cmake_c_options}") - unset(cmake_c_options) + list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}) + list(APPEND MDBX_BUILD_FLAGS ${CMAKE_C_DEFINES_${CMAKE_BUILD_TYPE_UPPERCASE}}) endif() # append linker dll's options if(LIBMDBX_TYPE STREQUAL "SHARED") - string(REPLACE " " ";" cmake_shared_linker_options "${CMAKE_SHARED_LINKER_FLAGS}") - list(APPEND mdbx_compile_options ${cmake_shared_linker_options}) - unset(cmake_shared_linker_options) + list(APPEND MDBX_BUILD_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif() -# drop duplicates in the option list -list(REMOVE_DUPLICATES mdbx_compile_options) +# get definitions +get_target_property(defs_list mdbx COMPILE_DEFINITIONS) +list(APPEND MDBX_BUILD_FLAGS ${defs_list}) -# make string of space separated flags -string(REPLACE ";" " " MDBX_BUILD_FLAGS "${mdbx_compile_options}") -unset(mdbx_compile_options) -string(STRIP "${MDBX_BUILD_FLAGS}${MDBX_DEFINITIONS}" MDBX_BUILD_FLAGS) +# get target compile options +get_target_property(options_list mdbx COMPILE_OPTIONS) +list(APPEND MDBX_BUILD_FLAGS ${options_list}) + +list(REMOVE_DUPLICATES MDBX_BUILD_FLAGS) if(CMAKE_CONFIGURATION_TYPES) # add dynamic part via per-configuration define message(STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS} ") - set(MDBX_BUILD_FLAGS "${MDBX_BUILD_FLAGS}") - add_definitions( - -DMDBX_COMPILE_FLAGS="$<$:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>" - ) + add_definitions(-MDBX_BUILD_FLAGS_CONFIG="$<$:${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_DEFINES_DEBUG}>$<$:${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_DEFINES_RELEASE}>$<$:${CMAKE_C_FLAGS_RELWITHDEBINFO} ${CMAKE_C_DEFINES_RELWITHDEBINFO}>$<$:${CMAKE_C_FLAGS_MINSIZEREL} ${CMAKE_C_DEFINES_MINSIZEREL}>") else() message(STATUS "MDBX Compile Flags: ${MDBX_BUILD_FLAGS}") - set(MDBX_BUILD_FLAGS "${MDBX_BUILD_FLAGS}") endif() # get compiler info diff --git a/src/elements/core.c b/src/elements/core.c index 1d7011b8..642bc8bc 100644 --- a/src/elements/core.c +++ b/src/elements/core.c @@ -14724,8 +14724,9 @@ __dll_export , #ifdef MDBX_BUILD_FLAGS MDBX_BUILD_FLAGS -#else - "@TODO: MDBX_BUILD_FLAGS" +#endif +#ifdef MDBX_BUILD_FLAGS_CONFIG + MDBX_BUILD_FLAGS_CONFIG #endif }; diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt index af7010be..e54f5146 100644 --- a/src/tools/CMakeLists.txt +++ b/src/tools/CMakeLists.txt @@ -1,12 +1,6 @@ -set(MDBX_TOOLS - mdbx_chk - mdbx_copy - mdbx_dump - mdbx_load - mdbx_stat - ) +set(MDBX_TOOLS mdbx_chk mdbx_copy mdbx_dump mdbx_load mdbx_stat) -foreach (TOOL ${MDBX_TOOLS}) +foreach(TOOL ${MDBX_TOOLS}) if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") add_executable(${TOOL} ${TOOL}.c wingetopt.c wingetopt.h) else()