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