1- # This makefile is for GNU Make 3.80 or above, and nowadays provided
1+ # This makefile is for GNU Make 3.81 or above, and nowadays provided
22# just for compatibility and preservation of traditions.
33#
44# Please use CMake in case of any difficulties or
@@ -16,6 +16,7 @@ ifneq ($(make_lt_3_81),0)
1616$(error Please use GNU Make 3.81 or above)
1717endif
1818make_ge_4_1 := $(shell expr "$(MAKE_VERx3 ) " ">=" " 4 1")
19+ make_ge_4_4 := $(shell expr "$(MAKE_VERx3 ) " ">=" " 4 4")
1920SRC_PROBE_C := $(shell [ -f mdbx.c ] && echo mdbx.c || echo src/osal.c)
2021SRC_PROBE_CXX := $(shell [ -f mdbx.c++ ] && echo mdbx.c++ || echo src/mdbx.c++)
2122UNAME := $(shell uname -s 2>/dev/null || echo Unknown)
@@ -51,17 +52,24 @@ CC ?= gcc
5152CXX ?= g++
5253CFLAGS_EXTRA ?=
5354LD ?= ld
55+ CMAKE ?= cmake
56+ CMAKE_OPT ?=
57+ CTEST ?= ctest
58+ CTEST_OPT ?=
59+ # target directory for `make dist`
60+ DIST_DIR ?= dist
5461
5562# build options
5663MDBX_BUILD_OPTIONS ?=-DNDEBUG=1
57- MDBX_BUILD_TIMESTAMP ?=$(shell date +% Y-% m-% dT% H:% M:% S% z)
58- MDBX_BUILD_CXX ?= YES
64+ MDBX_BUILD_TIMESTAMP ?=$(if $(SOURCE_DATE_EPOCH ) ,$(SOURCE_DATE_EPOCH ) ,$(shell date +% Y-% m-% dT% H:% M:% S% z) )
65+ MDBX_BUILD_CXX ?=YES
66+ MDBX_BUILD_METADATA ?=
5967
6068# probe and compose common compiler flags with variable expansion trick (seems this work two times per session for GNU Make 3.81)
6169CFLAGS ?= $(strip $(eval CFLAGS := -std=gnu11 -O2 -g -Wall -Werror -Wextra -Wpedantic -ffunction-sections -fPIC -fvisibility=hidden -pthread -Wno-error=attributes $$(shell for opt in -fno-semantic-interposition -Wno-unused-command-line-argument -Wno-tautological-compare; do [ -z "$$$$($(CC ) '-DMDBX_BUILD_FLAGS="probe"' $$$${opt} -c $(SRC_PROBE_C ) -o /dev/null >/dev/null 2>&1 || echo failed) " ] && echo "$$$${opt} "; done)$(CFLAGS_EXTRA ) )$(CFLAGS ) )
6270
6371# choosing C++ standard with variable expansion trick (seems this work two times per session for GNU Make 3.81)
64- CXXSTD ?= $(eval CXXSTD := $$(shell for std in gnu++23 c++23 gnu++2b c++2b gnu++20 c++20 gnu++2a c++2a gnu++17 c++17 gnu++1z c++1z gnu++14 c++14 gnu++1y c++1y gnu+11 c++11 gnu++0x c++0x; do $(CXX ) -std=$$$${std} -c $(SRC_PROBE_CXX ) -o /dev/null 2>probe4std-$$$${std}.err >/dev/null && echo "-std=$$$${std}" && exit; done) )$(CXXSTD )
72+ CXXSTD ?= $(eval CXXSTD := $$(shell for std in gnu++23 c++23 gnu++2b c++2b gnu++20 c++20 gnu++2a c++2a gnu++17 c++17 gnu++1z c++1z gnu++14 c++14 gnu++1y c++1y gnu+11 c++11 gnu++0x c++0x; do $(CXX ) -std=$$$${std} -DMDBX_BUILD_CXX=1 - c $(SRC_PROBE_CXX ) -o /dev/null 2>probe4std-$$$${std}.err >/dev/null && echo "-std=$$$${std}" && exit; done) )$(CXXSTD )
6573CXXFLAGS ?= $(strip $(CXXSTD ) $(filter-out -std=gnu11,$(CFLAGS ) ) )
6674
6775# libraries and options for linking
@@ -78,6 +86,13 @@ LDFLAGS ?= $(eval LDFLAGS := $$(shell $$(uname2ldflags)))$(LDFLAGS)
7886LIB_STDCXXFS ?= $(eval LIB_STDCXXFS := $$(shell echo '$$(cxx_filesystem_probe ) ' | cat mdbx.h++ - | sed $$$$'1s/\xef\xbb\xbf//' | $(CXX ) -x c++ $(CXXFLAGS ) -Wno-error - -Wl,--allow-multiple-definition -lstdc++fs $(LIBS ) $(LDFLAGS ) $(EXE_LDFLAGS ) -o /dev/null 2>probe4lstdfs.err >/dev/null && echo '-Wl,--allow-multiple-definition -lstdc++fs') )$(LIB_STDCXXFS )
7987endif
8088
89+ ifneq ($(make_ge_4_4 ) ,1)
90+ .NOTPARALLEL :
91+ WAIT =
92+ else
93+ WAIT = .WAIT
94+ endif
95+
8196# ###############################################################################
8297
8398define uname2sosuffix
@@ -121,12 +136,13 @@ endef
121136SO_SUFFIX := $(shell $(uname2sosuffix ) )
122137HEADERS := mdbx.h mdbx.h++
123138LIBRARIES := libmdbx.a libmdbx.$(SO_SUFFIX )
124- TOOLS := mdbx_stat mdbx_copy mdbx_dump mdbx_load mdbx_chk mdbx_drop
139+ TOOLS := chk copy drop dump load stat
140+ MDBX_TOOLS := $(addprefix mdbx_,$(TOOLS ) )
125141MANPAGES := mdbx_stat.1 mdbx_copy.1 mdbx_dump.1 mdbx_load.1 mdbx_chk.1 mdbx_drop.1
126142TIP := // TIP:
127143
128144.PHONY : all help options lib libs tools clean install uninstall check_buildflags_tag tools-static
129- .PHONY : install-strip install-no-strip strip libmdbx mdbx show-options lib-static lib-shared
145+ .PHONY : install-strip install-no-strip strip libmdbx mdbx show-options lib-static lib-shared cmake-build ninja
130146
131147boolean = $(if $(findstring $(strip $($1 ) ) ,YES Yes yes y ON On on 1 true True TRUE) ,1,$(if $(findstring $(strip $($1 ) ) ,NO No no n OFF Off off 0 false False FALSE) ,,$(error Wrong value `$($1 ) ` of $1 for YES/NO option) ) )
132148select_by = $(if $(call boolean,$(1 ) ) ,$(2 ) ,$(3 ) )
@@ -148,7 +164,11 @@ else
148164 $(info $(TIP) Use `make V=1` for verbose.)
149165endif
150166
151- all : show-options $(LIBRARIES ) $(TOOLS )
167+ ifeq ($(UNAME ) ,Darwin)
168+ $(info $(TIP) Use `brew install gnu-sed gnu-tar` and add ones to the beginning of the PATH.)
169+ endif
170+
171+ all : show-options $(LIBRARIES ) $(MDBX_TOOLS )
152172
153173help :
154174 @echo " make all - build libraries and tools"
@@ -160,6 +180,7 @@ help:
160180 @echo " make clean "
161181 @echo " make install "
162182 @echo " make uninstall "
183+ @echo " make cmake-build | ninja - build by CMake & Ninja"
163184 @echo " "
164185 @echo " make strip - strip debug symbols from binaries"
165186 @echo " make install-no-strip - install explicitly without strip"
@@ -175,6 +196,7 @@ show-options:
175196 @echo " MDBX_BUILD_OPTIONS = $( MDBX_BUILD_OPTIONS) "
176197 @echo " MDBX_BUILD_CXX = $( MDBX_BUILD_CXX) "
177198 @echo " MDBX_BUILD_TIMESTAMP = $( MDBX_BUILD_TIMESTAMP) "
199+ @echo " MDBX_BUILD_METADATA = $( MDBX_BUILD_METADATA) "
178200 @echo ' $(TIP) Use `make options` to listing available build options.'
179201 @echo $(call select_by,MDBX_BUILD_CXX," CXX =`which $(CXX ) ` | `$(CXX ) --version | head -1`"," CC =`which $(CC ) ` | `$(CC ) --version | head -1`")
180202 @echo $(call select_by,MDBX_BUILD_CXX," CXXFLAGS =$(CXXFLAGS ) "," CFLAGS =$(CFLAGS ) ")
@@ -202,38 +224,39 @@ options:
202224 @echo " "
203225 @echo " MDBX_BUILD_OPTIONS = $( MDBX_BUILD_OPTIONS) "
204226 @echo " MDBX_BUILD_TIMESTAMP = $( MDBX_BUILD_TIMESTAMP) "
227+ @echo " MDBX_BUILD_METADATA = $( MDBX_BUILD_METADATA) "
205228 @echo " "
206229 @echo " ## Assortment items for MDBX_BUILD_OPTIONS:"
207230 @echo " ## Note that the defaults should already be correct for most platforms;"
208231 @echo " ## you should not need to change any of these. Read their descriptions"
209232 @echo " ## in README and source code (see mdbx.c) if you do."
210- @grep -h ' #ifndef MDBX_' mdbx.c | grep -v BUILD | uniq | sed ' s/#ifndef / /'
233+ @grep -h ' #ifndef MDBX_' mdbx.c | grep -v BUILD | sort -u | sed ' s/#ifndef / /'
211234
212235lib libs libmdbx mdbx : libmdbx.a libmdbx.$(SO_SUFFIX )
213236
214- tools : $(TOOLS )
215- tools-static : $(addsuffix .static,$(TOOLS ) ) $(addsuffix .static-lto,$(TOOLS ) )
237+ tools : $(MDBX_TOOLS )
238+ tools-static : $(addsuffix .static,$(MDBX_TOOLS ) ) $(addsuffix .static-lto,$(MDBX_TOOLS ) )
216239
217240strip : all
218- @echo ' STRIP libmdbx.$(SO_SUFFIX) $(TOOLS )'
219- $(TRACE ) strip libmdbx.$(SO_SUFFIX ) $(TOOLS )
241+ @echo ' STRIP libmdbx.$(SO_SUFFIX) $(MDBX_TOOLS )'
242+ $(TRACE ) strip libmdbx.$(SO_SUFFIX ) $(MDBX_TOOLS )
220243
221244clean :
222245 @echo ' REMOVE ...'
223- $(QUIET ) rm -rf $(TOOLS ) mdbx_test @* * .[ao] * .[ls]o * .$(SO_SUFFIX ) * .dSYM * ~ tmp.db/* \
224- * .gcov * .log * .err src/* .o test/* .o mdbx_example dist \
225- config.h src/config.h src/version.c * .tar* buildflags.tag \
226- mdbx_* .static mdbx_* .static-lto
246+ $(QUIET ) rm -rf $(MDBX_TOOLS ) mdbx_test @* * .[ao] * .[ls]o * .$(SO_SUFFIX ) * .dSYM * ~ tmp.db/* \
247+ * .gcov * .log * .err src/* .o test/* .o mdbx_example dist @dist-check \
248+ config.h src/config.h src/version.c * .tar* @ buildflags.tag @dist-checked .tag \
249+ mdbx_* .static mdbx_* .static-lto CMakeFiles
227250
228251MDBX_BUILD_FLAGS =$(strip MDBX_BUILD_CXX=$(MDBX_BUILD_CXX ) $(MDBX_BUILD_OPTIONS ) $(call select_by,MDBX_BUILD_CXX,$(CXXFLAGS ) $(LDFLAGS ) $(LIB_STDCXXFS ) $(LIBS ) ,$(CFLAGS ) $(LDFLAGS ) $(LIBS ) ) )
229252check_buildflags_tag :
230- $(QUIET ) if [ " $( MDBX_BUILD_FLAGS) " != " $$ (cat buildflags.tag 2>&1)" ]; then \
253+ $(QUIET ) if [ " $( MDBX_BUILD_FLAGS) " != " $$ (cat @ buildflags.tag 2>&1)" ]; then \
231254 echo -n " CLEAN for build with specified flags..." && \
232255 $(MAKE ) IOARENA=false CXXSTD= -s clean > /dev/null && echo " Ok" && \
233- echo ' $(MDBX_BUILD_FLAGS)' > buildflags.tag; \
256+ echo ' $(MDBX_BUILD_FLAGS)' > @ buildflags.tag; \
234257 fi
235258
236- buildflags.tag : check_buildflags_tag
259+ @ buildflags.tag : check_buildflags_tag
237260
238261lib-static libmdbx.a : mdbx-static.o $(call select_by,MDBX_BUILD_CXX,mdbx++-static.o)
239262 @echo ' AR $@'
@@ -243,32 +266,46 @@ lib-shared libmdbx.$(SO_SUFFIX): mdbx-dylib.o $(call select_by,MDBX_BUILD_CXX,md
243266 @echo ' LD $@'
244267 $(QUIET )$(call select_by,MDBX_BUILD_CXX,$(CXX ) $(CXXFLAGS ) ,$(CC ) $(CFLAGS ) ) $^ -pthread -shared $(LDFLAGS ) $(call select_by,MDBX_BUILD_CXX,$(LIB_STDCXXFS ) ) $(LIBS ) -o $@
245268
269+ ninja-assertions : CMAKE_OPT += -DMDBX_FORCE_ASSERTIONS=ON
270+ ninja-assertions : cmake-build
271+ ninja-debug : CMAKE_OPT += -DCMAKE_BUILD_TYPE=Debug
272+ ninja-debug : cmake-build
273+ ninja : cmake-build
274+ cmake-build :
275+ @echo " RUN: cmake -G Ninja && cmake --build"
276+ $(QUIET ) mkdir -p @cmake-ninja-build && $(CMAKE ) $(CMAKE_OPT ) -G Ninja -S . -B @cmake-ninja-build && $(CMAKE ) --build @cmake-ninja-build
277+
278+ ctest : cmake-build
279+ @echo " RUN: ctest .."
280+ $(QUIET )$(CTEST ) --test-dir @cmake-ninja-build --parallel ` (nproc | sysctl -n hw.ncpu | echo 2) 2> /dev/null` --schedule-random $(CTEST_OPT )
246281
247282# ###############################################################################
248283# Amalgamated source code, i.e. distributed after `make dist`
249284MAN_SRCDIR := man1/
250285
251- config.h : buildflags.tag mdbx.c $(lastword $(MAKEFILE_LIST ) )
286+ config.h : @ buildflags.tag $( WAIT ) mdbx.c $(lastword $(MAKEFILE_LIST ) ) LICENSE NOTICE
252287 @echo ' MAKE $@'
253288 $(QUIET ) (echo ' #define MDBX_BUILD_TIMESTAMP "$(MDBX_BUILD_TIMESTAMP)"' \
254- && echo " #define MDBX_BUILD_FLAGS \" $$ (cat buildflags.tag)\" " \
289+ && echo " #define MDBX_BUILD_FLAGS \" $$ (cat @ buildflags.tag)\" " \
255290 && echo ' #define MDBX_BUILD_COMPILER "$(shell (LC_ALL=C $(CC) --version || echo ' Please use GCC or CLANG compatible compiler' ) | head -1)"' \
256291 && echo ' #define MDBX_BUILD_TARGET "$(shell set -o pipefail; (LC_ALL=C $(CC) -v 2>&1 | grep -i ' ^Target:' | cut -d ' ' -f 2- || (LC_ALL=C $(CC) --version | grep -qi e2k && echo E2K) || echo ' Please use GCC or CLANG compatible compiler' ) | head -1)"' \
292+ && echo ' #define MDBX_BUILD_CXX $(call select_by,MDBX_BUILD_CXX,1,0)' \
293+ && echo ' #define MDBX_BUILD_METADATA "$(MDBX_BUILD_METADATA)"' \
257294 ) > $@
258295
259- mdbx-dylib.o : config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST ) )
296+ mdbx-dylib.o : config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST ) ) LICENSE NOTICE
260297 @echo ' CC $@'
261298 $(QUIET )$(CC ) $(CFLAGS ) $(MDBX_BUILD_OPTIONS ) ' -DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c mdbx.c -o $@
262299
263- mdbx-static.o : config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST ) )
300+ mdbx-static.o : config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST ) ) LICENSE NOTICE
264301 @echo ' CC $@'
265302 $(QUIET )$(CC ) $(CFLAGS ) $(MDBX_BUILD_OPTIONS ) ' -DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c mdbx.c -o $@
266303
267- mdbx++-dylib.o : config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST ) )
304+ mdbx++-dylib.o : config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST ) ) LICENSE NOTICE
268305 @echo ' CC $@'
269306 $(QUIET )$(CXX ) $(CXXFLAGS ) $(MDBX_BUILD_OPTIONS ) ' -DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c mdbx.c++ -o $@
270307
271- mdbx++-static.o : config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST ) )
308+ mdbx++-static.o : config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST ) ) LICENSE NOTICE
272309 @echo ' CC $@'
273310 $(QUIET )$(CXX ) $(CXXFLAGS ) $(MDBX_BUILD_OPTIONS ) ' -DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c mdbx.c++ -o $@
274311
@@ -285,11 +322,10 @@ mdbx_%.static-lto: mdbx_%.c config.h mdbx.c mdbx.h
285322 $(QUIET )$(CC ) $(CFLAGS ) -Os -flto $(MDBX_BUILD_OPTIONS ) ' -DLIBMDBX_API=' ' -DMDBX_CONFIG_H="config.h"' \
286323 $< mdbx.c $(EXE_LDFLAGS ) $(LIBS ) -static -Wl,--strip-all -o $@
287324
288-
289- install : $(LIBRARIES ) $(TOOLS ) $(HEADERS )
325+ install : $(LIBRARIES ) $(MDBX_TOOLS ) $(HEADERS )
290326 @echo ' INSTALLING...'
291327 $(QUIET ) mkdir -p $(DESTDIR )$(prefix ) /bin$(suffix ) && \
292- $(INSTALL ) -p $(EXE_INSTALL_FLAGS ) $(TOOLS ) $(DESTDIR )$(prefix ) /bin$(suffix ) / && \
328+ $(INSTALL ) -p $(EXE_INSTALL_FLAGS ) $(MDBX_TOOLS ) $(DESTDIR )$(prefix ) /bin$(suffix ) / && \
293329 mkdir -p $(DESTDIR )$(prefix ) /lib$(suffix ) / && \
294330 $(INSTALL ) -p $(EXE_INSTALL_FLAGS ) $(filter-out libmdbx.a,$(LIBRARIES ) ) $(DESTDIR )$(prefix ) /lib$(suffix ) / && \
295331 mkdir -p $(DESTDIR )$(prefix ) /lib$(suffix ) / && \
@@ -307,7 +343,7 @@ install-no-strip: install
307343
308344uninstall :
309345 @echo ' UNINSTALLING/REMOVE...'
310- $(QUIET ) rm -f $(addprefix $(DESTDIR )$(prefix ) /bin$(suffix ) /,$(TOOLS ) ) \
346+ $(QUIET ) rm -f $(addprefix $(DESTDIR )$(prefix ) /bin$(suffix ) /,$(MDBX_TOOLS ) ) \
311347 $(addprefix $(DESTDIR )$(prefix ) /lib$(suffix ) /,$(LIBRARIES ) ) \
312348 $(addprefix $(DESTDIR )$(prefix ) /include/,$(HEADERS ) ) \
313349 $(addprefix $(DESTDIR )$(mandir ) /man1/,$(MANPAGES ) )
@@ -347,18 +383,17 @@ bench-$(1)_$(2).txt: $(3) $(IOARENA) $(lastword $(MAKEFILE_LIST))
347383 $(QUIET ) (export LD_LIBRARY_PATH="./:$$$${LD_LIBRARY_PATH}"; \
348384 ldd $(IOARENA ) | grep -i $(1 ) && \
349385 $(IOARENA ) -D $(1 ) -B batch -m $(BENCH_CRUD_MODE ) -n $(2 ) \
350- | tee $$@ | grep throughput | sed 's/throughput/batch×N/' && \
386+ | tee $$@ | grep throughput | $( SED ) 's/throughput/batch×N/' && \
351387 $(IOARENA ) -D $(1 ) -B crud -m $(BENCH_CRUD_MODE ) -n $(2 ) \
352- | tee -a $$@ | grep throughput | sed 's/throughput/ crud/' && \
388+ | tee -a $$@ | grep throughput | $( SED ) 's/throughput/ crud/' && \
353389 $(IOARENA ) -D $(1 ) -B iterate,get,iterate,get,iterate -m $(BENCH_CRUD_MODE ) -r 4 -n $(2 ) \
354- | tee -a $$@ | grep throughput | sed '0,/throughput/{s/throughput/iterate/};s/throughput/ get/' && \
390+ | tee -a $$@ | grep throughput | $( SED ) '0,/throughput/{s/throughput/iterate/};s/throughput/ get/' && \
355391 $(IOARENA ) -D $(1 ) -B delete -m $(BENCH_CRUD_MODE ) -n $(2 ) \
356- | tee -a $$@ | grep throughput | sed 's/throughput/ delete/' && \
392+ | tee -a $$@ | grep throughput | $( SED ) 's/throughput/ delete/' && \
357393 true) || mv -f $$@ $$@ .error
358394
359395endef
360396
361-
362397$(eval $(call bench-rule,mdbx,$(NN),libmdbx.$(SO_SUFFIX)))
363398
364399$(eval $(call bench-rule,sophia,$(NN)))
0 commit comments