aboutsummaryrefslogtreecommitdiff
path: root/cmake/module/FindBerkeleyDB.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/module/FindBerkeleyDB.cmake')
-rw-r--r--cmake/module/FindBerkeleyDB.cmake133
1 files changed, 133 insertions, 0 deletions
diff --git a/cmake/module/FindBerkeleyDB.cmake b/cmake/module/FindBerkeleyDB.cmake
new file mode 100644
index 0000000000..03a3cce10c
--- /dev/null
+++ b/cmake/module/FindBerkeleyDB.cmake
@@ -0,0 +1,133 @@
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or https://opensource.org/license/mit/.
+
+#[=======================================================================[
+FindBerkeleyDB
+--------------
+
+Finds the Berkeley DB headers and library.
+
+Imported Targets
+^^^^^^^^^^^^^^^^
+
+This module provides imported target ``BerkeleyDB::BerkeleyDB``, if
+Berkeley DB has been found.
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This module defines the following variables:
+
+``BerkeleyDB_FOUND``
+ "True" if Berkeley DB found.
+
+``BerkeleyDB_VERSION``
+ The MAJOR.MINOR version of Berkeley DB found.
+
+#]=======================================================================]
+
+set(_BerkeleyDB_homebrew_prefix)
+if(CMAKE_HOST_APPLE)
+ find_program(HOMEBREW_EXECUTABLE brew)
+ if(HOMEBREW_EXECUTABLE)
+ # The Homebrew package manager installs the berkeley-db* packages as
+ # "keg-only", which means they are not symlinked into the default prefix.
+ # To find such a package, the find_path() and find_library() commands
+ # need additional path hints that are computed by Homebrew itself.
+ execute_process(
+ COMMAND ${HOMEBREW_EXECUTABLE} --prefix berkeley-db@4
+ OUTPUT_VARIABLE _BerkeleyDB_homebrew_prefix
+ ERROR_QUIET
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ endif()
+endif()
+
+find_path(BerkeleyDB_INCLUDE_DIR
+ NAMES db_cxx.h
+ HINTS ${_BerkeleyDB_homebrew_prefix}/include
+ PATH_SUFFIXES 4.8 48 db4.8 4 db4 5.3 db5.3 5 db5
+)
+mark_as_advanced(BerkeleyDB_INCLUDE_DIR)
+unset(_BerkeleyDB_homebrew_prefix)
+
+if(NOT BerkeleyDB_LIBRARY)
+ if(VCPKG_TARGET_TRIPLET)
+ # The vcpkg package manager installs the berkeleydb package with the same name
+ # of release and debug libraries. Therefore, the default search paths set by
+ # vcpkg's toolchain file cannot be used to search libraries as the debug one
+ # will always be found.
+ set(CMAKE_FIND_USE_CMAKE_PATH FALSE)
+ endif()
+
+ get_filename_component(_BerkeleyDB_lib_hint "${BerkeleyDB_INCLUDE_DIR}" DIRECTORY)
+
+ find_library(BerkeleyDB_LIBRARY_RELEASE
+ NAMES db_cxx-4.8 db4_cxx db48 db_cxx-5.3 db_cxx-5 db_cxx libdb48
+ NAMES_PER_DIR
+ HINTS ${_BerkeleyDB_lib_hint}
+ PATH_SUFFIXES lib
+ )
+ mark_as_advanced(BerkeleyDB_LIBRARY_RELEASE)
+
+ find_library(BerkeleyDB_LIBRARY_DEBUG
+ NAMES db_cxx-4.8 db4_cxx db48 db_cxx-5.3 db_cxx-5 db_cxx libdb48
+ NAMES_PER_DIR
+ HINTS ${_BerkeleyDB_lib_hint}
+ PATH_SUFFIXES debug/lib
+ )
+ mark_as_advanced(BerkeleyDB_LIBRARY_DEBUG)
+
+ unset(_BerkeleyDB_lib_hint)
+ unset(CMAKE_FIND_USE_CMAKE_PATH)
+
+ include(SelectLibraryConfigurations)
+ select_library_configurations(BerkeleyDB)
+ # The select_library_configurations() command sets BerkeleyDB_FOUND, but we
+ # want the one from the find_package_handle_standard_args() command below.
+ unset(BerkeleyDB_FOUND)
+endif()
+
+if(BerkeleyDB_INCLUDE_DIR)
+ file(STRINGS "${BerkeleyDB_INCLUDE_DIR}/db.h" _BerkeleyDB_version_strings REGEX "^#define[\t ]+DB_VERSION_(MAJOR|MINOR|PATCH)[ \t]+[0-9]+.*")
+ string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_major "${_BerkeleyDB_version_strings}")
+ string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_minor "${_BerkeleyDB_version_strings}")
+ string(REGEX REPLACE ".*#define[\t ]+DB_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" _BerkeleyDB_version_patch "${_BerkeleyDB_version_strings}")
+ unset(_BerkeleyDB_version_strings)
+ # The MAJOR.MINOR.PATCH version will be logged in the following find_package_handle_standard_args() command.
+ set(_BerkeleyDB_full_version ${_BerkeleyDB_version_major}.${_BerkeleyDB_version_minor}.${_BerkeleyDB_version_patch})
+ set(BerkeleyDB_VERSION ${_BerkeleyDB_version_major}.${_BerkeleyDB_version_minor})
+ unset(_BerkeleyDB_version_major)
+ unset(_BerkeleyDB_version_minor)
+ unset(_BerkeleyDB_version_patch)
+endif()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BerkeleyDB
+ REQUIRED_VARS BerkeleyDB_LIBRARY BerkeleyDB_INCLUDE_DIR
+ VERSION_VAR _BerkeleyDB_full_version
+)
+unset(_BerkeleyDB_full_version)
+
+if(BerkeleyDB_FOUND AND NOT TARGET BerkeleyDB::BerkeleyDB)
+ add_library(BerkeleyDB::BerkeleyDB UNKNOWN IMPORTED)
+ set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BerkeleyDB_INCLUDE_DIR}"
+ )
+ if(BerkeleyDB_LIBRARY_RELEASE)
+ set_property(TARGET BerkeleyDB::BerkeleyDB APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS RELEASE
+ )
+ set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
+ IMPORTED_LOCATION_RELEASE "${BerkeleyDB_LIBRARY_RELEASE}"
+ )
+ endif()
+ if(BerkeleyDB_LIBRARY_DEBUG)
+ set_property(TARGET BerkeleyDB::BerkeleyDB APPEND PROPERTY
+ IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties(BerkeleyDB::BerkeleyDB PROPERTIES
+ IMPORTED_LOCATION_DEBUG "${BerkeleyDB_LIBRARY_DEBUG}"
+ )
+ endif()
+endif()