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,1221 @@
1
+ # Copyright (c) 2010-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
+ if(NOT CMAKE_VERSION VERSION_LESS 3.21)
15
+ cmake_policy(SET CMP0126 NEW)
16
+ endif()
17
+ if(NOT CMAKE_VERSION VERSION_LESS 3.17)
18
+ cmake_policy(SET CMP0102 NEW)
19
+ endif()
20
+ if(NOT CMAKE_VERSION VERSION_LESS 3.15)
21
+ cmake_policy(SET CMP0091 NEW)
22
+ endif()
23
+ if(NOT CMAKE_VERSION VERSION_LESS 3.13)
24
+ cmake_policy(SET CMP0077 NEW)
25
+ endif()
26
+ if(NOT CMAKE_VERSION VERSION_LESS 3.12)
27
+ cmake_policy(SET CMP0075 NEW)
28
+ endif()
29
+ if(NOT CMAKE_VERSION VERSION_LESS 3.9)
30
+ cmake_policy(SET CMP0068 NEW)
31
+ cmake_policy(SET CMP0069 NEW)
32
+ endif()
33
+
34
+ cmake_policy(SET CMP0054 NEW)
35
+
36
+ if(CMAKE_VERSION MATCHES ".*MSVC.*" AND CMAKE_VERSION VERSION_LESS 3.16)
37
+ message(FATAL_ERROR "CMake from MSVC kit is unfit! "
38
+ "Please use MSVC-2019 with modern CMake the original CMake from https://cmake.org/download/")
39
+ endif()
40
+
41
+ if(NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED))
42
+ message(FATAL_ERROR "This module required C or C++ to be enabled")
43
+ endif()
44
+
45
+ if(CMAKE_CXX_COMPILER_LOADED)
46
+ include(CheckCXXSourceRuns)
47
+ include(CheckCXXSourceCompiles)
48
+ include(CheckCXXCompilerFlag)
49
+ endif()
50
+ if(CMAKE_C_COMPILER_LOADED)
51
+ include(CheckCSourceRuns)
52
+ include(CheckCSourceCompiles)
53
+ include(CheckCCompilerFlag)
54
+ endif()
55
+ include(CMakeDependentOption)
56
+ include(CheckLibraryExists)
57
+ include(CheckIncludeFiles)
58
+
59
+ # Check if the same compile family is used for both C and CXX
60
+ if(CMAKE_C_COMPILER_LOADED
61
+ AND CMAKE_CXX_COMPILER_LOADED
62
+ AND NOT (CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID))
63
+ message(WARNING "CMAKE_C_COMPILER_ID (${CMAKE_C_COMPILER_ID}) is different "
64
+ "from CMAKE_CXX_COMPILER_ID (${CMAKE_CXX_COMPILER_ID}). " "The final binary may be unusable.")
65
+ endif()
66
+
67
+ if(CMAKE_CXX_COMPILER_LOADED)
68
+ set(CMAKE_PRIMARY_LANG "CXX")
69
+ else()
70
+ set(CMAKE_PRIMARY_LANG "C")
71
+ endif()
72
+
73
+ macro(check_compiler_flag flag variable)
74
+ if(CMAKE_CXX_COMPILER_LOADED)
75
+ check_cxx_compiler_flag(${flag} ${variable})
76
+ else()
77
+ check_c_compiler_flag(${flag} ${variable})
78
+ endif()
79
+ endmacro(check_compiler_flag)
80
+
81
+ # We support building with Clang and gcc. First check what we're using for build.
82
+ if(CMAKE_C_COMPILER_LOADED AND CMAKE_C_COMPILER_ID MATCHES ".*[Cc][Ll][Aa][Nn][Gg].*")
83
+ set(CMAKE_COMPILER_IS_CLANG ON)
84
+ set(CMAKE_COMPILER_IS_GNUCC OFF)
85
+ endif()
86
+ if(CMAKE_CXX_COMPILER_LOADED AND CMAKE_CXX_COMPILER_ID MATCHES ".*[Cc][Ll][Aa][Nn][Gg].*")
87
+ set(CMAKE_COMPILER_IS_CLANG ON)
88
+ set(CMAKE_COMPILER_IS_GNUCXX OFF)
89
+ endif()
90
+
91
+ if(CMAKE_C_COMPILER_LOADED)
92
+ # Check for Elbrus lcc
93
+ execute_process(
94
+ COMMAND ${CMAKE_C_COMPILER} --version
95
+ OUTPUT_VARIABLE tmp_lcc_probe_version
96
+ RESULT_VARIABLE tmp_lcc_probe_result
97
+ ERROR_QUIET)
98
+ if(tmp_lcc_probe_result EQUAL 0)
99
+ string(FIND "${tmp_lcc_probe_version}" "lcc:" tmp_lcc_marker)
100
+ string(FIND "${tmp_lcc_probe_version}" ":e2k-" tmp_e2k_marker)
101
+ if(tmp_lcc_marker GREATER -1 AND tmp_e2k_marker GREATER tmp_lcc_marker)
102
+ execute_process(
103
+ COMMAND ${CMAKE_C_COMPILER} -print-version
104
+ OUTPUT_VARIABLE CMAKE_C_COMPILER_VERSION
105
+ RESULT_VARIABLE tmp_lcc_probe_result
106
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
107
+ set(CMAKE_COMPILER_IS_ELBRUSC ON)
108
+ set(CMAKE_C_COMPILER_ID "Elbrus")
109
+ message(STATUS "Detected Elbrus C compiler ${CMAKE_C_COMPILER_VERSION}")
110
+ else()
111
+ set(CMAKE_COMPILER_IS_ELBRUSC OFF)
112
+ endif()
113
+ unset(tmp_lcc_marker)
114
+ unset(tmp_e2k_marker)
115
+ endif()
116
+ unset(tmp_lcc_probe_version)
117
+ unset(tmp_lcc_probe_result)
118
+ endif()
119
+
120
+ if(CMAKE_CXX_COMPILER_LOADED)
121
+ # Check for Elbrus l++
122
+ execute_process(
123
+ COMMAND ${CMAKE_CXX_COMPILER} --version
124
+ OUTPUT_VARIABLE tmp_lxx_probe_version
125
+ RESULT_VARIABLE tmp_lxx_probe_result
126
+ ERROR_QUIET)
127
+ if(tmp_lxx_probe_result EQUAL 0)
128
+ string(FIND "${tmp_lxx_probe_version}" "lcc:" tmp_lcc_marker)
129
+ string(FIND "${tmp_lxx_probe_version}" ":e2k-" tmp_e2k_marker)
130
+ if(tmp_lcc_marker GREATER -1 AND tmp_e2k_marker GREATER tmp_lcc_marker)
131
+ execute_process(
132
+ COMMAND ${CMAKE_CXX_COMPILER} -print-version
133
+ OUTPUT_VARIABLE CMAKE_CXX_COMPILER_VERSION
134
+ RESULT_VARIABLE tmp_lxx_probe_result
135
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
136
+ set(CMAKE_COMPILER_IS_ELBRUSCXX ON)
137
+ set(CMAKE_CXX_COMPILER_ID "Elbrus")
138
+ message(STATUS "Detected Elbrus C++ compiler ${CMAKE_CXX_COMPILER_VERSION}")
139
+ else()
140
+ set(CMAKE_COMPILER_IS_ELBRUSCXX OFF)
141
+ endif()
142
+ unset(tmp_lcc_marker)
143
+ unset(tmp_e2k_marker)
144
+ endif()
145
+ unset(tmp_lxx_probe_version)
146
+ unset(tmp_lxx_probe_result)
147
+ endif()
148
+
149
+ # Hard coding the compiler version is ugly from cmake POV, but at least gives user a friendly error message. The most
150
+ # critical demand for C++ compiler is support of C++11 lambdas, added only in version 4.5
151
+ # https://gcc.gnu.org/projects/cxx0x.html
152
+ if(CMAKE_COMPILER_IS_GNUCC)
153
+ if(CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5 AND NOT CMAKE_COMPILER_IS_ELBRUSC)
154
+ message(FATAL_ERROR "
155
+ Your GCC version is ${CMAKE_C_COMPILER_VERSION}, please update")
156
+ endif()
157
+ endif()
158
+ if(CMAKE_COMPILER_IS_GNUCXX)
159
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.5 AND NOT CMAKE_COMPILER_IS_ELBRUSCXX)
160
+ message(FATAL_ERROR "
161
+ Your G++ version is ${CMAKE_CXX_COMPILER_VERSION}, please update")
162
+ endif()
163
+ endif()
164
+
165
+ if(CMAKE_CL_64)
166
+ set(MSVC64 1)
167
+ endif()
168
+ if(WIN32 AND CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG})
169
+ execute_process(
170
+ COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -dumpmachine
171
+ OUTPUT_VARIABLE __GCC_TARGET_MACHINE
172
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
173
+ if(__GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64")
174
+ set(MINGW64 1)
175
+ endif()
176
+ unset(__GCC_TARGET_MACHINE)
177
+ endif()
178
+
179
+ if(NOT DEFINED IOS)
180
+ if(APPLE
181
+ AND (CMAKE_SYSTEM_NAME STREQUAL "iOS"
182
+ OR DEFINED CMAKE_IOS_DEVELOPER_ROOT
183
+ OR DEFINED IOS_PLATFORM
184
+ OR DEFINED IOS_ARCH
185
+ ))
186
+ set(IOS TRUE)
187
+ else()
188
+ set(IOS FALSE)
189
+ endif()
190
+ endif()
191
+
192
+ if(NOT DEFINED CMAKE_TARGET_BITNESS)
193
+ if(CMAKE_SIZEOF_VOID_P LESS 4)
194
+ set(CMAKE_TARGET_BITNESS 16)
195
+ elseif(CMAKE_SIZEOF_VOID_P LESS 8)
196
+ set(CMAKE_TARGET_BITNESS 32)
197
+ else()
198
+ set(CMAKE_TARGET_BITNESS 64)
199
+ endif()
200
+ endif()
201
+
202
+ if(NOT CMAKE_SYSTEM_ARCH)
203
+ if(CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_ARCHITECTURE_ID)
204
+ string(TOLOWER "${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_ARCHITECTURE_ID}" CMAKE_SYSTEM_ARCH)
205
+ if(CMAKE_SYSTEM_ARCH STREQUAL "x86")
206
+ set(X86_32 TRUE)
207
+ elseif(CMAKE_SYSTEM_ARCH STREQUAL "x86_64" OR CMAKE_SYSTEM_ARCH STREQUAL "x64")
208
+ set(X86_64 TRUE)
209
+ set(CMAKE_SYSTEM_ARCH "x86_64")
210
+ elseif(CMAKE_SYSTEM_ARCH MATCHES "^(aarch.*|arm.*)")
211
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
212
+ set(AARCH64 TRUE)
213
+ else()
214
+ set(ARM32 TRUE)
215
+ endif()
216
+ endif()
217
+ elseif(CMAKE_ANDROID_ARCH_ABI)
218
+ set(CMAKE_SYSTEM_ARCH "${CMAKE_ANDROID_ARCH_ABI}")
219
+ if(CMAKE_SYSTEM_ARCH STREQUAL "x86")
220
+ set(X86_32 TRUE)
221
+ elseif(CMAKE_SYSTEM_ARCH STREQUAL "x86_64")
222
+ set(X86_64 TRUE)
223
+ elseif(CMAKE_SYSTEM_ARCH MATCHES "^(aarch.*|AARCH.*|arm.*|ARM.*)")
224
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
225
+ set(AARCH64 TRUE)
226
+ else()
227
+ set(ARM32 TRUE)
228
+ endif()
229
+ elseif(CMAKE_SYSTEM_ARCH MATCHES "^(mips|MIPS).*")
230
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
231
+ set(MIPS64 TRUE)
232
+ else()
233
+ set(MIPS32 TRUE)
234
+ endif()
235
+ endif()
236
+ elseif(
237
+ CMAKE_COMPILER_IS_ELBRUSC
238
+ OR CMAKE_COMPILER_IS_ELBRUSCXX
239
+ OR CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_ID STREQUAL "LCC"
240
+ OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
241
+ set(E2K TRUE)
242
+ set(CMAKE_SYSTEM_ARCH "Elbrus")
243
+ elseif(
244
+ MSVC64
245
+ OR MINGW64
246
+ OR MINGW
247
+ OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
248
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
249
+ set(X86_64 TRUE)
250
+ set(CMAKE_SYSTEM_ARCH "x86_64")
251
+ else()
252
+ set(X86_32 TRUE)
253
+ set(CMAKE_SYSTEM_ARCH "x86")
254
+ endif()
255
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|[xXiI]86_64.*|AMD64.*|[iI][3-6]86.*|[xXiI]86.*")
256
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
257
+ set(X86_64 TRUE)
258
+ set(CMAKE_SYSTEM_ARCH "x86_64")
259
+ else()
260
+ set(X86_32 TRUE)
261
+ set(CMAKE_SYSTEM_ARCH "x86")
262
+ endif()
263
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch.*|AARCH.*|arm.*|ARM.*)")
264
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
265
+ set(AARCH64 TRUE)
266
+ set(CMAKE_SYSTEM_ARCH "ARM64")
267
+ else()
268
+ set(ARM32 TRUE)
269
+ set(CMAKE_SYSTEM_ARCH "ARM")
270
+ endif()
271
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc).*")
272
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
273
+ set(PPC64 TRUE)
274
+ set(CMAKE_SYSTEM_ARCH "PPC64")
275
+ else()
276
+ set(PPC32 TRUE)
277
+ set(CMAKE_SYSTEM_ARCH "PPC")
278
+ endif()
279
+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS).*")
280
+ if(CMAKE_TARGET_BITNESS EQUAL 64)
281
+ set(MIPS64 TRUE)
282
+ set(CMAKE_SYSTEM_ARCH "MIPS64")
283
+ else()
284
+ set(MIPS32 TRUE)
285
+ set(CMAKE_SYSTEM_ARCH "MIPS")
286
+ endif()
287
+ endif()
288
+ endif()
289
+ if(CMAKE_C_COMPILER_LOADED AND NOT CMAKE_C_COMPILER_ARCHITECTURE_ID)
290
+ set(CMAKE_C_COMPILER_ARCHITECTURE_ID "${CMAKE_SYSTEM_ARCH}")
291
+ endif()
292
+ if(CMAKE_CXX_COMPILER_LOADED AND NOT CMAKE_CXX_COMPILER_ARCHITECTURE_ID)
293
+ set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "${CMAKE_SYSTEM_ARCH}")
294
+ endif()
295
+
296
+ if(NOT CMAKE_HOST_ARCH)
297
+ if(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE)
298
+ set(CMAKE_HOST_ARCH "${CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE}")
299
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
300
+ set(CMAKE_HOST_ARCH "Elbrus")
301
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "amd64.*|[xXiI]86_64.*|AMD64.*")
302
+ set(CMAKE_HOST_ARCH "x86_64")
303
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "[iI][3-6]86.*|[xXiI]86.*")
304
+ set(CMAKE_HOST_ARCH "x86")
305
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)")
306
+ set(CMAKE_HOST_ARCH "ARM64")
307
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(arm.*|ARM.*)")
308
+ set(CMAKE_HOST_ARCH "ARM")
309
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(powerpc|ppc)64.*")
310
+ set(CMAKE_HOST_ARCH "PPC64")
311
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(powerpc|ppc).*")
312
+ set(CMAKE_HOST_ARCH "PPC")
313
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(mips|MIPS)64.*")
314
+ set(CMAKE_HOST_ARCH "MIPS64")
315
+ elseif(CMAKE_HOST_PROCESSOR MATCHES "^(mips|MIPS).*")
316
+ set(CMAKE_HOST_ARCH "MIPS")
317
+ else()
318
+ set(CMAKE_HOST_ARCH "${CMAKE_HOST_SYSTEM_PROCESSOR}")
319
+ endif()
320
+ endif()
321
+
322
+ if(NOT DEFINED CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET)
323
+ if(CMAKE_CROSSCOMPILING AND CMAKE_CROSSCOMPILING_EMULATOR)
324
+ set(CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET TRUE)
325
+ elseif(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR)
326
+ set(CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET FALSE)
327
+ elseif(
328
+ CMAKE_SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME
329
+ AND ((CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_PROCESSOR)
330
+ OR (CMAKE_SYSTEM_ARCH STREQUAL CMAKE_HOST_ARCH)
331
+ OR (WIN32
332
+ AND CMAKE_HOST_WIN32
333
+ AND X86_32
334
+ AND CMAKE_HOST_ARCH STREQUAL "x86_64"
335
+ )
336
+ ))
337
+ set(CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET TRUE)
338
+ message(STATUS "Assume СAN RUN A BUILT EXECUTABLES," " since host (${CMAKE_HOST_SYSTEM_NAME}-${CMAKE_HOST_ARCH})"
339
+ " match target (${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_ARCH})")
340
+ else()
341
+ if(CMAKE_C_COMPILER_LOADED)
342
+ include(CheckCSourceRuns)
343
+ check_c_source_runs("int main(void) { return 0; }" CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET)
344
+ elseif(CMAKE_CXX_COMPILER_LOADED)
345
+ include(CheckCXXSourceRuns)
346
+ check_cxx_source_runs("int main(void) { return 0; }" CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET)
347
+ endif()
348
+ if(NOT CMAKE_HOST_CAN_RUN_EXECUTABLES_BUILT_FOR_TARGET)
349
+ message(STATUS "Force CMAKE_CROSSCOMPILING to TRUE")
350
+ set(CMAKE_CROSSCOMPILING TRUE)
351
+ endif()
352
+ endif()
353
+ endif()
354
+
355
+ if(MSVC)
356
+ check_compiler_flag("/WX" CC_HAS_WERROR)
357
+ check_compiler_flag("/fsanitize=address" CC_HAS_ASAN)
358
+ check_compiler_flag("/fsanitize=undefined" CC_HAS_UBSAN)
359
+ else()
360
+ #
361
+ # GCC started to warn for unused result starting from 4.2, and this is when it introduced -Wno-unused-result GCC can
362
+ # also be built on top of llvm runtime (on mac).
363
+ check_compiler_flag("-Wno-unknown-pragmas" CC_HAS_WNO_UNKNOWN_PRAGMAS)
364
+ check_compiler_flag("-Wextra" CC_HAS_WEXTRA)
365
+ check_compiler_flag("-Werror" CC_HAS_WERROR)
366
+ check_compiler_flag("-fexceptions" CC_HAS_FEXCEPTIONS)
367
+ check_compiler_flag("-fno-semantic-interposition" CC_HAS_FNO_SEMANTIC_INTERPOSITION)
368
+ if(CMAKE_CXX_COMPILER_LOADED)
369
+ check_cxx_compiler_flag("-fcxx-exceptions" CC_HAS_FCXX_EXCEPTIONS)
370
+ endif()
371
+ check_compiler_flag("-funwind-tables" CC_HAS_FUNWIND_TABLES)
372
+ check_compiler_flag("-fno-omit-frame-pointer" CC_HAS_FNO_OMIT_FRAME_POINTER)
373
+ check_compiler_flag("-fno-common" CC_HAS_FNO_COMMON)
374
+ check_compiler_flag("-ggdb" CC_HAS_GGDB)
375
+ check_compiler_flag("-fvisibility=hidden" CC_HAS_VISIBILITY)
376
+ check_compiler_flag("-march=native" CC_HAS_ARCH_NATIVE)
377
+ check_compiler_flag("-Og" CC_HAS_DEBUG_FRIENDLY_OPTIMIZATION)
378
+ check_compiler_flag("-Wall" CC_HAS_WALL)
379
+ check_compiler_flag("-Ominimal" CC_HAS_OMINIMAL)
380
+ check_compiler_flag("-ffunction-sections -fdata-sections" CC_HAS_SECTIONS)
381
+ check_compiler_flag("-ffast-math" CC_HAS_FASTMATH)
382
+ check_compiler_flag("-Wno-attributes" CC_HAS_WNO_ATTRIBUTES)
383
+
384
+ # Check for an omp support
385
+ set(CMAKE_REQUIRED_FLAGS "-fopenmp -Werror")
386
+ if(CMAKE_CXX_COMPILER_LOADED)
387
+ check_cxx_source_compiles(
388
+ "int main(void) {
389
+ #pragma omp for
390
+ for(int i = 0, j = 0; i != 42; i = 1 + i * 12345) j += i % 43;
391
+ return j;
392
+ }"
393
+ HAVE_OPENMP)
394
+ else()
395
+ check_c_source_compiles(
396
+ "int main(void) {
397
+ #pragma omp for
398
+ for(int i = 0, j = 0; i != 42; i = 1 + i * 12345) j += i % 43;
399
+ return j;
400
+ }"
401
+ HAVE_OPENMP)
402
+ endif()
403
+ set(CMAKE_REQUIRED_FLAGS "")
404
+ endif()
405
+
406
+ # Crutch for old C++ compilers and/or CMake to enabling C++11
407
+ if(CMAKE_CXX_COMPILER_LOADED)
408
+ list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 HAS_CXX11)
409
+ if(HAS_CXX11 LESS 0)
410
+ if(MSVC)
411
+ check_cxx_compiler_flag("/std:c++11" CXX_FALLBACK_11)
412
+ else()
413
+ check_cxx_compiler_flag("-std=gnu++11" CXX_FALLBACK_GNU11)
414
+ if(NOT CXX_FALLBACK_GNU11)
415
+ check_cxx_compiler_flag("-std=c++11" CXX_FALLBACK_11)
416
+ endif()
417
+ endif()
418
+ endif()
419
+ endif()
420
+
421
+ # Crutch for mad C compilers and/or CMake to enabling C11
422
+ if(CMAKE_C_COMPILER_LOADED)
423
+ list(FIND CMAKE_C_COMPILE_FEATURES c_std_11 HAS_C11)
424
+ if(HAS_C11 LESS 0)
425
+ if(MSVC)
426
+ check_c_compiler_flag("/std:c11" C_FALLBACK_11)
427
+ else()
428
+ check_c_compiler_flag("-std=gnu11" C_FALLBACK_GNU11)
429
+ if(NOT C_FALLBACK_GNU11)
430
+ check_c_compiler_flag("-std=c11" C_FALLBACK_11)
431
+ endif()
432
+ endif()
433
+ endif()
434
+ endif()
435
+
436
+ # Check for LTO support by GCC
437
+ if(CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG}
438
+ AND NOT CMAKE_COMPILER_IS_ELBRUSC
439
+ AND NOT CMAKE_COMPILER_IS_ELBRUSCXX)
440
+ unset(gcc_collect)
441
+ unset(gcc_lto_wrapper)
442
+
443
+ if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 4.7)
444
+ execute_process(
445
+ COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -v
446
+ OUTPUT_VARIABLE gcc_info_v
447
+ ERROR_VARIABLE gcc_info_v)
448
+
449
+ string(REGEX MATCH "^(.+\nCOLLECT_GCC=)([^ \n]+)(\n.+)$" gcc_collect_valid ${gcc_info_v})
450
+ if(gcc_collect_valid)
451
+ string(REGEX REPLACE "^(.+\nCOLLECT_GCC=)([^ \n]+)(\n.+)$" "\\2" gcc_collect ${gcc_info_v})
452
+ endif()
453
+
454
+ string(REGEX MATCH "^(.+\nCOLLECT_LTO_WRAPPER=)([^ \n]+/lto-wrapper)(\n.+)$" gcc_lto_wrapper_valid ${gcc_info_v})
455
+ if(gcc_lto_wrapper_valid)
456
+ string(REGEX REPLACE "^(.+\nCOLLECT_LTO_WRAPPER=)([^ \n]+/lto-wrapper)(\n.+)$" "\\2" gcc_lto_wrapper
457
+ ${gcc_info_v})
458
+ endif()
459
+
460
+ set(gcc_suffix "")
461
+ if(gcc_collect_valid AND gcc_collect)
462
+ string(REGEX MATCH "^(.*(cc|\\+\\+))(-.+)$" gcc_suffix_valid ${gcc_collect})
463
+ if(gcc_suffix_valid)
464
+ string(REGEX REPLACE "^(.*(cc|\\+\\+))(-.+)$" "\\3" gcc_suffix ${gcc_collect})
465
+ endif()
466
+ endif()
467
+
468
+ get_filename_component(gcc_dir ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} DIRECTORY)
469
+ if(NOT CMAKE_GCC_AR)
470
+ find_program(
471
+ CMAKE_GCC_AR
472
+ NAMES "gcc${gcc_suffix}-ar" "gcc-ar${gcc_suffix}"
473
+ PATHS "${gcc_dir}"
474
+ NO_DEFAULT_PATH)
475
+ endif()
476
+ if(NOT CMAKE_GCC_NM)
477
+ find_program(
478
+ CMAKE_GCC_NM
479
+ NAMES "gcc${gcc_suffix}-nm" "gcc-nm${gcc_suffix}"
480
+ PATHS "${gcc_dir}"
481
+ NO_DEFAULT_PATH)
482
+ endif()
483
+ if(NOT CMAKE_GCC_RANLIB)
484
+ find_program(
485
+ CMAKE_GCC_RANLIB
486
+ NAMES "gcc${gcc_suffix}-ranlib" "gcc-ranlib${gcc_suffix}"
487
+ PATHS "${gcc_dir}"
488
+ NO_DEFAULT_PATH)
489
+ endif()
490
+
491
+ unset(gcc_dir)
492
+ unset(gcc_suffix_valid)
493
+ unset(gcc_suffix)
494
+ unset(gcc_lto_wrapper_valid)
495
+ unset(gcc_collect_valid)
496
+ unset(gcc_collect)
497
+ unset(gcc_info_v)
498
+ endif()
499
+
500
+ if(CMAKE_GCC_AR
501
+ AND CMAKE_GCC_NM
502
+ AND CMAKE_GCC_RANLIB
503
+ AND gcc_lto_wrapper)
504
+ message(STATUS "Found GCC's LTO toolset: ${gcc_lto_wrapper}, ${CMAKE_GCC_AR}, ${CMAKE_GCC_RANLIB}")
505
+ if(CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 11.4)
506
+ set(GCC_LTO_CFLAGS "-flto -fno-fat-lto-objects -fuse-linker-plugin")
507
+ else()
508
+ set(GCC_LTO_CFLAGS "-flto=auto -fno-fat-lto-objects -fuse-linker-plugin")
509
+ endif()
510
+ set(GCC_LTO_AVAILABLE TRUE)
511
+ message(STATUS "Link-Time Optimization by GCC is available")
512
+ else()
513
+ set(GCC_LTO_AVAILABLE FALSE)
514
+ message(STATUS "Link-Time Optimization by GCC is NOT available")
515
+ endif()
516
+ unset(gcc_lto_wrapper)
517
+ endif()
518
+
519
+ # check for LTO by MSVC
520
+ if(MSVC AND NOT CMAKE_COMPILER_IS_CLANG)
521
+ if(NOT MSVC_VERSION LESS 1600)
522
+ set(MSVC_LTO_AVAILABLE TRUE)
523
+ message(STATUS "Link-Time Optimization by MSVC is available")
524
+ else()
525
+ set(MSVC_LTO_AVAILABLE FALSE)
526
+ message(STATUS "Link-Time Optimization by MSVC is NOT available")
527
+ endif()
528
+ endif()
529
+
530
+ # Check for LTO support by CLANG
531
+ if(CMAKE_COMPILER_IS_CLANG)
532
+ if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 3.5)
533
+ execute_process(
534
+ COMMAND ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} -print-search-dirs
535
+ OUTPUT_VARIABLE clang_search_dirs
536
+ RESULT_VARIABLE clang_probe_result
537
+ ERROR_QUIET)
538
+
539
+ unset(clang_bindirs)
540
+ unset(clang_bindirs_x)
541
+ unset(clang_libdirs)
542
+ unset(clang_libdirs_x)
543
+ if(clang_probe_result EQUAL 0)
544
+ string(REGEX MATCH "(^|\n.*)(.*programs: =)([^\n]+)((\n.*)|$)" regexp_valid ${clang_search_dirs})
545
+ if(regexp_valid)
546
+ string(REGEX REPLACE "(^|\n.*)(.*programs: =)([^\n]+)((\n.*)|$)" "\\3" list ${clang_search_dirs})
547
+ string(REPLACE ":" ";" list "${list}")
548
+ set(libs_extra_subdirs "lib;../lib;lib64;../lib64;lib32;../lib32")
549
+ foreach(dir IN LISTS list)
550
+ get_filename_component(dir "${dir}" REALPATH)
551
+ if(dir MATCHES ".*llvm.*" OR dir MATCHES ".*clang.*")
552
+ set(list_suffix "")
553
+ else()
554
+ set(list_suffix "_x")
555
+ endif()
556
+ list(APPEND clang_bindirs${list_suffix} "${dir}")
557
+ foreach(subdir IN LISTS libs_extra_subdirs)
558
+ get_filename_component(subdir "${dir}/${subdir}" REALPATH)
559
+ if(EXISTS "${subdir}")
560
+ list(APPEND clang_libdirs${list_suffix} "${subdir}")
561
+ endif()
562
+ endforeach()
563
+ endforeach()
564
+ list(APPEND clang_bindirs "${clang_bindirs_x}")
565
+ list(REMOVE_DUPLICATES clang_bindirs)
566
+ endif()
567
+ string(REGEX MATCH "(^|\n.*)(.*libraries: =)([^\n]+)((\n.*)|$)" regexp_valid ${clang_search_dirs})
568
+ if(regexp_valid)
569
+ string(REGEX REPLACE "(^|\n.*)(.*libraries: =)([^\n]+)((\n.*)|$)" "\\3" list ${clang_search_dirs})
570
+ string(REPLACE ":" ";" list "${list}")
571
+ foreach(dir IN LISTS list)
572
+ get_filename_component(dir "${dir}" REALPATH)
573
+ if(dir MATCHES ".*llvm.*" OR dir MATCHES ".*clang.*")
574
+ set(list_suffix "")
575
+ else()
576
+ set(list_suffix "_x")
577
+ endif()
578
+ list(APPEND clang_libdirs${list_suffix} "${dir}")
579
+ endforeach()
580
+ list(APPEND clang_libdirs "${clang_libdirs_x}")
581
+ list(REMOVE_DUPLICATES clang_libdirs)
582
+ endif()
583
+ else()
584
+ get_filename_component(clang_bindirs ${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER} DIRECTORY)
585
+ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
586
+ set(clang_libdirs ${clang_bindirs})
587
+ else()
588
+ get_filename_component(clang_libdirs "${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER}/../lib" REALPATH)
589
+ endif()
590
+ endif()
591
+
592
+ if(clang_bindirs AND clang_libdirs)
593
+ message(STATUS "Found CLANG/LLVM directories: ${clang_bindirs}, ${clang_libdirs}")
594
+ else()
595
+ message(STATUS "Could NOT find CLANG/LLVM directories (bin and/or lib).")
596
+ endif()
597
+
598
+ if(NOT CMAKE_CLANG_LD AND clang_bindirs)
599
+ find_program(
600
+ CMAKE_CLANG_LD
601
+ NAMES lld-link ld.lld "ld${CMAKE_TARGET_BITNESS}.lld" lld llvm-link llvm-ld
602
+ PATHS ${clang_bindirs}
603
+ NO_DEFAULT_PATH)
604
+ endif()
605
+ if(NOT CMAKE_CLANG_AR AND clang_bindirs)
606
+ find_program(
607
+ CMAKE_CLANG_AR
608
+ NAMES llvm-ar ar
609
+ PATHS ${clang_bindirs}
610
+ NO_DEFAULT_PATH)
611
+ endif()
612
+ if(NOT CMAKE_CLANG_NM AND clang_bindirs)
613
+ find_program(
614
+ CMAKE_CLANG_NM
615
+ NAMES llvm-nm nm
616
+ PATHS ${clang_bindirs}
617
+ NO_DEFAULT_PATH)
618
+ endif()
619
+ if(NOT CMAKE_CLANG_RANLIB AND clang_bindirs)
620
+ find_program(
621
+ CMAKE_CLANG_RANLIB
622
+ NAMES llvm-ranlib ranlib
623
+ PATHS ${clang_bindirs}
624
+ NO_DEFAULT_PATH)
625
+ endif()
626
+
627
+ set(clang_lto_plugin_name "LLVMgold${CMAKE_SHARED_LIBRARY_SUFFIX}")
628
+ if(NOT CMAKE_LD_GOLD AND clang_bindirs)
629
+ find_program(
630
+ CMAKE_LD_GOLD
631
+ NAMES ld.gold
632
+ PATHS ${clang_bindirs})
633
+ endif()
634
+ if(NOT CLANG_LTO_PLUGIN AND clang_libdirs)
635
+ find_file(
636
+ CLANG_LTO_PLUGIN ${clang_lto_plugin_name}
637
+ PATHS ${clang_libdirs}
638
+ NO_DEFAULT_PATH)
639
+ endif()
640
+
641
+ if(CLANG_LTO_PLUGIN)
642
+ message(STATUS "Found CLANG/LLVM's plugin for LTO: ${CLANG_LTO_PLUGIN}")
643
+ else()
644
+ message(STATUS "Could NOT find CLANG/LLVM's plugin (${clang_lto_plugin_name}) for LTO.")
645
+ endif()
646
+
647
+ if(CMAKE_CLANG_LD)
648
+ message(STATUS "Found CLANG/LLVM's linker for LTO: ${CMAKE_CLANG_LD}")
649
+ else()
650
+ message(STATUS "Could NOT find CLANG/LLVM's linker (lld, llvm-ld, llvm-link) for LTO.")
651
+ endif()
652
+
653
+ if(CMAKE_CLANG_AR
654
+ AND CMAKE_CLANG_RANLIB
655
+ AND CMAKE_CLANG_NM)
656
+ message(STATUS "Found CLANG/LLVM's binutils for LTO: ${CMAKE_CLANG_AR}, ${CMAKE_CLANG_RANLIB}, ${CMAKE_CLANG_NM}")
657
+ else()
658
+ message(STATUS "Could NOT find CLANG/LLVM's binutils (ar, ranlib, nm) for LTO.")
659
+ endif()
660
+
661
+ unset(clang_lto_plugin_name)
662
+ unset(clang_libdir)
663
+ unset(clang_bindir_valid)
664
+ unset(clang_bindir)
665
+ unset(clang_search_dirs)
666
+ endif()
667
+
668
+ if(CMAKE_CLANG_AR
669
+ AND CMAKE_CLANG_NM
670
+ AND CMAKE_CLANG_RANLIB
671
+ AND ((CLANG_LTO_PLUGIN AND CMAKE_LD_GOLD)
672
+ OR CMAKE_CLANG_LD
673
+ OR APPLE))
674
+ if(ANDROID AND CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 12)
675
+ set(CLANG_LTO_AVAILABLE FALSE)
676
+ message(
677
+ STATUS "Link-Time Optimization by CLANG/LLVM is available but unusable due https://reviews.llvm.org/D79919")
678
+ else()
679
+ set(CLANG_LTO_AVAILABLE TRUE)
680
+ message(STATUS "Link-Time Optimization by CLANG/LLVM is available")
681
+ endif()
682
+ elseif(CMAKE_TOOLCHAIN_FILE AND NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 7.0)
683
+ set(CLANG_LTO_AVAILABLE TRUE)
684
+ if(NOT CMAKE_CLANG_LD)
685
+ set(CMAKE_CLANG_LD ${CMAKE_LINKER})
686
+ endif()
687
+ if(NOT CMAKE_CLANG_AR)
688
+ set(CMAKE_CLANG_AR ${CMAKE_AR})
689
+ endif()
690
+ if(NOT CMAKE_CLANG_NM)
691
+ set(CMAKE_CLANG_NM ${CMAKE_NM})
692
+ endif()
693
+ if(NOT CMAKE_CLANG_RANLIB)
694
+ set(CMAKE_CLANG_RANLIB ${CMAKE_RANLIB})
695
+ endif()
696
+ message(STATUS "Assume Link-Time Optimization by CLANG/LLVM is available via ${CMAKE_TOOLCHAIN_FILE}")
697
+ else()
698
+ set(CLANG_LTO_AVAILABLE FALSE)
699
+ message(STATUS "Link-Time Optimization by CLANG/LLVM is NOT available")
700
+ endif()
701
+ endif()
702
+
703
+ # Perform build type specific configuration.
704
+ option(
705
+ ENABLE_BACKTRACE
706
+ "Enable output of fiber backtrace information in 'show
707
+ fiber' administrative command. Only works on x86 architectures, if compiled
708
+ with gcc. If GNU binutils and binutils-dev libraries are installed, backtrace
709
+ is output with resolved function (symbol) names. Otherwise only frame
710
+ addresses are printed."
711
+ OFF)
712
+
713
+ set(HAVE_BFD FALSE)
714
+ if(ENABLE_BACKTRACE)
715
+ if(NOT (X86_32 OR X86_64) OR NOT CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG})
716
+ # We only know this option to work with gcc
717
+ message(
718
+ FATAL_ERROR
719
+ "ENABLE_BACKTRACE option is set but the system
720
+ is not x86 based (${CMAKE_SYSTEM_PROCESSOR}) or the compiler
721
+ is not GNU GCC (${CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER}).")
722
+ endif()
723
+ # Use GNU bfd if present.
724
+ find_library(BFD_LIBRARY NAMES libbfd.a)
725
+ if(BFD_LIBRARY)
726
+ check_library_exists(${BFD_LIBRARY} bfd_init "" HAVE_BFD_LIB)
727
+ endif()
728
+ find_library(IBERTY_LIBRARY NAMES libiberty.a)
729
+ if(IBERTY_LIBRARY)
730
+ check_library_exists(${IBERTY_LIBRARY} cplus_demangle "" HAVE_IBERTY_LIB)
731
+ endif()
732
+ set(CMAKE_REQUIRED_DEFINITIONS -DPACKAGE=${PACKAGE} -DPACKAGE_VERSION=${PACKAGE_VERSION})
733
+ check_include_files(bfd.h HAVE_BFD_H)
734
+ set(CMAKE_REQUIRED_DEFINITIONS)
735
+ find_package(ZLIB)
736
+ if(HAVE_BFD_LIB
737
+ AND HAVE_BFD_H
738
+ AND HAVE_IBERTY_LIB
739
+ AND ZLIB_FOUND)
740
+ set(HAVE_BFD ON)
741
+ set(BFD_LIBRARIES ${BFD_LIBRARY} ${IBERTY_LIBRARY} ${ZLIB_LIBRARIES})
742
+ find_package_message(BFD_LIBRARIES "Found libbfd and dependencies" ${BFD_LIBRARIES})
743
+ if(TARGET_OS_FREEBSD AND NOT TARGET_OS_DEBIAN_FREEBSD)
744
+ set(BFD_LIBRARIES ${BFD_LIBRARIES} iconv)
745
+ endif()
746
+ endif()
747
+ endif()
748
+
749
+ macro(setup_compile_flags)
750
+ # save initial C/CXX flags
751
+ if(NOT INITIAL_CMAKE_FLAGS_SAVED)
752
+ if(CMAKE_CXX_COMPILER_LOADED)
753
+ set(INITIAL_CMAKE_CXX_FLAGS
754
+ ${CMAKE_CXX_FLAGS}
755
+ CACHE STRING "Initial CMake's flags" FORCE)
756
+ endif()
757
+ if(CMAKE_C_COMPILER_LOADED)
758
+ set(INITIAL_CMAKE_C_FLAGS
759
+ ${CMAKE_C_FLAGS}
760
+ CACHE STRING "Initial CMake's flags" FORCE)
761
+ endif()
762
+ set(INITIAL_CMAKE_EXE_LINKER_FLAGS
763
+ ${CMAKE_EXE_LINKER_FLAGS}
764
+ CACHE STRING "Initial CMake's flags" FORCE)
765
+ set(INITIAL_CMAKE_SHARED_LINKER_FLAGS
766
+ ${CMAKE_SHARED_LINKER_FLAGS}
767
+ CACHE STRING "Initial CMake's flags" FORCE)
768
+ set(INITIAL_CMAKE_STATIC_LINKER_FLAGS
769
+ ${CMAKE_STATIC_LINKER_FLAGS}
770
+ CACHE STRING "Initial CMake's flags" FORCE)
771
+ set(INITIAL_CMAKE_MODULE_LINKER_FLAGS
772
+ ${CMAKE_MODULE_LINKER_FLAGS}
773
+ CACHE STRING "Initial CMake's flags" FORCE)
774
+ set(INITIAL_CMAKE_FLAGS_SAVED
775
+ TRUE
776
+ CACHE INTERNAL "State of initial CMake's flags" FORCE)
777
+ endif()
778
+
779
+ # reset C/CXX flags
780
+ if(CMAKE_CXX_COMPILER_LOADED)
781
+ set(CXX_FLAGS ${INITIAL_CMAKE_CXX_FLAGS})
782
+ # Crutch for old C++ compilers and/or CMake to enabling C++11
783
+ if(CXX_FALLBACK_GNU11)
784
+ add_compile_flags("CXX" "-std=gnu++11")
785
+ elseif(CXX_FALLBACK_11)
786
+ add_compile_flags("CXX" "-std=c++11")
787
+ endif()
788
+ endif()
789
+ if(CMAKE_C_COMPILER_LOADED)
790
+ set(C_FLAGS ${INITIAL_CMAKE_C_FLAGS})
791
+ # Crutch for mad C compilers and/or CMake to enabling C11
792
+ if(C_FALLBACK_GNU11)
793
+ add_compile_flags("C" "-std=gnu11")
794
+ elseif(C_FALLBACK_11)
795
+ if(MSVC)
796
+ add_compile_flags("C" "/std:c11")
797
+ else()
798
+ add_compile_flags("C" "-std=c11")
799
+ endif()
800
+ endif()
801
+ endif()
802
+ set(EXE_LINKER_FLAGS ${INITIAL_CMAKE_EXE_LINKER_FLAGS})
803
+ set(SHARED_LINKER_FLAGS ${INITIAL_CMAKE_SHARED_LINKER_FLAGS})
804
+ set(STATIC_LINKER_FLAGS ${INITIAL_CMAKE_STATIC_LINKER_FLAGS})
805
+ set(MODULE_LINKER_FLAGS ${INITIAL_CMAKE_MODULE_LINKER_FLAGS})
806
+
807
+ if(CC_HAS_FEXCEPTIONS)
808
+ add_compile_flags("C;CXX" "-fexceptions")
809
+ endif()
810
+ if(CC_HAS_FCXX_EXCEPTIONS)
811
+ add_compile_flags("CXX" "-fcxx-exceptions" "-frtti")
812
+ endif()
813
+ if(CC_HAS_FNO_SEMANTIC_INTERPOSITION AND NOT CMAKE_COMPILER_IS_CLANG)
814
+ add_compile_flags("C;CXX" "-fno-semantic-interposition")
815
+ endif()
816
+ if(MSVC)
817
+ # checks for /EHa or /clr options exists, i.e. is enabled structured async WinNT exceptions
818
+ string(REGEX MATCH "^(.* )*[-/]EHc*a( .*)*$" msvc_async_eh_enabled "${CXX_FLAGS}" "${C_FLAGS}")
819
+ string(REGEX MATCH "^(.* )*[-/]clr( .*)*$" msvc_clr_enabled "${CXX_FLAGS}" "${C_FLAGS}")
820
+ # remote any /EH? options
821
+ string(REGEX REPLACE "( *[-/]-*EH[csa]+ *)+" "" CXX_FLAGS "${CXX_FLAGS}")
822
+ string(REGEX REPLACE "( *[-/]-*EH[csa]+ *)+" "" C_FLAGS "${C_FLAGS}")
823
+ if(msvc_clr_enabled STREQUAL "")
824
+ if(NOT msvc_async_eh_enabled STREQUAL "")
825
+ add_compile_flags("C;CXX" "/EHa")
826
+ else()
827
+ add_compile_flags("C;CXX" "/EHsc")
828
+ endif()
829
+ endif()
830
+ endif(MSVC)
831
+
832
+ if(CC_HAS_WNO_ATTRIBUTES
833
+ AND CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG}
834
+ AND CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 9)
835
+ # GCC < 9.x generates false-positive warnings for optimization attributes
836
+ add_compile_flags("C;CXX" "-Wno-attributes")
837
+ if(LTO_ENABLED)
838
+ add_compile_flags("C;CXX" "-Wno-lto-type-mismatch")
839
+ endif()
840
+ endif()
841
+
842
+ # In C a global variable without a storage specifier (static/extern) and without an initialiser is called a ’tentative
843
+ # definition’. The language permits multiple tentative definitions in the single translation unit; i.e. int foo; int
844
+ # foo; is perfectly ok. GNU toolchain goes even further, allowing multiple tentative definitions in *different*
845
+ # translation units. Internally, variables introduced via tentative definitions are implemented as ‘common’ symbols.
846
+ # Linker permits multiple definitions if they are common symbols, and it picks one arbitrarily for inclusion in the
847
+ # binary being linked.
848
+ #
849
+ # -fno-common forces GNU toolchain to behave in a more standard-conformant way in respect to tentative definitions and
850
+ # it prevents common symbols generation. Since we are a cross-platform project it really makes sense. There are
851
+ # toolchains that don’t implement GNU style handling of the tentative definitions and there are platforms lacking
852
+ # proper support for common symbols (osx).
853
+ if(CC_HAS_FNO_COMMON)
854
+ add_compile_flags("C;CXX" "-fno-common")
855
+ endif()
856
+
857
+ if(CC_HAS_GGDB)
858
+ add_compile_flags("C;CXX" "-ggdb")
859
+ endif()
860
+
861
+ if(CC_HAS_WNO_UNKNOWN_PRAGMAS AND NOT HAVE_OPENMP)
862
+ add_compile_flags("C;CXX" "-Wno-unknown-pragmas")
863
+ endif()
864
+
865
+ if(CC_HAS_SECTIONS)
866
+ add_compile_flags("C;CXX" "-ffunction-sections" "-fdata-sections")
867
+ elseif(MSVC)
868
+ add_compile_flags("C;CXX" "/Gy")
869
+ endif()
870
+
871
+ # We must set -fno-omit-frame-pointer here, since we rely on frame pointer when getting a backtrace, and it must be
872
+ # used consistently across all object files. The same reasoning applies to -fno-stack-protector switch.
873
+ if(ENABLE_BACKTRACE)
874
+ if(CC_HAS_FNO_OMIT_FRAME_POINTER)
875
+ add_compile_flags("C;CXX" "-fno-omit-frame-pointer")
876
+ endif()
877
+ endif()
878
+
879
+ if(MSVC)
880
+ if(MSVC_VERSION LESS 1900)
881
+ message(
882
+ FATAL_ERROR
883
+ "At least \"Microsoft C/C++ Compiler\" version 19.0.24234.1 (Visual Studio 2015 Update 3) is required.")
884
+ endif()
885
+ if(NOT MSVC_VERSION LESS 1910)
886
+ add_compile_flags("CXX" "/Zc:__cplusplus")
887
+ endif()
888
+ remove_compile_flag("C;CXX" "/W3")
889
+ add_compile_flags("C;CXX" "/W4 /utf-8 /bigobj")
890
+ else()
891
+ if(CC_HAS_WALL)
892
+ add_compile_flags("C;CXX" "-Wall")
893
+ endif()
894
+ if(CC_HAS_WEXTRA)
895
+ add_compile_flags("C;CXX" "-Wextra")
896
+ endif()
897
+ endif()
898
+
899
+ add_definitions("-D__STDC_FORMAT_MACROS=1")
900
+ add_definitions("-D__STDC_LIMIT_MACROS=1")
901
+ add_definitions("-D__STDC_CONSTANT_MACROS=1")
902
+ add_definitions("-D_HAS_EXCEPTIONS=1")
903
+
904
+ # Only add -Werror if it's a debug build, done by developers. Release builds should not cause extra trouble.
905
+ if(CC_HAS_WERROR
906
+ AND (CI
907
+ OR CMAKE_CONFIGURATION_TYPES
908
+ OR CMAKE_BUILD_TYPE STREQUAL "Debug"))
909
+ if(MSVC)
910
+ add_compile_flags("C;CXX" "/WX")
911
+ elseif(CMAKE_COMPILER_IS_CLANG)
912
+ if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 6)
913
+ add_compile_flags("C;CXX" "-Werror")
914
+ endif()
915
+ elseif(CMAKE_COMPILER_IS_GNUCC)
916
+ if(NOT CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 6)
917
+ add_compile_flags("C;CXX" "-Werror")
918
+ endif()
919
+ else()
920
+ add_compile_flags("C;CXX" "-Werror")
921
+ endif()
922
+ endif()
923
+
924
+ if(CMAKE_COMPILER_IS_GNU${CMAKE_PRIMARY_LANG} AND CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 5)
925
+ # G++ bug. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31488
926
+ add_compile_flags("CXX" "-Wno-invalid-offsetof")
927
+ endif()
928
+ if(MINGW)
929
+ # Disable junk MINGW's warnings that issued due to incompatibilities and shortcomings of MINGW, since the code is
930
+ # checked by builds with GCC, CLANG and MSVC.
931
+ add_compile_flags("C;CXX" "-Wno-format-extra-args" "-Wno-format" "-Wno-cast-function-type"
932
+ "-Wno-implicit-fallthrough")
933
+ endif()
934
+
935
+ if(ENABLE_ASAN)
936
+ if(NOT MSVC)
937
+ add_compile_flags("C;CXX" "-fsanitize=address")
938
+ else()
939
+ add_compile_flags("C;CXX" "/fsanitize=address")
940
+ endif()
941
+ add_definitions(-DASAN_ENABLED=1)
942
+ endif()
943
+
944
+ if(ENABLE_UBSAN)
945
+ if(NOT MSVC)
946
+ add_compile_flags("C;CXX" "-fsanitize=undefined" "-fsanitize-undefined-trap-on-error")
947
+ else()
948
+ add_compile_flags("C;CXX" "/fsanitize=undefined")
949
+ endif()
950
+ add_definitions(-DUBSAN_ENABLED=1)
951
+ endif()
952
+
953
+ if(ENABLE_GCOV)
954
+ if(NOT HAVE_GCOV)
955
+ message(FATAL_ERROR "ENABLE_GCOV option requested but gcov library is not found")
956
+ endif()
957
+
958
+ add_compile_flags("C;CXX" "-fprofile-arcs" "-ftest-coverage")
959
+ set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
960
+ set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
961
+ set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage")
962
+ # add_library(gcov SHARED IMPORTED)
963
+ endif()
964
+
965
+ if(ENABLE_GPROF)
966
+ add_compile_flags("C;CXX" "-pg")
967
+ endif()
968
+
969
+ if(CMAKE_COMPILER_IS_GNUCC AND LTO_ENABLED)
970
+ add_compile_flags("C;CXX" ${GCC_LTO_CFLAGS})
971
+ set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm -fwhole-program")
972
+ set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm")
973
+ set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${GCC_LTO_CFLAGS} -fverbose-asm")
974
+ if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
975
+ # Pass the same optimization flags to the linker
976
+ set(compile_flags "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPERCASE}}")
977
+ set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${compile_flags}")
978
+ set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${compile_flags}")
979
+ set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${compile_flags}")
980
+ unset(compile_flags)
981
+ else()
982
+ add_compile_flags("CXX" "-flto-odr-type-merging")
983
+ endif()
984
+ endif()
985
+
986
+ if(MSVC
987
+ AND NOT CMAKE_COMPILER_IS_CLANG
988
+ AND LTO_ENABLED)
989
+ add_compile_flags("C;CXX" "/GL")
990
+ foreach(linkmode IN ITEMS EXE SHARED STATIC MODULE)
991
+ set(${linkmode}_LINKER_FLAGS "${${linkmode}_LINKER_FLAGS} /LTCG")
992
+ string(REGEX REPLACE "^(.*)(/INCREMENTAL)(:YES)?(:NO)?( ?.*)$" "\\1\\2:NO\\5" ${linkmode}_LINKER_FLAGS
993
+ "${${linkmode}_LINKER_FLAGS}")
994
+ string(STRIP "${${linkmode}_LINKER_FLAGS}" ${linkmode}_LINKER_FLAGS)
995
+ foreach(
996
+ config IN
997
+ LISTS CMAKE_CONFIGURATION_TYPES
998
+ ITEMS Release MinSizeRel RelWithDebInfo Debug)
999
+ string(TOUPPER "${config}" config_uppercase)
1000
+ if(DEFINED "CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}")
1001
+ string(REGEX REPLACE "^(.*)(/INCREMENTAL)(:YES)?(:NO)?( ?.*)$" "\\1\\2:NO\\5" altered_flags
1002
+ "${CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}}")
1003
+ string(STRIP "${altered_flags}" altered_flags)
1004
+ if(NOT "${altered_flags}" STREQUAL "${CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}}")
1005
+ set(CMAKE_${linkmode}_LINKER_FLAGS_${config_uppercase}
1006
+ "${altered_flags}"
1007
+ CACHE STRING "Altered: '/INCREMENTAL' removed for LTO" FORCE)
1008
+ endif()
1009
+ endif()
1010
+ endforeach(config)
1011
+ endforeach(linkmode)
1012
+ unset(linkmode)
1013
+
1014
+ foreach(
1015
+ config IN
1016
+ LISTS CMAKE_CONFIGURATION_TYPES
1017
+ ITEMS Release MinSizeRel RelWithDebInfo)
1018
+ foreach(lang IN ITEMS C CXX)
1019
+ string(TOUPPER "${config}" config_uppercase)
1020
+ if(DEFINED "CMAKE_${lang}_FLAGS_${config_uppercase}")
1021
+ string(REPLACE "/O2" "/Ox" altered_flags "${CMAKE_${lang}_FLAGS_${config_uppercase}}")
1022
+ if(NOT "${altered_flags}" STREQUAL "${CMAKE_${lang}_FLAGS_${config_uppercase}}")
1023
+ set(CMAKE_${lang}_FLAGS_${config_uppercase}
1024
+ "${altered_flags}"
1025
+ CACHE STRING "Altered: '/O2' replaced by '/Ox' for LTO" FORCE)
1026
+ endif()
1027
+ endif()
1028
+ unset(config_uppercase)
1029
+ endforeach(lang)
1030
+ endforeach(config)
1031
+ unset(altered_flags)
1032
+ unset(lang)
1033
+ unset(config)
1034
+ endif()
1035
+
1036
+ if(CMAKE_COMPILER_IS_CLANG AND OSX_ARCHITECTURES)
1037
+ set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
1038
+ set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
1039
+ set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} -Wl,-keep_dwarf_unwind")
1040
+ endif()
1041
+
1042
+ if(CMAKE_COMPILER_IS_CLANG AND LTO_ENABLED)
1043
+ if(CMAKE_${CMAKE_PRIMARY_LANG}_COMPILER_VERSION VERSION_LESS 3.9)
1044
+ set(CLANG_LTO_FLAG "-flto")
1045
+ else()
1046
+ set(CLANG_LTO_FLAG "-flto=thin")
1047
+ endif()
1048
+ add_compile_flags("C;CXX" ${CLANG_LTO_FLAG})
1049
+ if(NOT MSVC)
1050
+ set(EXE_LINKER_FLAGS "${EXE_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm -fwhole-program")
1051
+ set(SHARED_LINKER_FLAGS "${SHARED_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm")
1052
+ set(MODULE_LINKER_FLAGS "${MODULE_LINKER_FLAGS} ${CLANG_LTO_FLAG} -fverbose-asm")
1053
+ endif()
1054
+ endif()
1055
+
1056
+ # push C/CXX flags into the cache
1057
+ if(CMAKE_CXX_COMPILER_LOADED)
1058
+ set(CMAKE_CXX_FLAGS
1059
+ ${CXX_FLAGS}
1060
+ CACHE STRING "Flags used by the C++ compiler during all build types" FORCE)
1061
+ unset(CXX_FLAGS)
1062
+ endif()
1063
+ if(CMAKE_C_COMPILER_LOADED)
1064
+ set(CMAKE_C_FLAGS
1065
+ ${C_FLAGS}
1066
+ CACHE STRING "Flags used by the C compiler during all build types" FORCE)
1067
+ unset(C_FLAGS)
1068
+ endif()
1069
+ set(CMAKE_EXE_LINKER_FLAGS
1070
+ ${EXE_LINKER_FLAGS}
1071
+ CACHE STRING "Flags used by the linker" FORCE)
1072
+ set(CMAKE_SHARED_LINKER_FLAGS
1073
+ ${SHARED_LINKER_FLAGS}
1074
+ CACHE STRING "Flags used by the linker during the creation of dll's" FORCE)
1075
+ set(CMAKE_STATIC_LINKER_FLAGS
1076
+ ${STATIC_LINKER_FLAGS}
1077
+ CACHE STRING "Flags used by the linker during the creation of static libraries" FORCE)
1078
+ set(CMAKE_MODULE_LINKER_FLAGS
1079
+ ${MODULE_LINKER_FLAGS}
1080
+ CACHE STRING "Flags used by the linker during the creation of modules" FORCE)
1081
+ unset(EXE_LINKER_FLAGS)
1082
+ unset(SHARED_LINKER_FLAGS)
1083
+ unset(STATIC_LINKER_FLAGS)
1084
+ unset(MODULE_LINKER_FLAGS)
1085
+ endmacro(setup_compile_flags)
1086
+
1087
+ macro(probe_libcxx_filesystem)
1088
+ if(CMAKE_CXX_COMPILER_LOADED AND NOT DEFINED LIBCXX_FILESYSTEM)
1089
+ list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 HAS_CXX11)
1090
+ if(NOT HAS_CXX11 LESS 0
1091
+ OR CXX_FALLBACK_GNU11
1092
+ OR CXX_FALLBACK_11)
1093
+ include(CMakePushCheckState)
1094
+ include(CheckCXXSourceCompiles)
1095
+ cmake_push_check_state()
1096
+ set(stdfs_probe_save_libraries ${CMAKE_REQUIRED_LIBRARIES})
1097
+ set(stdfs_probe_save_flags ${CMAKE_REQUIRED_FLAGS})
1098
+ set(stdfs_probe_flags ${CMAKE_REQUIRED_FLAGS})
1099
+ set(stdfs_probe_save_link_options ${CMAKE_REQUIRED_LINK_OPTIONS})
1100
+ unset(stdfs_probe_clear_cxx_standard)
1101
+ if(NOT DEFINED CMAKE_CXX_STANDARD)
1102
+ list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_14 HAS_CXX14)
1103
+ list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_17 HAS_CXX17)
1104
+ if(NOT HAS_CXX17 LESS 0 AND NOT (CMAKE_COMPILER_IS_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5))
1105
+ set(CMAKE_CXX_STANDARD 17)
1106
+ elseif(NOT HAS_CXX14 LESS 0)
1107
+ set(CMAKE_CXX_STANDARD 14)
1108
+ elseif(NOT HAS_CXX11 LESS 0)
1109
+ set(CMAKE_CXX_STANDARD 11)
1110
+ elseif(CXX_FALLBACK_GNU11)
1111
+ set(stdfs_probe_flags ${stdfs_probe_flags} "-std=gnu++11")
1112
+ else()
1113
+ set(stdfs_probe_flags ${stdfs_probe_flags} "-std=c++11")
1114
+ endif()
1115
+ set(stdfs_probe_clear_cxx_standard ON)
1116
+ endif()
1117
+ if(CMAKE_COMPILER_IS_ELBRUSCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 1.25.23)
1118
+ if(CMAKE_VERSION VERSION_LESS 3.14)
1119
+ set(stdfs_probe_flags ${stdfs_probe_flags} "-Wl,--allow-multiple-definition")
1120
+ else()
1121
+ set(CMAKE_REQUIRED_LINK_OPTIONS ${stdfs_probe_save_link_options} "-Wl,--allow-multiple-definition")
1122
+ endif()
1123
+ endif()
1124
+ set(CMAKE_REQUIRED_FLAGS ${stdfs_probe_flags})
1125
+
1126
+ set(stdfs_probe_code
1127
+ [[
1128
+ #if defined(__SIZEOF_INT128__) && !defined(__GLIBCXX_TYPE_INT_N_0) && defined(__clang__) && __clang_major__ < 4
1129
+ #define __GLIBCXX_BITSIZE_INT_N_0 128
1130
+ #define __GLIBCXX_TYPE_INT_N_0 __int128
1131
+ #endif
1132
+
1133
+ #ifndef __has_include
1134
+ #define __has_include(header) (0)
1135
+ #endif
1136
+ #if __has_include(<version>)
1137
+ #include <version>
1138
+ #endif
1139
+ #include <cstdlib>
1140
+ #include <string>
1141
+ #if defined(__cpp_lib_string_view) && __cpp_lib_string_view >= 201606L
1142
+ #include <string_view>
1143
+ #endif
1144
+
1145
+ #if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L
1146
+ #include <filesystem>
1147
+ #else
1148
+ #include <experimental/filesystem>
1149
+ #endif
1150
+
1151
+ #if (defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500) && (!defined(__IPHONE_OS_VERSION_MIN_REQUIRED) || __IPHONE_OS_VERSION_MIN_REQUIRED >= 130100))
1152
+ namespace fs = ::std::filesystem;
1153
+ #elif defined(__cpp_lib_experimental_filesystem) && __cpp_lib_experimental_filesystem >= 201406L
1154
+ namespace fs = ::std::experimental::filesystem;
1155
+ #elif (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500) || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130100)
1156
+ #error "Select a newer target OSX/iOS to support C++17 std::filesystem"
1157
+ #else
1158
+ #error "No support for C++17 std::filesystem"
1159
+ #endif
1160
+
1161
+ int main(int argc, const char*argv[]) {
1162
+ std::string str(argv[0]);
1163
+ fs::path probe(str);
1164
+ if (argc != 1) throw fs::filesystem_error(std::string("fake"), std::error_code());
1165
+ int r = fs::is_directory(probe.relative_path());
1166
+ for (auto const& i : fs::directory_iterator(probe)) {
1167
+ ++r;
1168
+ (void)i;
1169
+ }
1170
+ return r;
1171
+ }
1172
+ ]])
1173
+ set(LIBCXX_FILESYSTEM "")
1174
+
1175
+ check_cxx_source_compiles("${stdfs_probe_code}" LIBCXX_FILESYSTEM_none)
1176
+ if(LIBCXX_FILESYSTEM_none)
1177
+ message(STATUS "No linking with additional library needed for std::filesystem")
1178
+ else()
1179
+ set(CMAKE_REQUIRED_LIBRARIES ${stdfs_probe_save_libraries} "stdc++fs")
1180
+ check_cxx_source_compiles("${stdfs_probe_code}" LIBCXX_FILESYSTEM_stdcxxfs)
1181
+ if(LIBCXX_FILESYSTEM_stdcxxfs)
1182
+ set(LIBCXX_FILESYSTEM "stdc++fs")
1183
+ message(STATUS "Linking with ${LIBCXX_FILESYSTEM} is required for std::filesystem")
1184
+ else()
1185
+ set(CMAKE_REQUIRED_LIBRARIES ${stdfs_probe_save_libraries} "c++fs")
1186
+ check_cxx_source_compiles("${stdfs_probe_code}" LIBCXX_FILESYSTEM_cxxfs)
1187
+ if(LIBCXX_FILESYSTEM_cxxfs)
1188
+ set(LIBCXX_FILESYSTEM "c++fs")
1189
+ message(STATUS "Linking with ${LIBCXX_FILESYSTEM} is required for std::filesystem")
1190
+ else()
1191
+ set(CMAKE_REQUIRED_LIBRARIES ${stdfs_probe_save_libraries} "c++experimental")
1192
+ check_cxx_source_compiles("${stdfs_probe_code}" LIBCXX_FILESYSTEM_cxxexperimental)
1193
+ if(LIBCXX_FILESYSTEM_cxxexperimental)
1194
+ set(LIBCXX_FILESYSTEM "c++experimental")
1195
+ message(STATUS "Linking with ${LIBCXX_FILESYSTEM} is required for std::filesystem")
1196
+ else()
1197
+ message(STATUS "No support for std::filesystem")
1198
+ endif()
1199
+ endif()
1200
+ endif()
1201
+ endif()
1202
+
1203
+ set(CMAKE_REQUIRED_LINK_OPTIONS ${stdfs_probe_save_link_options})
1204
+ set(CMAKE_REQUIRED_FLAGS ${stdfs_probe_save_flags})
1205
+ set(CMAKE_REQUIRED_LIBRARIES ${stdfs_probe_save_libraries})
1206
+ if(stdfs_probe_clear_cxx_standard)
1207
+ unset(CMAKE_CXX_STANDARD)
1208
+ endif()
1209
+ unset(stdfs_probe_clear_cxx_standard)
1210
+ unset(stdfs_probe_save_link_options)
1211
+ unset(stdfs_probe_save_flags)
1212
+ unset(stdfs_probe_flags)
1213
+ unset(stdfs_probe_save_libraries)
1214
+ unset(stdfs_probe_code)
1215
+ unset(stdfs_probe_rc)
1216
+ cmake_pop_check_state()
1217
+ endif()
1218
+ endif()
1219
+ endmacro(probe_libcxx_filesystem)
1220
+
1221
+ cmake_policy(POP)