mdbxmou 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/.github/workflows/ci.yml +32 -0
  2. package/.github/workflows/publish.yml +27 -0
  3. package/.gitmodules +3 -0
  4. package/CMakeLists.txt +53 -0
  5. package/LICENSE +201 -0
  6. package/README.md +639 -0
  7. package/build.js +11 -0
  8. package/deps/libmdbx/.clang-format +3 -0
  9. package/deps/libmdbx/.cmake-format.yaml +3 -0
  10. package/deps/libmdbx/.le.ini +40 -0
  11. package/deps/libmdbx/CMakeLists.txt +1269 -0
  12. package/deps/libmdbx/COPYRIGHT +159 -0
  13. package/deps/libmdbx/ChangeLog.md +2786 -0
  14. package/deps/libmdbx/GNUmakefile +950 -0
  15. package/deps/libmdbx/LICENSE +177 -0
  16. package/deps/libmdbx/Makefile +16 -0
  17. package/deps/libmdbx/NOTICE +39 -0
  18. package/deps/libmdbx/README.md +863 -0
  19. package/deps/libmdbx/TODO.md +43 -0
  20. package/deps/libmdbx/cmake/compiler.cmake +1221 -0
  21. package/deps/libmdbx/cmake/profile.cmake +58 -0
  22. package/deps/libmdbx/cmake/utils.cmake +524 -0
  23. package/deps/libmdbx/conanfile.py +323 -0
  24. package/deps/libmdbx/docs/Doxyfile.in +2734 -0
  25. package/deps/libmdbx/docs/_preface.md +47 -0
  26. package/deps/libmdbx/docs/_restrictions.md +248 -0
  27. package/deps/libmdbx/docs/_starting.md +245 -0
  28. package/deps/libmdbx/docs/_toc.md +34 -0
  29. package/deps/libmdbx/docs/header.html +96 -0
  30. package/deps/libmdbx/example/CMakeLists.txt +6 -0
  31. package/deps/libmdbx/example/README.md +1 -0
  32. package/deps/libmdbx/example/example-mdbx.c +154 -0
  33. package/deps/libmdbx/example/sample-bdb.txt +77 -0
  34. package/deps/libmdbx/mdbx.h +6655 -0
  35. package/deps/libmdbx/mdbx.h++ +6428 -0
  36. package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
  37. package/deps/libmdbx/src/alloy.c +54 -0
  38. package/deps/libmdbx/src/api-cold.c +543 -0
  39. package/deps/libmdbx/src/api-copy.c +912 -0
  40. package/deps/libmdbx/src/api-cursor.c +754 -0
  41. package/deps/libmdbx/src/api-dbi.c +315 -0
  42. package/deps/libmdbx/src/api-env.c +1434 -0
  43. package/deps/libmdbx/src/api-extra.c +165 -0
  44. package/deps/libmdbx/src/api-key-transform.c +197 -0
  45. package/deps/libmdbx/src/api-misc.c +286 -0
  46. package/deps/libmdbx/src/api-opts.c +575 -0
  47. package/deps/libmdbx/src/api-range-estimate.c +365 -0
  48. package/deps/libmdbx/src/api-txn-data.c +454 -0
  49. package/deps/libmdbx/src/api-txn.c +921 -0
  50. package/deps/libmdbx/src/atomics-ops.h +364 -0
  51. package/deps/libmdbx/src/atomics-types.h +97 -0
  52. package/deps/libmdbx/src/audit.c +109 -0
  53. package/deps/libmdbx/src/bits.md +34 -0
  54. package/deps/libmdbx/src/chk.c +1796 -0
  55. package/deps/libmdbx/src/cogs.c +309 -0
  56. package/deps/libmdbx/src/cogs.h +506 -0
  57. package/deps/libmdbx/src/coherency.c +170 -0
  58. package/deps/libmdbx/src/config.h.in +88 -0
  59. package/deps/libmdbx/src/cursor.c +2396 -0
  60. package/deps/libmdbx/src/cursor.h +391 -0
  61. package/deps/libmdbx/src/dbi.c +717 -0
  62. package/deps/libmdbx/src/dbi.h +142 -0
  63. package/deps/libmdbx/src/debug_begin.h +36 -0
  64. package/deps/libmdbx/src/debug_end.h +15 -0
  65. package/deps/libmdbx/src/dpl.c +486 -0
  66. package/deps/libmdbx/src/dpl.h +134 -0
  67. package/deps/libmdbx/src/dxb.c +1335 -0
  68. package/deps/libmdbx/src/env.c +607 -0
  69. package/deps/libmdbx/src/essentials.h +125 -0
  70. package/deps/libmdbx/src/gc-get.c +1345 -0
  71. package/deps/libmdbx/src/gc-put.c +970 -0
  72. package/deps/libmdbx/src/gc.h +40 -0
  73. package/deps/libmdbx/src/global.c +474 -0
  74. package/deps/libmdbx/src/internals.h +585 -0
  75. package/deps/libmdbx/src/layout-dxb.h +288 -0
  76. package/deps/libmdbx/src/layout-lck.h +289 -0
  77. package/deps/libmdbx/src/lck-posix.c +859 -0
  78. package/deps/libmdbx/src/lck-windows.c +607 -0
  79. package/deps/libmdbx/src/lck.c +174 -0
  80. package/deps/libmdbx/src/lck.h +110 -0
  81. package/deps/libmdbx/src/logging_and_debug.c +250 -0
  82. package/deps/libmdbx/src/logging_and_debug.h +159 -0
  83. package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
  84. package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
  85. package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
  86. package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
  87. package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
  88. package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
  89. package/deps/libmdbx/src/mdbx.c++ +1837 -0
  90. package/deps/libmdbx/src/meta.c +656 -0
  91. package/deps/libmdbx/src/meta.h +168 -0
  92. package/deps/libmdbx/src/mvcc-readers.c +414 -0
  93. package/deps/libmdbx/src/node.c +365 -0
  94. package/deps/libmdbx/src/node.h +102 -0
  95. package/deps/libmdbx/src/ntdll.def +1246 -0
  96. package/deps/libmdbx/src/options.h +534 -0
  97. package/deps/libmdbx/src/osal.c +3485 -0
  98. package/deps/libmdbx/src/osal.h +587 -0
  99. package/deps/libmdbx/src/page-get.c +483 -0
  100. package/deps/libmdbx/src/page-iov.c +185 -0
  101. package/deps/libmdbx/src/page-iov.h +34 -0
  102. package/deps/libmdbx/src/page-ops.c +744 -0
  103. package/deps/libmdbx/src/page-ops.h +142 -0
  104. package/deps/libmdbx/src/pnl.c +236 -0
  105. package/deps/libmdbx/src/pnl.h +146 -0
  106. package/deps/libmdbx/src/preface.h +990 -0
  107. package/deps/libmdbx/src/proto.h +105 -0
  108. package/deps/libmdbx/src/refund.c +212 -0
  109. package/deps/libmdbx/src/sort.h +484 -0
  110. package/deps/libmdbx/src/spill.c +431 -0
  111. package/deps/libmdbx/src/spill.h +74 -0
  112. package/deps/libmdbx/src/table.c +107 -0
  113. package/deps/libmdbx/src/tls.c +551 -0
  114. package/deps/libmdbx/src/tls.h +43 -0
  115. package/deps/libmdbx/src/tools/chk.c +673 -0
  116. package/deps/libmdbx/src/tools/copy.c +166 -0
  117. package/deps/libmdbx/src/tools/drop.c +199 -0
  118. package/deps/libmdbx/src/tools/dump.c +515 -0
  119. package/deps/libmdbx/src/tools/load.c +831 -0
  120. package/deps/libmdbx/src/tools/stat.c +516 -0
  121. package/deps/libmdbx/src/tools/wingetopt.c +87 -0
  122. package/deps/libmdbx/src/tools/wingetopt.h +30 -0
  123. package/deps/libmdbx/src/tree-ops.c +1554 -0
  124. package/deps/libmdbx/src/tree-search.c +140 -0
  125. package/deps/libmdbx/src/txl.c +99 -0
  126. package/deps/libmdbx/src/txl.h +26 -0
  127. package/deps/libmdbx/src/txn.c +1083 -0
  128. package/deps/libmdbx/src/unaligned.h +205 -0
  129. package/deps/libmdbx/src/utils.c +32 -0
  130. package/deps/libmdbx/src/utils.h +76 -0
  131. package/deps/libmdbx/src/version.c.in +44 -0
  132. package/deps/libmdbx/src/walk.c +290 -0
  133. package/deps/libmdbx/src/walk.h +20 -0
  134. package/deps/libmdbx/src/windows-import.c +152 -0
  135. package/deps/libmdbx/src/windows-import.h +128 -0
  136. package/deps/libmdbx/test/CMakeLists.txt +317 -0
  137. package/deps/libmdbx/test/append.c++ +237 -0
  138. package/deps/libmdbx/test/base.h++ +92 -0
  139. package/deps/libmdbx/test/battery-tmux.sh +64 -0
  140. package/deps/libmdbx/test/cases.c++ +118 -0
  141. package/deps/libmdbx/test/chrono.c++ +134 -0
  142. package/deps/libmdbx/test/chrono.h++ +85 -0
  143. package/deps/libmdbx/test/config.c++ +643 -0
  144. package/deps/libmdbx/test/config.h++ +334 -0
  145. package/deps/libmdbx/test/copy.c++ +62 -0
  146. package/deps/libmdbx/test/dead.c++ +39 -0
  147. package/deps/libmdbx/test/dump-load.sh +40 -0
  148. package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
  149. package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
  150. package/deps/libmdbx/test/extra/dbi.c++ +229 -0
  151. package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
  152. package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
  153. package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
  154. package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
  155. package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
  156. package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
  157. package/deps/libmdbx/test/extra/open.c++ +96 -0
  158. package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
  159. package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
  160. package/deps/libmdbx/test/extra/probe.c++ +10 -0
  161. package/deps/libmdbx/test/extra/txn.c++ +407 -0
  162. package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
  163. package/deps/libmdbx/test/fork.c++ +263 -0
  164. package/deps/libmdbx/test/hill.c++ +447 -0
  165. package/deps/libmdbx/test/jitter.c++ +197 -0
  166. package/deps/libmdbx/test/keygen.c++ +393 -0
  167. package/deps/libmdbx/test/keygen.h++ +130 -0
  168. package/deps/libmdbx/test/log.c++ +358 -0
  169. package/deps/libmdbx/test/log.h++ +91 -0
  170. package/deps/libmdbx/test/main.c++ +706 -0
  171. package/deps/libmdbx/test/nested.c++ +318 -0
  172. package/deps/libmdbx/test/osal-unix.c++ +647 -0
  173. package/deps/libmdbx/test/osal-windows.c++ +440 -0
  174. package/deps/libmdbx/test/osal.h++ +41 -0
  175. package/deps/libmdbx/test/stochastic.sh +690 -0
  176. package/deps/libmdbx/test/stub/LICENSE +24 -0
  177. package/deps/libmdbx/test/stub/README.md +8 -0
  178. package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
  179. package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
  180. package/deps/libmdbx/test/test.c++ +1551 -0
  181. package/deps/libmdbx/test/test.h++ +298 -0
  182. package/deps/libmdbx/test/tmux.conf +3 -0
  183. package/deps/libmdbx/test/try.c++ +30 -0
  184. package/deps/libmdbx/test/ttl.c++ +240 -0
  185. package/deps/libmdbx/test/utils.c++ +203 -0
  186. package/deps/libmdbx/test/utils.h++ +326 -0
  187. package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
  188. package/lib/mdbx_evn_async.js +211 -0
  189. package/lib/mdbx_worker.js +195 -0
  190. package/lib/nativemou.js +6 -0
  191. package/package.json +38 -0
  192. package/src/async/envmou_close.cpp +34 -0
  193. package/src/async/envmou_close.hpp +32 -0
  194. package/src/async/envmou_copy_to.cpp +29 -0
  195. package/src/async/envmou_copy_to.hpp +38 -0
  196. package/src/async/envmou_keys.cpp +201 -0
  197. package/src/async/envmou_keys.hpp +50 -0
  198. package/src/async/envmou_open.cpp +38 -0
  199. package/src/async/envmou_open.hpp +33 -0
  200. package/src/async/envmou_query.cpp +167 -0
  201. package/src/async/envmou_query.hpp +53 -0
  202. package/src/dbimou.cpp +522 -0
  203. package/src/dbimou.hpp +82 -0
  204. package/src/env_arg0.hpp +24 -0
  205. package/src/envmou.cpp +445 -0
  206. package/src/envmou.hpp +116 -0
  207. package/src/modulemou.cpp +113 -0
  208. package/src/querymou.cpp +177 -0
  209. package/src/querymou.hpp +93 -0
  210. package/src/txnmou.cpp +254 -0
  211. package/src/txnmou.hpp +122 -0
  212. package/src/typemou.hpp +239 -0
  213. package/src/valuemou.hpp +194 -0
  214. package/test/async.js +67 -0
  215. package/test/e3.js +38 -0
  216. package/test/e4.js +89 -0
  217. package/test/e5.js +162 -0
  218. package/test/test-batch-ops.js +243 -0
  219. package/test/test-cursor-mode.js +84 -0
  220. package/test/test-multi-mode.js +87 -0
@@ -0,0 +1,950 @@
1
+ # This makefile is for GNU Make 3.81 or above, and nowadays provided
2
+ # just for compatibility and preservation of traditions.
3
+ #
4
+ # Please use CMake in case of any difficulties or
5
+ # problems with this old-school's magic.
6
+ #
7
+ ################################################################################
8
+ #
9
+ # Basic internal definitions. For a customizable variables and options see below.
10
+ #
11
+ $(info // The GNU Make $(MAKE_VERSION))
12
+ SHELL := $(shell env bash -c 'echo $$BASH')
13
+ MAKE_VERx3 := $(shell printf "%3s%3s%3s" $(subst ., ,$(MAKE_VERSION)))
14
+ make_lt_3_81 := $(shell expr "$(MAKE_VERx3)" "<" " 3 81")
15
+ ifneq ($(make_lt_3_81),0)
16
+ $(error Please use GNU Make 3.81 or above)
17
+ endif
18
+ make_ge_4_1 := $(shell expr "$(MAKE_VERx3)" ">=" " 4 1")
19
+ make_ge_4_4 := $(shell expr "$(MAKE_VERx3)" ">=" " 4 4")
20
+ SRC_PROBE_C := $(shell [ -f mdbx.c ] && echo mdbx.c || echo src/osal.c)
21
+ SRC_PROBE_CXX := $(shell [ -f mdbx.c++ ] && echo mdbx.c++ || echo src/mdbx.c++)
22
+ UNAME := $(shell uname -s 2>/dev/null || echo Unknown)
23
+
24
+ define cxx_filesystem_probe
25
+ int main(int argc, const char*argv[]) {
26
+ mdbx::filesystem::path probe(argv[0]);
27
+ if (argc != 1) throw mdbx::filesystem::filesystem_error(std::string("fake"), std::error_code());
28
+ return mdbx::filesystem::is_directory(probe.relative_path());
29
+ }
30
+ endef
31
+ #
32
+ ################################################################################
33
+ #
34
+ # Use `make options` to list the available libmdbx build options.
35
+ #
36
+ # Note that the defaults should already be correct for most platforms;
37
+ # you should not need to change any of these. Read their descriptions
38
+ # in README and source code (see src/options.h) if you do.
39
+ #
40
+
41
+ # install sandbox
42
+ DESTDIR ?=
43
+ INSTALL ?= install
44
+ # install prefixes (inside sandbox)
45
+ prefix ?= /usr/local
46
+ mandir ?= $(prefix)/man
47
+ # lib/bin suffix for multiarch/biarch, e.g. '.x86_64'
48
+ suffix ?=
49
+
50
+ # toolchain
51
+ CC ?= gcc
52
+ CXX ?= g++
53
+ CFLAGS_EXTRA ?=
54
+ LD ?= ld
55
+ CMAKE ?= cmake
56
+ CMAKE_OPT ?=
57
+ CTEST ?= ctest
58
+ CTEST_OPT ?=
59
+ # target directory for `make dist`
60
+ DIST_DIR ?= dist
61
+
62
+ # build options
63
+ MDBX_BUILD_OPTIONS ?=-DNDEBUG=1
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 ?=
67
+
68
+ # probe and compose common compiler flags with variable expansion trick (seems this work two times per session for GNU Make 3.81)
69
+ CFLAGS ?= $(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))
70
+
71
+ # choosing C++ standard with variable expansion trick (seems this work two times per session for GNU Make 3.81)
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)
73
+ CXXFLAGS ?= $(strip $(CXXSTD) $(filter-out -std=gnu11,$(CFLAGS)))
74
+
75
+ # libraries and options for linking
76
+ EXE_LDFLAGS ?= -pthread
77
+ ifneq ($(make_ge_4_1),1)
78
+ # don't use variable expansion trick as workaround for bugs of GNU Make before 4.1
79
+ LIBS ?= $(shell $(uname2libs))
80
+ LDFLAGS ?= $(shell $(uname2ldflags))
81
+ 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')
82
+ else
83
+ # using variable expansion trick to avoid repeaded probes
84
+ LIBS ?= $(eval LIBS := $$(shell $$(uname2libs)))$(LIBS)
85
+ LDFLAGS ?= $(eval LDFLAGS := $$(shell $$(uname2ldflags)))$(LDFLAGS)
86
+ LIB_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)
87
+ endif
88
+
89
+ ifneq ($(make_ge_4_4),1)
90
+ .NOTPARALLEL:
91
+ WAIT =
92
+ else
93
+ WAIT = .WAIT
94
+ endif
95
+
96
+ ################################################################################
97
+
98
+ define uname2sosuffix
99
+ case "$(UNAME)" in
100
+ Darwin*|Mach*) echo dylib;;
101
+ CYGWIN*|MINGW*|MSYS*|Windows*) echo dll;;
102
+ *) echo so;;
103
+ esac
104
+ endef
105
+
106
+ define uname2ldflags
107
+ case "$(UNAME)" in
108
+ CYGWIN*|MINGW*|MSYS*|Windows*)
109
+ echo '-Wl,--gc-sections,-O1';
110
+ ;;
111
+ *)
112
+ $(LD) --help 2>/dev/null | grep -q -- --gc-sections && echo '-Wl,--gc-sections,-z,relro,-O1';
113
+ $(LD) --help 2>/dev/null | grep -q -- -dead_strip && echo '-Wl,-dead_strip';
114
+ ;;
115
+ esac
116
+ endef
117
+
118
+ # TIP: try add the'-Wl, --no-as-needed,-lrt' for ability to built with modern glibc, but then use with the old.
119
+ define uname2libs
120
+ case "$(UNAME)" in
121
+ CYGWIN*|MINGW*|MSYS*|Windows*)
122
+ echo '-lm -lntdll -lwinmm';
123
+ ;;
124
+ *SunOS*|*Solaris*)
125
+ echo '-lm -lkstat -lrt';
126
+ ;;
127
+ *Darwin*|OpenBSD*)
128
+ echo '-lm';
129
+ ;;
130
+ *)
131
+ echo '-lm -lrt';
132
+ ;;
133
+ esac
134
+ endef
135
+
136
+ SO_SUFFIX := $(shell $(uname2sosuffix))
137
+ HEADERS := mdbx.h mdbx.h++
138
+ LIBRARIES := libmdbx.a libmdbx.$(SO_SUFFIX)
139
+ TOOLS := chk copy drop dump load stat
140
+ MDBX_TOOLS := $(addprefix mdbx_,$(TOOLS))
141
+ MANPAGES := mdbx_stat.1 mdbx_copy.1 mdbx_dump.1 mdbx_load.1 mdbx_chk.1 mdbx_drop.1
142
+ TIP := // TIP:
143
+
144
+ .PHONY: all help options lib libs tools clean install uninstall check_buildflags_tag tools-static
145
+ .PHONY: install-strip install-no-strip strip libmdbx mdbx show-options lib-static lib-shared cmake-build ninja
146
+
147
+ boolean = $(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)))
148
+ select_by = $(if $(call boolean,$(1)),$(2),$(3))
149
+
150
+ ifeq ("$(origin V)", "command line")
151
+ MDBX_BUILD_VERBOSE := $(V)
152
+ endif
153
+ ifndef MDBX_BUILD_VERBOSE
154
+ MDBX_BUILD_VERBOSE := 0
155
+ endif
156
+
157
+ ifeq ($(call boolean,MDBX_BUILD_VERBOSE),1)
158
+ QUIET :=
159
+ HUSH :=
160
+ $(info $(TIP) Use `make V=0` for quiet.)
161
+ else
162
+ QUIET := @
163
+ HUSH := >/dev/null
164
+ $(info $(TIP) Use `make V=1` for verbose.)
165
+ endif
166
+
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)
172
+
173
+ help:
174
+ @echo " make all - build libraries and tools"
175
+ @echo " make help - print this help"
176
+ @echo " make options - list build options"
177
+ @echo " make lib - build libraries, also lib-static and lib-shared"
178
+ @echo " make tools - build the tools"
179
+ @echo " make tools-static - build the tools with statically linking with system libraries and compiler runtime"
180
+ @echo " make clean "
181
+ @echo " make install "
182
+ @echo " make uninstall "
183
+ @echo " make cmake-build | ninja - build by CMake & Ninja"
184
+ @echo ""
185
+ @echo " make strip - strip debug symbols from binaries"
186
+ @echo " make install-no-strip - install explicitly without strip"
187
+ @echo " make install-strip - install explicitly with strip"
188
+ @echo ""
189
+ @echo " make bench - run ioarena-benchmark"
190
+ @echo " make bench-couple - run ioarena-benchmark for mdbx and lmdb"
191
+ @echo " make bench-triplet - run ioarena-benchmark for mdbx, lmdb, sqlite3"
192
+ @echo " make bench-quartet - run ioarena-benchmark for mdbx, lmdb, rocksdb, wiredtiger"
193
+ @echo " make bench-clean - remove temp database(s) after benchmark"
194
+ #> dist-cutoff-begin
195
+ @echo ""
196
+ @echo " make check - smoke test with amalgamation and installation checking"
197
+ @echo " make smoke - fast smoke test"
198
+ @echo " make smoke-memcheck - build with Valgrind support and run smoke test under memcheck tool"
199
+ @echo " make smoke-fault - execute transaction owner failure smoke testcase"
200
+ @echo " make smoke-singleprocess - execute single-process smoke test"
201
+ @echo " make test - basic test"
202
+ @echo " make test-memcheck - build with Valgrind support and run basic test under memcheck tool"
203
+ @echo " make test-long - execute long test which runs for several weeks, or until interruption"
204
+ @echo " make test-asan - build with AddressSanitizer and run basic test"
205
+ @echo " make test-leak - build with LeakSanitizer and run basic test"
206
+ @echo " make test-ubsan - build with UndefinedBehaviourSanitizer and run basic test"
207
+ @echo " make test-singleprocess - execute single-process basic test (also used by make cross-qemu)"
208
+ @echo " make cross-gcc - check cross-compilation without test execution"
209
+ @echo " make cross-qemu - run cross-compilation and execution basic test with QEMU"
210
+ @echo " make gcc-analyzer - run gcc-analyzer (mostly useless for now)"
211
+ @echo " make build-test - build test executable(s)"
212
+ @echo ""
213
+ @echo " make dist - build amalgamated source code"
214
+ @echo " make doxygen - build HTML documentation"
215
+ @echo " make release-assets - build release assets"
216
+ @echo " make reformat - reformat source code with clang-format"
217
+ #< dist-cutoff-end
218
+
219
+ show-options:
220
+ @echo " MDBX_BUILD_OPTIONS = $(MDBX_BUILD_OPTIONS)"
221
+ @echo " MDBX_BUILD_CXX = $(MDBX_BUILD_CXX)"
222
+ @echo " MDBX_BUILD_TIMESTAMP = $(MDBX_BUILD_TIMESTAMP)"
223
+ @echo " MDBX_BUILD_METADATA = $(MDBX_BUILD_METADATA)"
224
+ @echo '$(TIP) Use `make options` to listing available build options.'
225
+ @echo $(call select_by,MDBX_BUILD_CXX," CXX =`which $(CXX)` | `$(CXX) --version | head -1`"," CC =`which $(CC)` | `$(CC) --version | head -1`")
226
+ @echo $(call select_by,MDBX_BUILD_CXX," CXXFLAGS =$(CXXFLAGS)"," CFLAGS =$(CFLAGS)")
227
+ @echo $(call select_by,MDBX_BUILD_CXX," LDFLAGS =$(LDFLAGS) $(LIB_STDCXXFS) $(LIBS) $(EXE_LDFLAGS)"," LDFLAGS =$(LDFLAGS) $(LIBS) $(EXE_LDFLAGS)")
228
+ @echo '$(TIP) Use `make help` to listing available targets.'
229
+
230
+ options:
231
+ @echo " INSTALL =$(INSTALL)"
232
+ @echo " DESTDIR =$(DESTDIR)"
233
+ @echo " prefix =$(prefix)"
234
+ @echo " mandir =$(mandir)"
235
+ @echo " suffix =$(suffix)"
236
+ @echo ""
237
+ @echo " CC =$(CC)"
238
+ @echo " CFLAGS_EXTRA =$(CFLAGS_EXTRA)"
239
+ @echo " CFLAGS =$(CFLAGS)"
240
+ @echo " CXX =$(CXX)"
241
+ @echo " CXXSTD =$(CXXSTD)"
242
+ @echo " CXXFLAGS =$(CXXFLAGS)"
243
+ @echo ""
244
+ @echo " LD =$(LD)"
245
+ @echo " LDFLAGS =$(LDFLAGS)"
246
+ @echo " EXE_LDFLAGS =$(EXE_LDFLAGS)"
247
+ @echo " LIBS =$(LIBS)"
248
+ @echo ""
249
+ @echo " MDBX_BUILD_OPTIONS = $(MDBX_BUILD_OPTIONS)"
250
+ @echo " MDBX_BUILD_TIMESTAMP = $(MDBX_BUILD_TIMESTAMP)"
251
+ @echo " MDBX_BUILD_METADATA = $(MDBX_BUILD_METADATA)"
252
+ @echo ""
253
+ @echo "## Assortment items for MDBX_BUILD_OPTIONS:"
254
+ @echo "## Note that the defaults should already be correct for most platforms;"
255
+ @echo "## you should not need to change any of these. Read their descriptions"
256
+ #> dist-cutoff-begin
257
+ ifeq ($(wildcard mdbx.c),mdbx.c)
258
+ #< dist-cutoff-end
259
+ @echo "## in README and source code (see mdbx.c) if you do."
260
+ @grep -h '#ifndef MDBX_' mdbx.c | grep -v BUILD | sort -u | sed 's/#ifndef / /'
261
+ #> dist-cutoff-begin
262
+ else
263
+ @echo "## in README and source code (see src/options.h) if you do."
264
+ @grep -h '#ifndef MDBX_' src/*.h | grep -v BUILD | sort -u | sed 's/#ifndef / /'
265
+ endif
266
+ #< dist-cutoff-end
267
+
268
+ lib libs libmdbx mdbx: libmdbx.a libmdbx.$(SO_SUFFIX)
269
+
270
+ tools: $(MDBX_TOOLS)
271
+ tools-static: $(addsuffix .static,$(MDBX_TOOLS)) $(addsuffix .static-lto,$(MDBX_TOOLS))
272
+
273
+ strip: all
274
+ @echo ' STRIP libmdbx.$(SO_SUFFIX) $(MDBX_TOOLS)'
275
+ $(TRACE )strip libmdbx.$(SO_SUFFIX) $(MDBX_TOOLS)
276
+
277
+ clean:
278
+ @echo ' REMOVE ...'
279
+ $(QUIET)rm -rf $(MDBX_TOOLS) mdbx_test @* *.[ao] *.[ls]o *.$(SO_SUFFIX) *.dSYM *~ tmp.db/* \
280
+ *.gcov *.log *.err src/*.o test/*.o mdbx_example dist @dist-check \
281
+ config.h src/config.h src/version.c *.tar* @buildflags.tag @dist-checked.tag \
282
+ mdbx_*.static mdbx_*.static-lto CMakeFiles
283
+
284
+ MDBX_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)))
285
+ check_buildflags_tag:
286
+ $(QUIET)if [ "$(MDBX_BUILD_FLAGS)" != "$$(cat @buildflags.tag 2>&1)" ]; then \
287
+ echo -n " CLEAN for build with specified flags..." && \
288
+ $(MAKE) IOARENA=false CXXSTD= -s clean >/dev/null && echo " Ok" && \
289
+ echo '$(MDBX_BUILD_FLAGS)' > @buildflags.tag; \
290
+ fi
291
+
292
+ @buildflags.tag: check_buildflags_tag
293
+
294
+ lib-static libmdbx.a: mdbx-static.o $(call select_by,MDBX_BUILD_CXX,mdbx++-static.o)
295
+ @echo ' AR $@'
296
+ $(QUIET)$(AR) rcs $@ $? $(HUSH)
297
+
298
+ lib-shared libmdbx.$(SO_SUFFIX): mdbx-dylib.o $(call select_by,MDBX_BUILD_CXX,mdbx++-dylib.o)
299
+ @echo ' LD $@'
300
+ $(QUIET)$(call select_by,MDBX_BUILD_CXX,$(CXX) $(CXXFLAGS),$(CC) $(CFLAGS)) $^ -pthread -shared $(LDFLAGS) $(call select_by,MDBX_BUILD_CXX,$(LIB_STDCXXFS)) $(LIBS) -o $@
301
+
302
+ ninja-assertions: CMAKE_OPT += -DMDBX_FORCE_ASSERTIONS=ON
303
+ ninja-assertions: cmake-build
304
+ ninja-debug: CMAKE_OPT += -DCMAKE_BUILD_TYPE=Debug
305
+ ninja-debug: cmake-build
306
+ ninja: cmake-build
307
+ cmake-build:
308
+ @echo " RUN: cmake -G Ninja && cmake --build"
309
+ $(QUIET)mkdir -p @cmake-ninja-build && $(CMAKE) $(CMAKE_OPT) -G Ninja -S . -B @cmake-ninja-build && $(CMAKE) --build @cmake-ninja-build
310
+
311
+ ctest: cmake-build
312
+ @echo " RUN: ctest .."
313
+ $(QUIET)$(CTEST) --test-dir @cmake-ninja-build --parallel `(nproc | sysctl -n hw.ncpu | echo 2) 2>/dev/null` --schedule-random $(CTEST_OPT)
314
+
315
+ #> dist-cutoff-begin
316
+ ifeq ($(wildcard mdbx.c),mdbx.c)
317
+ #< dist-cutoff-end
318
+
319
+ ################################################################################
320
+ # Amalgamated source code, i.e. distributed after `make dist`
321
+ MAN_SRCDIR := man1/
322
+
323
+ config.h: @buildflags.tag $(WAIT) mdbx.c $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
324
+ @echo ' MAKE $@'
325
+ $(QUIET)(echo '#define MDBX_BUILD_TIMESTAMP "$(MDBX_BUILD_TIMESTAMP)"' \
326
+ && echo "#define MDBX_BUILD_FLAGS \"$$(cat @buildflags.tag)\"" \
327
+ && echo '#define MDBX_BUILD_COMPILER "$(shell (LC_ALL=C $(CC) --version || echo 'Please use GCC or CLANG compatible compiler') | head -1)"' \
328
+ && 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)"' \
329
+ && echo '#define MDBX_BUILD_CXX $(call select_by,MDBX_BUILD_CXX,1,0)' \
330
+ && echo '#define MDBX_BUILD_METADATA "$(MDBX_BUILD_METADATA)"' \
331
+ ) >$@
332
+
333
+ mdbx-dylib.o: config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
334
+ @echo ' CC $@'
335
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c mdbx.c -o $@
336
+
337
+ mdbx-static.o: config.h mdbx.c mdbx.h $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
338
+ @echo ' CC $@'
339
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c mdbx.c -o $@
340
+
341
+ mdbx++-dylib.o: config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
342
+ @echo ' CC $@'
343
+ $(QUIET)$(CXX) $(CXXFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c mdbx.c++ -o $@
344
+
345
+ mdbx++-static.o: config.h mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
346
+ @echo ' CC $@'
347
+ $(QUIET)$(CXX) $(CXXFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c mdbx.c++ -o $@
348
+
349
+ mdbx_%: mdbx_%.c mdbx-static.o
350
+ @echo ' CC+LD $@'
351
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' $^ $(EXE_LDFLAGS) $(LIBS) -o $@
352
+
353
+ mdbx_%.static: mdbx_%.c mdbx-static.o
354
+ @echo ' CC+LD $@'
355
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' $^ $(EXE_LDFLAGS) -static -Wl,--strip-all -o $@
356
+
357
+ mdbx_%.static-lto: mdbx_%.c config.h mdbx.c mdbx.h
358
+ @echo ' CC+LD $@'
359
+ $(QUIET)$(CC) $(CFLAGS) -Os -flto $(MDBX_BUILD_OPTIONS) '-DLIBMDBX_API=' '-DMDBX_CONFIG_H="config.h"' \
360
+ $< mdbx.c $(EXE_LDFLAGS) $(LIBS) -static -Wl,--strip-all -o $@
361
+
362
+ #> dist-cutoff-begin
363
+ else
364
+ ################################################################################
365
+ # Plain (non-amalgamated) sources with test
366
+
367
+ .PHONY: build-test build-test-with-valgrind check cross-gcc cross-qemu dist doxygen gcc-analyzer long-test
368
+ .PHONY: reformat release-assets tags smoke test test-asan smoke-fault test-leak
369
+ .PHONY: smoke-singleprocess test-singleprocess test-ubsan test-valgrind test-memcheck memcheck smoke-memcheck
370
+ .PHONY: smoke-assertion test-assertion long-test-assertion test-ci test-ci-extra
371
+
372
+ test-ci-extra: test-ci cross-gcc cross-qemu
373
+
374
+ test-ci: check \
375
+ smoke-singleprocess smoke-fault smoke-memcheck smoke \
376
+ test-leak test-asan test-ubsan test-singleprocess test test-memcheck
377
+
378
+ define uname2osal
379
+ case "$(UNAME)" in
380
+ CYGWIN*|MINGW*|MSYS*|Windows*) echo windows;;
381
+ *) echo unix;;
382
+ esac
383
+ endef
384
+
385
+ define uname2titer
386
+ case "$(UNAME)" in
387
+ CYGWIN*|MINGW*|MSYS*|Windows*) echo 2;;
388
+ Darwin*|Mach*) echo 2;;
389
+ *) if [ -z "${CI}" ]; then echo 7; else echo 3; fi;;
390
+ esac
391
+ endef
392
+
393
+ DIST_EXTRA := LICENSE NOTICE README.md CMakeLists.txt GNUmakefile Makefile ChangeLog.md VERSION.json config.h.in ntdll.def \
394
+ $(addprefix man1/, $(MANPAGES)) cmake/compiler.cmake cmake/profile.cmake cmake/utils.cmake .clang-format-ignore
395
+ DIST_SRC := mdbx.h mdbx.h++ mdbx.c mdbx.c++ $(addsuffix .c, $(MDBX_TOOLS))
396
+
397
+ TEST_DB ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.db
398
+ TEST_LOG ?= $(shell [ -d /dev/shm ] && echo /dev/shm || echo /tmp)/mdbx-test.log
399
+ TEST_OSAL := $(shell $(uname2osal))
400
+ TEST_ITER := $(shell $(uname2titer))
401
+ TEST_SRC := test/osal-$(TEST_OSAL).c++ $(filter-out $(wildcard test/osal-*.c++),$(wildcard test/*.c++)) $(call select_by,MDBX_BUILD_CXX,,src/mdbx.c++)
402
+ TEST_INC := $(wildcard test/*.h++)
403
+ TEST_OBJ := $(patsubst %.c++,%.o,$(TEST_SRC))
404
+ ifndef SED
405
+ SED := $(shell which gnu-sed 2>&- || echo sed)
406
+ endif
407
+ TAR ?= $(shell which gnu-tar 2>&- || echo tar)
408
+ ZIP ?= $(shell which zip || echo "echo 'Please install zip'")
409
+ CLANG_FORMAT ?= $(shell (which clang-format-19 || which clang-format) 2>/dev/null)
410
+
411
+ reformat:
412
+ @echo ' RUNNING clang-format...'
413
+ $(QUIET)if [ -n "$(CLANG_FORMAT)" ]; then \
414
+ git ls-files | grep -E '\.(c|c++|h|h++)(\.in)?$$' | xargs -r $(CLANG_FORMAT) -i --style=file; \
415
+ else \
416
+ echo "clang-format version 19 not found for 'reformat'"; \
417
+ fi
418
+
419
+ MAN_SRCDIR := src/man1/
420
+ ALLOY_DEPS := $(shell git ls-files src/ | grep -e /tools -e /man -v)
421
+ MDBX_GIT_DIR := $(shell if [ -d .git ]; then echo .git; elif [ -s .git -a -f .git ]; then grep '^gitdir: ' .git | cut -d ':' -f 2; else echo git_directory_is_absent; fi)
422
+ MDBX_GIT_LASTVTAG := $(shell git describe --tags --dirty=-DIRTY --abbrev=0 '--match=v[0-9]*' 2>&- || echo 'Please fetch tags and/or install non-obsolete git version')
423
+ MDBX_GIT_3DOT := $(shell set -o pipefail; echo "$(MDBX_GIT_LASTVTAG)" | $(SED) -n 's|^v*\([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)\(.*\)|\1|p' || echo 'Please fetch tags and/or use non-obsolete git version')
424
+ MDBX_GIT_TWEAK := $(shell set -o pipefail; git rev-list $(shell git describe --tags --abbrev=0 '--match=v[0-9]*')..HEAD --count 2>&- || echo 'Please fetch tags and/or use non-obsolete git version')
425
+ MDBX_GIT_TIMESTAMP := $(shell git show --no-patch --format=%cI HEAD 2>&- || echo 'Please install latest get version')
426
+ MDBX_GIT_DESCRIBE := $(shell git describe --tags --long --dirty '--match=v[0-9]*' 2>&- || echo 'Please fetch tags and/or install non-obsolete git version')
427
+ MDBX_GIT_PRERELEASE := $(shell echo "$(MDBX_GIT_LASTVTAG)" | $(SED) -n 's|^v*\([0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\)\(.*\)-\([-.0-1a-zA-Z]\+\)|\3|p')
428
+ MDBX_VERSION_PURE = $(MDBX_GIT_3DOT)$(if $(filter-out 0,$(MDBX_GIT_TWEAK)),.$(MDBX_GIT_TWEAK),)$(if $(MDBX_GIT_PRERELEASE),-$(MDBX_GIT_PRERELEASE),)
429
+ MDBX_VERSION_IDENT = $(shell set -o pipefail; echo -n '$(MDBX_GIT_DESCRIBE)' | tr -c -s '[a-zA-Z0-9.]' _)
430
+ MDBX_VERSION_NODOT = $(subst .,_,$(MDBX_VERSION_IDENT))
431
+ MDBX_BUILD_SOURCERY = $(shell set -o pipefail; $(MAKE) IOARENA=false CXXSTD= -s src/version.c >/dev/null && (openssl dgst -r -sha256 src/version.c || sha256sum src/version.c || shasum -a 256 src/version.c) 2>/dev/null | cut -d ' ' -f 1 || (echo 'Please install openssl or sha256sum or shasum' >&2 && echo sha256sum_is_no_available))_$(MDBX_VERSION_NODOT)
432
+ MDBX_DIST_DIR = libmdbx-$(MDBX_VERSION_NODOT)
433
+
434
+ # Extra options mdbx_test utility
435
+ MDBX_SMOKE_EXTRA ?=
436
+
437
+ check: DESTDIR = $(shell pwd)/@check-install
438
+ check: CMAKE_OPT = -Werror=dev
439
+ check: smoke-assertion ninja-assertions dist install test ctest
440
+
441
+ smoke-assertion: MDBX_BUILD_OPTIONS:=$(strip $(MDBX_BUILD_OPTIONS) -DMDBX_FORCE_ASSERTIONS=1 -UNDEBUG -DMDBX_DEBUG=0)
442
+ smoke-assertion: smoke
443
+ test-assertion: MDBX_BUILD_OPTIONS:=$(strip $(MDBX_BUILD_OPTIONS) -DMDBX_FORCE_ASSERTIONS=1 -UNDEBUG -DMDBX_DEBUG=0)
444
+ test-assertion: smoke
445
+ long-test-assertion: MDBX_BUILD_OPTIONS:=$(strip $(MDBX_BUILD_OPTIONS) -DMDBX_FORCE_ASSERTIONS=1 -UNDEBUG -DMDBX_DEBUG=0)
446
+ long-test-assertion: smoke
447
+
448
+ smoke: build-test
449
+ @echo ' SMOKE `mdbx_test basic`...'
450
+ $(QUIET)rm -f $(TEST_DB) $(TEST_LOG).gz && (set -o pipefail; \
451
+ (./mdbx_test --table=+data.integer --keygen.split=29 --datalen.min=min --datalen.max=max --progress --console=no --repeat=$(TEST_ITER) --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) basic && \
452
+ ./mdbx_test --mode=-writemap,-nosync-safe,-lifo --progress --console=no --repeat=$(TEST_ITER) --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) basic) \
453
+ | tee >(gzip --stdout >$(TEST_LOG).gz) | tail -n 42) \
454
+ && ./mdbx_chk -vvn $(TEST_DB) && ./mdbx_chk -vvn $(TEST_DB)-copy
455
+
456
+ smoke-singleprocess: build-test
457
+ @echo ' SMOKE `mdbx_test --nested`...'
458
+ $(QUIET)rm -f $(TEST_DB) $(TEST_LOG).gz && (set -o pipefail; \
459
+ (./mdbx_test --table=+data.integer --keygen.split=29 --datalen.min=min --datalen.max=max --progress --console=no --repeat=42 --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) --hill && \
460
+ ./mdbx_test --progress --console=no --repeat=2 --pathname=$(TEST_DB) --dont-cleanup-before --dont-cleanup-after --copy && \
461
+ ./mdbx_test --mode=-writemap,-nosync-safe,-lifo --progress --console=no --repeat=42 --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) --nested) \
462
+ | tee >(gzip --stdout >$(TEST_LOG).gz) | tail -n 42) \
463
+ && ./mdbx_chk -vvn $(TEST_DB) && ./mdbx_chk -vvn $(TEST_DB)-copy
464
+
465
+ smoke-fault: build-test
466
+ @echo ' SMOKE `mdbx_test --inject-writefault=42 basic`...'
467
+ $(QUIET)rm -f $(TEST_DB) $(TEST_LOG).gz && (set -o pipefail; ./mdbx_test --progress --console=no --pathname=$(TEST_DB) --inject-writefault=42 --dump-config --dont-cleanup-after $(MDBX_SMOKE_EXTRA) basic \
468
+ | tee >(gzip --stdout >$(TEST_LOG).gz) | tail -n 42) \
469
+ ; ./mdbx_chk -vvnw $(TEST_DB) && ([ ! -e $(TEST_DB)-copy ] || ./mdbx_chk -vvn $(TEST_DB)-copy)
470
+
471
+ test: build-test
472
+ @echo ' RUNNING `test/stochastic.sh --loops 2`...'
473
+ $(QUIET)test/stochastic.sh --dont-check-ram-size --loops 2 --db-upto-mb 256 --skip-make --taillog >$(TEST_LOG) || (cat $(TEST_LOG) && false)
474
+
475
+ long-test: test-long
476
+ test-long: build-test
477
+ @echo ' RUNNING `test/stochastic.sh --loops 42`...'
478
+ $(QUIET)test/stochastic.sh --loops 42 --db-upto-mb 1024 --extra --skip-make --taillog
479
+
480
+ test-singleprocess: build-test
481
+ @echo ' RUNNING `test/stochastic.sh --single --loops 2`...'
482
+ $(QUIET)test/stochastic.sh --dont-check-ram-size --single --loops 2 --db-upto-mb 256 --skip-make --taillog >$(TEST_LOG) || (cat $(TEST_LOG) && false)
483
+
484
+ test-valgrind: test-memcheck
485
+ test-memcheck: CFLAGS_EXTRA=-Ofast -DENABLE_MEMCHECK
486
+ test-memcheck: build-test
487
+ @echo ' RUNNING `test/stochastic.sh --with-valgrind --loops 2`...'
488
+ $(QUIET)test/stochastic.sh --with-valgrind --loops 2 --db-upto-mb 256 --skip-make >$(TEST_LOG) || (cat $(TEST_LOG) && false)
489
+
490
+ memcheck: smoke-memcheck
491
+ smoke-memcheck: VALGRIND=valgrind --trace-children=yes --log-file=valgrind-%p.log --leak-check=full --track-origins=yes --read-var-info=yes --error-exitcode=42 --suppressions=test/valgrind_suppress.txt
492
+ smoke-memcheck: CFLAGS_EXTRA=-Ofast -DENABLE_MEMCHECK
493
+ smoke-memcheck: build-test
494
+ @echo " SMOKE \`mdbx_test basic\` under Valgrind's memcheck..."
495
+ $(QUIET)rm -f valgrind-*.log $(TEST_DB) $(TEST_LOG).gz && (set -o pipefail; ( \
496
+ $(VALGRIND) ./mdbx_test --table=+data.fixed --keygen.split=29 --datalen=35 --progress --console=no --repeat=2 --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) basic && \
497
+ $(VALGRIND) ./mdbx_test --progress --console=no --pathname=$(TEST_DB) --dont-cleanup-before --dont-cleanup-after --copy && \
498
+ $(VALGRIND) ./mdbx_test --mode=-writemap,-nosync-safe,-lifo --progress --console=no --repeat=4 --pathname=$(TEST_DB) --dont-cleanup-after $(MDBX_SMOKE_EXTRA) basic && \
499
+ $(VALGRIND) ./mdbx_chk -vvn $(TEST_DB) && \
500
+ $(VALGRIND) ./mdbx_chk -vvn $(TEST_DB)-copy \
501
+ ) | tee >(gzip --stdout >$(TEST_LOG).gz) | tail -n 42)
502
+
503
+ gcc-analyzer:
504
+ @echo ' RE-BUILD with `-fanalyzer` option...'
505
+ @echo "NOTE: There a lot of false-positive warnings at 2020-05-01 by pre-release GCC-10 (20200328, Red Hat 10.0.1-0.11)"
506
+ $(QUIET)$(MAKE) IOARENA=false CXXSTD=$(CXXSTD) CFLAGS_EXTRA="-Og -fanalyzer -Wno-error" build-test
507
+
508
+ test-ubsan:
509
+ @echo ' RE-TEST with `-fsanitize=undefined` option...'
510
+ $(QUIET)$(MAKE) IOARENA=false CXXSTD=$(CXXSTD) CFLAGS_EXTRA="-DENABLE_UBSAN -Ofast -fsanitize=undefined -fsanitize-undefined-trap-on-error" test
511
+
512
+ test-asan:
513
+ @echo ' RE-TEST with `-fsanitize=address` option...'
514
+ $(QUIET)$(MAKE) IOARENA=false CXXSTD=$(CXXSTD) CFLAGS_EXTRA="-Os -fsanitize=address" test
515
+
516
+ test-leak:
517
+ @echo ' RE-TEST with `-fsanitize=leak` option...'
518
+ $(QUIET)$(MAKE) IOARENA=false CXXSTD=$(CXXSTD) CFLAGS_EXTRA="-fsanitize=leak" test
519
+
520
+ mdbx_example: mdbx.h example/example-mdbx.c libmdbx.$(SO_SUFFIX)
521
+ @echo ' CC+LD $@'
522
+ $(QUIET)$(CC) $(CFLAGS) -I. example/example-mdbx.c ./libmdbx.$(SO_SUFFIX) -o $@
523
+
524
+ build-test: all mdbx_example mdbx_test
525
+
526
+ define test-rule
527
+ $(patsubst %.c++,%.o,$(1)): $(1) $(TEST_INC) $(HEADERS) $(lastword $(MAKEFILE_LIST))
528
+ @echo ' CC $$@'
529
+ $(QUIET)$$(CXX) $$(CXXFLAGS) $$(MDBX_BUILD_OPTIONS) -DMDBX_BUILD_CXX=1 -DMDBX_WITHOUT_MSVC_CRT=0 -c $(1) -o $$@
530
+
531
+ endef
532
+ $(foreach file,$(TEST_SRC),$(eval $(call test-rule,$(file))))
533
+
534
+ define tool-rule
535
+ mdbx_$(1): src/tools/$(1).c libmdbx.a
536
+ @echo ' CC+LD $$@'
537
+ $(QUIET)$$(CC) $$(CFLAGS) $$(MDBX_BUILD_OPTIONS) -Isrc '-DMDBX_CONFIG_H="config.h"' $$^ $$(EXE_LDFLAGS) $$(LIBS) -o $$@
538
+
539
+ mdbx_$(1).static: src/tools/$(1).c mdbx-static.o
540
+ @echo ' CC+LD $$@'
541
+ $(QUIET)$$(CC) $$(CFLAGS) $$(MDBX_BUILD_OPTIONS) -Isrc '-DMDBX_CONFIG_H="config.h"' $$^ $$(EXE_LDFLAGS) $$(LIBS) -static -Wl,--strip-all -o $$@
542
+
543
+ mdbx_$(1).static-lto: src/tools/$(1).c src/config.h src/version.c src/alloy.c $(ALLOY_DEPS)
544
+ @echo ' CC+LD $$@'
545
+ $(QUIET)$$(CC) $$(CFLAGS) -Os -flto $$(MDBX_BUILD_OPTIONS) -Isrc '-DLIBMDBX_API=' '-DMDBX_CONFIG_H="config.h"' \
546
+ $$< src/alloy.c $$(EXE_LDFLAGS) $$(LIBS) -static -Wl,--strip-all -o $$@
547
+
548
+ endef
549
+ $(foreach file,$(TOOLS),$(eval $(call tool-rule,$(file))))
550
+
551
+ mdbx_test: $(TEST_OBJ) libmdbx.$(SO_SUFFIX)
552
+ @echo ' LD $@'
553
+ $(QUIET)$(CXX) $(CXXFLAGS) $(TEST_OBJ) -Wl,-rpath . -L . -l mdbx $(EXE_LDFLAGS) $(LIBS) -o $@
554
+
555
+ $(MDBX_GIT_DIR)/HEAD $(MDBX_GIT_DIR)/index $(MDBX_GIT_DIR)/refs/tags:
556
+ @echo '*** ' >&2
557
+ @echo '*** Please don''t use tarballs nor zips which are automatically provided by Github !' >&2
558
+ @echo '*** These archives do not contain version information and thus are unfit to build libmdbx.' >&2
559
+ @echo '*** ' >&2
560
+ @echo '*** Instead just follow the https://libmdbx.dqdkfa.ru/usage.html' >&2
561
+ @echo '*** PLEASE, AVOID USING ANY OTHER TECHNIQUES.' >&2
562
+ @echo '*** ' >&2
563
+ @false
564
+
565
+ src/version.c: src/version.c.in $(lastword $(MAKEFILE_LIST)) $(MDBX_GIT_DIR)/HEAD $(MDBX_GIT_DIR)/index $(MDBX_GIT_DIR)/refs/tags LICENSE NOTICE
566
+ @echo ' MAKE $@'
567
+ $(QUIET)$(SED) \
568
+ -e "s|@MDBX_GIT_TIMESTAMP@|$(MDBX_GIT_TIMESTAMP)|" \
569
+ -e "s|@MDBX_GIT_TREE@|$(shell git show --no-patch --format=%T HEAD || echo 'Please install latest get version')|" \
570
+ -e "s|@MDBX_GIT_COMMIT@|$(shell git show --no-patch --format=%H HEAD || echo 'Please install latest get version')|" \
571
+ -e "s|@MDBX_GIT_DESCRIBE@|$(MDBX_GIT_DESCRIBE)|" \
572
+ -e "s|\$${MDBX_VERSION_MAJOR}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 1)|" \
573
+ -e "s|\$${MDBX_VERSION_MINOR}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 2)|" \
574
+ -e "s|\$${MDBX_VERSION_PATCH}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 3)|" \
575
+ -e "s|\$${MDBX_VERSION_TWEAK}|$(MDBX_GIT_TWEAK)|" \
576
+ -e "s|@MDBX_VERSION_PRERELEASE@|$(MDBX_GIT_PRERELEASE)|" \
577
+ -e "s|@MDBX_VERSION_PURE@|$(MDBX_VERSION_PURE)|" \
578
+ src/version.c.in >$@
579
+
580
+ src/config.h: @buildflags.tag $(WAIT) src/version.c $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
581
+ @echo ' MAKE $@'
582
+ $(QUIET)(echo '#define MDBX_BUILD_TIMESTAMP "$(MDBX_BUILD_TIMESTAMP)"' \
583
+ && echo "#define MDBX_BUILD_FLAGS \"$$(cat @buildflags.tag)\"" \
584
+ && echo '#define MDBX_BUILD_COMPILER "$(shell (LC_ALL=C $(CC) --version || echo 'Please use GCC or CLANG compatible compiler') | head -1)"' \
585
+ && 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)"' \
586
+ && echo '#define MDBX_BUILD_SOURCERY $(MDBX_BUILD_SOURCERY)' \
587
+ && echo '#define MDBX_BUILD_CXX $(call select_by,MDBX_BUILD_CXX,1,0)' \
588
+ && echo '#define MDBX_BUILD_METADATA "$(MDBX_BUILD_METADATA)"' \
589
+ ) >$@
590
+
591
+ mdbx-dylib.o: src/config.h src/version.c src/alloy.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
592
+ @echo ' CC $@'
593
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c src/alloy.c -o $@
594
+
595
+ mdbx-static.o: src/config.h src/version.c src/alloy.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST)) LICENSE NOTICE
596
+ @echo ' CC $@'
597
+ $(QUIET)$(CC) $(CFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c src/alloy.c -o $@
598
+
599
+ docs/Doxyfile: docs/Doxyfile.in src/version.c $(lastword $(MAKEFILE_LIST))
600
+ @echo ' MAKE $@'
601
+ $(QUIET)$(SED) \
602
+ -e "s|@MDBX_GIT_TIMESTAMP@|$(MDBX_GIT_TIMESTAMP)|" \
603
+ -e "s|@MDBX_GIT_TREE@|$(shell git show --no-patch --format=%T HEAD || echo 'Please install latest get version')|" \
604
+ -e "s|@MDBX_GIT_COMMIT@|$(shell git show --no-patch --format=%H HEAD || echo 'Please install latest get version')|" \
605
+ -e "s|@MDBX_GIT_DESCRIBE@|$(MDBX_GIT_DESCRIBE)|" \
606
+ -e "s|\$${MDBX_VERSION_MAJOR}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 1)|" \
607
+ -e "s|\$${MDBX_VERSION_MINOR}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 2)|" \
608
+ -e "s|\$${MDBX_VERSION_PATCH}|$(shell echo '$(MDBX_GIT_3DOT)' | cut -d . -f 3)|" \
609
+ -e "s|\$${MDBX_VERSION_TWEAK}|$(MDBX_GIT_TWEAK)|" \
610
+ -e "s|@MDBX_VERSION_PRERELEASE@|$(MDBX_GIT_PRERELEASE)|" \
611
+ -e "s|@MDBX_VERSION_PURE@|$(MDBX_VERSION_PURE)|" \
612
+ docs/Doxyfile.in >$@
613
+
614
+ define md-extract-section
615
+ docs/__$(1).md: $(2) $(lastword $(MAKEFILE_LIST))
616
+ @echo ' EXTRACT $1'
617
+ $(QUIET)$(SED) -n '/<!-- section-begin $(1) -->/,/<!-- section-end -->/p' $(2) >$$@ && test -s $$@
618
+
619
+ endef
620
+ $(foreach section,overview mithril characteristics improvements history usage performance bindings,$(eval $(call md-extract-section,$(section),README.md)))
621
+
622
+ docs/contrib.fame: src/version.c $(lastword $(MAKEFILE_LIST))
623
+ @echo ' MAKE $@'
624
+ $(QUIET)echo "" > $@ && git fame --show-email --format=md --silent-progress -w -M -C | grep '^|' >> $@
625
+
626
+ docs/overall.md: docs/__overview.md docs/_toc.md docs/__mithril.md docs/__history.md COPYRIGHT LICENSE NOTICE $(lastword $(MAKEFILE_LIST))
627
+ @echo ' MAKE $@'
628
+ $(QUIET)echo -e "\\mainpage Overall\n\\section brief Brief" | cat - $(filter %.md, $^) >$@ && echo -e "\n\n\nLicense\n=======\n" | cat - LICENSE >>$@
629
+
630
+ docs/intro.md: docs/_preface.md docs/__characteristics.md docs/__improvements.md docs/_restrictions.md docs/__performance.md
631
+ @echo ' MAKE $@'
632
+ $(QUIET)cat $^ | $(SED) 's/^Performance comparison$$/Performance comparison {#performance}/;s/^Improvements beyond LMDB$$/Improvements beyond LMDB {#improvements}/' >$@
633
+
634
+ docs/usage.md: docs/__usage.md docs/_starting.md docs/__bindings.md
635
+ @echo ' MAKE $@'
636
+ $(QUIET)echo -e "\\page usage Usage\n\\section getting Building & Embedding" | cat - $^ | $(SED) 's/^Bindings$$/Bindings {#bindings}/' >$@
637
+
638
+ doxygen: docs/Doxyfile docs/overall.md docs/intro.md docs/usage.md mdbx.h mdbx.h++ src/options.h ChangeLog.md COPYRIGHT LICENSE NOTICE $(lastword $(MAKEFILE_LIST))
639
+ @echo ' RUNNING doxygen...'
640
+ $(QUIET)rm -rf docs/html && \
641
+ cat mdbx.h | tr '\n' '\r' | $(SED) -e 's/LIBMDBX_INLINE_API\s*(\s*\([^,]\+\),\s*\([^,]\+\),\s*(\s*\([^)]\+\)\s*)\s*)\s*{/inline \1 \2(\3) {/g' | tr '\r' '\n' >docs/mdbx.h && \
642
+ cp mdbx.h++ src/options.h ChangeLog.md docs/ && (cd docs && doxygen Doxyfile $(HUSH)) && cp COPYRIGHT LICENSE NOTICE docs/html/
643
+
644
+ mdbx++-dylib.o: src/config.h src/mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST))
645
+ @echo ' CC $@'
646
+ $(QUIET)$(CXX) $(CXXFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -DLIBMDBX_EXPORTS=1 -c src/mdbx.c++ -o $@
647
+
648
+ mdbx++-static.o: src/config.h src/mdbx.c++ mdbx.h mdbx.h++ $(lastword $(MAKEFILE_LIST))
649
+ @echo ' CC $@'
650
+ $(QUIET)$(CXX) $(CXXFLAGS) $(MDBX_BUILD_OPTIONS) '-DMDBX_CONFIG_H="config.h"' -ULIBMDBX_EXPORTS -c src/mdbx.c++ -o $@
651
+
652
+ dist: tags $(WAIT) @dist-checked.tag libmdbx-sources-$(MDBX_VERSION_IDENT).tar.gz $(lastword $(MAKEFILE_LIST))
653
+ @echo ' AMALGAMATION is done'
654
+
655
+ tags:
656
+ @echo ' FETCH git tags...'
657
+ $(QUIET)git fetch --tags --force
658
+
659
+ release-assets: libmdbx-amalgamated-$(MDBX_GIT_3DOT).zpaq \
660
+ libmdbx-amalgamated-$(MDBX_GIT_3DOT).tar.xz \
661
+ libmdbx-amalgamated-$(MDBX_GIT_3DOT).tar.bz2 \
662
+ libmdbx-amalgamated-$(MDBX_GIT_3DOT).tar.gz \
663
+ libmdbx-amalgamated-$(subst .,_,$(MDBX_GIT_3DOT)).zip
664
+ $(QUIET)([ \
665
+ "$$(set -o pipefail; git describe | $(SED) -n '/^v[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}$$/p' || echo fail-left)" \
666
+ == \
667
+ "$$(git describe --tags --dirty=-dirty || echo fail-right)" ] \
668
+ || (echo 'ERROR: Is not a valid release because not in the clean state with a suitable annotated tag!!!' >&2 && false)) \
669
+ && echo ' RELEASE ASSETS are done'
670
+
671
+ @dist-checked.tag: $(addprefix $(DIST_DIR)/, $(DIST_SRC) $(DIST_EXTRA))
672
+ @echo -n ' VERIFY amalgamated sources...'
673
+ $(QUIET)rm -rf $@ $(DIST_DIR)/@tmp-essentials.inc $(DIST_DIR)/@tmp-internals.inc \
674
+ && if grep -R "define xMDBX_ALLOY" dist | grep -q MDBX_BUILD_SOURCERY; then echo "sed output is WRONG!" >&2; exit 2; fi \
675
+ && rm -rf @dist-check && cp -r -p $(DIST_DIR) @dist-check && ($(MAKE) -j IOARENA=false CXXSTD=$(CXXSTD) -C @dist-check all ninja-assertions >@dist-check.log 2>@dist-check.err || (cat @dist-check.err && exit 1)) \
676
+ && touch $@ || (echo " FAILED! See @dist-check.log and @dist-check.err" >&2; exit 2) && echo " Ok"
677
+
678
+ %.tar.gz: @dist-checked.tag
679
+ @echo ' CREATE $@'
680
+ $(QUIET)$(TAR) -c $(shell LC_ALL=C $(TAR) --help | grep -q -- '--owner' && echo '--owner=0 --group=0') -f - -C dist $(DIST_SRC) $(DIST_EXTRA) | gzip -c -9 >$@
681
+
682
+ %.tar.xz: @dist-checked.tag
683
+ @echo ' CREATE $@'
684
+ $(QUIET)$(TAR) -c $(shell LC_ALL=C $(TAR) --help | grep -q -- '--owner' && echo '--owner=0 --group=0') -f - -C dist $(DIST_SRC) $(DIST_EXTRA) | xz -9 -z >$@
685
+
686
+ %.tar.bz2: @dist-checked.tag
687
+ @echo ' CREATE $@'
688
+ $(QUIET)$(TAR) -c $(shell LC_ALL=C $(TAR) --help | grep -q -- '--owner' && echo '--owner=0 --group=0') -f - -C dist $(DIST_SRC) $(DIST_EXTRA) | bzip2 -9 -z >$@
689
+
690
+ %.zip: @dist-checked.tag
691
+ @echo ' CREATE $@'
692
+ $(QUIET)rm -rf $@ && (cd dist && $(ZIP) -9 ../$@ $(DIST_SRC) $(DIST_EXTRA)) &>@zip.log
693
+
694
+ %.zpaq: @dist-checked.tag
695
+ @echo ' CREATE $@'
696
+ $(QUIET)rm -rf $@ && (cd dist && zpaq a ../$@ $(DIST_SRC) $(DIST_EXTRA) -m59) &>@zpaq.log
697
+
698
+ $(DIST_DIR)/@tmp-essentials.inc: src/version.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST))
699
+ @echo ' ALLOYING...'
700
+ $(QUIET)mkdir -p dist \
701
+ && (grep -v '#include ' src/alloy.c && echo '#define MDBX_BUILD_SOURCERY $(MDBX_BUILD_SOURCERY)' \
702
+ && $(SED) \
703
+ -e 's|#include "../mdbx.h"|@INCLUDE "mdbx.h"|' \
704
+ -e '/#include "preface.h"/r src/preface.h' \
705
+ -e '/#include "osal.h"/r src/osal.h' \
706
+ -e '/#include "options.h"/r src/options.h' \
707
+ -e '/#include "atomics-types.h"/r src/atomics-types.h' \
708
+ -e '/#include "layout-dxb.h"/r src/layout-dxb.h' \
709
+ -e '/#include "layout-lck.h"/r src/layout-lck.h' \
710
+ -e '/#include "logging_and_debug.h"/r src/logging_and_debug.h' \
711
+ -e '/#include "utils.h"/r src/utils.h' \
712
+ -e '/#include "pnl.h"/r src/pnl.h' \
713
+ src/essentials.h \
714
+ | $(SED) \
715
+ -e '/#pragma once/d' -e '/#include "/d' \
716
+ -e '/ clang-format o/d' -e '/ \*INDENT-O/d' \
717
+ | grep -v '^/// ') >$@
718
+
719
+ $(DIST_DIR)/@tmp-internals.inc: $(DIST_DIR)/@tmp-essentials.inc src/version.c $(ALLOY_DEPS) $(lastword $(MAKEFILE_LIST))
720
+ $(QUIET)(cat $(DIST_DIR)/@tmp-essentials.inc \
721
+ && $(SED) \
722
+ -e '/#include "essentials.h"/d' \
723
+ -e '/#include "atomics-ops.h"/r src/atomics-ops.h' \
724
+ -e '/#include "proto.h"/r src/proto.h' \
725
+ -e '/#include "txl.h"/r src/txl.h' \
726
+ -e '/#include "unaligned.h"/r src/unaligned.h' \
727
+ -e '/#include "cogs.h"/r src/cogs.h' \
728
+ -e '/#include "cursor.h"/r src/cursor.h' \
729
+ -e '/#include "dbi.h"/r src/dbi.h' \
730
+ -e '/#include "dpl.h"/r src/dpl.h' \
731
+ -e '/#include "gc.h"/r src/gc.h' \
732
+ -e '/#include "lck.h"/r src/lck.h' \
733
+ -e '/#include "meta.h"/r src/meta.h' \
734
+ -e '/#include "node.h"/r src/node.h' \
735
+ -e '/#include "page-iov.h"/r src/page-iov.h' \
736
+ -e '/#include "page-ops.h"/r src/page-ops.h' \
737
+ -e '/#include "spill.h"/r src/spill.h' \
738
+ -e '/#include "sort.h"/r src/sort.h' \
739
+ -e '/#include "tls.h"/r src/tls.h' \
740
+ -e '/#include "walk.h"/r src/walk.h' \
741
+ -e '/#include "windows-import.h"/r src/windows-import.h' \
742
+ src/internals.h \
743
+ | $(SED) \
744
+ -e '/#pragma once/d' -e '/#include "/d' \
745
+ -e '/ clang-format o/d' -e '/ \*INDENT-O/d' \
746
+ | grep -v '^/// ') >$@
747
+
748
+ $(DIST_DIR)/mdbx.c: $(DIST_DIR)/@tmp-internals.inc $(lastword $(MAKEFILE_LIST))
749
+ @echo ' MAKE $@'
750
+ $(QUIET)(cat $(DIST_DIR)/@tmp-internals.inc $(shell git ls-files src/*.c | grep -v alloy) src/version.c | $(SED) \
751
+ -e '/#include "debug_begin.h"/r src/debug_begin.h' \
752
+ -e '/#include "debug_end.h"/r src/debug_end.h' \
753
+ ) | $(SED) -e '/#include "/d;/#pragma once/d' -e 's|@INCLUDE|#include|' \
754
+ -e '/ clang-format o/d;/ \*INDENT-O/d' -e '3i /* clang-format off */' | cat -s >$@
755
+
756
+ $(DIST_DIR)/mdbx.c++: $(DIST_DIR)/@tmp-essentials.inc src/mdbx.c++ $(lastword $(MAKEFILE_LIST))
757
+ @echo ' MAKE $@'
758
+ $(QUIET)cat $(DIST_DIR)/@tmp-essentials.inc src/mdbx.c++ | $(SED) \
759
+ -e '/#define xMDBX_ALLOY/d' \
760
+ -e '/#include "/d;/#pragma once/d' \
761
+ -e 's|@INCLUDE|#include|;s|"mdbx.h"|"mdbx.h++"|' \
762
+ -e '/ clang-format o/d;/ \*INDENT-O/d' -e '3i /* clang-format off */' | cat -s >$@
763
+
764
+ define dist-tool-rule
765
+ $(DIST_DIR)/mdbx_$(1).c: src/tools/$(1).c src/tools/wingetopt.h src/tools/wingetopt.c \
766
+ $(DIST_DIR)/@tmp-internals.inc $(lastword $(MAKEFILE_LIST))
767
+ @echo ' MAKE $$@'
768
+ $(QUIET)mkdir -p dist && $(SED) \
769
+ -e '/#include "essentials.h"/r $(DIST_DIR)/@tmp-essentials.inc' \
770
+ -e '/#include "wingetopt.h"/r src/tools/wingetopt.c' \
771
+ -e '/ clang-format o/d' -e '/ \*INDENT-O/d' \
772
+ src/tools/$(1).c \
773
+ | $(SED) -e '/#include "/d;/#pragma once/d;/#define xMDBX_ALLOY/d' -e 's|@INCLUDE|#include|' \
774
+ -e '/ clang-format o/d;/ \*INDENT-O/d' -e '9i /* clang-format off */' | cat -s >$$@
775
+
776
+ endef
777
+ $(foreach file,$(TOOLS),$(eval $(call dist-tool-rule,$(file))))
778
+
779
+ define dist-extra-rule
780
+ $(DIST_DIR)/$(1): $(1) src/version.c $(lastword $(MAKEFILE_LIST))
781
+ @echo ' REFINE $$@'
782
+ $(QUIET)mkdir -p $$(dir $$@) && $(SED) -e '/^#> dist-cutoff-begin/,/^#< dist-cutoff-end/d' $$< | cat -s >$$@
783
+
784
+ endef
785
+ $(foreach file,mdbx.h mdbx.h++ $(filter-out man1/% VERSION.json .clang-format-ignore %.in ntdll.def,$(DIST_EXTRA)),$(eval $(call dist-extra-rule,$(file))))
786
+
787
+ $(DIST_DIR)/VERSION.json: src/version.c
788
+ @echo ' MAKE $@'
789
+ $(QUIET)mkdir -p $(DIST_DIR)/ && echo "{ \"git_describe\": \"$(MDBX_GIT_DESCRIBE)\", \"git_timestamp\": \"$(MDBX_GIT_TIMESTAMP)\", \"git_tree\": \"$(shell git show --no-patch --format=%T HEAD 2>&1)\", \"git_commit\": \"$(shell git show --no-patch --format=%H HEAD 2>&1)\", \"semver\": \"$(MDBX_VERSION_PURE)\" }" >$@
790
+
791
+ $(DIST_DIR)/.clang-format-ignore: $(lastword $(MAKEFILE_LIST))
792
+ @echo ' MAKE $@'
793
+ $(QUIET)echo "$(filter-out %.h %h++,$(DIST_SRC))" | tr ' ' \\n > $@
794
+
795
+ $(DIST_DIR)/ntdll.def: src/ntdll.def
796
+ @echo ' COPY $@'
797
+ $(QUIET)mkdir -p $(DIST_DIR)/ && cp $< $@
798
+
799
+ $(DIST_DIR)/config.h.in: src/config.h.in
800
+ @echo ' COPY $@'
801
+ $(QUIET)mkdir -p $(DIST_DIR)/ && cp $< $@
802
+
803
+ $(DIST_DIR)/man1/mdbx_%.1: src/man1/mdbx_%.1
804
+ @echo ' COPY $@'
805
+ $(QUIET)mkdir -p $(DIST_DIR)/man1/ && cp $< $@
806
+
807
+ endif
808
+
809
+ ################################################################################
810
+ # Cross-compilation simple test
811
+
812
+ CROSS_LIST = \
813
+ aarch64-linux-gnu-gcc \
814
+ arm-linux-gnueabihf-gcc \
815
+ hppa-linux-gnu-gcc \
816
+ mips64-linux-gnuabi64-gcc \
817
+ mips-linux-gnu-gcc \
818
+ powerpc64-linux-gnu-gcc\
819
+ riscv64-linux-gnu-gcc \
820
+ s390x-linux-gnu-gcc \
821
+ sh4-linux-gnu-gcc
822
+
823
+ ## On Ubuntu Noble (24.04.2) with QEMU 8.2 (8.2.2+ds-0ubuntu1.7) & GCC 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)
824
+ # sparc64-linux-gnu-gcc - fails mmap/BAD_ADDRESS (previously: qemu-coredump sice mmap-troubles, qemu fails fcntl for F_SETLK/F_GETLK)
825
+ # alpha-linux-gnu-gcc - qemu-coredump (qemu mmap-troubles)
826
+ # powerpc-linux-gnu-gcc - fails mmap/BAD_ADDRESS (previously: qemu-coredump sice mmap-troubles, qemu fails fcntl for F_SETLK/F_GETLK)
827
+ CROSS_LIST_NOQEMU = sparc64-linux-gnu-gcc alpha-linux-gnu-gcc powerpc-linux-gnu-gcc
828
+
829
+ cross-gcc:
830
+ @echo ' Re-building by cross-compiler for: $(CROSS_LIST_NOQEMU) $(CROSS_LIST)'
831
+ @echo "CORRESPONDING CROSS-COMPILERs ARE REQUIRED."
832
+ @echo "FOR INSTANCE: sudo apt install \$$(apt list 'g++-*' | grep 'g++-[a-z0-9]\+-linux-gnu/' | cut -f 1 -d / | sort -u)"
833
+ $(QUIET)for CC in $(CROSS_LIST_NOQEMU) $(CROSS_LIST); do \
834
+ echo "===================== $$CC"; \
835
+ $(MAKE) IOARENA=false CXXSTD= clean && CC=$$CC CXX=$$(echo $$CC | $(SED) 's/-gcc/-g++/') EXE_LDFLAGS=-static $(MAKE) IOARENA=false all || exit $$?; \
836
+ done
837
+
838
+ # Unfortunately qemu don't provide robust support for futexes.
839
+ # Therefore it is impossible to run full multi-process tests.
840
+ cross-qemu:
841
+ @echo ' Re-building by cross-compiler and re-check by QEMU for: $(CROSS_LIST)'
842
+ @echo "CORRESPONDING CROSS-COMPILERs AND QEMUs ARE REQUIRED."
843
+ @echo "FOR INSTANCE: "
844
+ @echo " 1) sudo apt install \$$(apt list 'g++-*' | grep 'g++-[a-z0-9]\+-linux-gnu/' | cut -f 1 -d / | sort -u)"
845
+ @echo " 2) sudo apt install binfmt-support qemu-user-static qemu-user \$$(apt list 'qemu-system-*' | grep 'qemu-system-[a-z0-9]\+/' | cut -f 1 -d / | sort -u)"
846
+ $(QUIET)for CC in $(CROSS_LIST); do \
847
+ echo "===================== $$CC + qemu"; \
848
+ $(MAKE) IOARENA=false CXXSTD= clean && \
849
+ CC=$$CC CXX=$$(echo $$CC | $(SED) 's/-gcc/-g++/') EXE_LDFLAGS=-static MDBX_BUILD_OPTIONS="-DMDBX_LOCKING=5 -DMDBX_SAFE4QEMU $(MDBX_BUILD_OPTIONS)" \
850
+ $(MAKE) IOARENA=false smoke-singleprocess test-singleprocess || exit $$?; \
851
+ done
852
+
853
+ #< dist-cutoff-end
854
+
855
+ install: $(LIBRARIES) $(MDBX_TOOLS) $(HEADERS)
856
+ @echo ' INSTALLING...'
857
+ $(QUIET)mkdir -p $(DESTDIR)$(prefix)/bin$(suffix) && \
858
+ $(INSTALL) -p $(EXE_INSTALL_FLAGS) $(MDBX_TOOLS) $(DESTDIR)$(prefix)/bin$(suffix)/ && \
859
+ mkdir -p $(DESTDIR)$(prefix)/lib$(suffix)/ && \
860
+ $(INSTALL) -p $(EXE_INSTALL_FLAGS) $(filter-out libmdbx.a,$(LIBRARIES)) $(DESTDIR)$(prefix)/lib$(suffix)/ && \
861
+ mkdir -p $(DESTDIR)$(prefix)/lib$(suffix)/ && \
862
+ $(INSTALL) -p libmdbx.a $(DESTDIR)$(prefix)/lib$(suffix)/ && \
863
+ mkdir -p $(DESTDIR)$(prefix)/include/ && \
864
+ $(INSTALL) -p -m 444 $(HEADERS) $(DESTDIR)$(prefix)/include/ && \
865
+ mkdir -p $(DESTDIR)$(mandir)/man1/ && \
866
+ $(INSTALL) -p -m 444 $(addprefix $(MAN_SRCDIR), $(MANPAGES)) $(DESTDIR)$(mandir)/man1/
867
+
868
+ install-strip: EXE_INSTALL_FLAGS = -s
869
+ install-strip: install
870
+
871
+ install-no-strip: EXE_INSTALL_FLAGS =
872
+ install-no-strip: install
873
+
874
+ uninstall:
875
+ @echo ' UNINSTALLING/REMOVE...'
876
+ $(QUIET)rm -f $(addprefix $(DESTDIR)$(prefix)/bin$(suffix)/,$(MDBX_TOOLS)) \
877
+ $(addprefix $(DESTDIR)$(prefix)/lib$(suffix)/,$(LIBRARIES)) \
878
+ $(addprefix $(DESTDIR)$(prefix)/include/,$(HEADERS)) \
879
+ $(addprefix $(DESTDIR)$(mandir)/man1/,$(MANPAGES))
880
+
881
+ ################################################################################
882
+ # Benchmarking by ioarena
883
+
884
+ ifeq ($(origin IOARENA),undefined)
885
+ IOARENA := $(shell \
886
+ (test -x ../ioarena/@BUILD/src/ioarena && echo ../ioarena/@BUILD/src/ioarena) || \
887
+ (test -x ../../@BUILD/src/ioarena && echo ../../@BUILD/src/ioarena) || \
888
+ (test -x ../../src/ioarena && echo ../../src/ioarena) || which ioarena 2>&- || \
889
+ (echo false && echo '$(TIP) Clone and build the https://abf.io/erthink/ioarena.git within a neighbouring directory for availability of benchmarking.' >&2))
890
+ endif
891
+ NN ?= 25000000
892
+ BENCH_CRUD_MODE ?= nosync
893
+
894
+ bench-clean:
895
+ @echo ' REMOVE bench-*.txt _ioarena/*'
896
+ $(QUIET)rm -rf bench-*.txt _ioarena/*
897
+
898
+ re-bench: bench-clean bench
899
+
900
+ ifeq ($(or $(IOARENA),false),false)
901
+ bench bench-quartet bench-triplet bench-couple:
902
+ $(QUIET)echo 'The `ioarena` benchmark is required.' >&2 && \
903
+ echo 'Please clone and build the https://abf.io/erthink/ioarena.git within a neighbouring `ioarena` directory.' >&2 && \
904
+ false
905
+
906
+ else
907
+
908
+ .PHONY: bench bench-clean bench-couple re-bench bench-quartet bench-triplet
909
+
910
+ define bench-rule
911
+ bench-$(1)_$(2).txt: $(3) $(IOARENA) $(lastword $(MAKEFILE_LIST))
912
+ @echo ' RUNNING ioarena for $1/$2...'
913
+ $(QUIET)(export LD_LIBRARY_PATH="./:$$$${LD_LIBRARY_PATH}"; \
914
+ ldd $(IOARENA) | grep -i $(1) && \
915
+ $(IOARENA) -D $(1) -B batch -m $(BENCH_CRUD_MODE) -n $(2) \
916
+ | tee $$@ | grep throughput | $(SED) 's/throughput/batch×N/' && \
917
+ $(IOARENA) -D $(1) -B crud -m $(BENCH_CRUD_MODE) -n $(2) \
918
+ | tee -a $$@ | grep throughput | $(SED) 's/throughput/ crud/' && \
919
+ $(IOARENA) -D $(1) -B iterate,get,iterate,get,iterate -m $(BENCH_CRUD_MODE) -r 4 -n $(2) \
920
+ | tee -a $$@ | grep throughput | $(SED) '0,/throughput/{s/throughput/iterate/};s/throughput/ get/' && \
921
+ $(IOARENA) -D $(1) -B delete -m $(BENCH_CRUD_MODE) -n $(2) \
922
+ | tee -a $$@ | grep throughput | $(SED) 's/throughput/ delete/' && \
923
+ true) || mv -f $$@ $$@.error
924
+
925
+ endef
926
+
927
+
928
+ $(eval $(call bench-rule,mdbx,$(NN),libmdbx.$(SO_SUFFIX)))
929
+
930
+ $(eval $(call bench-rule,sophia,$(NN)))
931
+ $(eval $(call bench-rule,leveldb,$(NN)))
932
+ $(eval $(call bench-rule,rocksdb,$(NN)))
933
+ $(eval $(call bench-rule,wiredtiger,$(NN)))
934
+ $(eval $(call bench-rule,forestdb,$(NN)))
935
+ $(eval $(call bench-rule,lmdb,$(NN)))
936
+ $(eval $(call bench-rule,nessdb,$(NN)))
937
+ $(eval $(call bench-rule,sqlite3,$(NN)))
938
+ $(eval $(call bench-rule,ejdb,$(NN)))
939
+ $(eval $(call bench-rule,vedisdb,$(NN)))
940
+ $(eval $(call bench-rule,dummy,$(NN)))
941
+ bench: bench-mdbx_$(NN).txt
942
+ bench-quartet: bench-mdbx_$(NN).txt bench-lmdb_$(NN).txt bench-rocksdb_$(NN).txt bench-wiredtiger_$(NN).txt
943
+ bench-triplet: bench-mdbx_$(NN).txt bench-lmdb_$(NN).txt bench-sqlite3_$(NN).txt
944
+ bench-couple: bench-mdbx_$(NN).txt bench-lmdb_$(NN).txt
945
+
946
+ # $(eval $(call bench-rule,debug,10))
947
+ # .PHONY: bench-debug
948
+ # bench-debug: bench-debug_10.txt
949
+
950
+ endif