FindBerkeleyDB.cmake raw

   1  # Copyright (c) 2023-present The Limenka developers
   2  # Distributed under the MIT software license, see the accompanying
   3  # file COPYING or https://opensource.org/license/mit/.
   4  
   5  #[=======================================================================[
   6  FindBerkeleyDB
   7  --------------
   8  
   9  Finds the Berkeley DB headers and library.
  10  
  11  Imported Targets
  12  ^^^^^^^^^^^^^^^^
  13  
  14  This module provides imported target ``BerkeleyDB::BerkeleyDB``, if
  15  Berkeley DB has been found.
  16  
  17  Result Variables
  18  ^^^^^^^^^^^^^^^^
  19  
  20  This module defines the following variables:
  21  
  22  ``BerkeleyDB_FOUND``
  23    "True" if Berkeley DB found.
  24  
  25  ``BerkeleyDB_VERSION``
  26    The MAJOR.MINOR version of Berkeley DB found.
  27  
  28  #]=======================================================================]
  29  
  30  set(_BerkeleyDB_homebrew_prefix)
  31  if(CMAKE_HOST_APPLE)
  32    find_program(HOMEBREW_EXECUTABLE brew)
  33    if(HOMEBREW_EXECUTABLE)
  34      # The Homebrew package manager installs the berkeley-db* packages as
  35      # "keg-only", which means they are not symlinked into the default prefix.
  36      # To find such a package, the find_path() and find_library() commands
  37      # need additional path hints that are computed by Homebrew itself.
  38      execute_process(
  39        COMMAND ${HOMEBREW_EXECUTABLE} --prefix berkeley-db@4
  40        OUTPUT_VARIABLE _BerkeleyDB_homebrew_prefix
  41        ERROR_QUIET
  42        OUTPUT_STRIP_TRAILING_WHITESPACE
  43      )
  44    endif()
  45  endif()
  46  
  47  find_path(BerkeleyDB_INCLUDE_DIR
  48    NAMES db_cxx.h
  49    HINTS ${_BerkeleyDB_homebrew_prefix}/include
  50    PATH_SUFFIXES 4.8 48 db4.8 4 db4 5.3 db5.3 5 db5
  51  )
  52  mark_as_advanced(BerkeleyDB_INCLUDE_DIR)
  53  unset(_BerkeleyDB_homebrew_prefix)
  54  
  55  if(NOT BerkeleyDB_LIBRARY)
  56    if(VCPKG_TARGET_TRIPLET)
  57      # The vcpkg package manager installs the berkeleydb package with the same name
  58      # of release and debug libraries. Therefore, the default search paths set by
  59      # vcpkg's toolchain file cannot be used to search libraries as the debug one
  60      # will always be found.
  61      set(CMAKE_FIND_USE_CMAKE_PATH FALSE)
  62    endif()
  63  
  64    get_filename_component(_BerkeleyDB_lib_hint "${BerkeleyDB_INCLUDE_DIR}" DIRECTORY)
  65  
  66    find_library(BerkeleyDB_LIBRARY_RELEASE
  67      NAMES db_cxx-4.8 db4_cxx db48 db_cxx-5.3 db_cxx-5 db_cxx libdb48
  68      NAMES_PER_DIR
  69      HINTS ${_BerkeleyDB_lib_hint}
  70      PATH_SUFFIXES lib
  71    )
  72    mark_as_advanced(BerkeleyDB_LIBRARY_RELEASE)
  73  
  74    find_library(BerkeleyDB_LIBRARY_DEBUG
  75      NAMES db_cxx-4.8 db4_cxx db48 db_cxx-5.3 db_cxx-5 db_cxx libdb48
  76      NAMES_PER_DIR
  77      HINTS ${_BerkeleyDB_lib_hint}
  78      PATH_SUFFIXES debug/lib
  79    )
  80    mark_as_advanced(BerkeleyDB_LIBRARY_DEBUG)
  81  
  82    unset(_BerkeleyDB_lib_hint)
  83    unset(CMAKE_FIND_USE_CMAKE_PATH)
  84  
  85    include(SelectLibraryConfigurations)
  86    select_library_configurations(BerkeleyDB)
  87    # The select_library_configurations() command sets BerkeleyDB_FOUND, but we
  88    # want the one from the find_package_handle_standard_args() command below.
  89    unset(BerkeleyDB_FOUND)
  90  endif()
  91  
  92  if(BerkeleyDB_INCLUDE_DIR)
  93    file(STRINGS "${BerkeleyDB_INCLUDE_DIR}/db.h" _BerkeleyDB_version_strings REGEX "^#define[\t ]+DB_VERSION_(MAJOR|MINOR|PATCH)[ \t]+[0-9]+.*")
  94    string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_major "${_BerkeleyDB_version_strings}")
  95    string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_minor "${_BerkeleyDB_version_strings}")
  96    string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_patch "${_BerkeleyDB_version_strings}")
  97    unset(_BerkeleyDB_version_strings)
  98    # The MAJOR.MINOR.PATCH version will be logged in the following find_package_handle_standard_args() command.
  99    set(_BerkeleyDB_full_version ${_BerkeleyDB_version_major}.${_BerkeleyDB_version_minor}.${_BerkeleyDB_version_patch})
 100    set(BerkeleyDB_VERSION ${_BerkeleyDB_version_major}.${_BerkeleyDB_version_minor})
 101    unset(_BerkeleyDB_version_major)
 102    unset(_BerkeleyDB_version_minor)
 103    unset(_BerkeleyDB_version_patch)
 104  endif()
 105  
 106  include(FindPackageHandleStandardArgs)
 107  find_package_handle_standard_args(BerkeleyDB
 108    REQUIRED_VARS BerkeleyDB_LIBRARY BerkeleyDB_INCLUDE_DIR
 109    VERSION_VAR _BerkeleyDB_full_version
 110  )
 111  unset(_BerkeleyDB_full_version)
 112  
 113  if(BerkeleyDB_FOUND AND NOT TARGET BerkeleyDB::BerkeleyDB)
 114    add_library(BerkeleyDB::BerkeleyDB UNKNOWN IMPORTED)
 115    set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
 116      INTERFACE_INCLUDE_DIRECTORIES "${BerkeleyDB_INCLUDE_DIR}"
 117    )
 118    if(BerkeleyDB_LIBRARY_RELEASE)
 119      set_property(TARGET BerkeleyDB::BerkeleyDB APPEND PROPERTY
 120        IMPORTED_CONFIGURATIONS RELEASE
 121      )
 122      set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
 123        IMPORTED_LOCATION_RELEASE "${BerkeleyDB_LIBRARY_RELEASE}"
 124      )
 125    endif()
 126    if(BerkeleyDB_LIBRARY_DEBUG)
 127      set_property(TARGET BerkeleyDB::BerkeleyDB APPEND PROPERTY
 128        IMPORTED_CONFIGURATIONS DEBUG)
 129      set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
 130        IMPORTED_LOCATION_DEBUG "${BerkeleyDB_LIBRARY_DEBUG}"
 131      )
 132    endif()
 133  endif()
 134