Changeset View
Changeset View
Standalone View
Standalone View
cmake/modules/FindBerkeleyDB.cmake
# Try to find the BerkeleyDB libraries | # Copyright (c) 2017-2020 The Bitcoin developers | ||||
# BDB_FOUND - system has Berkeley DB lib | # Distributed under the MIT software license, see the accompanying | ||||
# BDB_INCLUDE_DIR - the Berkeley DB include directory | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
# BDB_LIBRARY - Library needed to use Berkeley DB | |||||
# BDBXX_INCLUDE_DIR - the Berkeley DB include directory for C++ | #.rst | ||||
# BDBXX_LIBRARY - Library needed to use Berkeley DB C++ API | # FindBerkeleyDB | ||||
# ------------- | |||||
# | |||||
# This is inspired by https://github.com/sum01/FindBerkeleyDB. | |||||
# | |||||
# Find the Berkeley database (versions >= 5.x) libraries The following | |||||
# components are available:: | |||||
# C | |||||
# CXX | |||||
# | |||||
# This will define the following variables:: | |||||
# | |||||
# BerkeleyDB_FOUND - system has Berkeley DB lib | |||||
# BerkeleyDB_INCLUDE_DIRS - the Berkeley DB include directories | |||||
# BerkeleyDB_LIBRARIES - Libraries needed to use Berkeley DB | |||||
# BerkeleyDB_VERSION - The library version MAJOR.MINOR.PATCH | |||||
# BerkeleyDB_VERSION_MAJOR - Major version number | |||||
# BerkeleyDB_VERSION_MINOR - Minor version number | |||||
# BerkeleyDB_VERSION_PATCH - Patch version number | |||||
# | |||||
# And the following imported target:: | |||||
# | |||||
# BerkeleyDB::C | |||||
# BerkeleyDB::CXX | |||||
# Generate a list of all the possible versioned library name variants given a | |||||
# list of separators. | |||||
function(generate_versions_variants VARIANTS LIB MAJOR MINOR) | |||||
set(SEPARATORS | |||||
"" "." "-" "_" | |||||
) | |||||
set(${VARIANTS} "${LIB}") | |||||
foreach(_separator1 IN LISTS SEPARATORS) | |||||
list(APPEND ${VARIANTS} "${LIB}${_separator1}${MAJOR}") | |||||
foreach(_separator2 IN LISTS SEPARATORS) | |||||
list(APPEND ${VARIANTS} "${LIB}${_separator1}${MAJOR}${_separator2}${MINOR}") | |||||
endforeach() | |||||
endforeach() | |||||
set(${VARIANTS} ${${VARIANTS}} PARENT_SCOPE) | |||||
endfunction() | |||||
include(BrewHelper) | include(BrewHelper) | ||||
find_brew_prefix(BREW_HINT berkeley-db) | find_brew_prefix(BREW_HINT berkeley-db) | ||||
find_path(BDB_INCLUDE_DIR | # If the include directory is user supplied, skip the search | ||||
if(NOT BerkeleyDB_INCLUDE_DIR) | |||||
# Berkeley DB 5 including latest minor release. | |||||
generate_versions_variants(_BerkeleyDB_PATH_SUFFIXES_5_3 db 5 3) | |||||
# Berkeley DB 6 including latest minor release. | |||||
generate_versions_variants(_BerkeleyDB_PATH_SUFFIXES_6_2 db 6 2) | |||||
# Berkeley DB 18 including latest minor release (current). | |||||
generate_versions_variants(_BerkeleyDB_PATH_SUFFIXES_18_1 db 18 1) | |||||
set(_BerkeleyDB_PATH_SUFFIXES | |||||
${_BerkeleyDB_PATH_SUFFIXES_5_3} | |||||
${_BerkeleyDB_PATH_SUFFIXES_6_2} | |||||
${_BerkeleyDB_PATH_SUFFIXES_18_1} | |||||
) | |||||
list(REMOVE_DUPLICATES _BerkeleyDB_PATH_SUFFIXES) | |||||
# Try to find the db.h header. | |||||
# If the header is not found the user can supply the correct path by passing | |||||
# the `BerkeleyDB_ROOT` variable to cmake. | |||||
find_path(BerkeleyDB_INCLUDE_DIR | |||||
NAMES db.h | NAMES db.h | ||||
HINTS ${BREW_HINT} | HINTS ${BREW_HINT} | ||||
PATH_SUFFIXES db5 | PATH_SUFFIXES ${_BerkeleyDB_PATH_SUFFIXES} | ||||
) | ) | ||||
find_library(BDB_LIBRARY | endif() | ||||
NAMES db libdb | |||||
HINTS ${BREW_HINT} | # There is a single common include directory. | ||||
PATH_SUFFIXES db5 | # Set the BerkeleyDB_INCLUDE_DIRS variable which is the expected standard output | ||||
# variable name for the include directories. | |||||
set(BerkeleyDB_INCLUDE_DIRS "${BerkeleyDB_INCLUDE_DIR}") | |||||
mark_as_advanced(BerkeleyDB_INCLUDE_DIR) | |||||
if(NOT DEFINED BerkeleyDB_VERSION) | |||||
# Extract version information from the db.h header. | |||||
if(BerkeleyDB_INCLUDE_DIR) | |||||
# Read the version from file db.h into a variable. | |||||
file(READ "${BerkeleyDB_INCLUDE_DIR}/db.h" _BerkeleyDB_DB_HEADER) | |||||
# Parse the version into variables. | |||||
string(REGEX REPLACE | |||||
".*DB_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" | |||||
BerkeleyDB_VERSION_MAJOR | |||||
"${_BerkeleyDB_DB_HEADER}" | |||||
) | |||||
string(REGEX REPLACE | |||||
".*DB_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" | |||||
BerkeleyDB_VERSION_MINOR | |||||
"${_BerkeleyDB_DB_HEADER}" | |||||
) | |||||
# Patch version example on non-crypto installs: x.x.xNC | |||||
string(REGEX REPLACE | |||||
".*DB_VERSION_PATCH[ \t]+([0-9]+(NC)?).*" "\\1" | |||||
BerkeleyDB_VERSION_PATCH | |||||
"${_BerkeleyDB_DB_HEADER}" | |||||
) | |||||
else() | |||||
# Set some garbage values to the versions since we didn't find a file to | |||||
# read. | |||||
set(BerkeleyDB_VERSION_MAJOR "0") | |||||
set(BerkeleyDB_VERSION_MINOR "0") | |||||
set(BerkeleyDB_VERSION_PATCH "0") | |||||
endif() | |||||
# Cache the result. | |||||
set(BerkeleyDB_VERSION_MAJOR ${BerkeleyDB_VERSION_MAJOR} | |||||
CACHE INTERNAL "BerekeleyDB major version number" | |||||
) | ) | ||||
set(BerkeleyDB_VERSION_MINOR ${BerkeleyDB_VERSION_MINOR} | |||||
CACHE INTERNAL "BerekeleyDB minor version number" | |||||
) | |||||
set(BerkeleyDB_VERSION_PATCH ${BerkeleyDB_VERSION_PATCH} | |||||
CACHE INTERNAL "BerekeleyDB patch version number" | |||||
) | |||||
# The actual returned/output version variable (the others can be used if | |||||
# needed). | |||||
set(BerkeleyDB_VERSION | |||||
"${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}.${BerkeleyDB_VERSION_PATCH}" | |||||
CACHE INTERNAL "BerekeleyDB full version" | |||||
) | |||||
endif() | |||||
find_path(BDBXX_INCLUDE_DIR | include(ExternalLibraryHelper) | ||||
NAMES db_cxx.h | |||||
HINTS ${BREW_HINT} | macro(_BerkeleyDB_find_component COMPONENT_NAME LIB_NAME) | ||||
PATH_SUFFIXES db5 | # Different systems sometimes have a version in the lib name... | ||||
# and some have a dash or underscore before the versions. | |||||
# Generate all combinations from the separators "" (none), ".", "-" and "_". | |||||
generate_versions_variants( | |||||
_lib_variants | |||||
${LIB_NAME} | |||||
"${BerkeleyDB_VERSION_MAJOR}" | |||||
"${BerkeleyDB_VERSION_MINOR}" | |||||
) | ) | ||||
find_library(BDBXX_LIBRARY | |||||
NAMES db_cxx libdb_cxx db5_cxx | find_component(BerkeleyDB ${COMPONENT_NAME} | ||||
NAMES ${_lib_variants} | |||||
HINTS ${BREW_HINT} | HINTS ${BREW_HINT} | ||||
PATH_SUFFIXES db5 | PATH_SUFFIXES ${_lib_variants} | ||||
INCLUDE_DIRS ${BerkeleyDB_INCLUDE_DIRS} | |||||
) | ) | ||||
endmacro() | |||||
MESSAGE(STATUS "BerkeleyDB libs: " ${BDB_LIBRARY} " " ${BDBXX_LIBRARY}) | _BerkeleyDB_find_component(C db) | ||||
_BerkeleyDB_find_component(CXX db_cxx) | |||||
include(FindPackageHandleStandardArgs) | include(FindPackageHandleStandardArgs) | ||||
find_package_handle_standard_args(BerkeleyDB DEFAULT_MSG BDB_INCLUDE_DIR BDB_LIBRARY BDBXX_INCLUDE_DIR BDBXX_LIBRARY) | find_package_handle_standard_args(BerkeleyDB | ||||
REQUIRED_VARS | |||||
mark_as_advanced(BDB_INCLUDE_DIR BDB_LIBRARY BDBXX_INCLUDE_DIR BDBXX_LIBRARY) | BerkeleyDB_INCLUDE_DIR | ||||
VERSION_VAR BerkeleyDB_VERSION | |||||
set(BerkeleyDB_LIBRARIES ${BDB_LIBRARY} ${BDBXX_LIBRARY}) | HANDLE_COMPONENTS | ||||
set(BerkeleyDB_INCLUDE_DIRS ${BDB_INCLUDE_DIR} ${BDBXX_INCLUDE_DIR}) | ) |