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,58 @@
1
+ # Copyright (c) 2012-2025 Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> ###############################################
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ if(CMAKE_VERSION VERSION_LESS 3.8.2)
5
+ cmake_minimum_required(VERSION 3.0.2)
6
+ elseif(CMAKE_VERSION VERSION_LESS 3.12)
7
+ cmake_minimum_required(VERSION 3.8.2)
8
+ else()
9
+ cmake_minimum_required(VERSION 3.12)
10
+ endif()
11
+
12
+ cmake_policy(PUSH)
13
+ cmake_policy(VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION})
14
+
15
+ unset(MEMCHECK_OPTION_NAME)
16
+ if(NOT DEFINED ENABLE_MEMCHECK)
17
+ if(DEFINED MDBX_USE_VALGRIND)
18
+ set(MEMCHECK_OPTION_NAME "MDBX_USE_VALGRIND")
19
+ elseif(DEFINED ENABLE_VALGRIND)
20
+ set(MEMCHECK_OPTION_NAME "ENABLE_VALGRIND")
21
+ else()
22
+ set(MEMCHECK_OPTION_NAME "ENABLE_MEMCHECK")
23
+ endif()
24
+ if(MEMCHECK_OPTION_NAME STREQUAL "ENABLE_MEMCHECK")
25
+ option(ENABLE_MEMCHECK "Enable integration with valgrind, a memory analyzing tool" OFF)
26
+ elseif(${MEMCHECK_OPTION_NAME})
27
+ set(ENABLE_MEMCHECK ON)
28
+ else()
29
+ set(ENABLE_MEMCHECK OFF)
30
+ endif()
31
+ endif()
32
+
33
+ include(CheckLibraryExists)
34
+ check_library_exists(gcov __gcov_flush "" HAVE_GCOV)
35
+
36
+ option(ENABLE_GCOV "Enable integration with gcov, a code coverage program" OFF)
37
+
38
+ option(ENABLE_GPROF "Enable integration with gprof, a performance analyzing tool" OFF)
39
+
40
+ option(ENABLE_ASAN "Enable AddressSanitizer, a fast memory error detector based on compiler instrumentation" OFF)
41
+
42
+ option(ENABLE_UBSAN
43
+ "Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector based on compiler instrumentation" OFF)
44
+
45
+ if(ENABLE_MEMCHECK)
46
+ if(CMAKE_CXX_COMPILER_LOADED)
47
+ include(CheckIncludeFileCXX)
48
+ check_include_file_cxx(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
49
+ else()
50
+ include(CheckIncludeFile)
51
+ check_include_file(valgrind/memcheck.h HAVE_VALGRIND_MEMCHECK_H)
52
+ endif()
53
+ if(NOT HAVE_VALGRIND_MEMCHECK_H)
54
+ message(FATAL_ERROR "${MEMCHECK_OPTION_NAME} option is set but valgrind/memcheck.h is not found")
55
+ endif()
56
+ endif()
57
+
58
+ cmake_policy(POP)
@@ -0,0 +1,524 @@
1
+ # Copyright (c) 2012-2025 Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> ###############################################
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ if(CMAKE_VERSION VERSION_LESS 3.8.2)
5
+ cmake_minimum_required(VERSION 3.0.2)
6
+ elseif(CMAKE_VERSION VERSION_LESS 3.12)
7
+ cmake_minimum_required(VERSION 3.8.2)
8
+ else()
9
+ cmake_minimum_required(VERSION 3.12)
10
+ endif()
11
+
12
+ cmake_policy(PUSH)
13
+ cmake_policy(VERSION ${CMAKE_MINIMUM_REQUIRED_VERSION})
14
+
15
+ macro(add_option HIVE NAME DESCRIPTION DEFAULT)
16
+ list(APPEND ${HIVE}_BUILD_OPTIONS ${HIVE}_${NAME})
17
+ if(NOT ${DEFAULT} STREQUAL "AUTO")
18
+ option(${HIVE}_${NAME} "${DESCRIPTION}" ${DEFAULT})
19
+ elseif(NOT DEFINED ${HIVE}_${NAME})
20
+ set(${HIVE}_${NAME}_AUTO ON)
21
+ endif()
22
+ endmacro()
23
+
24
+ macro(set_if_undefined VARNAME)
25
+ if(NOT DEFINED "${VARNAME}")
26
+ set("${VARNAME}" ${ARGN})
27
+ endif()
28
+ endmacro()
29
+
30
+ macro(add_compile_flags languages)
31
+ foreach(_lang ${languages})
32
+ string(REPLACE ";" " " _flags "${ARGN}")
33
+ if(CMAKE_CXX_COMPILER_LOADED AND _lang STREQUAL "CXX")
34
+ set("${_lang}_FLAGS" "${${_lang}_FLAGS} ${_flags}")
35
+ endif()
36
+ if(CMAKE_C_COMPILER_LOADED AND _lang STREQUAL "C")
37
+ set("${_lang}_FLAGS" "${${_lang}_FLAGS} ${_flags}")
38
+ endif()
39
+ endforeach()
40
+ unset(_lang)
41
+ unset(_flags)
42
+ endmacro(add_compile_flags)
43
+
44
+ macro(remove_flag varname flag)
45
+ string(REGEX REPLACE "^(.*)( ${flag} )(.*)$" "\\1 \\3" ${varname} ${${varname}})
46
+ string(REGEX REPLACE "^((.+ )*)(${flag})(( .+)*)$" "\\1\\4" ${varname} ${${varname}})
47
+ endmacro(remove_flag)
48
+
49
+ macro(remove_compile_flag languages flag)
50
+ foreach(_lang ${languages})
51
+ if(CMAKE_CXX_COMPILER_LOADED AND _lang STREQUAL "CXX")
52
+ remove_flag(${_lang}_FLAGS ${flag})
53
+ endif()
54
+ if(CMAKE_C_COMPILER_LOADED AND _lang STREQUAL "C")
55
+ remove_flag(${_lang}_FLAGS ${flag})
56
+ endif()
57
+ endforeach()
58
+ unset(_lang)
59
+ endmacro(remove_compile_flag)
60
+
61
+ macro(set_source_files_compile_flags)
62
+ foreach(file ${ARGN})
63
+ get_filename_component(_file_ext ${file} EXT)
64
+ set(_lang "")
65
+ if("${_file_ext}" STREQUAL ".m")
66
+ set(_lang OBJC)
67
+ # CMake believes that Objective C is a flavor of C++, not C, and uses g++ compiler for .m files. LANGUAGE property
68
+ # forces CMake to use CC for ${file}
69
+ set_source_files_properties(${file} PROPERTIES LANGUAGE C)
70
+ elseif("${_file_ext}" STREQUAL ".mm")
71
+ set(_lang OBJCXX)
72
+ endif()
73
+
74
+ if(_lang)
75
+ get_source_file_property(_flags ${file} COMPILE_FLAGS)
76
+ if("${_flags}" STREQUAL "NOTFOUND")
77
+ set(_flags "${CMAKE_${_lang}_FLAGS}")
78
+ else()
79
+ set(_flags "${_flags} ${CMAKE_${_lang}_FLAGS}")
80
+ endif()
81
+ # message(STATUS "Set (${file} ${_flags}")
82
+ set_source_files_properties(${file} PROPERTIES COMPILE_FLAGS "${_flags}")
83
+ endif()
84
+ endforeach()
85
+ unset(_file_ext)
86
+ unset(_lang)
87
+ endmacro(set_source_files_compile_flags)
88
+
89
+ macro(semver_parse str)
90
+ set(_semver_ok FALSE)
91
+ set(_semver_err "")
92
+ set(_semver_major 0)
93
+ set(_semver_minor 0)
94
+ set(_semver_patch 0)
95
+ set(_semver_tweak_withdot "")
96
+ set(_semver_tweak "")
97
+ set(_semver_extra "")
98
+ set(_semver_prerelease_withdash "")
99
+ set(_semver_prerelease "")
100
+ set(_semver_buildmetadata_withplus "")
101
+ set(_semver_buildmetadata "")
102
+ if("${str}" MATCHES
103
+ "^v?(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*))?([-+]-*[0-9a-zA-Z]+.*)?$")
104
+ set(_semver_major ${CMAKE_MATCH_1})
105
+ set(_semver_minor ${CMAKE_MATCH_2})
106
+ set(_semver_patch ${CMAKE_MATCH_3})
107
+ set(_semver_tweak_withdot ${CMAKE_MATCH_4})
108
+ set(_semver_tweak ${CMAKE_MATCH_5})
109
+ set(_semver_extra "${CMAKE_MATCH_6}")
110
+ if("${_semver_extra}" STREQUAL "")
111
+ set(_semver_ok TRUE)
112
+ elseif("${_semver_extra}" MATCHES "^([.-][a-zA-Z0-9-]+)*(\\+[^+]+)?$")
113
+ set(_semver_prerelease_withdash "${CMAKE_MATCH_1}")
114
+ if(NOT "${_semver_prerelease_withdash}" STREQUAL "")
115
+ string(SUBSTRING "${_semver_prerelease_withdash}" 1 -1 _semver_prerelease)
116
+ endif()
117
+ set(_semver_buildmetadata_withplus "${CMAKE_MATCH_2}")
118
+ if(NOT "${_semver_buildmetadata_withplus}" STREQUAL "")
119
+ string(SUBSTRING "${_semver_buildmetadata_withplus}" 1 -1 _semver_buildmetadata)
120
+ endif()
121
+ set(_semver_ok TRUE)
122
+ else()
123
+ set(_semver_err
124
+ "Поля prerelease и/или buildmetadata (строка `-foo+bar` в составе `0.0.0[.0][-foo][+bar]`) не соответствуют SemVer-спецификации"
125
+ )
126
+ endif()
127
+ else()
128
+ set(_semver_err "Версионная отметка в целом не соответствует шаблону `0.0.0[.0][-foo][+bar]` SemVer-спецификации")
129
+ endif()
130
+ endmacro(semver_parse)
131
+
132
+ function(_semver_parse_probe str expect)
133
+ semver_parse(${str})
134
+ if(expect AND NOT _semver_ok)
135
+ message(FATAL_ERROR "semver_parse(${str}) expect SUCCESS, got ${_semver_ok}: ${_semver_err}")
136
+ elseif(NOT expect AND _semver_ok)
137
+ message(FATAL_ERROR "semver_parse(${str}) expect FAIL, got ${_semver_ok}")
138
+ endif()
139
+ endfunction()
140
+
141
+ function(semver_parse_selfcheck)
142
+ _semver_parse_probe("0.0.4" TRUE)
143
+ _semver_parse_probe("v1.2.3" TRUE)
144
+ _semver_parse_probe("10.20.30" TRUE)
145
+ _semver_parse_probe("10.20.30.42" TRUE)
146
+ _semver_parse_probe("1.1.2-prerelease+meta" TRUE)
147
+ _semver_parse_probe("1.1.2+meta" TRUE)
148
+ _semver_parse_probe("1.1.2+meta-valid" TRUE)
149
+ _semver_parse_probe("1.0.0-alpha" TRUE)
150
+ _semver_parse_probe("1.0.0-beta" TRUE)
151
+ _semver_parse_probe("1.0.0-alpha.beta" TRUE)
152
+ _semver_parse_probe("1.0.0-alpha.beta.1" TRUE)
153
+ _semver_parse_probe("1.0.0-alpha.1" TRUE)
154
+ _semver_parse_probe("1.0.0-alpha0.valid" TRUE)
155
+ _semver_parse_probe("1.0.0-alpha.0valid" TRUE)
156
+ _semver_parse_probe("1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay" TRUE)
157
+ _semver_parse_probe("1.0.0-rc.1+build.1" TRUE)
158
+ _semver_parse_probe("2.0.0-rc.1+build.123" TRUE)
159
+ _semver_parse_probe("1.2.3-beta" TRUE)
160
+ _semver_parse_probe("10.2.3-DEV-SNAPSHOT" TRUE)
161
+ _semver_parse_probe("1.2.3-SNAPSHOT-123" TRUE)
162
+ _semver_parse_probe("1.0.0" TRUE)
163
+ _semver_parse_probe("2.0.0" TRUE)
164
+ _semver_parse_probe("1.1.7" TRUE)
165
+ _semver_parse_probe("2.0.0+build.1848" TRUE)
166
+ _semver_parse_probe("2.0.1-alpha.1227" TRUE)
167
+ _semver_parse_probe("1.0.0-alpha+beta" TRUE)
168
+ _semver_parse_probe("1.2.3----RC-SNAPSHOT.12.9.1--.12+788" TRUE)
169
+ _semver_parse_probe("1.2.3----R-S.12.9.1--.12+meta" TRUE)
170
+ _semver_parse_probe("1.2.3----RC-SNAPSHOT.12.9.1--.12" TRUE)
171
+ _semver_parse_probe("1.0.0+0.build.1-rc.10000aaa-kk-0.1" TRUE)
172
+ _semver_parse_probe("99999999999999999999999.999999999999999999.99999999999999999" TRUE)
173
+ _semver_parse_probe("v1.0.0-0A.is.legal" TRUE)
174
+
175
+ _semver_parse_probe("1" FALSE)
176
+ _semver_parse_probe("1.2" FALSE)
177
+ # _semver_parse_probe("1.2.3-0123" FALSE) _semver_parse_probe("1.2.3-0123.0123" FALSE)
178
+ _semver_parse_probe("1.1.2+.123" FALSE)
179
+ _semver_parse_probe("+invalid" FALSE)
180
+ _semver_parse_probe("-invalid" FALSE)
181
+ _semver_parse_probe("-invalid+invalid" FALSE)
182
+ _semver_parse_probe("-invalid.01" FALSE)
183
+ _semver_parse_probe("alpha" FALSE)
184
+ _semver_parse_probe("alpha.beta" FALSE)
185
+ _semver_parse_probe("alpha.beta.1" FALSE)
186
+ _semver_parse_probe("alpha.1" FALSE)
187
+ _semver_parse_probe("alpha+beta" FALSE)
188
+ _semver_parse_probe("alpha_beta" FALSE)
189
+ _semver_parse_probe("alpha." FALSE)
190
+ _semver_parse_probe("alpha.." FALSE)
191
+ _semver_parse_probe("beta" FALSE)
192
+ _semver_parse_probe("1.0.0-alpha_beta" FALSE)
193
+ _semver_parse_probe("-alpha." FALSE)
194
+ _semver_parse_probe("1.0.0-alpha.." FALSE)
195
+ _semver_parse_probe("1.0.0-alpha..1" FALSE)
196
+ _semver_parse_probe("1.0.0-alpha...1" FALSE)
197
+ _semver_parse_probe("1.0.0-alpha....1" FALSE)
198
+ _semver_parse_probe("1.0.0-alpha.....1" FALSE)
199
+ _semver_parse_probe("1.0.0-alpha......1" FALSE)
200
+ _semver_parse_probe("1.0.0-alpha.......1" FALSE)
201
+ _semver_parse_probe("01.1.1" FALSE)
202
+ _semver_parse_probe("1.01.1" FALSE)
203
+ _semver_parse_probe("1.1.01" FALSE)
204
+ _semver_parse_probe("1.2" FALSE)
205
+ _semver_parse_probe("1.2.3.DEV" FALSE)
206
+ _semver_parse_probe("1.2-SNAPSHOT" FALSE)
207
+ _semver_parse_probe("1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788" FALSE)
208
+ _semver_parse_probe("1.2-RC-SNAPSHOT" FALSE)
209
+ _semver_parse_probe("-1.0.3-gamma+b7718" FALSE)
210
+ _semver_parse_probe("+justmeta" FALSE)
211
+ _semver_parse_probe("9.8.7+meta+meta" FALSE)
212
+ _semver_parse_probe("9.8.7-whatever+meta+meta" FALSE)
213
+ _semver_parse_probe(
214
+ "99999999999999999999999.999999999999999999.99999999999999999----RC-SNAPSHOT.12.09.1--------------------------------..12"
215
+ FALSE)
216
+ endfunction()
217
+
218
+ macro(git_get_versioninfo source_root_directory)
219
+ set(_git_describe "")
220
+ set(_git_timestamp "")
221
+ set(_git_tree "")
222
+ set(_git_commit "")
223
+ set(_git_last_vtag "")
224
+ set(_git_trailing_commits 0)
225
+ set(_git_is_dirty FALSE)
226
+
227
+ execute_process(
228
+ COMMAND ${GIT} show --no-patch --format=%cI HEAD
229
+ OUTPUT_VARIABLE _git_timestamp
230
+ OUTPUT_STRIP_TRAILING_WHITESPACE
231
+ WORKING_DIRECTORY ${source_root_directory}
232
+ RESULT_VARIABLE _rc)
233
+ if(_rc OR "${_git_timestamp}" STREQUAL "%cI")
234
+ execute_process(
235
+ COMMAND ${GIT} show --no-patch --format=%ci HEAD
236
+ OUTPUT_VARIABLE _git_timestamp
237
+ OUTPUT_STRIP_TRAILING_WHITESPACE
238
+ WORKING_DIRECTORY ${source_root_directory}
239
+ RESULT_VARIABLE _rc)
240
+ if(_rc OR "${_git_timestamp}" STREQUAL "%ci")
241
+ message(FATAL_ERROR "Please install latest version of git (`show --no-patch --format=%cI HEAD` failed)")
242
+ endif()
243
+ endif()
244
+
245
+ execute_process(
246
+ COMMAND ${GIT} show --no-patch --format=%T HEAD
247
+ OUTPUT_VARIABLE _git_tree
248
+ OUTPUT_STRIP_TRAILING_WHITESPACE
249
+ WORKING_DIRECTORY ${source_root_directory}
250
+ RESULT_VARIABLE _rc)
251
+ if(_rc OR "${_git_tree}" STREQUAL "")
252
+ message(FATAL_ERROR "Please install latest version of git (`show --no-patch --format=%T HEAD` failed)")
253
+ endif()
254
+
255
+ execute_process(
256
+ COMMAND ${GIT} show --no-patch --format=%H HEAD
257
+ OUTPUT_VARIABLE _git_commit
258
+ OUTPUT_STRIP_TRAILING_WHITESPACE
259
+ WORKING_DIRECTORY ${source_root_directory}
260
+ RESULT_VARIABLE _rc)
261
+ if(_rc OR "${_git_commit}" STREQUAL "")
262
+ message(FATAL_ERROR "Please install latest version of git (`show --no-patch --format=%H HEAD` failed)")
263
+ endif()
264
+
265
+ execute_process(
266
+ COMMAND ${GIT} status --untracked-files=no --porcelain
267
+ OUTPUT_VARIABLE _git_status
268
+ OUTPUT_STRIP_TRAILING_WHITESPACE
269
+ WORKING_DIRECTORY ${source_root_directory}
270
+ RESULT_VARIABLE _rc)
271
+ if(_rc)
272
+ message(FATAL_ERROR "Please install latest version of git (`status --untracked-files=no --porcelain` failed)")
273
+ endif()
274
+ if(NOT "${_git_status}" STREQUAL "")
275
+ set(_git_commit "DIRTY-${_git_commit}")
276
+ set(_git_is_dirty TRUE)
277
+ endif()
278
+ unset(_git_status)
279
+
280
+ execute_process(
281
+ COMMAND ${GIT} describe --tags --abbrev=0 "--match=v[0-9]*"
282
+ OUTPUT_VARIABLE _git_last_vtag
283
+ OUTPUT_STRIP_TRAILING_WHITESPACE
284
+ WORKING_DIRECTORY ${source_root_directory}
285
+ RESULT_VARIABLE _rc)
286
+ if(_rc OR "${_git_last_vtag}" STREQUAL "")
287
+ execute_process(
288
+ COMMAND ${GIT} tag
289
+ OUTPUT_VARIABLE _git_tags_dump
290
+ OUTPUT_STRIP_TRAILING_WHITESPACE
291
+ WORKING_DIRECTORY ${source_root_directory}
292
+ RESULT_VARIABLE _rc)
293
+ execute_process(
294
+ COMMAND ${GIT} rev-list --count --no-merges --remove-empty HEAD
295
+ OUTPUT_VARIABLE _git_whole_count
296
+ OUTPUT_STRIP_TRAILING_WHITESPACE
297
+ WORKING_DIRECTORY ${source_root_directory}
298
+ RESULT_VARIABLE _rc)
299
+ if(_rc)
300
+ message(
301
+ FATAL_ERROR
302
+ "Please install latest version of git (`git rev-list --count --no-merges --remove-empty HEAD` failed)")
303
+ endif()
304
+ if(_git_whole_count GREATER 42 AND "${_git_tags_dump}" STREQUAL "")
305
+ message(FATAL_ERROR "Please fetch tags (`describe --tags --abbrev=0 --match=v[0-9]*` failed)")
306
+ else()
307
+ message(NOTICE "Falling back to version `0.0.0` (have you made an initial release?")
308
+ endif()
309
+ set(_git_last_vtag "0.0.0")
310
+ set(_git_trailing_commits ${_git_whole_count})
311
+ execute_process(
312
+ COMMAND ${GIT} describe --tags --dirty --long --always
313
+ OUTPUT_VARIABLE _git_describe
314
+ OUTPUT_STRIP_TRAILING_WHITESPACE
315
+ WORKING_DIRECTORY ${source_root_directory}
316
+ RESULT_VARIABLE _rc)
317
+ if(_rc OR "${_git_describe}" STREQUAL "")
318
+ execute_process(
319
+ COMMAND ${GIT} describe --tags --all --dirty --long --always
320
+ OUTPUT_VARIABLE _git_describe
321
+ OUTPUT_STRIP_TRAILING_WHITESPACE
322
+ WORKING_DIRECTORY ${source_root_directory}
323
+ RESULT_VARIABLE _rc)
324
+ if(_rc OR "${_git_describe}" STREQUAL "")
325
+ message(FATAL_ERROR "Please install latest version of git (`describe --tags --all --long` failed)")
326
+ endif()
327
+ endif()
328
+ else()
329
+ execute_process(
330
+ COMMAND ${GIT} describe --tags --dirty --long "--match=v[0-9]*"
331
+ OUTPUT_VARIABLE _git_describe
332
+ OUTPUT_STRIP_TRAILING_WHITESPACE
333
+ WORKING_DIRECTORY ${source_root_directory}
334
+ RESULT_VARIABLE _rc)
335
+ if(_rc OR "${_git_describe}" STREQUAL "")
336
+ message(FATAL_ERROR "Please install latest version of git (`describe --tags --long --match=v[0-9]*`)")
337
+ endif()
338
+ execute_process(
339
+ COMMAND ${GIT} rev-list --count "${_git_last_vtag}..HEAD"
340
+ OUTPUT_VARIABLE _git_trailing_commits
341
+ OUTPUT_STRIP_TRAILING_WHITESPACE
342
+ WORKING_DIRECTORY ${source_root_directory}
343
+ RESULT_VARIABLE _rc)
344
+ if(_rc OR "${_git_trailing_commits}" STREQUAL "")
345
+ message(FATAL_ERROR "Please install latest version of git (`rev-list --count ${_git_last_vtag}..HEAD` failed)")
346
+ endif()
347
+ endif()
348
+ endmacro(git_get_versioninfo)
349
+
350
+ macro(semver_provide name source_root_directory build_directory_for_json_output build_metadata parent_scope)
351
+ set(_semver "")
352
+ set(_git_describe "")
353
+ set(_git_timestamp "")
354
+ set(_git_tree "")
355
+ set(_git_commit "")
356
+ set(_version_from "")
357
+ set(_git_root FALSE)
358
+
359
+ find_program(GIT git)
360
+ if(GIT)
361
+ execute_process(
362
+ COMMAND ${GIT} rev-parse --show-toplevel
363
+ OUTPUT_VARIABLE _git_root
364
+ ERROR_VARIABLE _git_root_error
365
+ OUTPUT_STRIP_TRAILING_WHITESPACE
366
+ WORKING_DIRECTORY ${source_root_directory}
367
+ RESULT_VARIABLE _rc)
368
+ if(_rc OR "${_git_root}" STREQUAL "")
369
+ if(EXISTS "${source_root_directory}/.git")
370
+ message(ERROR "`git rev-parse --show-toplevel` failed '${_git_root_error}'")
371
+ else()
372
+ message(VERBOSE "`git rev-parse --show-toplevel` failed '${_git_root_error}'")
373
+ endif()
374
+ else()
375
+ set(_source_root "${source_root_directory}")
376
+ if(NOT CMAKE_VERSION VERSION_LESS 3.19)
377
+ file(REAL_PATH "${_git_root}" _git_root)
378
+ file(REAL_PATH "${_source_root}" _source_root)
379
+ endif()
380
+ if(_source_root STREQUAL _git_root AND EXISTS "${_git_root}/VERSION.json")
381
+ message(
382
+ FATAL_ERROR
383
+ "Несколько источников информации о версии, допустим только один из: репозиторий git, либо файл VERSION.json"
384
+ )
385
+ endif()
386
+ endif()
387
+ endif()
388
+
389
+ if(EXISTS "${source_root_directory}/VERSION.json")
390
+ set(_version_from "${source_root_directory}/VERSION.json")
391
+
392
+ if(CMAKE_VERSION VERSION_LESS 3.19)
393
+ message(FATAL_ERROR "Требуется CMake версии >= 3.19 для чтения VERSION.json")
394
+ endif()
395
+ file(
396
+ STRINGS "${_version_from}" _versioninfo_json NEWLINE_CONSUME
397
+ LIMIT_COUNT 9
398
+ LIMIT_INPUT 999
399
+ ENCODING UTF-8)
400
+ string(JSON _git_describe GET ${_versioninfo_json} git_describe)
401
+ string(JSON _git_timestamp GET "${_versioninfo_json}" "git_timestamp")
402
+ string(JSON _git_tree GET "${_versioninfo_json}" "git_tree")
403
+ string(JSON _git_commit GET "${_versioninfo_json}" "git_commit")
404
+ string(JSON _semver GET "${_versioninfo_json}" "semver")
405
+ unset(_json_object)
406
+ if(NOT _semver)
407
+ message(FATAL_ERROR "Unable to retrieve ${name} version from \"${_version_from}\" file.")
408
+ endif()
409
+ semver_parse("${_semver}")
410
+ if(NOT _semver_ok)
411
+ message(FATAL_ERROR "SemVer `${_semver}` from ${_version_from}: ${_semver_err}")
412
+ endif()
413
+ elseif(_git_root AND _source_root STREQUAL _git_root)
414
+ set(_version_from git)
415
+ git_get_versioninfo(${source_root_directory})
416
+ semver_parse(${_git_last_vtag})
417
+ if(NOT _semver_ok)
418
+ message(FATAL_ERROR "Git tag `${_git_last_vtag}`: ${_semver_err}")
419
+ endif()
420
+ if(_git_trailing_commits GREATER 0 AND "${_semver_tweak}" STREQUAL "")
421
+ set(_semver_tweak ${_git_trailing_commits})
422
+ endif()
423
+
424
+ elseif(GIT)
425
+ message(
426
+ FATAL_ERROR
427
+ "Нет источника информации о версии (${source_root_directory}), требуется один из: репозиторий git, либо VERSION.json"
428
+ )
429
+ else()
430
+ message(FATAL_ERROR "Требуется git для получения информации о версии")
431
+ endif()
432
+
433
+ if(NOT _git_describe
434
+ OR NOT _git_timestamp
435
+ OR NOT _git_tree
436
+ OR NOT _git_commit
437
+ OR "${_semver_major}" STREQUAL ""
438
+ OR "${_semver_minor}" STREQUAL ""
439
+ OR "${_semver_patch}" STREQUAL "")
440
+ message(ERROR "Unable to retrieve ${name} version from ${_version_from}.")
441
+ endif()
442
+
443
+ set(_semver "${_semver_major}.${_semver_minor}.${_semver_patch}")
444
+ if("${_semver_tweak}" STREQUAL "")
445
+ set(_semver_tweak 0)
446
+ elseif(_semver_tweak GREATER 0)
447
+ string(APPEND _semver ".${_semver_tweak}")
448
+ endif()
449
+ if(NOT "${_semver_prerelease}" STREQUAL "")
450
+ string(APPEND _semver "-${_semver_prerelease}")
451
+ endif()
452
+ if(_git_is_dirty)
453
+ string(APPEND _semver "-DIRTY")
454
+ endif()
455
+
456
+ set(_semver_complete "${_semver}")
457
+ if(NOT "${build_metadata}" STREQUAL "")
458
+ string(APPEND _semver_complete "+${build_metadata}")
459
+ endif()
460
+
461
+ set(${name}_VERSION "${_semver_complete}")
462
+ set(${name}_VERSION_PURE "${_semver}")
463
+ set(${name}_VERSION_MAJOR ${_semver_major})
464
+ set(${name}_VERSION_MINOR ${_semver_minor})
465
+ set(${name}_VERSION_PATCH ${_semver_patch})
466
+ set(${name}_VERSION_TWEAK ${_semver_tweak})
467
+ set(${name}_VERSION_PRERELEASE "${_semver_prerelease}")
468
+ set(${name}_GIT_DESCRIBE "${_git_describe}")
469
+ set(${name}_GIT_TIMESTAMP "${_git_timestamp}")
470
+ set(${name}_GIT_TREE "${_git_tree}")
471
+ set(${name}_GIT_COMMIT "${_git_commit}")
472
+
473
+ if(${parent_scope})
474
+ set(${name}_VERSION
475
+ "${_semver_complete}"
476
+ PARENT_SCOPE)
477
+ set(${name}_VERSION_PURE
478
+ "${_semver}"
479
+ PARENT_SCOPE)
480
+ set(${name}_VERSION_MAJOR
481
+ ${_semver_major}
482
+ PARENT_SCOPE)
483
+ set(${name}_VERSION_MINOR
484
+ ${_semver_minor}
485
+ PARENT_SCOPE)
486
+ set(${name}_VERSION_PATCH
487
+ ${_semver_patch}
488
+ PARENT_SCOPE)
489
+ set(${name}_VERSION_TWEAK
490
+ "${_semver_tweak}"
491
+ PARENT_SCOPE)
492
+ set(${name}_VERSION_PRERELEASE
493
+ "${_semver_prerelease}"
494
+ PARENT_SCOPE)
495
+ set(${name}_GIT_DESCRIBE
496
+ "${_git_describe}"
497
+ PARENT_SCOPE)
498
+ set(${name}_GIT_TIMESTAMP
499
+ "${_git_timestamp}"
500
+ PARENT_SCOPE)
501
+ set(${name}_GIT_TREE
502
+ "${_git_tree}"
503
+ PARENT_SCOPE)
504
+ set(${name}_GIT_COMMIT
505
+ "${_git_commit}"
506
+ PARENT_SCOPE)
507
+ endif()
508
+
509
+ if(_version_from STREQUAL "git")
510
+ string(
511
+ CONFIGURE
512
+ "{
513
+ \"git_describe\" : \"@_git_describe@\",
514
+ \"git_timestamp\" : \"@_git_timestamp@\",
515
+ \"git_tree\" : \"@_git_tree@\",
516
+ \"git_commit\" : \"@_git_commit@\",
517
+ \"semver\" : \"@_semver@\"\n}"
518
+ _versioninfo_json
519
+ @ONLY ESCAPE_QUOTES)
520
+ file(WRITE "${build_directory_for_json_output}/VERSION.json" "${_versioninfo_json}")
521
+ endif()
522
+ endmacro(semver_provide)
523
+
524
+ cmake_policy(POP)