FindBerkeleyDB.cmake 5.3 KB

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