Skip to content
Bitcoin Roots

v31.1-roots.1 · Commit 1: [PATCH 01/17] build(roots): establish v31 portability foundation

cmake/module/FindLevelDB.cmake

Before: /dev/null · After: cmake/module/FindLevelDB.cmake

File metadata
new file mode 100644
index 0000000000000000000000000000000000000000..2f9075fa9e689cb06769d8a12fdeaa9fcf669f27

Download original patch · Release notes

Diff rows 1–143 of 143. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

cmake/module/FindLevelDB.cmake ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2025-present The Bitcoin Roots developers
2
+ # Distributed under the MIT software license, see the accompanying
3
+ # file COPYING or https://opensource.org/license/mit/.
4
+
5
+ include(CheckSourceCompiles)
6
+ include(CMakePushCheckState)
7
+
8
+ message(CHECK_START "Looking for system LevelDB")
9
+
10
+ find_path(LevelDB_INCLUDE_DIR
11
+ NAMES leveldb/filter_policy.h
12
+ DOC "Path to LevelDB include directory (ie, the directory ABOVE leveldb/db.h)"
13
+ )
14
+ mark_as_advanced(LevelDB_INCLUDE_DIR)
15
+
16
+ find_path(LevelDB_MemEnv_INCLUDE_DIR
17
+ NAMES memenv.h
18
+ HINTS "${LevelDB_INCLUDE_DIR}/leveldb/helpers"
19
+ DOC "Path to include directory for MemEnv LevelDB helper (ie, the directory with memenv.h)"
20
+ )
21
+ mark_as_advanced(LevelDB_MemEnv_INCLUDE_DIR)
22
+
23
+ function(_try_leveldb_compile libs cachevar)
24
+ cmake_push_check_state(RESET)
25
+ list(APPEND CMAKE_REQUIRED_INCLUDES "${LevelDB_INCLUDE_DIR}")
26
+ list(APPEND CMAKE_REQUIRED_INCLUDES "${LevelDB_MemEnv_INCLUDE_DIR}")
27
+ list(APPEND CMAKE_REQUIRED_LIBRARIES "${libs}")
28
+ set(CMAKE_REQUIRED_QUIET 1)
29
+ unset(${cachevar} CACHE)
30
+ check_source_compiles(
31
+ CXX
32
+ [[
33
+ #include <leveldb/env.h>
34
+ #include <memenv.h>
35
+
36
+ int main() {
37
+ leveldb::Env *myenv = leveldb::NewMemEnv(leveldb::Env::Default());
38
+ delete myenv;
39
+ }
40
+ ]]
41
+ "${cachevar}"
42
+ )
43
+ cmake_pop_check_state()
44
+ endfunction()
45
+
46
+ function(find_leveldb_libs release_type suffixes _LevelDB_lib_hint)
47
+ find_library("LevelDB_LIBRARY_${release_type}"
48
+ NAMES leveldb
49
+ HINTS "${_LevelDB_lib_hint}"
50
+ PATH_SUFFIXES "${suffixes}"
51
+ )
52
+ mark_as_advanced("LevelDB_LIBRARY_${release_type}")
53
+
54
+ if(NOT LevelDB_LIBRARY_${release_type})
55
+ set("LevelDB_MemEnv_LINKABLE_${release_type}" OFF PARENT_SCOPE)
56
+ return()
57
+ endif()
58
+
59
+ _try_leveldb_compile("${LevelDB_LIBRARY_${release_type}}" "LevelDB_memenv_works_without_helper_lib_${release_type}")
60
+ if(LevelDB_memenv_works_without_helper_lib_${release_type})
61
+ # This configuration needs no helper; do not link a previously cached one.
62
+ set("LevelDB_MemEnv_LIBRARY_${release_type}" "" PARENT_SCOPE)
63
+ set("LevelDB_MemEnv_LINKABLE_${release_type}" ON PARENT_SCOPE)
64
+ else()
65
+ # Older successful integrated probes cached an empty helper path. CMake's
66
+ # find_library treats that as resolved, even after the selected base library
67
+ # changes to a package that needs a separate helper.
68
+ if("${LevelDB_MemEnv_LIBRARY_${release_type}}" STREQUAL "")
69
+ unset("LevelDB_MemEnv_LIBRARY_${release_type}" CACHE)
70
+ unset("LevelDB_MemEnv_LIBRARY_${release_type}")
71
+ endif()
72
+ find_library("LevelDB_MemEnv_LIBRARY_${release_type}"
73
+ NAMES memenv
74
+ HINTS "${_LevelDB_lib_hint}"
75
+ PATH_SUFFIXES "${suffixes}"
76
+ )
77
+
78
+ set(libs ${LevelDB_LIBRARY_${release_type}} ${LevelDB_MemEnv_LIBRARY_${release_type}})
79
+ _try_leveldb_compile("${libs}" "LevelDB_memenv_works_with_helper_lib_${release_type}")
80
+ set("LevelDB_MemEnv_LINKABLE_${release_type}"
81
+ "${LevelDB_memenv_works_with_helper_lib_${release_type}}" PARENT_SCOPE
82
+ )
83
+ endif()
84
+ mark_as_advanced("LevelDB_MemEnv_LIBRARY_${release_type}")
85
+ endfunction()
86
+
87
+ get_filename_component(_LevelDB_lib_hint "${LevelDB_INCLUDE_DIR}" DIRECTORY)
88
+
89
+ find_leveldb_libs(RELEASE lib "${_LevelDB_lib_hint}")
90
+ find_leveldb_libs(DEBUG debug/lib "${_LevelDB_lib_hint}")
91
+
92
+ unset(_LevelDB_lib_hint)
93
+
94
+ include(SelectLibraryConfigurations)
95
+ select_library_configurations(LevelDB)
96
+ select_library_configurations(LevelDB_MemEnv)
97
+
98
+ # Validate every available configuration, without rejecting a package that
99
+ # supplies only one configuration (SelectLibraryConfigurations supports this).
100
+ set(LevelDB_MemEnv_LINKABLE ON)
101
+ foreach(release_type IN ITEMS RELEASE DEBUG)
102
+ if(LevelDB_LIBRARY_${release_type} AND NOT LevelDB_MemEnv_LINKABLE_${release_type})
103
+ set(LevelDB_MemEnv_LINKABLE OFF)
104
+ endif()
105
+ endforeach()
106
+
107
+ include(FindPackageHandleStandardArgs)
108
+ find_package_handle_standard_args(LevelDB
109
+ # select_library_configurations sets <name>_FOUND from library presence.
110
+ # Keep the actual link probes separate so an unusable helper cannot pass.
111
+ REQUIRED_VARS LevelDB_LIBRARY LevelDB_INCLUDE_DIR LevelDB_MemEnv_INCLUDE_DIR
112
+ LevelDB_MemEnv_LINKABLE
113
+ )
114
+
115
+ if(LevelDB_FOUND)
116
+ message(CHECK_PASS "found")
117
+ if(NOT TARGET leveldb)
118
+ add_library(leveldb UNKNOWN IMPORTED)
119
+ set_target_properties(leveldb PROPERTIES
120
+ INTERFACE_INCLUDE_DIRECTORIES "${LevelDB_INCLUDE_DIR};${LevelDB_MemEnv_INCLUDE_DIR}"
121
+ )
122
+ if(LevelDB_LIBRARY_RELEASE)
123
+ set_property(TARGET leveldb APPEND PROPERTY
124
+ IMPORTED_CONFIGURATIONS RELEASE
125
+ )
126
+ set_target_properties(leveldb PROPERTIES
127
+ IMPORTED_LOCATION_RELEASE "${LevelDB_LIBRARY_RELEASE}"
128
+ IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "${LevelDB_MemEnv_LIBRARY_RELEASE}"
129
+ )
130
+ endif()
131
+ if(LevelDB_LIBRARY_DEBUG)
132
+ set_property(TARGET leveldb APPEND PROPERTY
133
+ IMPORTED_CONFIGURATIONS DEBUG
134
+ )
135
+ set_target_properties(leveldb PROPERTIES
136
+ IMPORTED_LOCATION_DEBUG "${LevelDB_LIBRARY_DEBUG}"
137
+ IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "${LevelDB_MemEnv_LIBRARY_DEBUG}"
138
+ )
139
+ endif()
140
+ endif()
141
+ else()
142
+ message(CHECK_FAIL "not found")
143
+ endif()