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