FindLevelDB.cmake raw
1 # Copyright (c) 2025-present The Limenka Knots 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 check_source_compiles(
30 CXX
31 [[
32 #include <leveldb/env.h>
33 #include <memenv.h>
34
35 int main() {
36 leveldb::Env *myenv = leveldb::NewMemEnv(leveldb::Env::Default());
37 delete myenv;
38 }
39 ]]
40 "${cachevar}"
41 )
42 cmake_pop_check_state()
43 endfunction()
44
45 function(find_leveldb_libs release_type suffixes _LevelDB_lib_hint)
46 find_library("LevelDB_LIBRARY_${release_type}"
47 NAMES leveldb
48 HINTS "${_LevelDB_lib_hint}"
49 PATH_SUFFIXES "${suffixes}"
50 )
51 mark_as_advanced("LevelDB_LIBRARY_${release_type}")
52
53 _try_leveldb_compile("${LevelDB_LIBRARY_${release_type}}" "LevelDB_memenv_works_without_helper_lib_${release_type}")
54 if(LevelDB_memenv_works_without_helper_lib_${release_type})
55 set("LevelDB_MemEnv_LIBRARY_${release_type}" "" CACHE STRING "")
56 set(LevelDB_MemEnv_FOUND ON CACHE INTERNAL "")
57 else()
58 find_library("LevelDB_MemEnv_LIBRARY_${release_type}"
59 NAMES memenv
60 HINTS "${_LevelDB_lib_hint}"
61 PATH_SUFFIXES "${suffixes}"
62 )
63
64 set(libs ${LevelDB_LIBRARY_${release_type}} ${LevelDB_MemEnv_LIBRARY_${release_type}})
65 _try_leveldb_compile("${libs}" "LevelDB_memenv_works_with_helper_lib_${release_type}")
66 if(NOT LevelDB_memenv_works_with_helper_lib_${release_type})
67 set(LevelDB_MemEnv_FOUND OFF CACHE INTERNAL "")
68 endif()
69 endif()
70 mark_as_advanced("LevelDB_MemEnv_LIBRARY_${release_type}")
71 endfunction()
72
73 get_filename_component(_LevelDB_lib_hint "${LevelDB_INCLUDE_DIR}" DIRECTORY)
74
75 find_leveldb_libs(RELEASE lib "${_LevelDB_lib_hint}")
76 find_leveldb_libs(DEBUG debug/lib "${_LevelDB_lib_hint}")
77
78 unset(_LevelDB_lib_hint)
79
80 include(SelectLibraryConfigurations)
81 select_library_configurations(LevelDB)
82 select_library_configurations(LevelDB_MemEnv)
83
84 include(FindPackageHandleStandardArgs)
85 find_package_handle_standard_args(LevelDB
86 REQUIRED_VARS LevelDB_LIBRARY LevelDB_INCLUDE_DIR LevelDB_MemEnv_INCLUDE_DIR LevelDB_MemEnv_FOUND
87 )
88
89 if(LevelDB_FOUND)
90 message(CHECK_PASS "found")
91 if(NOT TARGET leveldb)
92 add_library(leveldb UNKNOWN IMPORTED)
93 set_target_properties(leveldb PROPERTIES
94 INTERFACE_INCLUDE_DIRECTORIES "${LevelDB_INCLUDE_DIR};${LevelDB_MemEnv_INCLUDE_DIR}"
95 )
96 if(LevelDB_LIBRARY_RELEASE)
97 set_property(TARGET leveldb APPEND PROPERTY
98 IMPORTED_CONFIGURATIONS RELEASE
99 )
100 set_target_properties(leveldb PROPERTIES
101 IMPORTED_LOCATION_RELEASE "${LevelDB_LIBRARY_RELEASE}"
102 IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE "${LevelDB_MemEnv_LIBRARY_RELEASE}"
103 )
104 endif()
105 if(LevelDB_LIBRARY_DEBUG)
106 set_property(TARGET leveldb APPEND PROPERTY
107 IMPORTED_CONFIGURATIONS DEBUG
108 )
109 set_target_properties(leveldb PROPERTIES
110 IMPORTED_LOCATION_DEBUG "${LevelDB_LIBRARY_DEBUG}"
111 IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG "${LevelDB_MemEnv_LIBRARY_DEBUG}"
112 )
113 endif()
114 endif()
115 else()
116 message(CHECK_FAIL "not found")
117 endif()
118